タイマー1の使い方


【タイマー1】

タイマー1もPIC18Fxxxxになって強化されています。

(1) 16ビット読み書きモードの追加
  通常の読書きに対し、上位バイトに中継バッファが用意され、上位、下位バイトの
  同時読書きができるようになりました。

(2) システムクロックとして使用される
  システムクロックとして使われる場合には2通りあります。
   ・省電力のため、積極的にプログラムで切替える場合
   ・”Fail-Safe Clock Monitor”機能を使っていて、メインクロックが停止した場合に、
    自動的にタイマー1のクロックに切り替わる場合

(3) CCPからのSpecial Event Trigger機能でクリアする機能が追加された。
  Compare機能を使って一定周期の割込みを発生することができます。
  このTriggerでクリアされた場合には、タイマー1の割込みは発生しません。

【タイマー1の構成】

  16ビットのカウンタの読み出し、書込みがバッファ経由となって、1回で確実に
  読み書きできるようになった。
  つまりタイマー1の構成が、これまでの通常モードと、下側のような16ビットモードの
  2通りの形で扱えるようになりました。
  これで、従来2度読みしたり、書込みには一度停止させたりしなければならなかった
  のが、16ビットモードではバッファで一旦中継されるようになり、同じタイミングで
  上位と下位両方の読み書きができるようになりました。

 《通常モード》



  《16ビットモード》




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

【T1CONレジスタ】

16ビットモードの追加に伴いT1CONレジスタに16ビットモード設定用のビットである
「RD16」ビットが追加されました。
また、システムクロックへの切替使用が可能になったことで、その使用状態のビットで
ある「T1RUN」ビットが追加されました。





【リアルタイムクロック】

タイマー1はもともとリアルタイムクロック用に用意されたタイマーです。
32.768kHzのクリスタル振動子をタイマー1の発振回路に使うことで、正確な1秒の
インターバルタイマを構成することができます。この発振回路はいかなる省電力モード
でも継続動作しますので、リアルタイムクロックが停まることはありません。
また、この発振回路は、時計用のクリスタルが使えるように、非常に微小な電流で発振
するような回路となったため、発振回路の近くに強力な信号線が通ると誤動作します。
そこでこの影響を避けるため、下図のようなパターンとすることが推奨されています。











このタイマー1用の発振回路の近くには
他の配線は近づけないようにする。
32kHzでのコンデンサの推奨値は27pF




《テクニック》
 通常モードの時には、カウント中にTMR1Hレジスタ側を変更しても、他には何も影響
 を与えません。従って、インターバルタイマの場合、下位側のTMR1Lの初期値を”00”に
 することで、上位側のTMR1Hだけ書き直せば良いので、下位側のカウントを継続させた
 まま、上位側の再設定ができます。
 これで、カウント初期値の再設定までの時間による誤差が無くなり、正確な繰返し周期
 とすることができます。

【CCPからのリセット】

CCPのCompareモードでSpecial Event Triggerを使うと、タイマー1を連動してクリアする
ことができます。このときには、タイマー1は、同期モードとする必要があります。
つまりT1CONレジスタの「T1SYNC」ビットを0にして同期モードとします。
この使い方をすると、CCPとタイマー1を使って、定周期のCCPの割込みを発生させること
ができます。この場合にはプログラムが介在しないので、正確に一定周期の割込みとなり
ます。また、このときにはタイマー1の割込みは発生しません。

【アセンブラでの使用例】

タイマ1を単純なインターバルタイマとして利用した例題です。
ここでは、タイマ0とタイマ1を同時にインターバルタイマとして動かし、タイマ1を低位
レベルの割込みで3msec周期とします。そしてこの割込みで2桁のセグメントLEDの
ダイナミック点灯制御をしています。
タイマ0の方は0.5秒の周期で高位レベルの割込みとします。この割込みで、セグメント
LEDに表示する数値を+1します。数値が100になったらまた0に戻します。

この例での初期設定の部分は下記のようになっています。
割込み優先順位を許可するため、RCONレジスタの8ビット目を1にしています。







 また低レベルのタイマ1の割込み処理部分は、下記のようになっています。
低レベルの割込みの場合には、レジスタの退避、復旧はソフトで実行する
必要があります。




本タイマ1のサンプルプログラムの完全なソースファイルは
下記からダウンロードできます。

 ★ タイマ1テストプログラムソースファイル(timer1.asm)


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

CCS社のPCHコンパイラには、タイマー1用の関数として下表のような関数が
用意されています。

組込み関数書式 内   容
setup_timer_1(mode)

タイマー1の初期設定を行う。
modeの値は下記を使用する。
複数の設定はORで行う。

 T1_DISABLED タイマ1を使用しない
 T1_INTERNAL 内部クロックモード指定
 T1_EXTERNAL 外部入力、非同期モード指定
 T1_EXTERNAL_SYNC 外部入力同期モード指定
 T1_CLK_OUT 内蔵発振回路を使う指定
 T1_DIV_BY_1 プリスケール値1
 T1_DIV_BY_2  〃     2
 T1_DIV_BY_4  〃     4
 T1_DIV_BY_8  〃     8

《例》
   setup_timer_1(T1_DISABLED);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
   etup_timer_1(T1_INTERNAL | T1_DIV_BY_8);

get_timer1( )

現在のTMR1の内容を返す。
16ビットなのでlongで扱う必要がある。
《例》 while (get_timer1( ) != 0)

set_timer1(value)

TMR1レジスタにvalueの値をセットする
《例》
  if (get_timer1( )=1000)
  set_timer1(0);




【実際の使用例】

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



  トップページへ