Timer1 モジュールは、ゲート制御機能を持った16ビットタイマー/カウンターです。強化したゲート制御により能力が大きく向上しました。
強化したゲート制御には以下の機能が備わっています。
図22-1は、Timer1モジュールのブロック図です。
*注意*
1:T1CKIのSTバッファは高速タイプ
2:Timer1レジスタは立ち上がりエッジでカウント
3:スリープ中は同期は動作しない
4:T1CKIピンとT1Gピンは、PPS機能を使用し任意のpinを指定できる
Timer1モジュールは、TMR1H:TMR1Lレジスタペアを介してアクセスされる16ビットのインクリメントカウンタです。TMR1HまたはTMR1Lへの書き込みで、カウンターを直接更新します。
内部クロック源とともに使用する場合、モジュールはタイマーであり、命令サイクルごとにインクリメントします。外部クロック源とともに使用する場合、モジュールはタイマーまたはカウンターとして使用でき、外部信号源の指定したすべてのエッジでインクリメントします。
Timer1は、T1CONとT1GCONレジスタのTMR1ONとTMR1GEビットを設定することで有効になります。表22-1に、Timer1が有効になる選択を示します。
表22-1:TIMER1有効な選択
TMR1ON | TMR1GE | タイマー1の動作 |
---|---|---|
0 | 0 | オフ |
0 | 0 | オフ |
0 | 1 | オフ |
1 | 0 | 常にカウント |
1 | 1 | ゲート機能による |
T1CONレジスタのTMR1CS <1:0>ビットは、Timer1のクロック源を選択するために使用されます。表22-2に、クロック源の選択を示します。
表22-2:クロック源の選択
TMR1CS <1:0> | クロック源 |
---|---|
11 | LFINTOSC |
10 | T1CKIピンの外部クロック |
01 | システムクロック(FOSC) |
00 | 命令クロック(FOSC/4) |
内部クロック源が選択されると、TMR1H:TMR1Lレジスタペアは、Timer1プリスケーラによって決定されたFOSCの倍数でインクリメントします。
FOSC が選択されている場合、Timer1レジスタ値は命令クロックサイクルごとに4カウントずつインクリメントします。このため、Timer1値を読み取るときに分解能に2 LSBエラーが発生します。Timer1のフル解像度を利用するには、非同期入力信号を使用してTimer1クロック入力をゲートする必要があります。
次の非同期源が利用できます。
外部クロック源が選択されている場合、Timer1モジュールはタイマーまたはカウンターとして機能する場合があります。カウントを有効にすると、Timer1は外部クロック入力T1CKIの立ち上がりエッジでインクリメントされます。外部クロック源は、マイクロコントローラのシステムクロックに同期させることも、非同期で実行することもできます。
*注意*
カウンターモードでは、以下の条件のいずれか1つ以上が発生した後も、最初の有効な立ち上がりエッジでインクリメントする前に立ち下がりエッジが入力される必要があります。
Timer1は、プリスケーラでクロック入力を1、2、4、または8分割することがを可能です。T1CONレジスタのT1CKPSビットで、プリスケーラーを制御します。プリスケーラーは、直接読み取りまたは書き込みができません。TMR1HまたはTMR1Lへの書き込み時にクリアされます。
内部クロックをカウントするタイマーとして使用し、タイマーがカウントアップするまでの時間と内部クロック・プリスケーラーとの関係
Prescalerl | T1OSC | Fosc | Fosc/4 | ||||
---|---|---|---|---|---|---|---|
32k | 31k | 1M | 32M | 31k | 1M | 32M | |
1:1 | 2 Sec | 2.1 S | 66mS | 2.0mS | 8.4 S | 262mS | 8.2mS |
1:2 | 4 Sec | 4.2 S | 131mS | 4.1mS | 16.8 S | 524mS | 8.2mS |
1:4 | 8 Sec | 8.4 S | 262mS | 8.2mS | 33.6 S | 1 S | 33mS |
1:8 | 16 Sec | 16.8 S | 524mS | 16mS | 67.1 S | 2.1 S | 66mS |
T1CONレジスタの制御ビットT1SYNCがセットされている場合、外部クロック入力は同期されません。タイマーは、内部位相クロックとは非同期にインクリメントします。外部クロック源が選択されている場合、タイマーはスリープ中も実行を継続し、オーバーフロー時に割り込みを生成して、プロセッサをウェイクアップさせることができます。ただし、タイマーの読み取り/書き込みには、ソフトウェアに特別な注意が必要です(下項参照 )。
タイマーが外部非同期クロックで動作しているときにTMR1HまたはTMR1Lを読み取る場合、バイト単位では有効な読み取りが保証されます(ハードウェアで処理されます)。ただし、2つの8ビット値で16ビットタイマーを読み取ること自体が特定の問題を引き起こす可能性があります。これは、タイマー読み取りの間にオーバーフローする可能性があるためです。
書き込みの場合、ユーザーはタイマーを停止して目的の値を書き込むことをお勧めします。レジスタがインクリメントしているときにタイマーレジスタに書き込むと、書き込み競合が発生する可能性があります。これにより、TMR1H:TMR1Lレジスタペアに予測できない値が生成される可能性があります。
Timer1は、カウントを常時継続するように構成することも、Tゲート制御回路を使用してカウントをOn/Offすることもできます。後者は、Timer1 Gate Enableとも呼ばれます。
Timer1ゲートは、複数の選択可能な信号源によって駆動することができます。
Timer1ゲートイネーブルモードは、T1GCONレジスタのTMR1GEビットを「1」にセットすることで有効になります。Timer1ゲートイネーブルモードの極性は、T1GCONレジスタのT1GPOLビットで設定します。
Timer1ゲートイネーブルモードが有効になっている場合、Timer1はTimer1クロックの立ち上がりエッジでインクリメントします。Timer1 Gate Enableモードが無効になっている場合、インクリメントは発生せず、Timer1は現在のカウントを保持します。タイミングの詳細については、図22-3を参照してください。
*注意*
同期動作から非同期動作に切り替える場合、1カウントミスすることがあります。非同期動作から同期動作に切り替えるときに、1つ多くカウントすることができます。
表22-3:TIMER1 GATE ENABLE SELECTIONS
T1CLK | T1GPOL | T1G | タイマー1の動作 |
---|---|---|---|
↑ | 0 | 0 | カウント継続 |
↑ | 0 | 1 | カウント停止 |
↑ | 1 | 0 | カウント停止 |
↑ | 1 | 1 | カウント継続 |
Timer1ゲート源の選択を表22-4に示します。信号源の選択は、T1GCONレジスタのT1GSS <1:0>ビットによって制御されます。利用可能な各信号源の極性も選択できます。極性の選択は、T1GCONレジスタのT1GPOLビットによって制御されます。
表22-4:TIMER1ゲート信号源
T1GSS | Timer1ゲート信号源 |
---|---|
00 | タイマー1ゲートピン(T1G) |
01 | Timer0のオーバーフロー(T0_overflow)(TMR0がFFhから00h) |
10 | コンパレータ1出力(C1_OUT_sync)(1) |
11 | コンパレータ2出力(C2_OUT_sync)(1) |
注1:オプションで同期されたコンパレータ出力。
T1Gピンゲートの動作
T1Gピンは、Timer1ゲート制御の1つの信号源です。これは、Timer1ゲート回路に外部信号源を供給するために使用できます。
Timer0オーバーフローゲートの動作
Timer0がFFhから00hにインクリメントすると、ローからハイへのパルスが自動的に生成され、Timer1ゲート回路に供給されます。
Timer1ゲートトグルモードが有効になっている場合、パルス幅の持続時間ではなく、Timer1ゲート信号の繰り返しサイクル長で測定することができます。
Timer1ゲート信号源は、信号のエッジごとに反転するフリップフロップを介してゲートを制御します。タイミングの詳細については、図22-4を参照してください。
Timer1ゲートトグルモードは、T1GCONレジスタのT1GTMビットをセットすることで有効になります。T1GTMビットがクリアされると、フリップフロップはクリアされ、クリアされたままになります。これは、測定するエッジを制御するために必要です。
Timer1ゲートシングルパルスモードは、T1GCONレジスタのT1GSPMビットを「1」にセットすることによって有効になります。次に、T1GCONレジスタのT1GGO/DONEビットをセットする必要があります。Timer1は、次のエッジで完全に有効になります。パルスの次の立ち下がりエッジで、T1GGO/DONEビットが自動的にクリアされます。T1GGO/DONEビットがソフトウェアで再度「1」にセットされるまで、他のゲートイベントがTimer1をインクリメントすることは許可されません。タイミングの詳細については、図22-5を参照してください。
T1GCONレジスタのT1GSPMビットをクリアしてシングルパルスゲートモードを無効にする場合は、T1GGO/DONEビットもクリアする必要があります。
トグルモードとシングルパルスモードを同時に有効にすると、両方が連携して機能します。これにより、Timer1ゲート信号源のサイクルタイムを測定できます。タイミングの詳細については、図22-6を参照してください。
Timer1ゲート値ステータスを利用すると、ゲート制御値の最新レベルを読み取ることができます。値は、T1GCONレジスタのT1GVALビットに格納されます。T1GVALビットは、Timer1ゲートが有効になっていない(TMR1GEビットがクリアされている)場合でも有効です。
Timer1ゲートイベント割り込みが有効になっている場合、ゲートイベントの完了時に割り込みを生成することができます。T1GVALの立ち下がりエッジが発生すると、PIR1レジスタのTMR1GIFフラグビットがセットされます。PIE1レジスタのTMR1GIEビットがセットされている場合、割り込みが認識されます。
TMR1GIFフラグビットは、Timer1ゲートが有効になっていない(TMR1GEビットがクリアされている)場合でも動作します。
*注意*
ゲート極性の変更と同時にトグルモードを有効にすると、動作が不確定になる場合があります。
Timer1 のレジスタ ペア (TMR1H:TMR1L) は、FFFFh までインクリメントすると、0000h にロールオーバ します。Timer1 がロールオーバすると、PIR1 レジ スタの Timer1 割り込みフラグ ビットがセットされ ます。ロールオーバ割り込みを有効にするには、次のビットをセットする必要があります。
割り込みは、割り込みサービスルーチンのTMR1IFビットをクリアすることによってクリアされます。
*注意*
割り込みを有効にする前に、TMR1H:TMR1LレジスタペアとTMR1IFビットをクリアする必要があります。
Timer1は、非同期カウンターモードに設定されている場合、スリープ中でも動作します。このモードでは、水晶または外部クロックを使用してカウンタを動作させます。デバイスをウェイクアップするようにタイマーを設定するには:
デバイスはオーバーフロー時にウェイクアップし、次の命令を実行します。INTCONレジスタのGIEビットが「1」にセットされている場合、デバイスは割り込みサービスルーチンを呼び出します。
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
INTCON | GIE | PEIE | - | - | - | - | - | INTEDG |
PIE1 | TMR1GIE | ADIE | RCIE | TXIE | SSP1IE | BCL1IE | TMR2IE | TMR1IE |
PIR1 | TMR1GIF | ADIF | RCIF | TXIF | SSP1IF | BCL1IF | TMR2IF | TMR1IF |
T1CON | TMR1CS<1:0> | T1CKPS<1:0> | T1SOSC | nT1SYNC | - | TMR1ON | ||
T1GCON | TMR1GE | T1GPOL | T1GTM | T1GSPM | T1GGO_ nDONE |
T1GVAL | T1GSS<1:0> | |
T1CKIPPS | - | - | - | T1CKIPPS<4:0> | ||||
T1GPPS | - | - | - | T1GPPS<4:0> | ||||
TMR1H | TMR1 Count の上位 8 bit | |||||||
TMR1L | TMR1 Count の下位 8 bit |
レジスタ | BIT | 名 | 説明 | 1 | 0 |
---|---|---|---|---|---|
INTCON | 7 | GIE | 全インタラプトの使用許可 | 許可 | 否 |
6 | PEIE | 周辺機能インタラプトの使用許可 | 許可 | 否 | |
PIE1 | 7 | TMR1GIE | ゲート インタラプトを使用許可 | 許可 | 否 |
1 | TMR1IE | タイマー1 インタラプトを使用許可 | 許可 | 否 | |
PIR1 | 7 | TMR1GIF | ゲート インタラプト フラグ | 発生 | 未発生 |
1 | TMR1IF | タイマー1 オーバーフロー発生フラグ | 発生 | 未発生 | |
T1CON | 7 | TMR1CS1 | タイマー1 クロック選択 00=FOSC/4(既定) 01=FOSC, 10=T1CKI or T1OSC, 11=LFINTOSC |
1 | 0 |
6 | TMR1CS1 | 1 | 0 | ||
5 | T1CKPS1 | プリスケラー比率 00=1:1(既定) 01=1:2, 10=1:4, 11=1:8 |
1 | 0 | |
4 | T1CKPS2 | 1 | 0 | ||
3 | T1SOSC | タイマー1 発振器 | ON | OFF | |
2 | nT1SYNC | タイマー1 外部信号の内部クロック同期 | 非同期 | 同期 | |
0 | TMR1ON | タイマー1 ON/OFF | ON | OFF | |
T1GCON | 7 | TMR1GE | ゲート機能 ON/OFF(TMR1ON=0 のときは無効) | 有効 | 無効 |
6 | T1GPOL | ゲート極性 | 正論理 | 負論理 | |
5 | T1GTM | ゲート・トグルモード(立上りでトグルされる) | ON | OFF | |
4 | T1GSPM | シングル・パルスモード | ON | OFF | |
3 | T1GGO_ nDONE |
シングル・パルスモードのセットおよびモニタ | 待機 | 終了 | |
2 | T1GVAL | ゲートの状態を反映(Read Only) | 開 | 閉 | |
1 | T1GSS1 | ゲートの信号源 00 = 外部信号ピン (初期値) 01 = Timer0 10 = C1 11 = C2 |
1 | 0 | |
0 | T1GSS0 | 1 | 0 | ||
T1CKIPPS | - | T1CKIPPS | T1CKIのPin配置 (PPS指定を参照のこと) | RA3 | RA4 |
T1GPPS | - | T1GPPS | T1GのPin配置 (PPS指定を参照のこと) | RA3 | RA4 |
PortC - RC2 に接続されたLEDが点灯するプログラムを作成しました。 Gate機能は使用していません。
<回路図>
<プログラム>
/*************************************************** * File name: Timer 1 Free Run * Notes: 4 MHz内部クロック PLLはOFF * LED RC5 * PIC16F1619 MPLAB X IDE with XC8 * Copyright (c) 2017 iwamoto All Rights Reserved * *************************************************/ #include <xc.h> #define _XTAL_FREQ 4000000 #define LED LATC5 // CONFIG #pragma config FOSC = INTOSC, PWRTE = OFF, MCLRE = ON, CP = OFF #pragma config BOREN = ON, CLKOUTEN = OFF, IESO = ON, FCMEN = ON #pragma config WRT = OFF, PPS1WAY = ON, ZCD = OFF, PLLEN = OFF #pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = ON #pragma config WDTCPS = WDTCPS1F, WDTE = OFF, WDTCWS = WDTCWSSW, WDTCCS = SWC /******************** Main application ****************/ void main(void) { OSCCON = 0b01101000; // PLL disabled; 4MHz_HF; FOSC; TRISC5 = 0; // Outputs RC5 // --------------------------------------------- // Timer 1 設定(262mSecごと) // 内部クロック(FOSC/4)をカウント Gate設定(使用せず) // --------------------------------------------- T1CON = 0b00100001; T1GCON = 0b00000000; while(1){ // 繰り返しループ (132mSecごと) while(! TMR1IF); // Timer 1 のタイムアップを待つ TMR1IF = 0; // キャリーフラッグをクリア LED = ! LED; // LEDへの出力を反転 } }