PIC16F1619の基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
タイマー1 ゲート制御付き
20120-04-06

Timer1 モジュールは、ゲート制御機能を持った16ビットタイマー/カウンターです。強化したゲート制御により能力が大きく向上しました。

目次

概要

強化したゲート制御には以下の機能が備わっています。

図22-1は、Timer1モジュールのブロック図です。

*注意*
1:T1CKIのSTバッファは高速タイプ
2:Timer1レジスタは立ち上がりエッジでカウント
3:スリープ中は同期は動作しない
4:T1CKIピンとT1Gピンは、PPS機能を使用し任意のpinを指定できる

タイマ1の動作

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クロック入力をゲートする必要があります。

次の非同期源が利用できます。

  • T1GピンからTimer1ゲートに入力する非同期イベント
  • C1またはC2 comparatorからの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

    非同期カウンターモードでのTimer1の動作

    T1CONレジスタの制御ビットT1SYNCがセットされている場合、外部クロック入力は同期されません。タイマーは、内部位相クロックとは非同期にインクリメントします。外部クロック源が選択されている場合、タイマーはスリープ中も実行を継続し、オーバーフロー時に割り込みを生成して、プロセッサをウェイクアップさせることができます。ただし、タイマーの読み取り/書き込みには、ソフトウェアに特別な注意が必要です(下項参照 )。

    非同期カウンターでのTIMER1の読み取りと書き込み

    タイマーが外部非同期クロックで動作しているときにTMR1HまたはTMR1Lを読み取る場合、バイト単位では有効な読み取りが保証されます(ハードウェアで処理されます)。ただし、2つの8ビット値で16ビットタイマーを読み取ること自体が特定の問題を引き起こす可能性があります。これは、タイマー読み取りの間にオーバーフローする可能性があるためです。

    書き込みの場合、ユーザーはタイマーを停止して目的の値を書き込むことをお勧めします。レジスタがインクリメントしているときにタイマーレジスタに書き込むと、書き込み競合が発生する可能性があります。これにより、TMR1H:TMR1Lレジスタペアに予測できない値が生成される可能性があります。

    タイマー1ゲート

    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ゲート信号源の選択

    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ビットがクリアされている)場合でも動作します。

    *注意*
    ゲート極性の変更と同時にトグルモードを有効にすると、動作が不確定になる場合があります。

    タイマ1割り込み

    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

    タイマー1のプログラム例

    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への出力を反転
    				    }
    				}