タイマの使い方(遅延タイマー)

【遅延時間とは?】

 マイクロコンピュータでは直接外部機器を制御することが多くあり
ますが、常にマイコン側の速度と制御対象機器の速度をどこかで
合わせることが必要になります。
つまり、外部機器はリレーとかランプとかモーターとかセンサーとか
がありますが、いずれもマイコンの速度よりははるかに遅い速度で
しか動作しません。そこでマイコン側で遅延(ディレイ)をわざと作っ
て合わせてやる必要があります。
ここではその遅延の作り方を説明します。

【遅延の作り方】

まず遅延を作るにはどうするかというと、幾つかの方法があります。

1.命令実行時間を利用して、必要な命令の数を実行して遅らす。
  この方法は前のページで紹介していますのでそちらを参照願い
  ます。
2.タイマーを使って一定時間カウントし、カウントが終了するのを
  待つ。
  この待つ方法には、命令でカウントアップのフラグがONとなる
  のを待つ方法と、割り込みを待つ方法があります。
  


【タイマで遅延を作る方法】

PICに用意されているタイマーは色々な使い方が出来ます。例えば
  ・インターバルタイマとして使う
  ・カウンタとして使う
  ・ディレイタイマとして使う
  ・パルス出力に使う   などなど
ここでは、タイマで一定の時間を作り出す方法を説明します。
基本的な設定はインターバルタイマとして使う時と全く同じで、繰り
返しをしないだけです。

(1) 基本的な動かし方の流れ
 まず、タイマとして使うのは、PICシリーズの場合はTMR0を使い
 ます。このタイマを動かす基本的な方法は下記の手順となります。

       カウンタの動作モード設定
         ↓
       TMR0にカウント値設定
         ↓
       カウントアップ待ち

   (2) 実際のプログラム例
    上記の手順を実際のプログラムで書くと下記のようになり
    ます。
       BSF    STATUS,RP0  ;ページ1に切替え
       MOVLW  088H     ;カウンタモード値
                   ;(下記(4)項参照)
       MOVWF  OPTION_REG  ;モード設定
       BCF   STATUS,RP0  ;ページ0に切替え
       MOVLW  03CH     ;カウント値ロード
       MOVWF  TMR0     ;TMR0へ出力
    LOOP
       BTFSS  INTCON,T0IF  ;カウントアップ待ち
       GOTO   LOOP
       BCF   INTCON,T0IF  ;フラグクリア

(3) カウンタの時間設定
  上記プログラムでは適当な値をTMR0に設定していますが、この
  タイマで作られる時間はどうやって求めるのでしょうか?
  まず、タイマの動作原理から始めます。
  PIC16シリーズのタイマー(TMR0)は、CPUチップのクロックをもと
  にしてカウントするようになっています。  従ってある時間を作る
  ためのカウンター値は下記の様にして求めます。

     (インターバル時間)/(CPUクロックx4)

  例えば、CPUの水晶発振子が10MHz(0.1μsec)の時に100μsec
  の時間のタイマとするためには、100μsec/0.1usec*4=250 が
  カウント値となります。
  そこで上記のプログラムで03CHとなっている所を、0FAHと
  すれば、100μsecの時間のタイマが作れることになります。
  ただし、正確にはカウントアップ待ちの命令の実行時間も
  勘定に入れて考えなければなりません。

(4)プリスケーラの使い方
 PICシリーズのタイマ(TMR0)には、プリスケーラという機能がついて
 います。これは何をするかというと、上記の方法では、256がTMR0
 のカウント値の上限ですから、せいぜい100μsecが出来るタイマの
 時間の上限ということになってしまいます。そこで、このプリスケーラ
 の機能を追加すると、TMR0のカウンタの前段にもう一つ最大8ビット
 のカウンタが追加され、カウント値の上限が 256x256 まで拡大され
 ることになります。この前段に挿入されるカウンタは、1ビット毎に
 最大8ビットまで指定したビットとすることができ、前段でカウントを
 プリスケーラするためプリスケーラと呼びます。
 このプリスケーラの設定方法は下記の様な値をOPTIONレジスタ に
 設定することで行います。(上記プログラム参照)

  OPTION_REGへの設定値   プリスケーラ値
     80          2(1ビット)
     81          4(2ビット)
     82          8(3ビット)
     83         16(4ビット)
     84         32(5ビット)
     85         64(6ビット)
     86        128(7ビット)
     87        256(8ビット)

 これで例えば、87をOPTION_REGに設定すると、最大のタイマ時間は
 クロックが10MHzの時には 256x256x0.4μsec=約26msec ということに
 なり大幅に長い時間のタイマが出来ることになります。


次のページへ   目次ページへ