タイマー0,1,2,3の使い方


【タイマー0】


 タイマー0もPIC18シリーズでは強化されています。強化ポイントは下記のように
なっています。

(1) 8ビットモードと16ビットモードの両方が用意されソフトウェアで選択できる。
  カウンタが長くなったことで、長時間のインターバルタイマも可能になった。
(2) 8ビットのプリスケーらが専用に用意された。
  従来はウォッチドッグタイマと兼用であったが、専用になった。
(3) 16ビットタイマを確実に読めるようになった。
  16ビットモードの時にも上位バイト、下位バイトを確実に読み出せるように、
  ハードウェアで上位バイトをバッファするようにした。


【タイマー0の構成】

タイマー0の16ビットモードの時の構成は下図のようになります。






ここで、タイマー0のカウンタの内容は上位、下位の2バイトでRead/Writeします。
このとき上位バイトは直接は読み書きしないで、TMR0Hレジスタを経由して読み
書きします。
この読み書きのタイミングは下位バイトであるTMR0Lレジスタと同期するように
なっており、読み出しの時には、TMR0Lを読むと、同時に上位バイトがTMR0H
レジスタにコピーされます。
このため、従来2度読みしないと下位バイトを読んで、次に上位バイトを読むまで
の間で、上位バイトがカウントアップしてしまうかもしれないという問題を回避でき
るようになりました。
つまりTMR0Lを読み込んでから、次にTMR0Hを読めば、TMR0Lを読み込んだ瞬間
の時の上位バイトが読み込めることになります。

書込みの時は、あらかじめ上位データをTMR0Hに書き込んでおき、それから下位
データをTMR0Lに書き込めば、そのタイミングで同時にTMR0Hからカウンタの上位
バイトに書き込まれます。


《T0CONレジスタの構成》
 タイマー0の機能強化により制御用のレジスタT0CONも機能追加されて下図の
ようになりました。



ここでは、TMR0ONとT08BITビットが追加されました。
T08BITが8ビットと16ビットのモード切替用の設定ビットです。


【タイマー1】

タイマー1も強化されています。
(1) 16ビットのカウンタの読み出し、書込みがバッファ経由となって、1回で確実に
  読み書きできるようになった。

(2) タイマー1の構成が、下図のように改良されて、上位バイトの扱いがTMR1Hという
  バッファ経由となりました。
  これで、従来2度読みしたり、書込みには一度停止させたりしなければならな
  かったのが、確実に読み書きできるようになりました。




まず読み出しは下位バイトの、TMR1Lを読み出すと、上位バイトが同時にTMR1Hに
コピーされます。これで後からTMR1Hを読み込めば、下位を読み込んだ瞬間の
カウンタ値が正確に読み込めます。
書込み時は、TMR1Hに先に上位データを書き込んでおき、あとから下位データを
TMR1Lに書き込めば、そのタイミングで同時に上位バイトがTMR1Hからカウンタに
コピーされます。これで、下位データを書き込む瞬間に16ビット同時に書き替わる
ことになります。

この16ビットモードの追加に伴いT1CONレジスタに16ビットモード設定用のビット、
RD16ビットが追加されました。






【タイマー2】

特にこれまでと変更強化部分はありません。
タイマー2の構成は下図のようになっています。従来同様タイマー2は主に
CCPのデューティ制御用カウンタとして使われます。






タイマ2の制御ようには下図のT2CONレジスタが使われます。このレジスタは
PIC16シリーズから特に変更はありません。






【タイマー3】

タイマー3はPIC18シリーズで新たに追加されたタイマでCCP用に使えるタイマとして
強化されました。

(1) タイマー1と同様に8ビットモードと16ビットモードがあります。
  同様に16ビットモード設定用のビット、RD16がT3CONレジスタにあります。

(2) タイマ−1の発振回路のクロックをタイマー3のクロックとすることが出来るよう
  になっています。これによりリアルタイムクロックを2つにすることが可能となります。

(3) タイマー3をタイマー1と同じようにCCPの周期カウンタとして使うことが出来る
  ようになっており、いずれか片方を指定して使うことになります。

タイマー3のブロック構成は下図のようになっています。
図のように発振回路はタイマー1と兼用になっていて、TMR3CSビットにより指定
して選択します。
16ビットのタイマーカウンタは、やはりTMR3Hレジスタでバッファリングされていて
TMR3Lのリードライトと連動してTMR3Hとタイマの上位8ビットとの間でデータ授受
を実行します。




タイマ3の制御には下図のT3CONレジスタが使われますが、これは新たに
追加されたレジスタで、特にタイマ3はCCP用のクロック用として、タイマ1と
2つが用意されたので、どちらをCCP用に使うかの指定が出来るようになって
います。








【タイマー用Cライブラリ関数】

MPLAB-C18で用意されているタイマー用の関数ライブラリがあります。
各タイマー毎に用意されていて、タイマー0,1,2,3の数値で区別しています。
(1) タイマー用C関数ライブラリ一覧
関数名 機能と基本形 使用例
CloseTimer0
CloseTimer1
CloseTimer2
CloseTimer3
指定タイマーを停止し割込みを禁止する CloseTimer0();
void CloseTimer0(void);
OpenTimer0
OpenTimer1

OpenTimer2
OpenTimer3
指定のタイマーの初期設定を行う。割込み、
クロック選択、プリスケーラ値などの設定を含む
OpenTimer0(TIMER_INT_OFF
& T0_SOURCE_INT &
T0_PS_1_32);
void OpenTimer0(unsigned char config);
ReadTimer0
ReadTimer1
ReadTimer2
ReadTimer3
各タイマーのカウンタレジスタの内容を返す
8ビットと16ビットのものがある
  Timer0: int(16-bits)  TMR0H、TMR0Lレジスタ
  Timer1: int(16-bits)  TMR1H、TMR1Lレジスタ
  Timer2: char(8-bits)  TMR2レジスタ
  Timer3: int(16-bits)  TMR3H、TMR3Lレジスタ
unsigned int result;
result = ReadTimer0();
unsigned int ReadTimer1(void);
unsigned char ReadTimer2(void);
WriteTimer0
WriteTimer1
WriteTimer2
WriteTimer3
各タイマのタイマレジスタに値を設定する
8ビットと16ビットのものがある

  Timer0: int(16-bits)  TMR0H、TMR0Lレジスタ

  Timer1: int(16-bits)  TMR1H、TMR1Lレジスタ
  Timer2: char(8-bits)  TMR2レジスタ
  Timer3: int(16-bits)  TMR3H、TMR3Lレジスタ
WriteTimer0(0);
unsigned WriteTimer0(unsigned int timer);
unsigned WriteTimer2(unsigned char timer);

(2) OpenTimer用パラメータ一覧
  OpenTimer関数には各タイマの動作モードを設定するための多くのパラメータが
  必要となりますが、これらは下記のようになっています。
タイマー種別 項目種別 パラメータ名称 意味内容
全部共通 割込み許可禁止 TIMER_INT_ON
TIMER_INT_OFF
タイマー割込み許可
         禁止
タイマ0 モード設定 T0_8BIT
T0_16BIT
8ビットモード指定
16ビットモード指定
外部クロックエッジ T0_EDGE_FALL
T0_EDGE_RISE
外部クロック立下り
外部クロック立上り
クロック選択 T0_SOURCE_EXT
T0_SOURCE_INT
外部クロック指定(I/Oピン)
内部クロック指定(Tosc)
プリスケーラ値 T0_PS1_1
T0_PS1_2
T0_PS1_4
T0_PS1_8
T0_PS1_16
T0_PS1_32
T0_PS1_64
T0_PS1_128
T0_PS1_256
1:1
1:2
1:4
1:8
1:16
1:32
1:64
1:128
1:256
タイマ1 モード設定 T1_8BIT_RW
T1_16BIT_RW
8ビットモード指定
16ビットモード指定
クロック選択 T1_SOURCE_EXT
T1_SOURCE_INT
外部クロック指定(I/Oピン)
内部クロック指定(Tosc)
プリスケーラ値 T1_PS_1_1
T1_PS_1_2
T1_PS_1_4
T1_PS_1_8
1:1
1:2
1:4
1:8
発振回路許可禁止 T1_OSC1EN_ON
T1_OSC1EN_OFF
発振回路を使用する
発振回路を使用しない
外部クロック入力
の内部同期の指定
T1_SYNC_EXT_ON
T1_SYNC_EXT_OFF
内部クロックに同期させる
         させない
CCP用のクロック指定 T1_SOURCE_CCP
T1_CCP1_T3_CCP2
CCP1,2両方のクロックに使用
CCP1だけのクロックに使用
タイマ2 プリスケーラ値 T2_PS1_1
T2_PS1_4
T2_PS1_16
1:1
1:4
1:16
ポストスケーラ値 T2_POST_1_1
T2_POST_1_2
1:1
1:2
タイマ3 クロック選択 T3_SOURCE_EXT
T3_SOURCE_INT
外部クロック指定(I/Oピン)
内部クロック指定(Tosc)
モード設定 T3_8BIT_RW
T3_16BIT_RW
8ビットモード指定
16ビットモード指定
プリスケーラ値 T3_PS_1_1
T3_PS_1_2
T3_PS_1_4
T3_PS_1_8
1:1
1:2
1:4
1:8
クロックの選択 T3_OSC1EN_ON
T3_OSC1EN_OFF
タイマー1のクロックを使う
         使わない
外部クロック入力
の内部同期の指定
T3_SYNC_EXT_ON
T3_SYNC_EXT_OFF
内部クロックに同期させる
         させない
CCP用のクロック指定 T3_SOURCE_CCP
T1_CCP1_T3_CCP2
CCP1,2両方のクロックに使用
CCP2だけのクロックに使用



【実際の使用例】

下記のプログラム例は、これらのタイマー関数を使った実際の例です。

《例1》
  タイマ0の約25msec周期の割込みを使って、発光ダイオードを点滅させた例です。
  アイドルループでも別の発光ダイオードを点滅させています。

    ★ タイマ0の使用例

《例2》
  タイマ0とタイマ1を同じ優先順位の割込みで使った例で、タイマ0は約25msec周期
  タイマ1はその8倍の周期で割りこみます。
  アイドルループでは約0.5秒間隔でLEDを点滅させ、タイマ0では0.1秒間隔で
  タイマ1では1秒間隔でそれぞれ別の発光ダイオードを点滅させます。

    ★ タイマ0とタイマ1の同時使用例



  トップページへ