タイマの使い方 


【標準タイマの機能と種類】

 標準タイマは8ビットから32ビットまですべてのPICマイコンに内蔵されている
タイマで、基本的な使い方は次の3通りになります。

 @ インターバルタイマ
  一定間隔の時間を得るために使います。通常は割り込みを使います。
  数μsecから数100msecの時間を得ることができます。

 A イベントカウンタ
  外部から入力されるパルス数をカウントする使い方で、荷物のカウンタや
  周波数カウンタなどの用途で使います。

B パルス幅測定
 ゲート機能を使って外部から入力されるパルスの幅を、命令サイクルの
 単位で測定します。

 F1ファミリに実装されている標準タイマの使い方を説明します。
これらのタイマの種類は大きく分けると、次の3種類となっています。

 @ タイマ0
 A タイマ1、タイマ3、タイマ5
 B タイマ2、タイマ4、タイマ6、タイマ8、タイマ10

 以降でそれぞれの構成と使い方を説明します。

【タイマ0の使い方】

A) タイマ0の内部構成
 タイマ0は初代のPICマイコンからある基本のタイマモジュールで、すべての
8ビットPICマイコンに実装されています。このタイマ0の内部構成は下図のように
なっています。


 タイマ0の本体はTMR0という8ビットのカウンタでこれがアップカウンタとして
動作します。
 フルカウントまで進むと次のパルス入力で0x00にロールオーバーしますが、
このとき割り込み要因としてTMR0IFビットを「1」にセットします。

 また、他のタイマ1/3/5にオーバーフロー信号を出力して、これでタイマ1/3/5の
ゲート機能を制御することもできます。


B) タイマ0関連レジスタ
 タイマ0の動作モードは、下図のOPTION_REGレジスタで設定します。
まず、TMR0のカウンタの入力パルス源はTMR0CSビットで選択され、内部クロック(Fosc)
の1/4つまり命令サイクルか、T0CKIピンに入力される外部パルスかになります。



 内部クロックを選択した場合には、一定周波数のパルスですから、TMR0カウンタは
一定周期でオーバーフローを発生します。これがインターバルタイマとしての動作になります。

 しかし、内部クロックそのままでは早過ぎますから、プリスケーラで分周したクロックパルス
とすることができます。このプリスケーラを使うかどうかはPSAビットで選択し、
 さらにプリスケーラの分周比をPS<2:0>の3ビットで8種類から選択指定できます。

 インターバル時間の調整はTMR0レジスタに値を設定してカウント開始値を変更することで
行います。短くする方向でしか調整できません。

 外部パルスを選択した場合には、T0CKIに入力されるパルス数をカウントすることに
なりますから、何らかのイベントごとに1パルス発生するようにすればイベントの回数を
カウントすることができます。
 この外部パルスを使う場合には、TMR0SEビットにより立ち上がりでカウントするか、
立下りでカウントするかのエッジを指定することができます。

 割り込みを使う場合には、INTCONレジスタのTMR0IEビットを「1」にセットすれば、
タイマ0の割り込みが許可され、オーバーフローで割り込みフラグTMR0IFが「1」にセット
されると、INTCONレジスタのGIEビットが「1」にセットされ、全体割り込みが許可されて
いれば割り込みが発生します。

 ここで注意しなければならないことがあります。上記でオーバーフローして割り込みが
発生したら、割り込み処理を実行しますが、次のタイマ0のインターバルを同じ時間と
するためには、この割り込み処理の中で、TMR0にカウント開始値を再セットしてやる
必要があることです。



【タイマ1/3/5の使い方】

A) タイマ1/3/5の内部構成
 タイマ1/3/5は、ちょっと高機能なタイマモジュールです。カウンタが16ビットカウンタと
なっていること、専用の発振回路を内蔵していること、ゲート機能があることです。
 また、タイマ1/3/5は単独で使うだけでなく、キャプチャ機能やコンペア機能と組み
合わせることができます。これにより、時間測定や、パルス幅測定など、さらに高機能な
使い方ができます。タイマ1/3/5の内部構成は下図のようになっています。
 図のTMRx(xは1、2、3のいずれか)が16ビットカウンタの本体で、TMRxHレジスタと
TMRxLレジスタの2個のレジスタを接続して構成されています。




B) 関連レジスタ
 タイマ1/3/5の基本動作はTxCONレジスタで、ゲート機能はTxGCONレジスタで行う
ことができます。これらのレジスタの詳細は下図のようになっています。




 カウントトリガとなるパルスはTMRxCS<1:0>ビットで5種類から選択できます。
選択したパルスは直接かプリスケーラで分周して使うことができます。
プリスケーラの分周比は4段階でTxCKPS<1:0>ビットで指定します。

 ・LFINTOSC           :31kHzという低い周波数の内蔵発振器
 ・システムクロック(Fosc)   :PICマイコンのクロック
 ・命令サイクル(Fosc/4)    :システムクロックの1/4
 ・外部クロック          :T1CKIピンに入力される外部パルス
 ・専用発振回路         :専用の発振回路で発振させたパルス

 専用発振回路は、32.768kHzのクリスタルを接続して使うことが前提になっていて、
クリスタルをSOSCOピンとSOSCIピン間に接続し、SOSCENビットを「1」にセットすると
発振するようになります。
 この発振パルスの周波数は2の15乗の周波数になっていますから、1秒とか0.5秒とかの
時計ベースのインターバルタイマとすることができます。
 この専用発振回路は独立になっていますので、スリープ中も発振を継続します。
したがって、タイマxの割り込みでスリープからウェイクアップするという間欠動作を
させることで、極低消費電力のシステムを構成することができます。
 ただしこの場合はクロック同期を非同期とする必要があります。なぜなら、同期回路は
システムクロックで動作していますからスリープ中は同期回路が停止してしまうためです。

 タイマ1/3/5をインターバルタイマとして使う場合の時間設定は、必要なカウント数と
なるようにオーバーフローする度にカウント開始値をTMRxHTMRxLに代入して設定する
必要があります。
 タイマ1、3、5を割り込みで使う場合も、タイマ0と同じように、TMRxIEビットを「1」にセット
して割り込みを許可し、INTCONレジスタのGIEビットとPEIEビットを「1」にセットすれば、
タイマxのオーバーフローで割り込みが発生します。
割り込み処理では、タイマxのカウント開始値を再セットし割り込みフラグTMRxIFをクリア
する必要があります。


C) ゲート機能の使い方
 タイマ1/3/5はこの基本機能の他に、構成図の上側にあるゲート機能が追加されています。
ゲート機能を使うと、ゲートが有効な間だけカウント動作をさせることができます。
このゲートのオンオフを次の4つの入力源から選択して行うことができます。

 ・TxGピンからの外部パルス
 ・タイマ0のオーバーフロー
 ・タイマ2/4/6のオーバーフロー
 ・タイマ10のオーバーフロー

 そしてこれらの入力源を下図に示すように、そのままゲート信号とするか、単一パルス
としてゲート信号とするか、入力のエッジごとにトグルさせた信号をゲートとするかを
指定できます。




【タイマ2/4/6/8/10の使い方】

A) タイマ2/4/6/8/10の内部構成
 このタイプのタイマは2/4/6/8/10と最大5個のモジュールを内蔵しているデバイスが
ありますが、各タイマはすべて下図のような構成となっています。
実際の内蔵タイマ数はデバイスごとに異なっていますのでデータシートで確認してください。



 タイマの本体は8ビットのカウンタTMRx(xは2、4、6、8、10のいずれか)で、入力パルス
によるアップカウンタです。
 このTMRxにコンパレータが接続されていて、常時周期レジスタPRxと比較されています。
そしてこの両者が一致すると「タイマx一致出力」として出力され、同時にTMRxが0にクリア
されます。
 これで、下図のようにTMRxは0からカウントを再開することになります。さらに再度PRxと
同じ値までカウントするとまた0にもどされます。こうして一定間隔でタイマx一致出力が
出力されることになります。

 他のタイマと異なり、この間はハードウェアだけで動作していますので正確な一定間隔と
なります。
 このタイマx一致出力にはポストスケーラと呼ばれる分周器が接続されており、設定された
回数の一致出力が出力されるとはじめて実際の割り込み要因となるTMRxIFビットが
セットされます。
 タイマxのパルス入力源はシステムクロックのFosc/4だけで、これにプリスケーラが接続
されていて、最大64分周まで分周することができます。


B) タイマ2/4/6/8/10の関連レジスタ
 タイマ2/4/6/8/10の動作を決めるのはTxCONレジスタで、下図のような構成となっています。


 例えばシステムクロックが32MHzとした場合、10msecというインターバル時間とするためには、
次のようにします。
 まずタイマxの入力パルスは命令サイクルなので32MHz÷4 = 8MHz → 0.125μsec となります。
これで10msecとするには、TXOUTPS<3:0>ビットでポストスケーラを1/10にして、タイマxの周期を
1msec周期とすることにします。これで1msec÷0.125μsec = 8000 カウントとなります。

 プリスケーラをTXCKPS<1:0>ビットで最大の64分周とすれば、8000÷64 = 125 となりますから、
PRxに1を引いた124を設定すれば正確な10msec周期のインターバルが得られます。

 これでタイマxの割り込みを許可すれば、正確な10msec周期の割り込みが得られ、
また割り込み処理の中では、割り込みフラグTMRxIFをクリアするだけで、
TMRxの再設定は必要ありません。
 タイマxの割り込みを許可するには、他と同様に、TMRxIEビットを「1」にセットし、
INTCONレジスタのPEIEビットとGIEビットを「1」にセットすれば、TMRxIFが「1」にセットされたときに
割り込みを発生します。


【プログラム例】

実際にタイマを使ったプログラム例です。

《例題1》
 下記はタイマ1を使った例で、専用発振器の32.768kHzで動作させて0.5秒のインターバル
タイマとした例です。メインループでTMR1IFビットをチェックし、1になった時点で0.5秒経過に
なりますから、ここで次の処理を実行しています。
毎回TMR1IFビットをクリアし、TMR1Hレジスタにゲタをはかせ直しています。
ここではTMR1Lレジスタは0からカウントすればよいのでゲタのはかせ直しは必要ありません。
実はこの時点で既にTMR1Lはカウントが進んでしまっていますから、ゲタをはかせ直すと
その分が誤差になってしまいますので注意が必要です。




《例題2》
 次はタイマ2とタイマ4を同時に使った例です。Foscを2MHzとして0.5μsec周期のTcyで
動作させ、タイマ2は0.5秒周期、タイマ4は0.1秒周期のインタバルタイマとしています。
いずれも割り込みを許可しています。



この例題の割り込み処理関数が下記となります。
タイマ2、タイマ4それぞれでLEDの点滅動作をさせています。タイマ2/4/6/8/10
の割り込みでは割り込みフラグのクリアだけで済み、PRxレジスタの再設定などは
必要ありません。