1.インターバルタイマとして使う
一定時間間隔でタイマーから割込みをもらって処理をする
場合は意外に多くあります。
そこでこの一定間隔で割込みをいれるいわゆるインターバル
タイマーとしての動かし方を説明します。
(1)カウンタの設定値の求め方
PIC16シリーズのタイマー(TMR0)は、CPUチップのクロックを
もとにしてカウントするようになっています。
従ってあるインターバル時間を出すためのカウンター値は下記の
様にして求めます。
(インターバル時間)/(CPUクロックx4)
例 CPUの水晶発振子が10MHzの時に20msecの
インターバルとするためには、
20msec*1000/0.1usec*4=50000
(2)プリスケーラとの関係
TMR0には8ビットのプリスケーラが接続されています。
従って8ビット+8ビットで合計16ビットで65,535までの
カウントが出来ます。
プリスケーラの動かし方は 2,4,8,16,32,64,128,256 カウントの
8種類となっています。
従ってカウンタの設定の仕方は下記で求めます。
TMR0のカウント値=必要なカウント値/プリスケーラ設定値
例 上例 20msec のタイマーとするには、
50000/256=約195(16進で C3H)となります。
従ってカウンタの設定値は結局下記となります。
プリスケーラ→ 256カウント
これ以外ではTMR0がオーバーフローする。
TMR0 → カウンタはアップカウンタなので
FFH−C3H=3CHで 3Cが設定値となる。
(3)カウンタの設定
実際にカウンタへ設定値を出力するには、下記の様にします。
・プリスケーラの設定
BSF STATUS,RP0 ;ページ1に切替え
MOVLW 087H ;256カウントモード値
MOVWF OPTION_REG ;モード設定出力
BCF STATUS,RP0 ;ページ0に切替え
・TMR0へ出力
MOVLW 03CH ;カウント値ロード
MOVWF TMR0 ;TMR0へ出力
(4)インターバルタイマとしての動作
インターバルタイマとして動かすにはタイマーのカウントアップ
で割込んで来たときに、再度タイマを設定して続けて次の動作を
するようにします。
メインルーチン 割込み処理ルーチン
↓ ↓
プリスケーラ設定 タイマ割込みフラグクリア
↓ ↓
TMR0にカウント設定 TMR0にカウント値再設定
↓ ↓
割込み許可 −−−−−(他の処理)
→→→↓ ↓
↑ 割込み待ちループ RETFIE
|___↓
(5)実際のコーディング例
上記のフローで実際にコーディングした例を下記に示します。
CPUは10MHzで、インターバルは20msecの例です。
LIST P=PIC16F84 ;CPUの指定
INCLUDE "P16F84.INC" ;定数ラベルファイル
ORG 0 ;RESETの入口
GOTO MAIN ;メインルーチンへ
ORG 4 ;割込みの入口
GOTO INTR ;割込み処理ルーチンへ
MAIN
BSF STATUS,RP0 ;ページ1に切替え
MOVLW 087H ;256カウントモード指定
MOVWF OPTION_REG ;プリセットカウンタへ出力
BCF STATUS,RP0 ;ページ0に切替え
MOVLW 03CH ;カウント値ロード
MOVWF TMR0 ;TMR0へ出力
BSF INTCON,T0IE ;タイマ割込み許可
BSF INTCON,GIE ;全体割込み許可
IDLE
NOP
(他の処理)
GOTO IDLE ;割込み待ちループ
INTR
BCF INTCON,T0I ;割込みフラグクリア
MOVLW 03CH ;カウント値ロード
MOVWF TMR0 ;TMR0へ出力 (他の処理)
RETFIE ;割込み許可リターン
さて次ぎはタイマの使い方のその2です。