タイマー0の使い方(その1)


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です。


   目次ページへ