【基礎電子工学ⅡENG】017-2:マイコン制御[割り込み処理/タイマー0割り込み(TMR0割り込み)/PIC16F84A]
HTML-код
- Опубликовано: 30 окт 2024
- *プログラムリストは、下記にあります↓
#マイコン制御#PIC16F84A#
【学習内容】
1:TMR0 割り込み1
2:TMR0 割り込み2
-----------------------------------------------------------------------------------
<プログラムリスト>(MPLABX Ver5.35)
コピー&ペーストでお使い下さい。
*”TABキー”でスペースの間隔の体裁を整えて下さい。
(プログラムの記述画面に”全角”のスペースが
含まれていると、ビルドに失敗します。)
-----------------------------------------------------------------------------------
<タイマー0(TMR0)割り込み
SW2=ONの間 LED(RB6) 0.3(s)間隔で点滅>
-----------------------------------------------------------------------------------
;------------------初期設定-------------------
LIST p=p16F84A
#INCLUDE "p16f84a.inc"
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
;--------------------------------------------
ORG 00h ;00h番地に以下の命令を格納
GOTO INIT ;初期化処理
ORG 04h ;04h番地に以下の命令を格納
GOTO INTER ;割込み処理
;---------------------------------------------
;------------------初期化設定------------------
INIT
OVFL_CNT EQU 0Ch ;オーバーフロー回数カウンタ
WREG_EV EQU 0Dh ;Wレジスタ退避用レジスタ
STATUS_EV EQU 0Eh ;STATUSレジスタ退避用レジスタ
BSF STATUS,RP0 ;BANK 1に切替え
MOVLW B'00000100' ;RA2を入力に設定(SW2)
MOVWF TRISA ;Wレジスタ→PORTA入出力設定
CLRF TRISB ;PORTBを全て出力に設定
MOVLW B'10000111' ;bit5(内部CK使用)
;bit3(分周器→TMR0に割り当て)
;bit2-0(分周比=1/256)
MOVWF OPTION_REG ;Wレジスタ→OPTIONレジスタ
BCF STATUS,RP0 ;BANK 0に切替え
CLRF PORTB ;Bポートの出力ビットに0をセット
MOVLW D'61' ;TMR0初期値=61
MOVWF TMR0 ;
MOVLW D'15' ;15→OVFL_CNT
MOVWF OVFL_CNT ;
;-----------------メインルーチン-----------------
MAIN
BTFSS PORTA,2 ;RA2が1(SW2=OFF)なら次の行をスキップ
GOTO SW2_ON ;(SW2 ON)
GOTO SW2_OFF ;(SW2 OFF)
SW2_ON
BSF INTCON,T0IE ;1→T0IE タイマ割り込みを許可
BSF INTCON,GIE ;1→GIE 割り込みを全般的に許可
GOTO MAIN ;MAINへ
SW2_OFF
BCF INTCON,T0IE ;0→T0IE タイマ割り込み禁止
CALL LED_OFF ;LED_OFFサブルーチン実行
GOTO MAIN ;MAINへ
;-----------------割り込み処理------------------
INTER
;Wレジスタ、STATUSレジスタ待避
MOVWF WREG_EV ;Wレジスタ→WREG_EV
SWAPF STATUS,W ;STATUSレジスタ上下反転→STATUS_EV
MOVWF STATUS_EV ;
BCF INTCON,T0IF ;0→T0IF TMR0のフラグクリア
MOVLW D'61' ;61→TMR0
MOVWF TMR0 ;
DECFSZ OVFL_CNT,F ;OVFL_CNT-1→OVFL_CNT
;OVFL_CNTが0なら次の行をスキップ
RETURN ;(OVFL_CNT≠0)
MOVLW D'15' ;(OVFL_CNT=0)15→OVFL_CNT
MOVWF OVFL_CNT ;
CALL LED_ONOFF ;LED_ONOFFサブルーチン
;Wレジスタ、STATUSレジスタ復帰
SWAPF STATUS_EV,W ;STATUS_EV上下反転→STATUSレジスタ
MOVWF STATUS ;
MOVF WREG_EV,W ;WREG_EV→Wレジスタ
RETFIE ;0→GIE 全体的に割込みを許可して
;メインルーチンへ
;-----------------LED点滅処理------------------
LED_ONOFF
MOVLW B'01000000' ;RB6を反転ビット指定
XORWF PORTB,F ;W (ExOR) F→F
;PORTBに反転出力(LED点滅)
RETURN ;
;-----------------LED消灯処理------------------
LED_OFF
MOVLW B'00000000' ;PORTBの全ビットに0をセット
MOVWF PORTB ;PORTBに出力(LED消灯)
RETURN ;
END