IRQ割り込みなどの外部割込みは割り込み要因に立ち上がりエッジ、立ち下がりエッジが選択できるようになっているのでそれを利用します。(リスト4)(リスト5)
リスト4
39行目 :long型の COUNTを宣言します。
44行目〜 :IEGR1レジスタのIEG0ビットがIRQ0のエッジ選択ビットになっています。ここでカウントアップの条件は
IRQ0(A相)の割り込みが立ち上がりエッジで発生し、B相がLOW
IRQ0(A相)の割り込みが立ち下がりエッジで発生し、B相がHI
カウントダウンの条件は
IRQ0(A相)の割り込みが立ち上がりエッジで発生し、B相がHI
IRQ0(A相)の割り込みが立ち上がりエッジで発生し、B相がLOW
56行目: NOT演算子で割り込みエッジを反転させます。 立ち上がりエッジで発生した割り込みならば次は立ち下がりエッジで、立ち下がりエッジで発生した割り込みならば次は立ち上がりエッジで割り込みが発生します。
リスト5
このプログラムの実行結果は図6のとおりです。
図6
立ち下がりエッジだけで割り込みをかけていたものを、立ち上がりエッジでも割り込みをかけるようにするとエンコーダディスクが同じだけ回転したときでも2倍の量の割り込みが発生するようになります。PUPPYのロータリエンコーダは車輪の回転角を測るものですから、エンコーダディスクの回転角に対してより多くの割り込みが発生したほうが正確な車輪の回転角を計測することができます。そこで、先ほどは2倍でしたが今度は4倍にチャレンジしてみましょう。