目次>9章 PIC18F1320編 > PORTBピン変化割込みを使う

PORTBピン変化割込みを使う

更新日2009.1.11

ここでは、PIC18のPORTBピン変化割込みを使って見ます。
PIC16と大きく変わる点はありません。

実験回路

今回の実験回路です。

スイッチ周りの抵抗とコンデンサは、チャタリングキャンセル回路です。
簡易的な回路ですが、今回使ったスイッチではチャタリングによる誤動作は発生しませんでした。

680Ωの抵抗2本は、300Ω〜1KΩ程度の範囲であれば何でもOKです。

ブレッドボードに仮組みした状態。
回路図に無い6ピン周りはICSP用です。


PORTBピン変化割込みとは

PORTBピン変化割込みとは、その名の通りPORTBのピンの状態が変化(H→LまたはL→H)した時に割込みが発生します。
この対象ピンはPORTB全てでは無く、RB4〜7の4ピンで、かつ入力モードに設定したポートが対象になります。

複数のピンをピン変化割込みの対象とした場合、どのピンが変化して割込みが発生したかは、割込みルーチンの中で前回の状態を管理しておき判定する必要があります。

もう一つ注意する点は、割込みルーチンから戻るまでにINTCONのRBIFビットをクリアする点と、その前にPORTBの読み出し操作をしておく必要があると言う点です。
この処理を行わないと割込みが連続して発生してしまいます。

これらは、PIC16でも同じです。


プログラムの仕様

PORTBピン変化割込みを有効にします。
そして、RB4のプッシュボタンスイッチにより発生するピン変化割込みの中でRB0/RB1のLEDを点滅させます。
ピン変化割込みは、スイッチのON/OFFいずれでも発生しますが、ONにした時(H→L)だけLEDの状態を変化するようにします。

スイッチのチャタリング対策は行いません。(回路で簡易的に対処しているので)

割込みはPIC18の優先割込み機能を使わずPIC16互換で使用します。


PORTBピン変化割込みで使うレジスタ

ピン変化割込みで使うレジスタはINTCONのみで、PIC16と互換があります。

INTCON
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
GIEPEIETMR0IEINT0IERBIETMR0IFINT0IFRBIF

ピン変化割込みで使うビットは以下の3つで、赤の状態に設定します。
これ以外のビットは0にしておきます。

GIE全割込み禁止ビット
1:割込み許可(個々の割込み有効・無効ビットに従う)
0:全ての割込み禁止
RBIEピン変化割込み有効・無効ビット
1:ピン変化割込み有効
0:ピン変化割込み無効(禁止)
RBIFピン変化割込み発生フラグ
1:ピン変化割込みが発生した(割込み処理でクリアが必要)
0:ピン変化割込みは発生していない

プログラム

今回のプログラムはこちらです。

スイッチを押す毎に2つのLEDの点灯状態が入れ替われば成功です。
スイッチを離した時はLEDの状態は変わりません。

動作が不安定な場合は以下を試して見て下さい。

  1. 割込み処理でRB4の状態を判定しているが、この前にNOP命令を5〜10個入れる
  2. クロックを遅くする(1MHz程度)

今回のテーマではありませんが、0.01uFのコンデンサの容量を大きくすれば、チャタリングキャンセルの効果も大きくなります。
ただし、スイッチ操作の反応が鈍くなりますので、その場合は上記No1の対応が必要になり、NOP命令の数も増やす必要があります。

コンデンサの容量を変えたりコンデンサを外したりスイッチの種類を変えたりして、どんな動きになるか試すのも良いでしょう。

使わないRB5−7は、入力モードにしてプルダウンする予定でしたが動作が不安定になりました。
入力モードにして、PORTB弱プルアップ機能を有効にしても同様です。
最終的に、出力モードでオープンにして安定しました。
アップしたプログラムも出力モードにしてあります。


PIC18の勧め(Vol.7)

その9. 優先割り込みモードを使わなければPIC16と同様に使える
PIC18で追加された優先割り込みモードを使わなければ(割込みをPIC16互換で使用すれば)、PORTBピン変化割込みはPIC16と同様に扱えます。