組み込みシステム-タイマー/カウンター
A timer時間間隔を測定するために使用される特殊なタイプの時計です。経過時間を測定するためにゼロから上にカウントするタイマーは、多くの場合、stopwatch。これは、指定された時間間隔からカウントダウンし、時間遅延を生成するために使用されるデバイスです。たとえば、砂時計はタイマーです。
A counterは、クロック信号に関して、特定のイベントまたはプロセスが発生した回数を保存する(場合によっては表示する)デバイスです。マイクロコントローラの外部で発生するイベントをカウントするために使用されます。エレクトロニクスでは、フリップフロップなどのレジスタタイプの回路を使用して、カウンタを非常に簡単に実装できます。
タイマーとカウンターの違い
タイマーとカウンターの違いは次のとおりです。
タイマー | カウンター |
---|---|
レジスタは、マシンサイクルごとにインクリメントされます。 | レジスタは、外部入力ピン(T0、T1)に対応する1から0への遷移を考慮してインクリメントされます。 |
最大カウントレートは発振器周波数の1/12です。 | 最大カウントレートは発振器周波数の1/24です。 |
タイマーは内部クロックの周波数を使用し、遅延を生成します。 | カウンタは外部信号を使用してパルスをカウントします。 |
8051のタイマーとそれに関連するレジスタ
8051には、タイマー0とタイマー1の2つのタイマーがあります。これらは、タイマーまたはイベントカウンターとして使用できます。タイマー0とタイマー1はどちらも16ビット幅です。8051は8ビットアーキテクチャに従っているため、各16ビットは下位バイトと上位バイトの2つの別々のレジスタとしてアクセスされます。
タイマー0レジスタ
タイマ0の16ビットレジスタは、下位バイトと上位バイトとしてアクセスされます。下位バイトレジスタはTL0(タイマー0下位バイト)と呼ばれ、上位バイトレジスタはTH0(タイマー0上位バイト)と呼ばれます。これらのレジスタには、他のレジスタと同じようにアクセスできます。たとえば、命令MOV TL0, #4H 値をタイマー#0の下位バイトに移動します。
タイマー1レジスタ
タイマ1の16ビットレジスタは、下位バイトと上位バイトとしてアクセスされます。下位バイトレジスタはTL1(タイマ1下位バイト)と呼ばれ、上位バイトレジスタはTH1(タイマ1上位バイト)と呼ばれます。これらのレジスタには、他のレジスタと同じようにアクセスできます。たとえば、命令MOV TL1, #4H 値をタイマー1の下位バイトに移動します。
TMOD(タイマーモード)レジスタ
タイマ0とタイマ1はどちらも同じレジスタを使用して、さまざまなタイマ動作モードを設定します。これは、タイマー0用に下位4ビット、タイマー用に上位4ビットが確保されている8ビットレジスタです。いずれの場合も、下位2ビットを使用して事前にタイマーモードを設定し、上位2ビットを使用して場所を指定します。
Gate −設定すると、タイマーはINT(0,1)がハイのときにのみ実行されます。
C/T −カウンタ/タイマ選択ビット。
M1 −モードビット1。
M0 −モードビット0。
ゲート
すべてのタイマーには、開始と停止の手段があります。一部のタイマーはソフトウェアによって、一部はハードウェアによってこれを実行し、一部はソフトウェアとハードウェアの両方の制御を備えています。8051タイマーには、ソフトウェアとハードウェアの両方の制御があります。タイマーの開始と停止は、命令を使用してソフトウェアによって制御されますSETB TR1 そして CLR TR1 タイマー1の場合、および SETB TR0 そして CLR TR0 タイマー0の場合。
SETB命令はそれを開始するために使用され、CLR命令によって停止されます。これらの命令は、TMODレジスタのGATE = 0である限り、タイマーを開始および停止します。タイマーは、TMODレジスタでGATE = 1にすることにより、外部ソースによって開始および停止できます。
C / T(時計/タイマー)
TMODレジスタのこのビットは、タイマーをとして使用するかどうかを決定するために使用されます。 delay generator または event manager。C / T = 0の場合、タイマー遅延生成のタイマーとして使用されます。時間遅延を作成するためのクロックソースは、8051の水晶周波数です。C/ T = 0の場合、8051に接続された水晶周波数も、8051タイマーが一定の間隔で刻む速度を決定します。
タイマー周波数は常に8051に接続されている水晶の周波数の1/12です。さまざまな8051ベースのシステムのXTAL周波数は10MHz〜40 MHzですが、通常は11.0592MHzのXTAL周波数で動作します。これは、8051.XTAL = 11.0592のシリアル通信のボーレートにより、8051システムがエラーなしでPCと通信できるためです。
M1 / M2
M1 | M2 | モード |
---|---|---|
0 | 0 | 13ビットタイマーモード。 |
0 | 1 | 16ビットタイマーモード。 |
1 | 0 | 8ビット自動リロードモード。 |
1 | 1 | こぼれたモード。 |
タイマーのさまざまなモード
モード0(13ビットタイマーモード)
モード0のタイマー1とタイマー0は、どちらも8ビットカウンターとして動作します(32分周プリスケーラーを使用)。タイマレジスタは、TH1の8ビットすべてとTL1の下位5ビットで構成される13ビットレジスタとして構成されています。TL1の上位3ビットは不確定であるため、無視する必要があります。実行フラグ(TR1)を設定しても、レジスタはクリアされません。タイマー割り込みフラグTF1は、カウントがすべて1からすべて0にロールオーバーしたときに設定されます。モード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ビットタイマーについて考えてみます。
TMODSFRを初期化します。TMODの下位4ビットを使用し、タイマー0を検討します。タイマーを外部ピンから独立させたいので、GATE0とC / T0の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はオーバーフローしています。