まくまくいろいろノート
タイマ 1 を使用する ─ PIC めもめも
2002-08-01

タイマ 1 はミッドレンジシリーズの PIC16F84 などで使用することができます。 タイマ 1 を使用することにより、より正確なインターバルタイマとして機能させることができます。

T1CON レジスタの構成

T1CON レジスタ (10h : Bank0)

(7)

(6)
T1CKPS1
(5)
T1CKPS0
(4)
T1OSCEN
(3)
T1SYNC
(2)
TMR1CS
(1)
TMR1ON
(0)
  • T1CKPS1 (5) ~ T1CKPS0 (4): タイマ 1 入力クロックプリスケール選択ビット
    • 00 ・・・ 1:1 プリスケール値
    • 01 ・・・ 1:2 プリスケール値
    • 10 ・・・ 1:4 プリスケール値
    • 11 ・・・ 1:8 プリスケール値
  • T1OSCEN (3): タイマ 1 オシレータイネーブルコントロールビット
    • 0 ・・・ オシレータを停止させる。オシレータインバータと帰還抵抗をオフにして消費電流を抑えます。
    • 1 ・・・ オシレータを動作させる。
  • T1SYNC (2): タイマ 1 外部クロック入力同期コントロールビット
    • If TMR1CS = 1
      • 0 ・・・ 外部クロック入力を同期させる
      • 1 ・・・ 外部クロック入力を同期させない
    • If TMR1CS = 0
      • このビットは無視されます。TMR1CS = 0 のとき、タイマ 1 は内部クロックを使用します。
  • TMR1CS (1): タイマ 1 クロックソース選択ビット
    • 0 ・・・ 内部クロック (Fosc/4)
    • 1 ・・・ RC0/T1OSO/T1CKI(立ち上がりエッジ)ピンからの外部クロック
  • TMR1ON (0): タイマ 1 オン・ビット
    • 0 ・・・ タイマ 1 を停止する
    • 1 ・・・ タイマ 1 を動作させる

タイマ 1 による割り込みの仕組み

タイマ 1 の仕組みは、ほぼタイマ 0 と同じ仕組みになっていますが、タイマ 1 のカウンタは TMR1L (8bit) と TMR1H (8bit) の計 16 bit を使うため、プリスケーラを入れないでも、65,536 までのカウントが可能です。 ただし、プリスケーラはタイマ 0 の時と違い、少なめの 3 bit になっており、スケールは 1:8 までです。 といっても、合計 19bit のカウンタとして働くので、プリスケーラを入れて、524,288 までのカウントが可能となり、システムクロックが 10MHz の場合は約 210 msec までのインターバルを実現することができます(20MHz の場合は約 105 msec まで)。

タイマ 0 の時は、プリスケーラを機能させるかどうかを OPTION_REG<PSA(3)> のビットで切り替えていましたが、タイマ 1 の場合は常にプリスケーラが働きます。 その代わり、スケール値は 1:2 からでなく、1:1 から設定できるようになっています。 スケール値は T1CON<T1CKPS0(4)>, T1CON<T1CKPS1(5)> で次のように設定します。

タイマ 1 のプリスケーラのスケール設定
T1CON
<T1CKPS1(5)>
T1CON
<T1CKPS0(4)>
スケール
00 1:1 (65,536 * 1 = 655,36 カウントまで)
01 1:2 (65,536 * 2 = 131,072 カウントまで)
10 1:4 (65,536 * 4 = 262,144 カウントまで)
11 1:8 (65,536 * 8 = 524,288 カウントまで)

TMR1L がオーバーフローすると、TMR1H が自動的にインクリメントされ、TMR1H もオーバーフローすると割り込みが発生します。

タイマ 1 のカウンタのためのクロック

タイマ 1 のカウントのためのクロックは外部クロックを使うか、内部クロックを使うか選択することができます。 T1CON<TMR1CS(1)> のビットで切り替えます。 内部クロックを使う場合は、システムクロックの 1/4 の周波数でカウントされていきます。

  • T1CON<TMR1CS(1)> = 0 … 内部クロックを使用 (Fosc/4)
  • T1CON<TMR1CS(1)> = 1 … 外部クロックを使用

割り込み時の処理

TMR1H がオーバーフローすると、割り込みが発生 (4 番地にジャンプ) し、割り込みフラグビット PIR1<TMR1IF(0)> がセットされます。

CCP モジュールのコンペアモードを利用した割り込み

CCP モジュールのコンペアモードを使うと、タイマ 1 のカウンタが指定した値になったときに割り込みを発生させることができます。 この場合は、オーバーフローによる割り込みを使用する必要がないので、カウンタの初期値をあらかじめ計算してセットする必要がありません(CCPR1L、CCPR1H の値と TMR1L、TMR1H の値が等しくなった時に、なんらかのアクションが発生します)。 コンペアモードを使うことにより、タイマ 1 を正確なインターバルタイマとして利用することができます。

タイマ 1 の設定例

SetupTimer1
    MOVLW    B'00000001'
             ;プリスケーラ 1:1
             ;オシレータ停止
             ;内部クロック
    MOVWF    T1CON

CCS モジュールのコンペアモードで割り込みを発生させる場合は、T1CON の設定はこれだけになります(この場合、CCPR1L, CCPR1H の値を目的の値に設定する必要があります)。 タイマ 1 は設定するとただちにカウントを始めるため、他のレジスタの設定が済んでから設定を行なうようにします。 あるいは、割り込みをイネーブルにする直前に、カウンタ (TMR1L, TMR1H) をリセットするのも 1 つの方法です。

タイマ 1 をタイマ 0 と同じように、カウンタのオーバーフローによる割り込み (PIR1<TMR1IF(0)>) で利用する場合は、TMR1H が予定時間にうまくオーバーフローするように、TMR1L、TMR1H の初期値を計算してあらかじめセットしておく必要があります。

2002-08-01