プロが教えるわが家の防犯対策術!

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(); }

A 回答 (3件)

wait()関数内でcnt=0;としているのはおかしくありませんか?


これだと、せっかく割り込みが発生してcnt++;しても、メインルーチンで呼び出されるたびに0クリアされウエイトの意味がないです。修正後のwait()関数のアッセンブラ展開を確認したほうがいいかもしれない。
理由:while( cnt0 < wait_set );で何も処理がないので、コンパイラーの最適化で展開されてないかもしれない。これは、杞憂かもしれないですが念のため。NOP:(正しい書き方ではないかも)を2~3ヶ入れる。
while( cnt0 < wait_set )
{
____NOP;
____NOP;
}
以上ですが、お役に立てればうれしいです。
    • good
    • 0

質問内容からでは、詳細はわかりませんが、思い当たることとして


これはROM化して動作確認したのでしょうか?
それともHEWのシリアルモニタのデバッガで確認されているのでしょうか?
後者なら、ベクタテーブル等のロケーションの変更が必要になります。
    • good
    • 0

とりあえず、cnt0の型にvolatile修飾子を付けましょう。


割り込みの練習でもなければ、普通にカウンタ読んだ方が楽な気はしますが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!