タイマー (Timer)

ライブラリ

ライブラリファイルtimer.hをインクルードします。

#include <timer.h>

関数名はOpenTimerx()のような形式をとり、使用するタイマーの種類に応じてxの部分でタイマーの番号を指定します。たとえばタイマー1を使用する場合はOpenTimer1()となります。

また32ビットのタイマーの場合には、OpenTimer23()のように結合したタイマーの番号を並べて表記します。有効な関数名を確認するには、timer.hを参照します。

関数、マクロ

関数

用途 関数 説明
開始/停止 OpenTimerx (OpenTimerxy)  
CloseTimerx (CloseTimerxy)  
設定 ReadTimerx (ReadTimerxy)  
WriteTimerx (WriteTimerxy)  
割り込み ConfigIntTimerx (ConfigIntTimerxy)  
dsPIC30F/dsPIC33F/PIC24H/dsPIC33E/PIC24E Timers Peripheral Module Library Help

マクロ

用途 マクロ 説明
割り込み EnableIntTx  
DisableIntTx  
SetPriorityIntTx  

レジスタ (Register)

  • TxCON (Timer Control x) … 制御レジスタ
  • TMRx (Timer x Register) … タイマーのカウント値
  • PRx (Period Register x) … 割り込み周期

タイマーは、アップカウンタです。

区分 SFR名 アドレス Bit 15 Bit 14 Bit 13 Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 リセット後の値
TxCON
(制御)
T1CON 0104 TON - TSIDL - - - - - - TGATE TCKPS1 TCKPS0 - TSYNC TCS - 0000 0000 0000 0000
T2CON 0110 TON - TSIDL - - - - - - TGATE TCKPS1 TCKPS0 T32 - TCS - 0000 0000 0000 0000
T3CON 0112 TON - TSIDL - - - - - - TGATE TCKPS1 TCKPS0 - - TCS - 0000 0000 0000 0000
T4CON 011E TON - TSIDL - - - - - - TGATE TCKPS1 TCKPS0 T32 - TCS - 0000 0000 0000 0000
T5CON 0120 TON - TSIDL - - - - - - TGATE TCKPS1 TCKPS0 - - TCS - 0000 0000 0000 0000
TMRx
(カウント値)
TMR1 0100 Timer1 Register 0000 0000 0000 0000
TMR2 0106 Timer2 Register 0000 0000 0000 0000
TMR3 010A Timer3 Register 0000 0000 0000 0000
TMR4 0114 Timer4 Register 0000 0000 0000 0000
TMR5 0118 Timer5 Register 0000 0000 0000 0000
PRx
(割り込み周期)
PR1 0102 Timer1 Period Register 1111 1111 1111 1111
PR2 010C Timer2 Period Register 1111 1111 1111 1111
PR3 010E Timer3 Period Register 1111 1111 1111 1111
PR4 011A Timer4 Period Register 1111 1111 1111 1111
PR5 011C Timer5 Period Register 1111 1111 1111 1111
TMRxHLD TMR3HLD 0108 Timer3 Holding Register (used in 32-bit mode only) 0000 0000 0000 0000
TMR5HLD 0116 Timer5 Holding Register (used in 32-bit mode only) 0000 0000 0000 0000
Table 12-1: Special Function Registers Associated with Timer Modules (DS70059D)

タイマーの開始、停止

開始 (OpenTimer)

OpenTimerx()で、動作モードと割り込み周期の設定を行います。

void OpenTimer1(
    unsigned int config,  // TxCONレジスタ (Control register) の値
    unsigned int period   // PRxレジスタ (Period register) の値
    )
configの定数 (TxCON)
区分 定数 説明
タイマーモジュール 有効/無効 Tx_ON Timerx ON
Tx_OFF Timerx OFF
アイドルモード時の動作 Tx_IDLE_CON operate during sleep
Tx_IDLE_STOP stop operation during sleep
ゲート制御 有効/無効※1 Tx_GATE_ON Timer Gate time accumulation enabled
Tx_GATE_OFF Timer Gate time accumulation disabled
プリスケーラ Tx_PS_1_1 Prescaler 1:1
Tx_PS_1_8 Prescaler 1:8
Tx_PS_1_64 Prescaler 1:64
Tx_PS_1_256 Prescaler 1:256
同期カウンター 有効/無効※1
(Timer1のみ)
T1_SYNC_EXT_ON Synch external clk input
T1_SYNC_EXT_OFF Do not synch external clk input
クロック源※1 Tx_SOURCE_EXT External clock source (外部クロック)
Tx_SOURCE_INT Internal clock source (内部クロック)
[ 命令の実行クロック (FOSC/4) ]
※1 これらの設定により動作モードが決定されます。

サンプルコード

unsigned int config
    = T1_ON            // タイマモジュール - 有効
    & T1_IDLE_STOP     // アイドルモード - 動作停止
    & T1_GATE_OFF      // ゲート制御 - 無効
    & T1_PS_1_256      // プリスケーラ - 1:256
    & T1_SYNC_EXT_ON   // 同期カウンター - 有効
    & T1_SOURCE_INT;   // クロック源 - 内部クロック

unsigned int period = 0xFFFF;

OpenTimer1( config, period );

停止 (CloseTimer)

タイマーを停止するにはCloseTimerx()を使用します。この関数は内部的には割り込みを無効とするだけで、タイマーモジュールを無効にするわけではありません。

void CloseTimer1( void )

タイマー値の設定

タイマーの値はTMRxレジスタに格納されており、値の設定および読み込みはこのレジスタに対してアクセスすることになります。よって関数を使用せずとも、そのレジスタに直接読み書きしても同義です。

タイマー値の型は、16ビットタイマーではunsigned int、32ビットではunsigned longになります。

書き込み

void WriteTimerx( unsigned int timer ) // 16ビットタイマー

これは、

TMRx = timer;

のように書き換えても同じです。

読み込み

unsigned int ReadTimerx( void ) // 16ビットタイマー

時間測定

クロック源を内部クロックとした場合には、タイマーは命令サイクルを基準にカウントされます。よって、このカウント数から時間を測定できます。

命令サイクル (TCY) = 4 / ( オシレータ周波数[Hz] * PLLの乗数 )
周期[sec] = 命令サイクル * プリスケーラ値 * タイマー値 (TMRx)

割り込み (Interrupt)

タイマーの期限切れで割り込みが発生します。

許可、禁止

機能 マクロ
割り込みを許可 EnableIntTx
割り込みを禁止 DisableIntTx

これらのマクロは、

/* Macros to Enable/Disable interrupts of Timers 1 */
#define EnableIntT1        _T1IE = 1
#define DisableIntT1       _T1IE = 0

のように定義されています。

割り込み優先順位

SetPriorityIntTx( priority )

Tx_INT_PRIOR_n (nは0~7の数値)

周期レジスタ (PRx)

タイマーのカウント値 (TMRx) が周期レジスタ (PRx) の値と一致したときに、割り込みが発生します。なおPRxの既定値は0xFFFFであり、これを0x0000と設定すると割り込みが発生しません

指定周期で割り込みを発生させるためには、周期レジスタ (PRx) に値を設定し、タイマー値 (TMRx) をクリアします。

設定

ConfigIntTimerx()で、割り込みの許可、禁止および割り込み優先順位を一括して設定できます。

void ConfigIntTimerx( unsigned int config )

割り込みフラグ

IFS0bits.TxIF

割り込みサービスルーチン (ISR)

__attribute__(( interrupt, auto_psv )) _TxInterrupt()

タイマーの種類

タイマーには、TypeA、TypeBそしてTypeCの3種類があります。

タイマー Type
Timer1 A
Timer2 B
Timer4
Timer3 C
Timer5

16ビット タイマー

TypeA

  • デバイスに接続された低消費電力の32kHzオシレータによる動作
  • 外部クロックによる非同期モード


16bit Timer1 (TypeA)

TypeB

  • 32ビットタイマのために、TypeCタイマと接続可能


16bit Timer2 (TypeB)


16bit Timer4 (TypeB)

TypeC

  • A/D変換のトリガ (TypeCタイマのうち、少なくとも1つのタイマ)
  • 32ビットタイマのために、TypeBタイマと接続可能


16bit Timer3 (TypeC)


16bit Timer5 (TypeC)

32ビット タイマー

TypeBとTypeCの16ビットタイマーを2つ連結して、32ビットのタイマーとして機能します。


32bit Timer2/3


32bit Timer4/5

動作モード (Modes of Operation)

動作モードごとのTxCONレジスタの設定値
区分 モード TCS
クロック源
TSYNC
同期カウンター
TGATE
ゲート制御
タイマー 同期タイマー 0 --- 0
ゲートタイマー 0 --- 1
カウンタ 同期カウンタ 1 1 ---
非同期カウンタ 1 0 ---

タイマー

内部システムクロックをクロック源とします。たとえばプリスケーラが1:1ならば、命令サイクル (TCY=4/FOSC) ごとにカウントします。

同期タイマー (Synchronous Timer Mode)

つねに一定周期でカウントします。これにより時間を測定できます。

ゲートタイマー (Gated Time Accumulation Mode)

TxCKピンの状態がHighの間だけカウントします。これにより外部入力のHighの時間を測定できます。

カウンタ

TxCKピンに接続された外部クロックをクロック源とします。

同期カウンタ (Synchronous Counter Mode)

外部クロック入力を、命令サイクル (TCY=4/FOSC) に同期してカウントします。

非同期カウンタ (Asynchronous Counter Mode)

外部クロック入力をカウントします。命令サイクルとは同期しないことで、スリープ中でもカウントできます。

※このモードは、タイプAであるタイマー1でのみ使用できます。

RTC (Real-Time Clock)

タイマー1にはRTC向けの機能が用意されています。これを利用すれば、スリープモード時にも正確に1秒周期で割り込みを発生させられます。

RTCとして動作させるためには、まずSOSCIピンとSOSCOピンに32.768kHzの水晶発振子を接続します。そしてクロック源を外部クロックとしてゲート制御を無効とします。さらにスリープ時にもカウント動作をさせるために、同期カウンターは無効としなければなりません。

参考

  • Section 12. Timers (DS70059D)
  • dsPIC30Fファミリー リファレンスマニュアル (DS70046B_JP)
    12章「タイマー」