目次>5章 第2ステップ(色々な実験)>(9)RB0/INT割込みを使う

RB0/INT割込みを使う

− 人が近づいたら明かりを点ける −

更新日2005.11.26

PIC16F84Aには4つの割込み機能があります。
・TMR0オーバフロー割込み
・RB0/INT割込み(外部割込み)
・PORTB変化割込み
・データEEPROMライト完了割込み
TMR0割込みは今まで何回も使用しました。
今回は、RB0/INT割込みを使って見ます。

実験回路

今回作成する回路図です。
RB0にNaPiOnを接続しています。NaPiOnの出力で、RB0/INT割込みを発生させます。
NaPiOnについては、「(8)人が近づいたら明かりを点ける」を参照して下さい。

RA0,RA1にはLEDを接続します。RA0のLEDは高輝度タイプとしました。高輝度LEDと直列に接続する抵抗は、電流が20mA以下となるものを選択して下さい。

新たに必要なパーツは、高輝度LEDです。今回は、日亜化学の「NSPW500BS」を使用しました。
どんなタイプでもかまいませんが、流れる電流は20mA未満となるように直列抵抗を決めて下さい。

一番左のLEDが今回使用した高輝度LEDです。赤のLEDは今まで何度も使用してきたタイプです。

仕様
・電圧:3.6〜4V
・電流:20mA(MAX)
・輝度:9200mcd

ブレッドボードに組み込んだ状態です。
写真の左下が高輝度LEDです。PIC16F84Aの左にある黒い円柱のようなものはNaPiOnです。

プログラムの作成
プログラムの概要

基本的な仕様は、(8)人が近づいたら明かりを点けると同じですが、RB0/INT割込みを使う事とひとの動きが無い時は、SLEEP命令で省電力モードにする点が異なります。

・RB0/INTポートにNaPiOnを接続し、ひとの動きがあったらRB0/INT割込みを発生
・RA0に高輝度LEDを接続し、ひとの動きを検出したら点灯し動きが無くなっても10秒間点灯したままとする
・RA1には普通のLEDを接続し、RB0(NaPiOnの出力)の状態を表示する
・TMR0割込みにより、10秒の時間を作る((8)人が近づいたら明かりを点けると同じ)
・ひとの動きが無い時は、SLEEPモードにより省電力状態で待機する
 (今回の回路で、SLEEPモード時の電流は0.19mAでした。)


以下はメインルーチンのフローです。

napionフラグの状態で、処理が2つに分かれます。
・napionフラグが1の時は、10秒タイマ(TMR0)をセットし、napionフラグを2にします。
・napionフラグが2の時は、10秒経過(flag10sがセットされるのを)待ち、RA0(高輝度LED)をOFFにしてnapionフラグを0クリア後SLEEP状態にします。

napionフラグは、RB0/INT割込み処理で1にします。

RB0/INT割込みで使うレジスタについては、RB0/INT割込みを使うためのレジスタを参照して下さい。


以下は、割込み処理のフローです。
割込み処理は、TMR0割込みとRB0/INT割込みの2つを処理しますので、先頭でどちらの割込みかの判定をします。

TMR0割込み処理では、(8)人が近づいたら明かりを点ける」と同じで、10秒経過時にflag10sをセットします。

RB0/INT割込み処理では、RA0(高輝度LED)をONにしてnapionフラグを1にします。

プログラムで使用するフラグ

上の処理フローでは、フラグを2つ使っています。その使い方は次のようにしています。
フラグ用 途
napionNaPiOnの出力変化を3つの状態で管理します。
0:NaPiOnの出力が10秒以上OFFの場合
1:NaPiOnの出力がONからOFFになった時(RB0/INT割込み発生時)1にする
2:値が1になったら、10秒タイマをセットして2にする
  2である間、10秒経過(flag10sのセット)を待つ
flag10sTMR0割り込みルーチンで10秒経過をカウントしたら1にする

プログラム全体
上記の処理を組み込んだプログラムはこちらです。
メモ帳などのテキストエディタに取り込んで、NAPION2.ASMという名で保存し、MPLABでアセンブル&PICライタでPICに書き込んで動かしてみて下さい。