PIC16F88等の18ピンのPICを使用している場合、RB6,RB7ピンが入力として使えない場合があります。
このような際ににチェックする事を羅列してみました。
RB6,RB7が入出力ピンとして使用できないときのチェックポイント
Check1:アナログ入力ピンとの競合
RB6,RB7は、アナログ入力のAN5,AN6と共用になっています。PORTBのデジタル入出力として利用したい場合は,ANSELレジスタの値を0にする必要があります。
[PIC]PIC16F88でPortAを入出力ピンとして動作しない場合にチェックする事
HI-TECH Cによるコード例
void main( void ) { ANSEL = 0; ... } |
Check2:デバッグピンとの競合
16F88は、RB6,RB7がデバッグ用のピンになっています。__CONFIG()マクロでDEBUG_ONにしている場合は、OFFにしてデバッグ機能を無効にします。
PicKit3などのライタを使用している場合、ライタが接続されていると、RB6,RB7を入力用ピンとして使用できません(PicKit3側の回路が生きるため)。
この為、テストを行う場合は都度、ライタを外す必要があります。
HI-TECH Cによるコード例
#include <htc.h> __CONFIG ( DEBUG_OFF & ... ) // ICDデバッグを無効にする void main( void ) { ... } |
Check3:Timer1機能との競合
Timer1タイマを使用している場合、RB6,RB7はクロック供給のピンとして使用可能です。内部オシレータ等をクロックソースとして使用する場合は、T1CONレジスタのT1OSCENビットを0にする必要があります。外部オシレータを使用する場合は、RB6,RB7をデジタル入出力として使えません。
HI-TECH Cによるコード例
void main( void ) { T1CONbits.T1OSCEN = 0; ... } |
Check4:Input/Outputの指定が逆になっている
該当ポートを出力として使いたいのに入力モードになっている(もしくはその逆)になっていると、当然ながら正しく動作しません。PORTBのピンに対する入出力モードはTRISBレジスタで指定でき、入力モードにしたい場合は対応するビットを”1″、出力にしたい時は”0″にします。
HI-TECH Cによるコード例
1:RB6,7を入力にする場合
void main( void ) { TRISBbits.TRISB7 = 1; // RB7を入力モードにする TRISBbits.TRISB6 = 1; // RB6を入力モードにする ... } |
2:RB6,7を出力にする場合
void main( void ) { TRISBbits.TRISB7 = 0; // RB7を出力モードにする TRISBbits.TRISB6 = 0; // RB6を出力モードにする ... } |
関連記事
久しぶりにPIC16F88を使ってみたのですが、みごとにANSELの設定にはまりました。
お蔭さまで解決しました。ありがとうございました。