目次>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
; =========================== ここまで ===============================