質問: 0b00000000; //PortC全てのピンを出力モードに設定 //初期処理:電源ON後、全ての出力を一度OFFにする。 LATC0=0; //LED1 LATC1=0; //LED2 LATC2=0; //BZ //RA5:PB1、RA4:PB2 while(1){ if(RA5==1){ int cnt=0; //PB1がONの時、最初にカウンタに0を代入 while(cnt<10000 && RA4==0){ //カウント値が30秒以下、PB2 OFFの時、下を実行 LATC2=1; //BZ ON if(cnt%500<250)LATC0=1; //LED1 ON else LATC0=0; //LED1 OFF __delay_ms(1); cnt++; } while(cnt==10000){ //カウント値が10秒に達したら下を実行 LATC0=0; //LED1 OFF LATC2=0; //BZ OFF while(RA4==0){ //PB2を押さない限り下を実行 if(cnt%1000<500)LATC1=1; //LED2 ON else LATC1=0; //LED2 OFF __delay_ms(1); cnt++; } } LATC0=0; //LED1 OFF LATC1=0; //LED2 OFF LATC2=0; //BZ OFF } } return; } ``` ### 試したこと 1の10秒カウントについて ・点滅コードが原因かと思い、LED1の点滅をやめて10間点灯に変更すると正常に10後LED2が点滅した。 ・点滅コードを ``` for(timer=0;teimer<10;timer++){ LATC0=1; __delay_ms(500); LATC1=0; __delay_ms(500); ``` にすると、PB2を押してもキャンセルされない時がある。 2の点滅が点灯に代わってしまう事について カウント上限?になってしまい、計算結果が真のままになってしまって点灯しっぱなしになっているのが原因かと思い、cnt++の下に if(cnt==2000){ cnt=0; } を追加したが関係なかった。 ### 補足情報(FW/ツールのバージョンなど) MPLABX IDE v5.30を使用
回答: __delay_ms() ではなく 内蔵タイマを基準とします PIC16F84 でテスト PIC16F1503 でも基本的な考え方は同じです (除算は使いません) SW , LED , BZ の ON/OFF (o,1) は #define で設定しています ``` #include #pragma config WDTE=OFF,PWRTE=OFF,CP=OFF,FOSC=HS #define _XTAL_FREQ 10000000 // 10MHz #define FOSC4 ( _XTAL_FREQ / 4 ) // PIC CLOCK #define _500ms ( FOSC4 / 2 ) #define _10s ( FOSC4 * 10 ) #define LED1 RA2 #define LED2 RA3 #define LED_ON 1 #define LED_OFF 0 #define SW1 RB0 #define SW2 RB1 #define SW_ON 0 #define BZ RA1 #define BZ_ON 0 #define BZ_OFF 1 unsigned short long tmr0_cnt3 = 0 ; // 24bit unsigned long tmr0_cnt4 = 0 ; // 32bit unsigned char blink_flag = 0 ; void main(void){ TRISA = 0 ; // OUTPUT TRISB = 0xFF; // INPUT OPTION_REG = 0b01010111; // TMR0_ON Prescaler 1:256 , PORTB pullup LED1=LED_OFF ; LED2=LED_OFF ; BZ=BZ_OFF ; while(1){ if ( SW1 == SW_ON && blink_flag==0 ){ blink_flag=1 ; tmr0_cnt3=0 ; tmr0_cnt4=0 ; } if ( SW2 == SW_ON ){ LED1=LED_OFF ; LED2=LED_OFF ; BZ=BZ_OFF ; blink_flag=0 ; } if ( T0IF==1 && blink_flag ==1 ){ // tmr0 over flow T0IF=0; tmr0_cnt3 += 65536; if ( tmr0_cnt4 < _10s ){ tmr0_cnt4 += 65536; } if ( tmr0_cnt3 >= _500ms ){ tmr0_cnt3 -= _500ms; if ( tmr0_cnt4 < _10s ){ LED1 ^= 1 ; LED2=LED_OFF ; BZ=BZ_ON ; } else { LED2 ^= 1 ; LED1=LED_OFF ; BZ=BZ_OFF ; } } } } // while } ```