目次8章.機能が豊富なPICを使う(PIC12F683)>(5)GP2/INT割り込みを使う

GP2/INT割り込みを使う (PIC12F683)
(ひとの動きを検出したら明かりを点ける,省電力実用版)

更新日2006.1.15

PIC12F683のGP2/INT割り込みを使ってみます。
GP2/INT割り込みは、PIC16F84AのRB0/INT割り込みに相当します。

割り込み信号はNaPiOnの出力とし、単三乾電池3本で動作させます。

作るものは、「暗いときに人の動きを検出したら、高輝度LEDを5秒間点灯させる」です。
乾電池で動作させますので、極力省電力となるようにしました。

【2007.6.25】
2005年12月5日に電源を入れ、高輝度LEDが1日2〜5分(最長30分程度)点灯する環境で動作し続けていましたが、本日高輝度LEDが点灯しなくなりました。
緑のLEDは人の動きで点滅しますので機能はしています。
このときの電源(単三乾電池3本直列)電圧を測ると1.9Vでした。

単三乾電池3本で1年半動作し続けたことに驚きを感じています。

【2007.7.24】
2V程度でも支障無く動作するようですので、CR2032タイプのボタン型リチウム電池(3V)にして同じ回路で動作開始しました。
どの程度連続動作するか楽しみです。予想では2〜3ヶ月?
【2007.9.16】
まだ点灯しますが、実用には耐えられない明るさになりました。2ヶ月弱ですので、ボタン電池での実用化は無理そうです。

実験回路
実用化するために、Cdsセルにより暗い時だけ動作させるようにしました。
灯りには高輝度LEDを使います。
また、単三型乾電池3本を電源とします。PIC12F683は、乾電池2本でも動作できますが、高輝度LEDの動作電圧が最低3.6Vのため乾電池3本で4.5Vとしました。

入力は、
GP2/INT:NaPiOn
GP0:Cdsセル
出力は、
GP4:通常LED(NaPiOnの状態表示)
GP5:高輝度LED
としました。

プログラムの仕様
NaPiOnにより、人の動きを検出するとGP2/INT割り込みが発生します。
割り込み発生時にGP0(Cdsセル)の状態をチェックし、
 0であれば(明るければ)何もしません。
 1であれば(暗ければ)、5秒間高輝度LEDを点灯します。

待ち時間は、TMR0割り込みにより作成します。

人の動きを検出していない時は、SLEEP命令により省電力モードで待機します。
SLEEPモード時の消費電流は、0.19mAでした。

オシレータは1MHzの内部クロックを使用します。高速動作させる必要がありませんので、もっと遅くてもかまいません。

プログラムの作成

やる事は、PIC16F84Aで行った「RB0/INT割込みを使う」とほぼ同じです。

プログラムの概要

以下はメイン処理のフローです。

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

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


以下は割込み処理のフローです。
内容は、「5章 RB0/INT割込みを使う」とほぼ同じですので説明は省略します。
「RB0/INT割込みを使う」とは、TMR0割込み処理が変わっています。

PICの初期化(使用するレジスタ)

今回のプログラムで初期設定するレジスタと、その設定値について説明します。
GPIOレジスタ以外は、最初に設定するだけで実行中に変更する必要はありません。

ここでは、今回設定する値を中心に説明します。
レジスタのもう少し詳しい説明は、「PIC12F683のレジスタ(特殊レジスタ:SFR)」を参照して下さい。

<GPIOレジスタ>

ビットBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
記号--GP5GP4GP3GP2GP1GP0
設定値

ポート(GP0〜GP5)のON/OFFを制御するレジスタで、0をセットするとOFF(LEDは消灯),1をセットするとON(LEDは点灯)になります。
初期値としては、全て0にします。
尚、Bit3,6,7は設定が無視されますが、プログラムでは0をセットします。

<TRISIOレジスタ>

ビットBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
記号--TRISIO5TRISIO4TRISIO3TRISIO2TRISIO1TRISIO0
設定値

ポート(GP0〜GP5)を入力で使うか出力で使うかを指定します。

該当ポートは出力
該当ポートは入力

尚、Bit3,6,7は設定が無視されますが、プログラムでは0をセットします。

<CMCON0レジスタ>

ビットBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
記号-COUT-CINVCISCM2CM1CM0
設定値

コンパレータの動作を設定するために使用しますが、今回はGP0〜2をデジタル入出力として使用しますので、CM0〜CM2には1を設定します。

<OSCCONレジスタ>

ビットBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
記号-IRCF2IRCF1IRCF0OSTSHTSLTSSCS
設定値

OSCCONレジスタでは、オシレータの動作モードを設定します。
今回は1MHzで動作させますので、IRCF2のみ1を設定します。

<ANSELレジスタ>

ビットBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
記号-ADCS2ADCS1ADCS0ANS3ANS2ANS1ANS0
設定値

ANSELレジスタでは、アナログ入力(A/D変換)の設定を行います。
今回は、AN0〜AN3(GP0,1,2,4)はデジタル入出力で使用しますので、全て0にします。

コンフィグレーションビット(__CONFIG命令の設定)

__CONFIG命令では以下の記述をします。

__CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BOD_ON & _IESO_OFF& _PWRTE_ON & _INTOSCIO & _MCLRE_OFF

_CP_OFFプログラムメモリコードプロテクトしない
_CPD_OFFEEPROMメモリコードプロテクトしない
_WDT_OFFウォッチドックタイマ使用しない
_BOD_ON電源電圧低下監視を有効にする
_IESO_OFF内部・外部切り替えモード無効
_PWRTE_ONパワーアップタイマ有効
_INTOSCIOオシレータは内部クロック使用(2番ピン:GP5,3番ピン:GP4)
_MCLRE_OFFマスタクリア無効(4番ピンをGP3として使用)

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

今まで、PIC16F84Aを使用していた場合は、MPLABのプロジェクトウィザードで「PIC12F683」を選択して下さい。
また、PICライタでも同様に「PIC12F683」を選択して下さい。