- 締切済み
PIC16F1827
プログラムの一部ですが、ここだけを見ると TRISB=0x00; RB0=0; RB1=0; RB2=0; RB3=0; PORTB=0b00000001; RB0から1、RB1から0、RB2から0、RB3から0が出力されると考えてもよいのでしょうか お手数おかけしますがよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- tadys
- ベストアンサー率40% (856/2135)
最後にPORTB=0b00000001;が実行されるのでRB0=1、RB0~RB7=0になります。 RB0=0;からRB3=0;は必要ないです。 PICのIOポートの1ビットだけを変更するときに RB0=0 などの命令を使うのは不適切です。 RB1=1;を実行した後にRB0=0 ;を実行した場合、RB0に関係ないRB1が0になってしまうことが有ります。 これはNop()命令を挿入しても防げない場合が有ります。 それは、RB0=0; RB0=1;命令の仕組みによります。 RB0=命令では最初にPORTBの全ビットを読み込んでbit0のみを書き換えてPORTBに出力します。 ところが、RB1にLEDを直接つけたりコンデンサがついているとRB1に1を出力しているのに電圧レベルが0を示す電圧になっていることが有ります。 その場合、RB0=命令でPORTBに出力するときにRB1=1だったものをRB1=0として出力してしまいます。 これを防ぐには、RB0=0;命令の代わりにLATB0=0;命令を使用します。 ただし、LATBとPORTBは異なるバンクに有るので命令を実行する前にBNAKSEL命令でバンクを切り替えておく必要が有ります。 また次の処理に進むときにはバンクを元に戻しておくことも忘れないようにしましょう。
- koujikuu
- ベストアンサー率43% (429/993)
No.1 補足 NOP(); は、アセンブラの NOP 命令と同じです 単なる時間稼ぎです PIC16F1827 8MHz ならば、 NOP(); // 500nS = 0.5μS = 0.0005mS です __delay_ms(1); // 1mS の違いがあります RB0=0; NOP(); RB1=0; NOP(); RB2=0; NOP(); RB3=0; で十分です、初期のPICでは、LATBレジスタが無い為 NOP で対処しました。
お礼
お礼が遅くなり申し訳ないです。 これからもよろしくお願いします。
- koujikuu
- ベストアンサー率43% (429/993)
基本そうですが RB0=0; // BCF PORTB,RB0 アセンブラ表記 RB1=0; // BCF PORTB,RB1 RB2=0; // BCF PORTB,RB2 RB3=0; // BCF PORTB,RB3 と read-modify-write を行う命令を続ける場合は、間にNOP(); を挟むか LATB0~LATB3 を使用しないと負荷により誤作動します PORTB=0b00000001; があるので RB0~RB3の設定は不要では?
お礼
お礼が遅くなり申し訳ないです。 これからもよろしくお願いします。
補足
回答ありがとうございます。 >read-modify-write を行う命令を続ける場合は、間にNOP(); を挟むか LATB0~LATB3 を使用しないと負荷により誤作動します これは__delay_ms( ); で代用しても構わないでしょうか。 >PORTB=0b00000001; があるので RB0~RB3の設定は不要では? そうですね、うっかりしていました。申し訳ないです。
お礼
お礼が遅くなり申し訳ないです。 これからもよろしくお願いします。
補足
回答ありがとうございます。 >これを防ぐには、RB0=0;命令の代わりにLATB0=0;命令を使用します。 ただし、LATBとPORTBは異なるバンクに有るので命令を実行する前にBNAKSEL命令でバンクを切り替えておく必要が有ります。 また次の処理に進むときにはバンクを元に戻しておくことも忘れないようにしましょう。 ということはどうやってかけばよろしかったでしょうか また、このプログラムは PORTB=0b00000001; delayを挟む PORTB=0b00000010; のように続いているプログラムです