(toppers-users 1880) Re: H8/3048Fでの割り込みハンドラ利用手順に関する質問です.

Yuki WAKUDA wakuda @ robo.mein.nagoya-u.ac.jp
2005年 2月 5日 (土) 16:09:55 JST


大箸 様

湧田です.
アドバイス有難う御座います.

> ITUによるインターバルタイマーはIMFAフラグのクリアをしないと
> RTEしたあとにすぐ割り込みがかかってきてしまいます。
> そのため、使い始めるときも、TCNTをクリアしたときにIMFAも1回読み込んで
> クリアし、割り込みルーチンの最後でIMFAを読み込んでクリアが必要かと思います。

そうですよね.
マニュアルを読むとそのように書いてあるのですが,net上などのサンプルプログラム等では,IMFAクリアのみを行っている場合ばかり見かけま
す.
とりえあえず以下のように変更してみました.
/*======== ITU2   */
 .globl _imia2_handler_disable_int
_imia2_handler_disable_int:
 mov.b @0xFF7B, r01 /*ITU2用IMFAフラグのダミーリード*/
 mov.l #0xFF7B, er0 /*ITU2用IMFAフラグのクリア*/
 bclr #0, @er0
 rts    /*サブルーチンからのリターン*/
/*--------*/
ですが,

jspカーネル純正のシステムタイマーであるITU0の割り込み出口処理でも,
/*========
 *  タイマ -- Compare Match フラグをクリアーする。
 */
 .globl _timer_handler_disable_int
_timer_handler_disable_int:

 mov.l #SYSTEM_TIMER_IFR, er0
 bclr #SYSTEM_TIMER_IF_BIT, @er0
 rts
/*--------*/
のようにしてあるので,IMFAクリアの前のIMFAのリードは不要な気がするのですが,H8/3048のハードウェアマニュアル“10.5.2 ステータスフラグ
のクリアタイミング”にあるような,
「ステータスフラグはCPUが1の状態をリードした後0をライトするとクリアされます.」
という記述はユーザーとしてどう読めばよいのでしょうね.

コンペアマッチ動作の中でIMFAをリードしているということなのでしょうか.

湧田 雄基