PIC 16シリーズで割り込みを禁止する場合、
BCF INTCON,GIE
(GIE(グローバル割り込み許可フラグ)をクリア)
とするのが普通である。
しかし、Microchipのアプリケーションノート AN576によると、この命令実行と同時に割り込みがかかると、この命令実行後に割り込みが実行されてしまい、割り込みサービスルーチンから抜ける時のRETFIE命令によって、GIEビットが1に、つまり割り込み受付状態になってしまうそうである。
うーむ、やばいな…。
AN576では
BCF INTCON.GIE
BTFSC INTCON,GIE
goto $-2 ;;;;;; GIEがクリアされていなかったらBCF INTCON,GIEに戻る
が対策コードとして例示されている。
AN576は 16Cシリーズ、17Cシリーズを対象にしたアプリケーションノートだが、わりと最近のデバイス 16F648Aのデータシートでも引用されているので、PICアーキテクチャのこのへんの部分は、現在でもそのままなのだろうか?
しかし、16F876Aのデータシートでは触れられていない。うーむ、どうなっているのだろうか?
2005/08/23追記。Microchipのwebサイト内検索を信用すれば、AN576を引用しているデータシートは PIC16F627A/628A/648A のもの (40044D.pdf) だけのようである。どういう意味だろうか。
コメント
テスト&セットになってない?同時に割り込みがかかるってのがミソか…
戻りでクリア…入口でロックして自動で解除…痛しかゆしだねぇ。
ループ組むのもダサいって気がするがPICだもんね、しゃーないか(笑
割り込みの実装を簡略にしすぎたんでしょうね。
昔の8ピンPICなんか割り込み機構自体無いのがあったし。
割り込み禁止の専用命令を用意すべきだったのでしょうね。
単に2回
BCF INTCON.GIE
BCF INTCON.GIE
をやるだけでほぼ対処できるのではないか、という意見もありました。
でもこれでは可能性はゼロにはならないような…。
12F683のデータシートを見てなんじゃこれと思い検索してたらこのサイトがヒットしました。
説明が分かりやすくて良かったです。