山本ワールド
PIC18F46K22でtimer0による割り込みを使用したLEDの0.5秒間隔の点滅サンプル(アセンブラ)
概要
PIC18F46K22 のTimer0を割り込みを発生させLEDを0.5秒置きに点滅する。
回路はPIC18F46K22でLEDを点滅(アセンブラ)のとおりである。
Timer0の設定方法は、PIC18 TIMER0計算を参照されたい。
プログラムの説明
メインプログラムでタイマー設定を行い、無限ループとする。 0.5秒後に割り込みによりinth割り込み処理ルーチンが起動される。 周期的に割り込ませるためにinth割り込み処理ルーチンで再度タイマー値の初期値の設定TMR0H,TMR0Lを行う。
プリスケラ 1:256
16bitタイマー使用
初期時及びオーバーフロー割り込み(タイマー値が65535から0になった時発生)時に下記の値を設定すると
TMR0=65536-(16000000/256)*0.5=34286(TMR0H=133 TMR0L=238)
34286から65535までカウントされオーバーフローごとに割り込みが発生する。すなわち65536-34286=31250周期となる。
TMR0を設定しない場合は、0~65535までカウントされるので、1/(16000000/256)*65536=1.048576秒ごとの割り込みとなる。
タイマー設定値
FOSC/4=16MHzプリスケラ 1:256
16bitタイマー使用
初期時及びオーバーフロー割り込み(タイマー値が65535から0になった時発生)時に下記の値を設定すると
TMR0=65536-(16000000/256)*0.5=34286(TMR0H=133 TMR0L=238)
34286から65535までカウントされオーバーフローごとに割り込みが発生する。すなわち65536-34286=31250周期となる。
TMR0を設定しない場合は、0~65535までカウントされるので、1/(16000000/256)*65536=1.048576秒ごとの割り込みとなる。
ソースファイル
以下のファイルで構成されているtimer0a1.asm ・・・ メインプログラムと割り込み処理プログラム
ソースファイルのダウンロード timer0a1.zip
; timer0による割り込みを使用したLEDの0.5秒間隔の点滅サンプル 2014/02/22 10: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
TMR0HSET EQU d'133'
TMR0LSET EQU d'238'
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'10000111' ; 16bit FOSC/4 1:256
movwf T0CON
movlw TMR0HSET
movwf TMR0H
movlw TMR0LSET
movwf TMR0L
bsf INTCON,TMR0IE
bsf INTCON,GIE
goto $
inth ; 高位割り込み
bcf INTCON,TMR0IF ; 割り込みフラグクリア
movlw TMR0HSET
movwf TMR0H
movlw TMR0LSET
movwf TMR0L
btg LED_ADS,LED0
retfie FAST
END
Copyright (C) 2012 山本ワールド All Rights Reserved.