目次>5章 第2ステップ(色々な実験)>(5)TMR0割込みを使ってみる(LEDを点滅させる)>ソース
TMR0割込みを使ってみる(LEDを点滅させる)(ソース)
更新日2005.9.10
以下のソースを取り込んで、アセンブル→PIC書き込み→実行して下さい。
; ========================== ここから ==============================
; CLOCK 10MHz
; PORTB 0:LED緑,1:LED赤
;
; 緑と赤のLEDを点滅させる(TMR0使用)
;
LIST P=PIC16F84A ; LIST宣言で、使用するPICをPIC16F84Aと定義する
INCLUDE P16F84A.INC ; 設定ファイルp16f84a.incを読み込む
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
t_count EQU 0Ch ; TMR0割込みを19回カウントする
i_flag EQU 0Dh ; TMR0割込み19回発生フラグ
save_st EQU 0Eh ; STATUSのセーブ領域
save_w EQU 0Fh ; W-regのセーブ領域
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 t_count,F
GOTO T0EXIT
BSF i_flag,0 ; TMR0割込み19回発生フラグセット
MOVLW 19
MOVWF t_count ; 割込みカウンタの設定
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 087h ; OPTIONレジスタの設定
MOVWF OPTION_REG ; ^RBPU:1 ,T0CS:0 ,PSA:0 ,PS2-PS0:111
BCF STATUS,RP0 ; STATUSのRP0をクリア(0) → バンク0
MOVLW 0A0h ; INTCONの設定
MOVWF INTCON ; GIE:1 ,T0IE:1
MOVLW 19
MOVWF t_count ; 割込みカウンタの設定
CLRF i_flag ; TMR0割込み19回発生フラグクリア
CLRF PORTB ; PORTBをクリア
CLRF TMR0 ; TMR0をクリア
; << メイン処理 >>
LOOP
BTFSS i_flag,0 ; TMR0割込み19回発生?
GOTO LOOP ; NO
BCF i_flag,0 ; TMR0割込み19回発生フラグクリア
BTFSC PORTB,0 ; RB0 ON?
GOTO MAIN10 ; YES
BSF PORTB,0 ; RB0 ON
BSF PORTB,1 ; RB1 ON
GOTO MAIN20
MAIN10
BCF PORTB,0 ; RB0 OFF
BCF PORTB,1 ; RB1 OFF
MAIN20
GOTO LOOP ; LOOPに戻る
END ; プログラムの終了をアセンブラに指示する
; =========================== ここまで ===============================