質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

解決済

1回答

1655閲覧

PICマイコン タイマ割込み フラグの使い方

raspypy

総合スコア247

0グッド

0クリップ

投稿2019/08/22 07:28

##やりたいこと
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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、フラグの値によって、点滅動作か、点灯しっぱなしかを切り替えるようにしましょう
whileループ中で、フラグの値によってLED関数を実行するか点灯しっぱを切り替えればいいと思います
で、割り込みルーチンの中で、SWの状態でフラグをONするかOFFするか設定します

以下コードの改善点

  • フラグ変数の宣言にvolatileをつけときましょう

volatile int flag;

  • 割り込みルーチンの中でタイマの初期化は不要です。

割り込みフラグのリセットだけでいいと思いますが

  • LED関数の中のフラグのリセットは削除しときましょう

投稿2019/08/22 08:21

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raspypy

2019/08/23 00:44

改善点を教えていただきありがとうございました。 おかげさまでタイマ割込み動作ができました。 別質問を後ほどUpしますが、LED関数の中にfor文を追加すると、タイマ割込みの動作に移行してくれないという問題に直面しています。 こちらも解決策が分からず、困っております。質問内容を見ていただけると助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問