PIC18F46K22でtimer2による割り込みを使用したLEDの0.5秒間隔の点滅サンプル(アセンブラ)

icon 項目のみ表示/展開表示の切り替え

概要

PIC18F46K22 のTimer2で4ms置きに割り込みを発生させ割り込みが125回発生したらLEDを点滅させる。
回路はPIC18F46K22でLEDを点滅(アセンブラ)のとおりである。
Timer1の設定方法は、PIC18 TIMER2計算を参照されたい。

プログラムの説明

メインプログラムでタイマー設定を行いPRレジスタに周期を設定し、無限ループとする。 4m秒後にPRレジスタとタイマー値が一致し割り込みによりinth割り込み処理ルーチンが起動される。 周期的に割り込ませるためにのinth割り込み処理ルーチン中で再度タイマー値の設定は必要ない。

タイマー設定値

FOSC/4=16MHz
プリスケーラ 1:16
ポストスケーラ 1:16
PR2=(16000000/16/16)*0.004=250
0から250までカウントされPRレジスタとカウント値が一致した場合割り込みが発生する。
PR2レジスタを設定せず他のタイマーと同様にTMR2レジスタで初期設定もできる。

ソースファイル

以下のファイルで構成されている
timer2a1.asm ・・・ メインプログラムと割り込み処理プログラム

ソースファイルのダウンロード timer2a1.zip


; timer2による割り込みを使用したLEDの0.5秒間隔の点滅サンプル 2014/02/22 11:00
; 慈渓博瑞テクノロジー株式会社 PIC18F46K22 マイコンキット Ver2013.12.08用
;   http://akizukidenshi.com/catalog/g/gK-07231/
;   水晶は16MHzに交換してPICを64MHzで駆動
; MPLAB X IDE v1.85 Microchip MPASM(v5.51)
; PicKit 3

        #INCLUDE <p18f46k22.inc>
        ; 水晶発振(16MHz) クロック分周無 PLL有効(*4) プライマリクロック有効  ウォッチドッグタイマ無効 低電圧プログラム書き込みモード無効
        CONFIG FOSC = HSHP,PLLCFG=ON,PRICLKEN=ON,WDTEN=OFF,LVP=OFF

LED_ADS  EQU      PORTB
LED0     EQU      RB5
TMR2SET  EQU      d'250'

bank0   UDATA   ; 変数の定義 バンク0
Count   RES     1


        CODE
        ORG 0
        goto   start    ;   リセット時
        org 08h
        goto   inth     ;   割り込み

start
        movlb   d'15'

        movlw   b'00011111'     ;   RB5をIO
        movwf   ANSELB,BANKED   ;   bank 0Fh
        movlw   b'00011111'     ;   RB5をIO
        movwf   TRISB
        movlw   b'00100000'     ;   RB5を出力
        movwf   PORTB

        movlw   b'01111110'     ;   1:16 1:16
        movwf   T2CON
        movlw   TMR2SET
        movwf   PR2
        bsf     PIE1,TMR2IE
        bsf     INTCON,PEIE
        bsf     INTCON,GIE
        movlw   d'125'
        movwf   Count
        bsf     LED_ADS,LED0
        goto    $

inth    ;   高位割り込み
        bcf     PIR1,TMR2IF ;   割り込みフラグクリア
        decfsz  Count
        goto    L1
        movlw   d'125'
        movwf   Count
        btg     LED_ADS,LED0
L1
        retfie  FAST

        END