お世話になっております。
以前、このサイトで様々な方にお世話になり、ご教示頂いたコードを基にコードを作成しています。
今回も引き続きPIC16F1503を使用して下記動作のプログラミングを作成致しました。
①LSW1がONの時、PB1を0.2秒押すと作動してLED1が点滅、LED3・4が点灯
②10秒以内にPrSWがONすると、LED1が点灯、LED3・4が消灯
③作動後、PrSWがONせず10秒経過すると、LED2点滅、LED1・3・4が消灯、BZ-ON
●問題点
①PB1を確実に押したと言う意味合いで0.2秒の長押しコードを作成しました(※1)。
現状、動作は正常にしています。しかしながら、C言語初心者と言う事もあり、良いものなのか不安です。
そこで、今後の為に、アドバイスを頂きたいと思っております。
②PB1(作動)とPB2(停止)を交互に押していると、不定なタイミングで急にmode3になってしまいLED2が点滅、BZ-ONする現象が起きました。そこで私なりに考えて、出力のmode0のコードに※2を追加致しました。現状、繰り返し試験を行いましたが現象は発生していません。
しかし、①で述べたようにいいものなのか不安です。同じようにアドバイスを頂きたいと思っております。
以上、よろしくお願いいたします。
void main (void){ //マイコン設定 OSCCON = 0b01111000; //内部クロック周波数を16MHzに設定 ANSELA = 0b00000000; //PortA全てのピンをデジタルモードに設定 ANSELC = 0b00000000; //PortC全てのピンをデジタルモードに設定 TRISA = 0b00110000; //PortAピン設定 TRISC = 0b00110000; //PortCピン設定 //初期処理:電源ON後、全ての出力を一度OFFにする。 LED1 =0; LED2 =0; LED3 =0; LED4 =0; BZ =0; int cnt=0; //カウント int PB1cnt=0; //PB1入力遅延用カウント int mode=0; //modeは出力 //mode0:全停止 //mode1(作動)=LED1点滅、LED3点灯、LED4点灯 //mode2(OK)=LED1点灯、LED3-OFF、LED4-OFF //mode3(NG)=LED2点滅、LED3-OFF、LED4-OFF、BZ-ON __delay_ms(1000); //電源投入後、誤作動を起こさないよう1秒待機してから本プログラムへ移行 while(1){ //入力 //mode0の時、LSW1+PB1(作動)がONしたら、modeを1にしてカウンタも初期化 if(mode==0 && PB1==0 && LSW1==0){ ※1 for(PB1cnt=0;PB1cnt<20;PB1cnt++){ __delay_ms(10); if(PB1==1)break; } if(PB1cnt==20){ mode=1; cnt=0; PB1cnt=0; } } //PrSWがONしたらmodeを2にする if(PrSW==0){ mode=2; } //PrSWがOFF、PB2(停止)がONしたら、どんな状態からでもmodeを0にする if(PrSW==1 && PB2==0){ mode=0; } //PrSWがOFFの時、modeを0にする if(mode!=3 && mode!=1 && PrSW==1){ mode=0; } //出力 if(mode==0){ //全停止 LED1=0; LED2=0; THUP=0; CL =0; BZ =0; ※2 cnt =0; } else if(mode==1){ //mode1(作動)=LED1点滅、LED3-ON、LED4-ON LED1=(cnt%100<50); LED2=0; LED3=1; LED4=1; BZ =0; __delay_ms(10); if(++cnt==1000){ //カウントが1000(10秒)になった時、modeを3、カウントを0にする mode=3; cnt =0; } } else if(mode==2){ //mode2(OK)=LED1点灯、LED3-OFF、LED4-OFF LED1=1; LED2=0; LED3=0; LED4=0; BZ =0; } else if(mode==3){ //mode3(NG)=LED2点滅、LED3-OFF、LED4-OFF、BZ-ON LED1=0; LED2=(cnt<50); LED3=0; LED4=0; BZ =1; __delay_ms(10); if(++cnt==100){ cnt=0; //1秒たったらカウントを0にして最初からカウント } } } return; }
回答2件
あなたの回答
tips
プレビュー