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