目次PIC入門ハードウェア


PIC16F84Aの詳細仕様(3)

このページではPIC16F84Aを使うときに必要なタイマー関係の仕様を説明します。

タイマー(TMR0)の仕様

上の図はタイマー(TMR0)とウォッチドックタイマー(WDT)に関するブロック図を表したものです。
図の下の各レジスタはタイマー設定に関するもので、黄色のビットが関係します。

図の真ん中にあるプリスケーラはタイマーかウォッチドックタイマーかのいずれかで使用するようになっています。この図ではプリスケーラをタイマー(TMR0)に使用した場合を示しています。その選択はOPTION_REGのPSAビットにより行われます。プリスケーラというのは一種のカウンターでカウントアウトする値をOPTION_REGのPS0,PS1,PS2で指定できるプログラマブルカウンターです。TMR0は8ビットのバイナリーカウンターで0〜255までの256カウントをすることができます。カウンターが255(FFh)から0(00h)になるときにオーバーフローによる割り込みが発生し、INTCONレジスタのT0IFが"1"になります。割り込みが発生するとプログラムカウンターはハードにより強制的に0004hになり、そこからプログラムが走り始めます。割り込みを発生させるためにはINTCONレジスタのGIEおよびT0IEビットを"1"にしておく必要があります。話を元に戻しますが。
TMR0の256カウントだけでは短い場合があります。例えば、20MHzの内部クロックをカウンターの入力とした場合、カウンターに入力される周波数は1/4の5MHzが入力されます。このクロックパルスの周期は200nsです。ですから、TMR0がオーバーフローする時間は0.2μsec x 256 = 51.2μsecになります。タイマーの使い方にもよりますが、これでは短い場合もあります。そのような場合、プリスケーラを使用します。

プリスケーラのカウント値は2、4、8、16、32、64、128、256の8段階に設定できます。例えば2と設定した場合、プリスケーラに2パルス入力された時に1パルス出力します。256の場合には入力に256パルス入ったときに出力から1パルス出ることになります。ですから、プリスケーラの設定値倍TMR0のオーバーフロー時間を長くすることができます。先ほどの例の場合、プリスケーラを256設定にすると 51.2μsec x 256 = 13,107.2μsecになり、約13ミリ秒でオーバーフローすることになります。

タイマー(TMR0)の入力は内部クロック以外に外部からのクロックを使用することができます。その場合にはOPTION_REGレジスタのT0CSビットを"1"に設定し、TRISAレジスタのTRISA4ビットを"1"にしてRA4/T0CKIピンを入力モード(TMR0 CLOCK IN)にする必要があります。また、クロックパルスの立ち上がりでカウントするか立ち下がりでカウントするかをOPTION_REGレジスタのT0SEビットで指定します。立ち上がりでカウントさせる場合には"0"、立ち下がりでカウントさせる場合には"1"を設定します。
タイマー(TMR0)の直前にはクロック同期回路があります。これは外部からクロックを入力した場合、クロックの立ち上がり、立ち下がりのタイミングが内部のクロックと同期していません。その場合、割り込みのタイミングなどがずれてしまうので、この回路で内部クロックと同期をさせています。最大2サイクル分の遅れが生じるようです。

ウォッチドックタイマーはCPUのクロックとは独立した発振器を持っています。精度はあまり良くありませんが、タイムアウト時間は約18msecです。

通常はタイムアウトしないようにソフトウェアでタイマーのリセット(CLRWDT命令)を時間内に実行することになります。タイムアウト前にこの命令が実行されないとCPUはリセットされて、電源投入直後と同じ動作をしてしまいます。タイムアウト時間を延ばすためにプリスケーラを使うことができます。タイマーの後に付けるので本当はポストスケーラです。でも、プリスケーラと言っています。
この場合のカウント値はTMR0に使う場合と異なっています。1、2、4、8、16、32、64、128の8段階です。128に設定した場合、18msec x 128 = 2,304msec で約2秒でタイムアウトすることになります。
ウォッチドックタイマーはソフトウェアの異常動作(暴走:プログラムでないところをプログラムと思って実行している、とかループ:同じ所を繰り返し実行している)をガードするために設けられている機能です。絶対に必要という機能ではありません。プログラムが間違っていれば、期待した動作をしないので分かります。ウォッチドックタイマーによりリセットされてしまうと、異常現象が分かり難くなる場合もあります。何だか分からないけれどリセットされると言うことになります。そのように考えるとウォッチドックタイマーは使わない方が良いかも知れません。ウォッチドックタイマーを使わないようにするためにはプログラムメモリーのコンフィギュレーションワード(2007h)のWDTEビットを"0"にします。
私は基本的にウォッチドックタイマーは使用しません。その場合、プリスケーラはTMR0に使用できます。