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