dポイントプレゼントキャンペーン実施中!

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();


}

A 回答 (2件)

whilie(1){


if(RA0==1){
PORTB=0xFF;
}else{
PORTB=0x00;
}
}
これで動かしてどうなりますか?
スイッチのオンオフでLEDがオンオフすればハードウエアはちゃんとしています。


シミュレータやデバッガーを使う方法も有ります。
MPLABのシミュレータでシミュレーションしてみてください。
これでちゃんと動くのであれば何かハードウエアがおかしいのです。
初期化されない変数やレジスタに依存する事でシミュレーションでOKなのに実際の動作でNGになる事が有ります。

もし動かないのであれば、PICKIT2をデバッガーとして動かしてチェックしてください。
デバッグモードで使用する時はRA5、RB6、RB7はデバッグ専用になるのでI/Oとして使用できません。
デバッグモードでは1命令ずつの実行や、ブレークポイントの設定、I/Oピンの状態の確認、出力ピンの操作などが出来ます。
    • good
    • 0

RA0がゼロだと何もしないで終わっちゃいます。



if(RA0==1) kaeru(); を
次のように直しましょう。
while(1){ if(RA0==1) kaeru(); }

RA0には抵抗を入れてプルアップしておきましょう。
スイッチはRA0とグランドの間に入れます。

16F84Aで動いたのは、main()が終了した後にたまたまゼロ番地に戻った為でしょう。

この回答への補足

ご指摘ありがとうございます。

ご指摘通り、if(RA0==1) kaeru(); の部分を無限ループに入れ、RA0をプルアップしたのですが、

今度は電源を入れた瞬間からLEDがつきっぱなしになり、スイッチを押しても何の変化もありませんでした。

補足日時:2012/07/20 16:32
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!