目次>5章 第2ステップ(色々な実験)>人が近づいたら明かりを点ける>ソース
人が近づいたら明かりを点ける(ソース)
更新日2005.11.12
以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。
; ========================== ここから ==============================
; CLOCK 10MHz
; PORTA 0:NaPiOn
; PORTB 0:LED緑,1:LED赤
;
; 人の動きを検出したら明かりを点ける
;
LIST P=PIC16F84A ; LIST宣言で、使用するPICをPIC16F84Aと定義する
INCLUDE P16F84A.INC ; 設定ファイルp16f84a.incを読み込む
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
save_st EQU 0Ch ; STATUSのセーブ領域
save_w EQU 0Dh ; W-regのセーブ領域
CNT38 EQU 0Eh ; TMR0割り込みを38回カウントするカウンタ
CNT10 EQU 0Fh ; 上記38回をさらに10回カウントするカウンタ
flag10s EQU 010h ; 10秒経過フラグ
napion EQU 011h ; NaPiOnの出力変化の管理
ORG 0 ; リセットベクタ(0番地)を指定する。
GOTO INIT ; 初期処理に行く
; << TMR0割込み処理 >>
ORG 4 ; 割込みベクタ(4番地)を指定する。
BCF INTCON,T0IF ; 割込みフラグクリア
MOVWF save_w ; W-regセーブ
SWAPF STATUS,W
MOVWF save_st ; STATUSレジスタセーブ
DECFSZ CNT38 ; CNT38−1が0か?
GOTO T0EXIT ; No
MOVLW d'38'
MOVWF CNT38 ; CNT38に38をセット
DECFSZ CNT10 ; CNT10−1が0か?
GOTO T0EXIT ; No
MOVLW d'10'
MOVWF CNT10 ; CNT10に10をセット
BSF flag10s,0 ; 10秒経過フラグをON
T0EXIT
SWAPF save_st,W
MOVWF STATUS ; STATUSレジスタロード
SWAPF save_w,F
SWAPF save_w,W ; W-regロード
RETFIE ; 割込み許可にしてリターン
; ここまでTMR0割込み処理
INIT
; << PICの初期化 >>
BSF STATUS,RP0 ; ↓ファイルレジスタSTATUSのRP0をセット(1)する → バンク1
CLRF TRISB ; ファイルレジスタTRISBをクリア(0) → PORTBは全て出力
MOVLW 01h
MOVWF TRISA ; ファイルレジスタTRISAの0ビット目のみON → RA0は入力
MOVLW 087h ; OPTIONレジスタの設定
MOVWF OPTION_REG ; ^RBPU:1 ,T0CS:0 ,PSA:0 ,PS2-PS0:111
BCF STATUS,RP0 ; ↑STATUSのRP0をクリア(0) → バンク0
CLRF PORTB ; PORTBを全てOFF
CLRF TMR0 ; TMR0をクリア
MOVLW 0A0h ; INTCONの設定
MOVWF INTCON ; GIE:1 ,T0IE:1(TMR0割り込み許可)
MOVLW d'38'
MOVWF CNT38 ; CNT38に38をセット
MOVLW d'10'
MOVWF CNT10 ; CNT10に10をセット
CLRF flag10s
CLRF napion
; << メイン処理 >>
WAIT10S ; 電源ON後、NaPiOnの回路が安定するまで10秒待つ
BTFSS flag10s,0 ; 10秒経過フラグON?
GOTO WAIT10S ; No
MAIN
BTFSC PORTA,0 ; RA0の状態チェック
GOTO RA0_ON ; ONの時
RA0_OFF ; NaPiOnの出力OFF
BCF PORTB,0 ; RB0をOFF
BTFSS napion,0 ; NaPiOn状態は1?
GOTO OFF_200 ; No
; << NaPiOn状態が1の時(ONからOFFになった) >>
CLRF TMR0 ; TMR0クリア
MOVLW d'38'
MOVWF CNT38 ; CNT38に38をセット
MOVLW d'10'
MOVWF CNT10 ; CNT10に10をセット
CLRF flag10s ; 10秒経過フラグクリア
MOVLW d'2'
MOVWF napion ; NaPiOn状態を2にする
GOTO MAIN
; << NaPiOn状態が1で無い時 >>
OFF_200
BTFSS napion,1 ; NaPiOn状態は2?
GOTO MAIN ; No
BTFSS flag10s,0 ; flag10s(10秒経過フラグ)1?
GOTO MAIN ; No
; BCF PORTB,1 ; RB0をOFFにする
BCF PORTB,1 ; RB1をOFFにする(20090224コメントのミス修正)
CLRF napion ; NaPiOn状態を0にする
GOTO MAIN
RA0_ON ; NaPiOnの出力ON
MOVLW 03h
MOVWF PORTB ; RB0をON,RB1をON
MOVLW 01h
MOVWF napion ; NaPiOnの状態管理に'1'を設定
GOTO MAIN
END
; =========================== ここまで ===============================