はじめまして。よろしくお願い致します。
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にも藤田さんの指摘と同じことが書いてありましたので、そういうメカニズムがあるのでしょうね。(今までずっと気にしていなかったのですが、なぜか今回突然気になって、少々恥をかいてしまいました。)
SAさん、チョコさん、ありがとうございます。(すみません。追記したら Content Under Review となる投稿になった為、追記を減らして再度投稿します。)H8/300H Super Low PowerのFAQにあったのですね。H8_300Hファミリ、H8_TINYファミリ、H8ファミリのFAQは見たのですが、まさに読み飛ばしたところにあったとは、、、ちなみに、H8/36094のハードウェアマニュアルや上記のFAQ、純正コンパイラでのアプリケーションノートで割り込みを使っていそうな幾つかの例、さらに、GCCでのウェブ上の入門記事、とか見てみたのですが、割り込み処理中というか正確には割り込みディセーブル中でも割り込み要求フラグのクリアにビット操作命令を使うように、とのアドバイスは見付けられなかったです。せっかく調べたので、あとで画面コピーとかURLとか追記しようかと思っています。 → 追記しました。[追記]RL78/G13のハードウェアマニュアルには以下の記載がありました。www.renesas.com/ja-jp/doc/products/mpumcu/doc/rl78/r01uh0146jj0330_rl78g13.pdf他方、H8/36094では先ほど書いたドキュメントには、そのような記載は見つけられなかったです。ハードウェアマニュアルH8/36094 グループ ハードウェアマニュアルルネサス16ビットシングルチップマイクロコンピュータ H8ファミリ/ H8/300H Tiny シリーズwww.renesas.com/ja-jp/doc/products/mpumcu/002/rjj09b0278_h836094hm.pdfFAQContent Under Reviewとなるのを避けるため略純正コンパイラでのアプリケーションノート例H8/300H Tiny シリーズ内部割り込みによる多重割り込み動作H8/300H Tiny シリーズオートリロードタイマ機能による割り込み周期設定16ビットフリーランニング機能による割り込み回数のカウントGCCでのウェブ上での入門記事例Content Under Reviewとなるのを避けるためURLを略イチから作って丸ごと学ぶ! H8マイコン道 - MONOistH8で学ぶマイコン開発入門 - MONOist