- 締切済み
16F88を用いてLEDの点灯パターンを制御する
16F88を用いてLEDの点灯パターンを制御するプログラムを作ったのですが、思うように動作してくれません。 電源を入れたときはLEDはすべて消灯しており、スタートのためのスイッチを押すとすべてのLEDが3回点滅するはずなのですが、実際のところ、全てのLEDが点灯しっぱなしになってしまいます。 心当たりはコンフィギュレーションビットの設定が間違っている、PICの出力が間違っている(A/Dが正しく設定されていない)といったことを考えたのですが、結局解決には至りませんでした。 ほぼ同じプログラムを16F84Aにて作ったところ正常に作動したため、PICの移行に伴って不具合が生じてしまったのでしょうか。 どなたかお力をお貸しください。 プログラムはMPLAB v8.85 にて作成しており、コンパイラはHI-TECH ANSI C Compiler で、書き込みにはPICKIT2を用いています。 RB0~7にLEDが接続されており、RA0にスイッチが接続されています。 以下、ソースコードになります。 #define _LEGACY_HEADERS #include <htc.h> #define _XTAL_FREQ 20000000 __CONFIG ( HS & WDTDIS & PWRTDIS & UNPROTECT & MCLREN & BOREN & LVPDIS & DEBUGDIS & IESODIS & FCMDIS); void kaeru(void){ ////////////準備点灯3回////////////// PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(500); PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(500); PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(800); //////////////////////////////////// //スペースの都合で省略しています。 } void main(void) { ANSEL=0b00000000;//16F88のPORTAのA/D変換の無効化 OPTION=0x7F;//PORTBのプルアップ PORTA=0x00;//初期設定 PORTB=0x00;//初期設定 TRISA=0x01;//RA0を入力 TRISB=0x00;//RB0~7を出力 if(RA0==1) kaeru(); }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tadys
- ベストアンサー率40% (856/2135)
whilie(1){ if(RA0==1){ PORTB=0xFF; }else{ PORTB=0x00; } } これで動かしてどうなりますか? スイッチのオンオフでLEDがオンオフすればハードウエアはちゃんとしています。 シミュレータやデバッガーを使う方法も有ります。 MPLABのシミュレータでシミュレーションしてみてください。 これでちゃんと動くのであれば何かハードウエアがおかしいのです。 初期化されない変数やレジスタに依存する事でシミュレーションでOKなのに実際の動作でNGになる事が有ります。 もし動かないのであれば、PICKIT2をデバッガーとして動かしてチェックしてください。 デバッグモードで使用する時はRA5、RB6、RB7はデバッグ専用になるのでI/Oとして使用できません。 デバッグモードでは1命令ずつの実行や、ブレークポイントの設定、I/Oピンの状態の確認、出力ピンの操作などが出来ます。
- tadys
- ベストアンサー率40% (856/2135)
RA0がゼロだと何もしないで終わっちゃいます。 if(RA0==1) kaeru(); を 次のように直しましょう。 while(1){ if(RA0==1) kaeru(); } RA0には抵抗を入れてプルアップしておきましょう。 スイッチはRA0とグランドの間に入れます。 16F84Aで動いたのは、main()が終了した後にたまたまゼロ番地に戻った為でしょう。
補足
ご指摘ありがとうございます。 ご指摘通り、if(RA0==1) kaeru(); の部分を無限ループに入れ、RA0をプルアップしたのですが、 今度は電源を入れた瞬間からLEDがつきっぱなしになり、スイッチを押しても何の変化もありませんでした。