PIC32の状態変化割込みにハマる

PIC32MXにもデジタル入力端子の状態が変化した時に割込みをかける機能がある。他のCPUのものと同じようなものだろうと思っていたら、今回、ひどくハマってしまった。

PIC32の状態変化割込み機能の変わっている点は、外部端子と比較するためのレジスタをPORTレジスタ(GPIOの端子の値)を読み出すタイミングで更新する点。例えばPB4ポートで状態変化割込みが起きるように設定したとする。状態変化割込み後、PORTBを読み出せば、比較用のレジスタと端子の状態が同じになって割込み信号はクリアされる。割込み処理ルーチンでPORTBを読み出さないと、永遠に割込みということになる。通常は、状態変化を確認する必要があるのでPORTBを読み出すので、この点は問題無い。

問題は、PB4だけ読み出すというようなことが出来ない点。今回、しばらくすると割込みが起きなくなるという現象に遭遇し、調べたところ、PB4変化後、状態変化割込み処理ルーチンが動く前に、他の割込み処理でPORTBを読み出され、状態変化割込みがクリアされてしまっていた。割込みに有線順位をつけても回避は難しそうだし、そんなややこしいことはしたくない。

普通のやり方なら、PORTレジスタで割込みをクリアするのではなく、専用の割込みステータス・レジスタで割込みの発生を知らせ、クリアすることで再割込みを可能にするとかにするだろう。なんで、こんな仕様にしたのか謎。

PIC32の謎仕様というか、惜しい仕様としてはRTC機能。なかなか良いRTCが内蔵されているのだが、RTCだけに電源を供給するVbat端子が無い。PIC24FJ64GA3xx等にはVbat端子があるらしい。外付けRTCは買えば300円ぐらいするので是非PIC32MXにもVbat端子付きのものが欲しい。AVddがVbatの機能を兼ねて、Vddが0V, AVddが一定電圧以上であればDeep Sleepモードに落ちて、AVddからの電源でRTCだけ動くとかいうのはどうだろう。

あと、以前、PIC32には端子のプルアップ・プルダウン機能が無いのが惜しいとか書いていたが、実はあった。あるということは、その後石川さんの陰気な男でいいですかで読んで知ったのだが、今回初めて使ってみたら動いた。CNPUBやCNPDBみたいなレジスタで設定するのだが、データシートでは、状態変化割込みのところにしか説明が書いてない。名前からしても状態変化割込みを使わないと動作しないかもしれない気がするが、使わなくても使えるようだ。ということで、入力端子のプルアップ・ダウンができるようになって便利になった。

Leave a Reply

メールアドレスが公開されることはありません。