- 締切済み
H8SX/1655のタイマー割り込みについて教えてください。
H8SX/1655のタイマー割り込みについて教えてください。 CQ出版の『今すぐ使える!H8マイコン基板』の基板の動作確認として、 基板上のLEDをタイマー割り込みで点滅させようとしたのですが動作しません。 HEWの設定上の問題と思いますが、思い当たるところがあれば教えてください。 HEW:Version 4.06.00.047 "iodefine.h"は自動生成されたものです。 ---HEWのコード #include <machine.h> #include "iodefine.h" unsigned long cnt0; // wait関数用 //割込み関数 #pragma interrupt( int_timer0 ) void int_timer0( void ) { TPU0.TSR.BIT.TGFA= 0; // フラグクリア cnt0++; } void wait( unsigned long wait_set ) { cnt0 = 0; while( cnt0 < wait_set ); } void main(void) { MSTP.CRA.BIT._TPUL =0; // 低消費電力モード解除 //タイマー設定 TPU0.TCR.BYTE = 0x23; //φ/64 TPU0.TIER.BIT.TGIEA = 1; TPU0.TGRA = 375; // 1/375 TPU.TSTR.BYTE = 0x01; // Timer Start //ポート設定 PM.DDR = 0x08; // LED Output port //割り込み許可 set_imask_ccr(0); while(1) { wait( 500 ); PM.DR.BIT.B3 = 1; wait( 500 ); PM.DR.BIT.B3 = 0; } } //intprg.c // vector 88 TGI0A TPU0 //__interrupt(vect=88) void INT_TGI0A_TPU0(void){/* sleep(); */} __interrupt(vect=88) void INT_TGI0A_TPU0(void){int_timer0(); }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- jin-tonic
- ベストアンサー率0% (0/0)
wait()関数内でcnt=0;としているのはおかしくありませんか? これだと、せっかく割り込みが発生してcnt++;しても、メインルーチンで呼び出されるたびに0クリアされウエイトの意味がないです。修正後のwait()関数のアッセンブラ展開を確認したほうがいいかもしれない。 理由:while( cnt0 < wait_set );で何も処理がないので、コンパイラーの最適化で展開されてないかもしれない。これは、杞憂かもしれないですが念のため。NOP:(正しい書き方ではないかも)を2~3ヶ入れる。 while( cnt0 < wait_set ) { ____NOP; ____NOP; } 以上ですが、お役に立てればうれしいです。