目次>6章 第3ステップ(実用品)>夜、人の動きを検知したら明かりを点ける>ソース
夜、人の動きを検知したら明かりを点ける(ソース)
更新日2006.12.16
以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。
; ========================== ここから ============================== ; ; PIC12F683 ; clock:INTOSCIO 8MHz ; 電源:単三乾電池三本(4.5V) ; ; 内部クロック8MHz ; 全てのピン(6ピン)をデジタルIOで使用 ; GP0: 未使用 ; GP1: 高輝度LED(出力) ; GP2: NaPiOn(GP2/INT) ; GP3: Cds ; GP4: 高輝度LED(出力) ; GP5: 高輝度LED(出力) ; ; NaPiOnによりGP2/INT割込みを発生させ、高輝度LEDを5秒間点灯させる ; Cdsにより、暗い時のみ動作 ; 時間待ちは、TMR0割込みを使用 ; 人の動きを検出していない時は、SLEEP状態(省電力待機)にする ; ; LIST P=12f683 #INCLUDE <p12f683.inc> __CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BOD_OFF & _IESO_OFF& _PWRTE_ON & _INTOSCIO & _MCLRE_OFF CBLOCK 020h save_st ; STATUSのセーブ領域 save_w ; W-regのセーブ領域 CNT19 ; TMR0割り込みを19回カウントするカウンタ napion ; NaPiOn状態フラグ timer ; タイマー(bit0:5秒) C25mS ; 25mSカウンタ(128uS×195) C5S ; 5Sカウンタ(128uS×195×200) ENDC t128uS EQU 0 t25mS EQU 1 t5S EQU 5 ORG 0 GOTO INIT ; 初期処理に行く ; ======================== 割込み処理 ======================== ORG 4 ; 割込みベクタ(4番地)を指定する。 MOVWF save_w ; W-regセーブ SWAPF STATUS,W MOVWF save_st ; STATUSレジスタセーブ BTFSC INTCON,T0IF ; TMR0割込み? GOTO T0INT ; Yes BTFSC INTCON,INTF ; GP2/INT割込み? GOTO GP2INT ; Yes GOTO INTEXIT ; No T0INT ; << TMR0割込み処理 >> BCF INTCON,T0IF ; 割込みフラグクリア BSF timer,t128uS ; 128μ秒経過フラグをON DECFSZ C25mS,F ; 25mS経過? GOTO INTEXIT ; No BSF timer,t25mS MOVLW d'195' MOVWF C25mS ; 25mSカウンタ(128uS×195) DECFSZ C5S,F ; 5S経過? GOTO INTEXIT ; No BSF timer,t5S ; 5秒経過フラグをON MOVLW d'200' MOVWF C5S ; 5Sカウンタ(25mS×200) GOTO INTEXIT GP2INT ; << GP2/INT割込み処理 >> BCF INTCON,INTF ; 割込みフラグクリア MOVLW d'1' MOVWF napion ; 1→NaPiOn状態 INTEXIT SWAPF save_st,W MOVWF STATUS ; STATUSレジスタロード SWAPF save_w,F SWAPF save_w,W ; W-regロード RETFIE ; 割込み許可にしてリターン ; ここまで割込み処理 ; ================= PICの初期化 ========================= INIT MOVLW 07h MOVWF CMCON0 ;GP2-0はデジタルIO BSF STATUS,RP0 ;■バンク1に切替え MOVLW 0Dh MOVWF TRISIO ; GP0,2,3は入力,GP1,4,5は出力 MOVLW 088h ; OPTIONレジスタの設定 MOVWF OPTION_REG ; ^RBPU:1 ,INTEDG:0 ,T0CS:0 ,PSA:1 ,PS2-PS0:000 MOVLW 070h ; CLOCK=8MHz MOVWF OSCCON CLRF ANSEL ;デジタルIO(AN機能を使用しない) BCF STATUS,RP0 ;■バンク0に切替え CLRF GPIO ; GPIOをクリア CLRF TMR0 ; TMR0をクリア MOVLW 0A0h ; INTCONの設定 MOVWF INTCON ; GIE:1 ,T0IE:1(TMR0割り込み許可) MOVLW d'195' MOVWF C25mS ; 25mSカウンタ(128uS×195) MOVLW d'200' MOVWF C5S ; 5Sカウンタ(25mS×200) CLRF timer CLRF napion ; 電源ON後、NaPiOnの回路が安定するまで5秒待つ BSF GPIO,5 ; 電源ON後NaPiOnが安定するまで高輝度LED一つを点灯 WAIT5S BTFSS timer,t5S ; 5秒経過フラグON? GOTO WAIT5S ; No BCF GPIO,5 ; 高輝度LED消灯 BSF INTCON,INTE ; RB0/INT割込み許可 ; ================= メイン処理 ========================= MAIN BTFSS napion,0 ; NaPiOn状態は1? GOTO NAPI2 ; No NAPI1 ; << NaPiOn状態が1の時(GP2/INT割込み発生) >> CLRF TMR0 ; TMR0クリア BCF timer,t5S ; 5秒経過フラグクリア MOVLW d'200' MOVWF C5S ; 5Sカウンタ(25mS×200) MOVLW d'2' MOVWF napion ; NaPiOn状態を2にする GOTO MAIN ; << NaPiOn状態が1で無い時 >> NAPI2 BTFSS GPIO,3 ; 暗い? GOTO SLEEPMODE ; No BTFSS napion,1 ; NaPiOn状態は2? GOTO MAIN ; No BSF GPIO,1 ; GP1をONにする BSF GPIO,4 ; GP4をONにする BSF GPIO,5 ; GP5をONにする BTFSS timer,t5S ; 5秒経過フラグ=1? GOTO MAIN ; No SLEEPMODE BCF GPIO,1 ; GP1をOFFにする BCF GPIO,4 ; GP4をOFFにする BCF GPIO,5 ; GP5をOFFにする CLRF napion ; NaPiOn状態を0にする SLEEP ; 省電力モードで待機(GP2/INT割込み待ち) MOVLW d'1' MOVWF napion ; NaPiOn状態を1にする GOTO MAIN END ; =========================== ここまで ===============================