##やりたいこと
PICマイコン(PIC16F18xx、XC8コンパイラ)を使用して、タイマ割込み処理を行いたいです。
割込みフラグを用意して、フラグの値によって、①と②の動作を切り替えたいと考えています。
①通常動作
3色のLEDを順番に点灯させています。
②タイマ割込み動作
SW(スイッチ)が押されたら、スイッチが押されている間は(ずっと)すべてのLEDを点灯させます。
##困っていること
↓のコードで動作確認をしていますが、SW(スイッチ)を押しても、①の動作のままになってしまいます。
SW(スイッチ)が押されたら、②の動作に切り替わってほしいのですが、①の動作のままです。
プログラムでおかしな箇所がありましたら、教えていただけると助かります。
##プログラムコード
html
1int flag; 2#define SW PORTAbits.RA4 3 4void intrInit(){ //割り込みの初期設定 5 T1CON = 0b00110001; //内部クロックの4分の1で,プリスケーラ1:8でカウント(x32) 6 // 1/8MHz (0.125usec) x 32 = 4usec 7 //4usec x 2500 = 10msec 8 TMR1H = (63036 >>8); //タイマー1の初期化(65536-2500=63036); 9 TMR1L = (63036 & 0x00ff); 10 TMR1IF = 0; //タイマー1割り込みフラグを0にする 11 TMR1IE = 1; //タイマー1割り込みを許可する 12 INTCONbits.GIE = 1; //グローバル割り込みを許可 13 INTCONbits.PEIE = 1; //割り込みを許可 14} 15 16//割り込み関数 17void interrupt isr(){ 18 GIE = 0; 19 if(TMR1IF == 1 && SW ==0){ 20 TMR1H = (63036 >>8); //タイマー1の初期化(65536-2500=63036); 21 TMR1L = (63036 & 0x00ff); 22 flag=1; 23 TMR1IF = 0; //割り込みフラグを落とす 24 } 25 GIE = 1; 26} 27 28void main(void) { 29 OSCCON=0x72; //PLL Disable/8MHz 30 ANSELA=0x04; //RA2 Analog Setting 31 ANSELC=0x00; //PORTC Digital Setting 32 TRISA=0x04; //RA2 Input 33 TRISC=0x28; //RC5, RC3 Input 34 LATC=0x00; 35 36 37 //LED初期設定 38 LED1=0; //1: 点灯/0: 消灯 39 LED2=0; //1: 点灯/0: 消灯 40 LED3=0; //1: 点灯/0: 消灯 41 __delay_ms(100); //100msec 42 43 44 while(1){ 45 LED(); 46 } 47} 48 49 50void LED(void) 51{ 52 //LED初期設定 53 LED1=0; 54 LED2=0; 55 LED3=0; 56 57 if (flag == 0 ){ 58 LED1=1; 59 __delay_ms(100); //100msec 60 LED1=0; 61 __delay_ms(100); //100msec 62 LED2=1; 63 __delay_ms(100); //100msec 64 LED2=0; 65 __delay_ms(100); //100msec 66 LED3=1; 67 __delay_ms(100); //100msec 68 LED3=0; 69 } 70 else { 71 while(SW == 0){ 72 LED1=1; 73 LED2=1; 74 LED3=1; 75 } 76 } 77 flag=0; 78}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/23 00:44