最近になってPIC18FとかPIC24FJとかの上位のチップで遊ぶようになって、気にはしていたけど面倒だから無視していたことに、LATレジスターの存在がある。
下位のチップには無かったものだ。
今までは特に支障が無かったので、いままでの通り何も考えずに PORTBbits.RB5 = 1; とかしていたわけだ。
ところが、ある回路でいくらやってもうまく動かないので、レジスタの設定ミスでI/Oピンの出力がおかしいのかと思い、試しにこんなことをしてみたら、
1 2 3 4 5 6 7 8 9 10 11 12 |
while(1){ PORTBbits.RB12 = 1; PORTBbits.RB13 = 1; PORTBbits.RB14 = 1; PORTBbits.RB15 = 1; __delay_ms(5); PORTBbits.RB12 = 0; PORTBbits.RB13 = 0; PORTBbits.RB14 = 0; PORTBbits.RB15 = 0; __delay_ms(5); } |
こうなった。
ああ、やっぱりな、毎度の設定漏れだなと決め付けようとしたが、ふと思い立って、こうしてみたら、
1 2 3 4 5 6 7 8 9 10 11 12 |
while(1){ LATBbits.LATB12 = 1; LATBbits.LATB13 = 1; LATBbits.LATB14 = 1; LATBbits.LATB15 = 1; __delay_ms(5); LATBbits.LATB12 = 0; LATBbits.LATB13 = 0; LATBbits.LATB14 = 0; LATBbits.LATB15 = 0; __delay_ms(5); } |
意図したとおりの動作になった。
コレだけの速さで変更を加えられてもPORT的にはついて来れないということだろう。
もちろん、PORTにぶら下がってる回路にも関係あることだろうし。
32MHzで駆動しているので、62.5nsということになる。
ということで、ことの詳細は検索でもかければ分りやすい説明がされているので省くとして、うまく動かなかったコードのPORTとなっていた部分をLATに書き換えたら問題は解決した。
Tweet