PORTBはすべて外部からの変化を割り込みで検知できる。
これが表題のInterrupt-On-Changeだ。
MCCしか見ないので、初めは下のように1つしかピンが割り当てられないのだと思い込んでいた。
データシートを見るとInterruptの項目のさらに下の方にInterrupt-On-Changeという別項目でちゃんと載っていた。
上のEXT_INTというやつとの違いはまだ見てないが、とりあえずたくさん使える方をやってみようと思う。
通常の手順でとりあえず3本をInputに設定する。
Pin Moduleの右の方にIOCがあるので、ここでは3つともnegativeに設定した。
negativeはNegative going edgeで割り込みを発生させるという意味で、立下りエッジを検出ということだ。
入力ピンは内部でプルアップしてあり、スイッチの押下でGNDとつながるような回路にしてあるのでこの設定でいいだろう。
逆の設定にも両方検知にもできる。
Generateする。
あとはpin_manager.cの以下の部分に処理を書くだけだ。
RB3を例にフラグ・レジスタについて書くと、
IOCBNbits.IOCBN3 = 1;
で立下り検知が有効、
IOCBPbits.IOCBP3 = 1;
で立ち上がり検知が有効、両方1にすれば両方検知され、両方0なら検知しなくなる。
検知の状態は、
IOCBFbits.IOCBF3
が持つ。
全体を有効にするには
INTCONbits.IOCIE = 1;
とし、これでInterrupt-On-Change自体がEnabledになる。
ちなみに、
INTCONbits.IOCIF
は、どれか1つでも何かしらの変化があれば1を持つ。
当然、以上の初期設定はすべてMCCが勝手にコードに書いて吐き出してくれるので、自分では上で赤線を引いた部分に割り込み発生時の処理を書くだけだ。