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

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

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

Q&A

解決済

2回答

853閲覧

PICマイコン タイマ割込み

raspypy

総合スコア247

0グッド

0クリップ

投稿2019/08/10 05:36

編集2019/08/22 05:02

##やりたいこと
PICマイコン(PIC16F18xx、XC8コンパイラ)を使用して、タイマ割込み処理を行いたいです。
①通常動作
3色のLEDを順番に点灯させています。
②タイマ割込み動作
SW(スイッチ)が押されたら、スイッチが押されている間は(ずっと)すべてのLEDを点灯させます。

##教えてほしいこと
タイマ割込み動作(void interrupt isr())内の記述について、間違えている個所がありましたら、教えていただけると助かります。

##プログラムコード

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ページで確認できます。

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

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

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

y_waiwai

2019/08/10 08:09

現状のコードではどういう動作になるんでしょうか
raspypy

2019/08/10 08:19

諸事情でまだ確認できていないのですが、掲載したコードに間違いがあるか知りたくて質問させていただきました。
raspypy

2019/08/22 05:04

遅れてすみません。 今テストしているコードを掲載しました。 コンパイルは通り、動作が意図した動作になっていません。 今確認した動作としては、LEDが順番に点滅している状態が続きます。 (SWを押すと、SWを押している限りはLEDがすべて点灯するコードを書いているつもりですが、 SWを押しても、LEDが順番に点滅したままという動作です。)
y_waiwai

2019/08/22 05:08

質問内容が当初と違っているので 新たに質問を立て直したほうがいいかも。 この質問は自己回答して解決済にしましょう
guest

回答2

0

ベストアンサー

掲載したコードに間違いがあるか知りたくて質問させていただきました。

そのコードをビルドしましょう。
間違いがあれば、エラーを出してくれます

どういう動作をするのかは別にして、コードは正しいというのがそれで確認できます

投稿2019/08/10 12:54

y_waiwai

総合スコア87749

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

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

0

while(SW== 0){
LEDR=1; LEDG=1; LEDB=1; }

確かに押されている間、ずっという意味では合っていると思いますが、LED? は一度セットすれば、1(on?) を保持してませんか?
それと押している間、無限ループなので、レスポンスは極めて悪化します。あまりすべきコードではありません。、、、この割込みの優先度は? もし、高いと他の事ができません。

[追記]
こういう時は、フラグを設けて、割込みはフラグのみ変更し、通常はそのフラグを見てLED の On/Offじゃないかと。

投稿2019/08/10 12:25

編集2019/08/10 12:36
pepperleaf

総合スコア6383

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

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

raspypy

2019/08/10 23:37

コメントありがとうございます。 何点か教えてください。 ①LED? は一度セットすれば、1(on?) を保持してませんか? →こちらに関しては、void LED()の先頭で、LEDを初期化(全消灯)しなければならないと理解しましたが、合っていますでしょうか? ②それと押している間、無限ループなので、レスポンスは極めて悪化します。あまりすべきコードではありません。、、、 →「レスポンス」というのは、何のレスポンスでしょうか。スイッチが押されなくなった時に、LED()に戻るレスポンスでしょうか? ③この割込みの優先度は? もし、高いと他の事ができません。 →スイッチ(SW)は、それほど頻繁に押される訳ではありませんが、「他のことができない」というのは、どういうことでしょうか。教えていただけると助かります。 ④[追記]について 追記ありがとうございます。次の理解で合っていますでしょうか? int flag; while(1) If (flag){ LED(void); } else{ LEDR=1; LEDG=1; LEDB=1 } } //割り込み関数 void interrupt isr(){ GIE = 0; if(TMR1IF == 1 && SW==0){ TMR1H = (55536 >>8); //タイマー1の初期化(65536-10000=55536); TMR1L = (55536 & 0x00ff); flag=1; TMR1IF = 0; //割り込みフラグを落とす } GIE = 1; }
pepperleaf

2019/08/10 23:52

ちょっと時間が無いので、ここだけ > 「レスポンス」というのは、何のレスポンスでしょうか。 PICの構造は詳しくないですが、通常、割込み処理の優先度は高いので、割込み処理を行っている間、CPUは他の処理が(多分、全く)出来ません。 という事は、ボタンが押されている間、ボタンの監視しか出来ませんが、それで良いでしょうか? という事です。
raspypy

2019/08/11 06:19

忙しい中、返信ありがとうございます。 今回作成するプログラムの目的からすると、ボタンが押されている間は、ボタンの監視だけで問題ありません。 お時間がある時に、他の質もにも回答いただけると助かります。
pepperleaf

2019/08/13 08:35

> void LED()の先頭で、LEDを初期化(全消灯)しなければならないと理解しましたが、合っていますでしょうか? 起動時のLEDの状態は、不定なので、初期化はお約束。(ただ、回路構成次第で決まるが、その場合でも初期化する事が多いようです) > 「他のことができない」というのは、 既に書いた通りです。LEDの点滅だけが、PICの処理では無いと思うのですが、、、。 > 次の理解で... コードは、質問文の更新または追記の方が見易いですが、、 ざっと見たところ、以下の問題があります。 - flagが初期化されていない。 - スイッチの Offが検出されていないので、一度、Onになるとそのまま。
raspypy

2019/08/15 01:30

回答ありがとうございます。 最初に指摘いただいたSWの優先度について。 一度ボタン(SW)が押されたら、基本的に押された状態がずっと続く仕様になっています。 (この場合、優先度が低いというのでしょうか…) これを踏まえて、コードを書き直してみました。 質問文に掲載しましたので、チェックしていただけると助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問