【基礎電子工学Ⅱ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

Комментарии •