こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

AKI-H8/3048Fでのタイマ割り込み

秋月電子で
http://akizukidenshi.com/catalog/items2.php?p=1&q="K-00004"
を買いマイコンの勉強をしています。
コンパイル等はGCC Developer Lite、モニタプログラムを使いRAM上で
動作確認をしています。
タイマによる割り込みをしたいと思い、参考書のプログラムを参考に
マザーボード上の2つのLEDが交互に光るようにしたいのですが、
肝心のint_imaia0()が全く実行されていません。

#include <3048.h>

int c;

void int_imia0( void )
{
ITU0.TSR.BIT.IMFA = 0;
c -= 1;
if( c == 0 ){
P5.DR.BYTE = ~ P5.DR.BYTE;
c = 10;
}
}

int main( void )
{
c = 10;
P5.DDR = 0x03;
ITU0.TCR.BIT.CCLR = 1;
ITU0.TCR.BIT.TPSC = 3;
ITU0.GRA = 39999;
ITU.TSTR.BIT.STR0 = 1;
P5.DR.BYTE = 0x01;
EI;
while( 1 ){
}
}

また、割り込みを使わない方法ということで

#include <3048.h>

int main( void )
{
int c = 10;
P5.DDR = 0x03;
ITU0.TCR.BIT.CCLR = 1;
ITU0.TCR.BIT.TPSC = 3;
ITU0.GRA = 39999;
ITU.TSTR.BIT.STR0 = 1;
P5.DR.BYTE = 0x01;
while( 1 ){
while( !ITU0.TSR.BIT.IMFA );
c -= 1;
if( c == 0 ){
P5.DR.BYTE = ~ P5.DR.BYTE;
c = 10;
}
ITU0.TSR.BIT.IMFA = 0;
}
}

を試したのですが、こちらはLEDが交互に点滅して成功しています。
なのでタイマ自体は動作していると思うのでですが、上のプログラムだと
int_imaia0()動作しません。
何がいけないのでしょうか?よろしくお願いします。

投稿日時 - 2006-10-20 22:50:55

QNo.2486255

困ってます

質問者が選んだベストアンサー

タイマインタラプトイネーブルレジスタ(TIER)の
設定し忘れのみのように思います。

#GDLのリンク参照しました。ベクタ登録等必要なしとは、
#便利にしているんですね。参考になりました。

投稿日時 - 2006-10-23 14:40:14

補足

無事にRAMに転送し動作させることが出来ました。

具体的にはソースで
ITU0.TIER.BIT.IMIEA = 1;
が抜けていたこと。

それとGDLでのリンカのスクリプトファイル(h8rom.x等)をRAM用に書き換える際に
http://d.hatena.ne.jp/gimme2s/20051114
を参考にしていたのですが、モニタプログラムで「?」としメモリの配置を見ると
Monitor Vector 00000 - 000FF
Monitor ROM 00100 - 07E65
Monitor RAM FEF10 - FF02F
User Vector FF030 - FF12F
となっていたので、h8rom.xの最初を
MEMORY {
vectors : org =0xff000, len =0x100
rom : org =0xff100, len =128k-0x100
ram : org =0xffef10, len =4k
eight : org =0xffff00, len =0x100
}
にすることで無事動作することが出来ました。
アドレスの設定が間違っていると、書き込めなかったり実行できなかったり、
割り込みが出来なかったりします。

同じH8/3048F+GDL+hterm+RAMに転送という環境で使っている人に
参考になれば幸いです。

投稿日時 - 2006-10-23 21:34:49

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

割り込みベクタの登録はできていますか?

また、int_imia0関数は普通の関数ですが、このままでは割り込みハンドラとしては使えません。
アセンブリ言語で、レジスタの退避・復帰処理と割り込みからのリターン処理を記述し、そこからこの関数を呼び出すようにするか、__attribute__((interrupt_handler))属性を付けてやる必要があるかと思います。

投稿日時 - 2006-10-20 23:34:51

補足

GDLを使う限りそういった宣言はいらないように思えるのですが・・
http://homepage1.nifty.com/rikiya/software/4GDL.htm

投稿日時 - 2006-10-21 09:06:00

あなたにオススメの質問