- 締切済み
(H8マイコン)タイマ割込で変更したグローバル変数がメインループ内で認識されない
H8マイコンの学習をしています。 LEDを一定時間ごとに点滅させるためにタイマ割込を使用して時間稼ぎ処理を行おうとしました。 1ms毎の割込でグローバル変数をインクリメントし、メインループ内でグローバル変数が一定値以上になるまで無限ループする処理を作成しました。 しかし、メインループの数値チェックの無限ループが終了せずLEDが点滅しません。 原因についてお知恵を拝借できないでしょうか。 何卒よろしくお願いいたします。 以下は環境およびコードです。 マイコン:H8/36109(H8/H300 Tinyシリーズ) 使用ツール:HEW4, E8a (main.c) #include "iodefine.h" volatile unsigned int cnt; //グローバル変数 void main(void) { cnt = 0; while(cnt < 1000); //ここで無限ループのまま(補足も参照) IO.PDR2.BIT.B0 = IO.PDR2.BIT.B0; //ここにブレークをかけても引っ掛らない } (intprg.c) #include <machine.h> #include "iodefine.h" extern volatile unsigned int cnt; #pragma section IntPRG (略) // vector 22 Timer V __interrupt(vect=22) void INT_TimerV(void) { cnt++; //(補足参照) TV.TCSRV.BIT.CMFA = 0; //コンペアマッチフラグクリア } (hwsetup.c) void HardwareSetup(void) { IO.PCR2 = 0xff; //出力ポート //タイマVの設定 TV.TCRV0.BYTE = 0x4b; /* CMFA有効, コンペアマッチAでクリア, φ/128 = 125kHz */ TV.TCRV1.BYTE = 0x01; /* 外部入力禁止 */ TV.TCORA = 125; /* 1ms */ TV.TCSRV.BYTE = 0x00; /* フラグクリア, 出力禁止 */ } (補足) 割込動作内でブレークをかけるとブレークがかかり、そこからステップ実行するとグローバル変数が変化していることを確認しました。 同様に、メインループの数値チェック無限ループでブレークをかけ、条件を満たすようにグローバル変数を手動で書き換えステップ実行すると無限ループを脱出しました。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
- ricardo_
- ベストアンサー率19% (14/72)
- f-tomohiko
- ベストアンサー率50% (11/22)
- f-tomohiko
- ベストアンサー率50% (11/22)
- ts244
- ベストアンサー率41% (53/127)
お礼
基本設定含め最初から確認することにしました。 よって、ここで一旦質問を打ち切らせていただきます。 ありがとうございました。
補足
早速の御回答ありがとうございます。 "main.c"の先頭部で以下のように宣言していますが何か間違っているのでしょうか? volatile unsigned int cnt; //グローバル変数