ライブラリファイルtimer.hをインクルードします。
#include <timer.h>
関数名はOpenTimerx()のような形式をとり、使用するタイマーの種類に応じてxの部分でタイマーの番号を指定します。たとえばタイマー1を使用する場合はOpenTimer1()となります。
また32ビットのタイマーの場合には、OpenTimer23()のように結合したタイマーの番号を並べて表記します。有効な関数名を確認するには、timer.hを参照します。
| 用途 | 関数 | 説明 |
|---|---|---|
| 開始/停止 | OpenTimerx (OpenTimerxy) | |
| CloseTimerx (CloseTimerxy) | ||
| 設定 | ReadTimerx (ReadTimerxy) | |
| WriteTimerx (WriteTimerxy) | ||
| 割り込み | ConfigIntTimerx (ConfigIntTimerxy) |
| 用途 | マクロ | 説明 |
|---|---|---|
| 割り込み | EnableIntTx | |
| DisableIntTx | ||
| SetPriorityIntTx |
タイマーは、アップカウンタです。
| 区分 | 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 | ||||||||||||||||
OpenTimerx()で、動作モードと割り込み周期の設定を行います。
void OpenTimer1(
unsigned int config, // TxCONレジスタ (Control register) の値
unsigned int period // PRxレジスタ (Period register) の値
)
| 区分 | 定数 | 説明 |
|---|---|---|
| タイマーモジュール 有効/無効 | 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) ] |
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 );
タイマーを停止するにはCloseTimerx()を使用します。この関数は内部的には割り込みを無効とするだけで、タイマーモジュールを無効にするわけではありません。
void CloseTimer1( void )
タイマーの値はTMRxレジスタに格納されており、値の設定および読み込みはこのレジスタに対してアクセスすることになります。よって関数を使用せずとも、そのレジスタに直接読み書きしても同義です。
タイマー値の型は、16ビットタイマーではunsigned int、32ビットではunsigned longになります。
void WriteTimerx( unsigned int timer ) // 16ビットタイマー
これは、
TMRx = timer;
のように書き換えても同じです。
unsigned int ReadTimerx( void ) // 16ビットタイマー
クロック源を内部クロックとした場合には、タイマーは命令サイクルを基準にカウントされます。よって、このカウント数から時間を測定できます。
タイマーの期限切れで割り込みが発生します。
| 機能 | マクロ |
|---|---|
| 割り込みを許可 | 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の数値)
タイマーのカウント値 (TMRx) が周期レジスタ (PRx) の値と一致したときに、割り込みが発生します。なおPRxの既定値は0xFFFFであり、これを0x0000と設定すると割り込みが発生しません。
指定周期で割り込みを発生させるためには、周期レジスタ (PRx) に値を設定し、タイマー値 (TMRx) をクリアします。
ConfigIntTimerx()で、割り込みの許可、禁止および割り込み優先順位を一括して設定できます。
void ConfigIntTimerx( unsigned int config )
IFS0bits.TxIF
__attribute__(( interrupt, auto_psv )) _TxInterrupt()
タイマーには、TypeA、TypeBそしてTypeCの3種類があります。
| タイマー | Type |
|---|---|
| Timer1 | A |
| Timer2 | B |
| Timer4 | |
| Timer3 | C |
| Timer5 |
![参考[ Microchip DOCUMENT:DS70135C Chapter9 ]](images/timer16_1.png)
16bit Timer1 (TypeA)
![参考[ Microchip DOCUMENT:DS70135C Chapter10 ]](images/timer16_2.png)
16bit Timer2 (TypeB)
![参考[ Microchip DOCUMENT:DS70135C Chapter11 ]](images/timer16_4.png)
16bit Timer4 (TypeB)
![参考[ Microchip DOCUMENT:DS70135C Chapter10 ]](images/timer16_3.png)
16bit Timer3 (TypeC)
![参考[ Microchip DOCUMENT:DS70135C Chapter11 ]](images/timer16_5.png)
16bit Timer5 (TypeC)
TypeBとTypeCの16ビットタイマーを2つ連結して、32ビットのタイマーとして機能します。
![参考[ Microchip DOCUMENT:DS70135C Chapter10 ]](images/timer32_2-3.png)
32bit Timer2/3
![参考[ Microchip DOCUMENT:DS70135C Chapter11 ]](images/timer32_4-5.png)
32bit Timer4/5
| 区分 | モード | TCS クロック源 |
TSYNC 同期カウンター |
TGATE ゲート制御 |
|---|---|---|---|---|
| タイマー | 同期タイマー | 0 | --- | 0 |
| ゲートタイマー | 0 | --- | 1 | |
| カウンタ | 同期カウンタ | 1 | 1 | --- |
| 非同期カウンタ | 1 | 0 | --- |
内部システムクロックをクロック源とします。たとえばプリスケーラが1:1ならば、命令サイクル (TCY=4/FOSC) ごとにカウントします。
つねに一定周期でカウントします。これにより時間を測定できます。
TxCKピンの状態がHighの間だけカウントします。これにより外部入力のHighの時間を測定できます。
TxCKピンに接続された外部クロックをクロック源とします。
外部クロック入力を、命令サイクル (TCY=4/FOSC) に同期してカウントします。
外部クロック入力をカウントします。命令サイクルとは同期しないことで、スリープ中でもカウントできます。
※このモードは、タイプAであるタイマー1でのみ使用できます。
タイマー1にはRTC向けの機能が用意されています。これを利用すれば、スリープモード時にも正確に1秒周期で割り込みを発生させられます。
RTCとして動作させるためには、まずSOSCIピンとSOSCOピンに32.768kHzの水晶発振子を接続します。そしてクロック源を外部クロックとしてゲート制御を無効とします。さらにスリープ時にもカウント動作をさせるために、同期カウンターは無効としなければなりません。