Embedded-systems-es-timer-counter

提供:Dev Guides
移動先:案内検索

組み込みシステム-タイマー/カウンター

  • タイマー*は、時間間隔の測定に使用される特殊なタイプのクロックです。 経過時間を測定するためにゼロからカウントアップするタイマーは、多くの場合*ストップウォッチ*と呼ばれます。 これは、指定された時間間隔からカウントダウンし、時間遅延を生成するために使用されるデバイスです。たとえば、砂時計はタイマーです。
*counter* は、クロック信号に関して特定のイベントまたはプロセスが発生した回数を保存(および表示する)するデバイスです。 マイクロコントローラーの外部で発生するイベントをカウントするために使用されます。 電子機器では、フリップフロップなどのレジスタ型回路を使用して、カウンターを非常に簡単に実装できます。

タイマーとカウンターの違い

タイマーをカウンターと区別するポイントは次のとおりです-

Timer Counter
The register incremented for every machine cycle. The register is incremented considering 1 to 0 transition at its corresponding to an external input pin (T0, T1).
Maximum count rate is 1/12 of the oscillator frequency. Maximum count rate is 1/24 of the oscillator frequency.
A timer uses the frequency of the internal clock, and generates delay. A counter uses an external signal to count pulses.

8051のタイマーと関連レジスタ

8051には、タイマー0とタイマー1の2つのタイマーがあります。 これらは、タイマーまたはイベントカウンターとして使用できます。 タイマー0とタイマー1は両方とも16ビット幅です。 8051は8ビットアーキテクチャに準拠しているため、各16ビットはローバイトとハイバイトの2つの独立したレジスタとしてアクセスされます。

タイマー0レジスタ

タイマー0の16ビットレジスタは、下位バイトおよび上位バイトとしてアクセスされます。 下位バイトレジスタはTL0(タイマー0下位バイト)と呼ばれ、上位バイトレジスタはTH0(タイマー0上位バイト)と呼ばれます。 これらのレジスタは、他のレジスタと同様にアクセスできます。 たとえば、命令 MOV TL0、#4H は、値をタイマー#0の下位バイトに移動します。

タイマー0

タイマー1レジスタ

タイマー1の16ビットレジスタは、下位バイトおよび上位バイトとしてアクセスされます。 下位バイトレジスタはTL1(タイマー1下位バイト)と呼ばれ、上位バイトレジスタはTH1(タイマー1上位バイト)と呼ばれます。 これらのレジスタは、他のレジスタと同様にアクセスできます。 たとえば、命令 MOV TL1、#4H は、値をタイマー1の下位バイトに移動します。

タイマー1

TMOD(タイマーモード)レジスタ

タイマー0とタイマー1は、同じレジスターを使用して、さまざまなタイマー動作モードを設定します。 これは、タイマー0の下位4ビットとタイマーの上位4ビットが確保されている8ビットのレジスタです。 いずれの場合も、下位2ビットを使用して事前にタイマーモードを設定し、上位2ビットを使用して場所を指定します。

TMOD Register

*Gate* -設定すると、タイマーはINT(0,1)が高い間のみ実行されます。
*C/T* -カウンター/タイマー選択ビット。
*M1* -モードビット1。
*M0* -モードビット0。

GATE

すべてのタイマーには、開始と停止の手段があります。 これをソフトウェアで行うタイマー、ハードウェアで行うタイマー、ソフトウェアとハ​​ードウェアの両方を制御するタイマーがあります。 8051タイマーには、ソフトウェアとハ​​ードウェアの両方の制御があります。 タイマーの開始と停止は、タイマー1の命令 SETB TR1CLR TR1 、およびタイマー0の SETB TR0CLR TR0 を使用して、ソフトウェアによって制御されます。

SETB命令を使用して起動し、CLR命令によって停止します。 これらの命令は、TMODレジスタでGATE = 0である限り、タイマーを開始および停止します。 TMODレジスタでGATE = 1にすることで、外部ソースによってタイマーを開始および停止できます。

C/T(時計/タイマー)

TMODレジスタのこのビットは、タイマーを*遅延ジェネレーター*または*イベントマネージャー*のどちらとして使用するかを決定するために使用されます。 C/T = 0の場合、タイマー遅延生成のタイマーとして使用されます。 時間遅延を作成するクロックソースは、8051の水晶周波数です。 C/T = 0の場合、8051に接続されている水晶周波数によって、8051タイマーが一定間隔で作動する速度も決定されます。

タイマー周波数は常に、8051に接続されている水晶の周波数の1/12です。 さまざまな8051ベースのシステムのXTAL周波数は10 MHz〜40 MHzですが、通常XTAL周波数11.0592 MHzで動作します。 これは、8051.XTALのシリアル通信のボーレート= 11.0592により、8051システムがエラーなしでPCと通信できるためです。

M1/M2

M1 M2 Mode
0 0 13-bit timer mode.
0 1 16-bit timer mode.
1 0 8-bit auto reload mode.
1 1 Spilt mode.

タイマーのさまざまなモード

モード0(13ビットタイマーモード)

モード0のタイマー1とタイマー0は両方とも8ビットカウンターとして動作します(32分周プリスケーラー付き)。 タイマーレジスタは、TH1の8ビットすべてとTL1の下位5ビットで構成される13ビットレジスタとして構成されます。 TL1の上位3ビットは不定であり、無視する必要があります。 実行フラグ(TR1)を設定しても、レジスタはクリアされません。 カウントがすべて1からすべて0にロールオーバーすると、タイマー割り込みフラグTF1が設定されます。 モード0の動作は、タイマー0の場合とタイマー1の場合と同じです。

モード1(16ビットタイマーモード)

タイマーモード「1」は16ビットタイマーで、一般的に使用されるモードです。 16ビットすべてが使用されることを除いて、13ビットモードと同じように機能します。 TLxは、0から最大255まで増分されます。 値が255に達すると、TLxは0にリセットされ、THxは1ずつ増加します。 フル16ビットタイマーであるため、タイマーには最大65536個の個別の値が含まれ、65,536マシンサイクル後にオーバーフローして0に戻ります。

モード2(8ビット自動リロード)

両方のタイマーレジスタは、自動リロードを備えた8ビットカウンター(TL1およびTL0)として構成されます。 TL1(TL0)からのオーバーフローは、TF1(TF0)を設定し、ソフトウェアによって事前設定されているTh1(TH0)の内容でTL1(TL0)をリロードします。 リロードでは、TH1(TH0)は変更されません。

自動リロードモードの利点は、タイマーに常に200〜255の値を含めることができることです。 モード0または1を使用する場合は、コードをチェックインしてオーバーフローを確認し、その場合はタイマーを200にリセットする必要があります。 この場合、貴重な指示が値を確認し、リロードされます。 モード2では、マイクロコントローラーがこれを処理します。 モード2でタイマーを構成したら、タイマーがオーバーフローしたかどうかを確認する必要はありません。また、マイクロコントローラーハードウェアがすべてを行うため、値をリセットすることを心配する必要はありません。 自動リロードモードは、一般的なボーレートを確立するために使用されます。

モード3(スプリットタイマーモード)

タイマーモード「3」は、 split-timer mode として知られています。 タイマー0がモード3になると、2つの独立した8ビットタイマーになります。 タイマー0はTL0で、タイマー1はTH0です。 両方のタイマーは0から255までカウントし、オーバーフローの場合は0にリセットします。 これで、タイマー1のすべてのビットがTH0に関連付けられます。

タイマー0が分割モードの場合、実際のタイマー1(つまり、 TH1およびTL1)は、モード0、1、または2で設定できますが、そのビットがTH0にリンクされているため、開始/停止できません。 実際のタイマー1は、マシンサイクルごとにインクリメントされます。

タイマーの初期化

タイマーモードを決定します。 継続的に実行され、外部ピンに依存しない16ビットタイマーを考えてみましょう。

TMOD SFRを初期化します。 TMODの最下位4ビットを使用し、タイマー0を検討します。 タイマーを外部ピンから独立させるため、GATE 0とC/T 0の2ビットを0のままにします。 16ビットモードはタイマーモード1であるため、T0M1をクリアしてT0M0を設定します。 事実上、オンにするビットはTMODのビット0のみです。 今、次の命令を実行します-

MOV TMOD,#01h

現在、タイマー0は16ビットタイマーモードになっていますが、タイマーは実行されていません。 実行モードでタイマーを開始するには、次の命令を実行してTR0ビットを設定します-

SETB TR0

これで、タイマー0はすぐにカウントを開始し、マシンサイクルごとに1つずつ増加します。

タイマーを読む

16ビットタイマーは、2つの方法で読み取ることができます。 タイマーの実際の値を16ビット数として読み取るか、タイマーがオーバーフローしたことを検出します。

タイマーオーバーフローの検出

タイマーが最大値から0にオーバーフローすると、マイクロコントローラーはTCONレジスタのTFxビットを自動的に設定します。 そのため、タイマーの正確な値をチェックする代わりに、TFxビットをチェックできます。 TF0が設定されている場合、タイマー0はオーバーフローしています。 TF1が設定されている場合、タイマー1はオーバーフローしています。