ATmega168とWinAVRで割り込みのプログラミングをしています。
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(TIMER1_OVF_vect)
{
TCNT1 = 65500;
PORTC ^= 0x02;
}
int main()
{
int i;
DDRC = 0x07;
PORTC ^= 0x01;
TCCR1B = 0x00;
TCNT1 = 65500;
TIMSK1 = _BV(TOIE1);
TCCR1B = 0x05;
sei();
while (1) {
PORTC ^= 0x04;
for(i=0;i=500;i++){}
}
}
上記のプログラムを組んでみたのですが。while文に入ってfor文に少し入ってからISRの処理が始まるのですが。ISRの処理が終わってから又for文の処理に戻ろうとしません。なのでPORTC0x04の点滅が起こりません。PORTC0x04の点滅もしながらPORTC0x02の点滅もしたいのですがどうすれば良いのでしょうか?
No.3ベストアンサー
- 回答日時:
>回答ありがとうございます。
プログラムの確認はWinAVRのシュミレーションで確認しました。シミュレータ上でデバッガで停止させて確認したと認識よろしいですか?
なぜ、mainに戻っていないと確信を得たか教えてください。
>あと割り込みと言うのはmain()文を中心に処理するが割り込みの条件がはいったならばmain文の処理をいったん停止し、割り込みの内容を優先する。割り込みの処理が終了したらmain文の処理に戻っていくという認識をしているのですが合っているのでしょうか?
main文だとmain関数の中だけ見たいですが、割り込み処理以外の部分でプログラムが走っている場合は、どこの処理中でも割り込み信号が発生した瞬間に処理を中断して割り込み処理終了後に続きの処理に戻ります。
割り込む命令の単位はマシン語1命令の単位でありC言語の文の単位では有りません。
>メインでPORTCを変更する間は割り込みを禁止してください。
cil();
PORTC ^= 0x04;
sei();
ここらを参考に↓
http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Star …
回答ありがとうございます。
それはプログラム的に言うと
int main(){
・
・
while (1) {
cil();
PORTC ^= 0x04;
sei();
for(i=0;i=500;i++){}
}
}
こういうことで良いんでしょうか?
うまくいきません。
No.6
- 回答日時:
>F11を押すとプログラムが一つずつ進んでいくのでそれを見ていると
>ISRに入った後main文に戻らずにISR文の中でずっとループしていました。
ループ構造を持たないISRの中でループするのは変だと思いません?
それは、割り込みタイマがステップ実行中(F11)でも無関係にカウントダウンしてオーバーフローしてるんじゃないでしょうか?なので割り込みを抜けると直ぐ再度割り込んでいるんじゃ?
割り込みのデバッグはF11で実行しないで下さい。必ずブレーク設定して調べたい命令の所で止めましょう。
No.5
- 回答日時:
R32Cさんの指摘まで基本的すぎて見落としてましたが、このコードは確実に無限ループします。
>for(i=0;i=500;i++){}
>}
i=500は代入文で条件式では無いので常に真でループから抜けることが出来ません。つまり無限ループです。
>シミュレータ上でデバッガで停止させて確認したと認識よろしいですか?
>なぜ、mainに戻っていないと確信を得たか教えてください。
こちらは答えてもらえないんでしょうか?
デバッガがちゃんと使えたら無限ループしていることは直ぐに確認できたのに勿体無いですね。
i=500になったら終了と言うことではなかったのですね。
シュミレータはデバッガと言うよりビルド&ランをしていました。
F11を押すとプログラムが一つずつ進んでいくのでそれを見ていると
ISRに入った後main文に戻らずにISR文の中でずっとループしていました。
No.2
- 回答日時:
プログラムを見る限りは正常に動作するとは思えません。
PORTC ^= 0x04;
はアセンブラ1命令に置き換えれませんよね?
(1)レジスタ←PORTC
(2)レジスタ←レジスタ XOR 0x04
(3)レジスタ→PORTC
となるはずですので(1)~(3)の間のどこかで割り込む可能性が出てきます。もし(2)で割り込んだらPORTCの書き換えが割り込み中で行われるので(2)の時点でレジスタが保持している値と実際のPORTCの値が違う可能性かが出てきます。
>上記のプログラムを組んでみたのですが。while文に入ってfor文に少し入ってからISRの処理が始まるのですが。ISRの処理が終わってから又for文の処理に戻ろうとしません。
これはどのようにして確認しましたか?
LEDの点滅以外のデバッガ等で確認しましたか?
>なのでPORTC0x04の点滅が起こりません。PORTC0x04の点滅もしながらPORTC0x02の点滅もしたいのですがどうすれば良いのでしょうか?
メインでPORTCを変更する間は割り込みを禁止してください。
回答ありがとうございます。プログラムの確認はWinAVRのシュミレーションで確認しました。
あと割り込みと言うのはmain()文を中心に処理するが割り込みの条件がはいったならばmain文の処理をいったん停止し、割り込みの内容を優先する。割り込みの処理が終了したらmain文の処理に戻っていくという認識をしているのですが合っているのでしょうか?
No.1
- 回答日時:
こんにちは。
ええと、多分ですが、関数ISRが割り込みハンドラとしてコンパイルされていないため、正しくリターンできていないのではないでしょうか。
割り込みハンドラとしてのコンパイルの仕方は、コンパイラのマニュアル等を見てください。
あと、蛇足ですが、PORTCをメインルーチンと割り込みの両方から変更していますが、メインルーチンで変更する間は割り込み禁止にするとかしないと、動きがおかしくなると思います。
回答ありがとうございます。
割り込み禁止とはcil();のことでしょうか?
具体的にどこに入れれば良いのでしょうか?
ソースで示していただけると大変うれしいです。
どうか、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングのペーパーテスト 実行結果の表示を答えてください #include <stdio.h> 2 2022/07/09 16:14
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スーパーのレジで並んでいたら...
-
アセンブラのタイマー割り込み
-
AKI-H8/3048Fでのタイマ割り込み
-
一定時間操作がなかったら、と...
-
[コンピュータアーキテクチャ]...
-
ショッピング
-
割り込み処理から引数を取得す...
-
割り込み処理のシミュレート
-
電車で待機列の割り込みについ...
-
Macターミナルで実行中のプログ...
-
VBAの配列サイズとメモリに関して
-
緯度、経度の 10進法と 60進法...
-
C言語で、メモリを解放しないで...
-
なんかC言語でプログラム書いて...
-
タスクマネージャーのプロセス...
-
バックグラウンドのプロセスの...
-
TCP/IP通信時のサーバーからの受信
-
プログラミング ソースコード
-
Excel-VBAのmsgBox()の不思議
-
Webプログラムってネイティブア...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
インバウンドで迷惑している人...
-
pic 複数の割り込み関数 切り分...
-
スーパーのレジで並んでいたら...
-
ショッピング
-
Excelでタイマーの一時停止する...
-
電車で待機列の割り込みについ...
-
CPUの処理量を減らすコーデ...
-
C言語でPICマイコン開発
-
【組込み】割り込み中のstatic...
-
Amazonfireタブレットにわから...
-
マイコン C言語 割り込み処理...
-
USB機器からのデータ受信による...
-
一定時間操作がなかったら、と...
-
VB.net 割り込みの禁止
-
ウォッチドッグタイマ(WDT)の...
-
電車乗車時、並んでいるのに割...
-
USJでの割り込み
-
VB6でSendKeyを利用したTab移動...
-
PICでのプログラムによるチャタ...
-
割り込み中に例外異常
おすすめ情報