目次>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                 ; プログラムの終了をアセンブラに指示する
; =========================== ここまで ===============================