はじめまして。よろしくお願い致します。
H8/36094を以下のクロック、割込を使用して動かしているのですが、IRQ0の処理がたまに(1,000回に1回くらい)起動しないことがあります。
これは、プログラムでIRQ0の処理の入り口でP81=L、出口でP81=Hとし、オシロでIRQ0とP81を観測することで確認しております。
試しにTimerAの割込周期を約50msecにしたところ、上記の現象は100,000回に1回程度になったのでTimerAが影響しているのだろうとは思いますが、どうしてこうなるのか分かりません。
プログラム中では初期設定以外でIENR1やIビットの操作はしていません。
解決のために何をチェックすればよろしいでしょうか。ご教示いただけるとありがたいです。
CPUクロック
・オンチップオシレータ 10MHzで動作
IRQ0
・割込周期:約50msec、立下りエッジ検出、Lowレベル:約2msec、処理時間:50usec以下
TimerA
・割込周期:819.2usec、処理時間:50usec以下
ADC
・割込周期:50msecごと、処理時間:50usec以下
WDT
・未使用
MOV.B @IRR1,R1L AND.B #H'BF,R1L ;IRR1のbit6 (IRRTA)のみクリア MOV.B R1L,@IRR1
確率としては低いものゝ IRR1 を読み込んだ直後のタイミングで IRQ0 が発生した場合、IRR1 への書き込みで上書きリセットしてしまう危険性はあるので、1命令で
BCLR #6,@IRR1 ;IRR1のbit6 (IRRTA)のみクリア
等とされるが良いと思います(H8 は使ったことないのでこう書けるかはわからん)。
一般論としてビット操作命令であってもCPUのバス上はリード・モデファイ・ライトだと思っているのですが、H8ではビット操作命令時は割り込み要求フラグのセットを遅延させるようなメカニズムがあったりするのでしょうか、、、
[追記]
すみません。RL78のUMにも藤田さんの指摘と同じことが書いてありましたので、そういうメカニズムがあるのでしょうね。(今までずっと気にしていなかったのですが、なぜか今回突然気になって、少々恥をかいてしまいました。)