AVRの多重割り込みと優先順位について
AVRのATMEGA48シリーズのマイコンをよく使うのですが、割り込みについて勘違いをしていて数日悩んだので記しておきます。
今回のバグ、
ATMEGA88で、PWMをON時間を計測するために、外部割込みを使用しようと思いました。
本来はインプットキャプチャ機能を使うべきなのですが、どうしても1マイコンで2つのPWMを計測したかったため、
インプットキャプチャが1つしかない、ATmega88では使えなかったのです。
計測対象がRCサーボで使うような信号PWMなので、計測時間が1000usから2000us、10usくらいの精度にしたいと思っていたので、
外部割込みでも、なんとか行けるかな?と思いました。
もちろん時間計測用に他のタイマー割り込みも併用していました。
けれど、外部割込みの優先順位がもっとも高いので、たとえ他の割り込み最中だったとしても、TCNTを記録するくらいはできるはずである、という目算でした。
しかし、どうしても外部割込みのタイミングかバラバラで、うまくTCNTをキャプチャすることができませんでした。
いろいろ試していると、どうも他の割り込み最中だと、外部割込みがかかってないようでした。
優先順位が高いはずなのでおかしいな、と思い、もう一度よく調べてみると、
「優先順位が設定されているが、多重割り込みはデフォルトでOFFになっている」とのことでした。
これは完全に盲点でした。多重割り込みがOFFになっているとは露にも思っていませんでした。
多重割り込みをONにするには、割り込み動作中にsei()をすればよいだけでした。
よって、外部割込み以外のタイマーなどの割り込みの最初にsei()を実行するようにしたところ、うまくいきました。
悲しい、でも解決してよかったです。