タイマ 1 はミッドレンジシリーズの PIC16F84 などで使用することができます。 タイマ 1 を使用することにより、より正確なインターバルタイマとして機能させることができます。
─ (7) |
─ (6) |
T1CKPS1 (5) |
T1CKPS0 (4) |
T1OSCEN (3) |
T1SYNC (2) |
TMR1CS (1) |
TMR1ON (0) |
タイマ 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)> で次のように設定します。
T1CON <T1CKPS1(5)> | T1CON <T1CKPS0(4)> |
スケール |
---|---|---|
0 | 0 | 1:1 (65,536 * 1 = 655,36 カウントまで) |
0 | 1 | 1:2 (65,536 * 2 = 131,072 カウントまで) |
1 | 0 | 1:4 (65,536 * 4 = 262,144 カウントまで) |
1 | 1 | 1:8 (65,536 * 8 = 524,288 カウントまで) |
TMR1L がオーバーフローすると、TMR1H が自動的にインクリメントされ、TMR1H もオーバーフローすると割り込みが発生します。
タイマ 1 のカウントのためのクロックは外部クロックを使うか、内部クロックを使うか選択することができます。 T1CON<TMR1CS(1)> のビットで切り替えます。 内部クロックを使う場合は、システムクロックの 1/4 の周波数でカウントされていきます。
TMR1H がオーバーフローすると、割り込みが発生 (4 番地にジャンプ) し、割り込みフラグビット PIR1<TMR1IF(0)> がセットされます。
CCP モジュールのコンペアモードを使うと、タイマ 1 のカウンタが指定した値になったときに割り込みを発生させることができます。 この場合は、オーバーフローによる割り込みを使用する必要がないので、カウンタの初期値をあらかじめ計算してセットする必要がありません(CCPR1L、CCPR1H の値と TMR1L、TMR1H の値が等しくなった時に、なんらかのアクションが発生します)。 コンペアモードを使うことにより、タイマ 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 の初期値を計算してあらかじめセットしておく必要があります。