目次>8章.機能が豊富なPICを使う(PIC12F683)>GP2/INT割り込みを使う>ソース
GP2/INT割り込みを使う(ソース)
(ひとの動きを検出したら明かりを点ける)更新日2006.1.15
以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。
; ========================== ここから ============================== ; ; PIC12F683 ; clock:INTOSCIO 1MHz ; 電源:単三乾電池三本(4.5V) ; ; 内部クロック1MHz ; 全てのピン(6ピン)をデジタルIOで使用 ; GP0: Cds(入力) ; GP2: NaPiOn(GP2/INT) ; 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_ON & _IESO_OFF& _PWRTE_ON & _INTOSCIO & _MCLRE_OFF save_st EQU 020h ; STATUSのセーブ領域 save_w EQU 021h ; W-regのセーブ領域 CNT19 EQU 022h ; TMR0割り込みを19回カウントするカウンタ napion EQU 023h ; NaPiOn状態フラグ flag5s EQU 024h ; 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 ; 割込みフラグクリア DECFSZ CNT19,F ; CNT19−1が0か? GOTO INTEXIT ; No ; Yes (5秒経過) MOVLW d'19' MOVWF CNT19 ; CNT19に19をセット BSF flag5s,0 ; 5秒経過フラグをON 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 ; 割込み許可にしてリターン ; ここまで割込み処理 INIT ; << PICの初期化 >> MOVLW 07h MOVWF CMCON0 ;GP2-0はデジタルIO BSF STATUS,RP0 ;■バンク1に切替え MOVLW 0Fh MOVWF TRISIO ; GP0-3は入力,GP4-5は出力 MOVLW 087h ; OPTIONレジスタの設定 MOVWF OPTION_REG ; ^RBPU:1 ,INTEDG:0 ,T0CS:0 ,PSA:0 ,PS2-PS0:111 MOVLW 040h ; CLOCK=1MHz 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'19' MOVWF CNT19 ; CNT19に19をセット CLRF flag5s CLRF napion ; << メイン処理 >> BSF GPIO,4 ; 電源ON後NaPiOnが安定するまで緑色LED点灯 WAIT5S ; 電源ON後、NaPiOnの回路が安定するまで10秒待つ BTFSS flag5s,0 ; 5秒経過フラグON? GOTO WAIT5S ; No BCF GPIO,4 ; 電源ON後NaPiOnが安定するまで緑色LED点灯 BSF INTCON,INTE ; RB0/INT割込み許可 MAIN CALL DISP ; NaPiOn状態を緑色LEDで表示 BTFSS napion,0 ; NaPiOn状態は1? GOTO NAPI2 ; No NAPI1 ; << NaPiOn状態が1の時(GP2/INT割込み発生) >> CLRF TMR0 ; TMR0クリア MOVLW d'19' MOVWF CNT19 ; CNT19に19をセット CLRF flag5s ; 5秒経過フラグクリア MOVLW d'2' MOVWF napion ; NaPiOn状態を2にする GOTO MAIN ; << NaPiOn状態が1で無い時 >> NAPI2 BTFSS GPIO,0 ; 暗い? GOTO SLEEPMODE ; No BTFSS napion,1 ; NaPiOn状態は2? GOTO MAIN ; No BSF GPIO,5 ; GP5をONにする BTFSS flag5s,0 ; flag5s(5秒経過フラグ)=1? GOTO MAIN ; No SLEEPMODE 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 DISP BTFSS GPIO,0 ; 暗い? GOTO DISP900 ; No BTFSS GPIO,2 ; NaPiOn = ON? GOTO DISP010 ; No BSF GPIO,4 GOTO DISP900 DISP010 BCF GPIO,4 DISP900 RETURN END ; =========================== ここまで ===============================