[STC MCU学習]レッスン10:MCUのタイマーとカウンター

【朱さんのコース概要侵入】

このレッスンの焦点:レジスタ

最初の部分、章リスト

1.10.1。タイマーの概要

1.10.2。ソフトウェア制御ハードウェアレジスタの鍵

1.10.3.51マイクロプロセッサのタイマーの概要

1.10.4。タイマーのメインレジスタの概要

1.10.5。タイマープログラミングの練習1

1.10.6。タイミング時間設定エラー修正



第二部、章の紹介


1.10.1。タイマーの紹介
    このセクションでは、タイマーの動作原理、機能、および重要性を中心に、広い視点からタイマーを紹介します。
1.10.2。ソフトウェアレジスタによるハードウェア制御の鍵
    このセクションでは、レジスタの概念を紹介し、レジスタを学習することによってソフトウェアを使用してハードウェアを制御する原理を学習します。
1.10.3.51
    51シングルチップマイクロコンピュータのタイマーの概要このセクションでは、51シングルチップマイクロコンピュータのデータマニュアルにあるタイマーの概要の章を読みます。データマニュアルを読むことにより、タイマーを学びながらデータマニュアルの読み方を学ぶことができます。
1.10.4。タイマーのメインレジスタの概要1
    このセクションでは、51個のシングルチップマイクロコンピュータのタイマー関連レジスタについて説明します。このセクションでは、主にTCONのTFビットとTRビット、およびTMODのGATEビットに焦点を当てます。
1.10.5。タイマー2のメインレジスタの概要
    このセクションでは、51個のシングルチップマイクロコンピュータのタイマー関連レジスタについて説明します。このセクションでは、主にTCONのTFビットとTRビット、およびTMODのGATEビットに焦点を当てます。
1.10.6。タイマーのメインレジスタの概要3
    このセクションでは、残りのレジスタビットについて説明します。
1.10.7。タイマープログラミングの練習1
    このセクションは、タイマープログラミングの練習用です。データマニュアルのサンプルコードを参照して、独自のコードを書き直して取得し、テスト検証のためにダウンロードしてください。
1.10.8。タイマープログラミングの練習2
    このセクションは、タイマープログラミングの練習用です。データマニュアルのサンプルコードを参照して、独自のコードを書き直して取得し、テスト検証のためにダウンロードしてください。
1.10.9。タイミング時間設定エラーの修正
    このセクションでは、前のコースで間違っていた51個のシングルチップタイマーのタイミング時間設定の問題について補足的に説明しました。

    
パート3、教室の記録

1.10.1。タイマーの概要

1.10.1.1タイマーとは?
(1)SoCの内部周辺機器(チップ上のシステム、成果はマイクロコンピューターであることが理解できます)
(2)タイマーはCPUの「アラームクロック」です。
タイマーはSoCに関連するアラームクロックのようなものです。意味は人と同じです。シングルコアCPUはシングルスレッドであり、1つのことしか実行できません。また、このことを終了して別のことを実行したときに通知するタイマーが必要です。

1.10.1.2
カウンターとはカウンターとタイマーは実際には同じものです
(1)カウンターはSOCの内部周辺機器でもあります
(2)カウンターは、その名前が示すように、カウントに使用されます。
たとえば、stopwatch(ポインターウォッチ)は実際にはカウンターです。ストップウォッチのカウント期間は固定されているため、1単位おきにグリッドを取ります(つまり、数値をカウントします)。特定の時間が来たら、カウント値*カウント期間を使用して期間を取得します。この期間がセットです。時間(これはタイマーです)。

(3)カウンターは、外部パルス数(パルスは実際にはピンを介してマイクロコンピューターに流入するレベル信号です)をカウントでき、パルスが
ソース画像を表示
発生する頻度と、カウンターを通過するパルスの数が時間を認識します。
言い換えると、内部パルスのカウントはタイマーと呼ばれ、外部パルスのカウントはカウンターと呼ばれます。
内部パルスは安定しており、各パルスは一定の時間間隔を持っているため、時間を計ることができます。
外部パルスは非常に不安定です。2つのパルス間の時間を知ることは不可能であり、カウントするだけです。

(4)タイマーですか、それともカウンターですか?レジスターによって制御されます

。1.10.1.3。タイマーはどのように機能しますか?
(1)ステップ1:最初にタイマーのクロックソースを設定します(必要な場合)
                 クロックソース:水晶振動子(水晶振動子)
(2)ステップ2:クロック関連レジスタを初期化します
(3)ステップ3:タイミング時間を設定します(パルス数+各パルス時間をカウント)
(4)ステップ4:設定割り込み処理プログラム(外部入力の優先度はタイミングよりも高い
例:主なタスクはテレビを見ることであり、タイマー割り込みプログラムは沸騰したお湯です!
(5)ステップ5:タイマーをオンにします
(6)実行:タイマーは、タイマーがカウントアップした後に割り込みを生成し、割り込みisrを実行し

ます。後でコードを見ると、より明確になります。


1.10.2。ソフトウェア制御ハードウェアレジスタの鍵

一部のハードウェアをソフトウェアで制御するにはどうすればよいですか?レジスターによります!

1.10.2.1レジスタとは
(1)レジスタ[reg]  
(2)レジスタ

  •    登録、内容は可変で、通常はビットで定義されます
  •    変数と同等ですが、この変数には固定アドレスに特別な名前が付いています。
  •    レジスターは、一般レジスター(P0 ...)と特殊機能レジスター(IE ...)に分けられます。

(3)レジスタは
、reg51.hで定義されたメモリのようにプログラムされたアドレスによってアクセスされます

1.10.2.2。レジスタの動作原理
(1)レジスタとハードウェアの間には双方向の影響があります。率直に言って、レジスタ
にはIOもあります。これは、入力/出力デバイスであるハードウェアに関連しています。
(2)ソフトウェアはレジスターの読み取りと書き込みを行うことができます
プログラムはレジスターへの値の書き込みやGPIOピンの値などのレジスター値の読み取りを行うことができます実際には、ピン内のレジスターを読み取ります。
(3)まとめ:レジスターはソフトウェアがハードウェアを制御する

ための鍵1.10.2.3。MCU学習の鍵はさまざまなレジスターです。
レジスターはMCUに対するものであり、単語は英語学習に対するものです。

(1)シングルチップマイクロメータの学習には主に2つが含まれます:CPUとさまざまな内部周辺機器
(2)さまざまな内部周辺機器のプログラミングインターフェイスはレジスタです
(3)シングルチップマイクロコンピュータに精通していることは実際にそのレジスタに精通しています
(4)レジスタは続きますシングルチップマイクロコンピュータの複雑さにより、複雑になります(STM32とシングルチップマイクロコンピュータには違いがありますが、勉強すると非常に簡単です!)
(5)C言語でレジスタを操作するスキルを学ぶ-重要なポイントは
C言語の操作を学ぶことですマイクロコントローラーのスキル!


1.10.3.51マイクロプロセッサのタイマーの概要

データシートを参照してください。P136タイマー/カウンター

マイクロコンピューターが12Tモードで動作する場合!
外部12MHz水晶振動子、内部クロック周波数は1MHz、クロックパルス幅は1us(1 / 1MHz = 1us)です。
 
マイクロ
プロセッサが外部12MHz水晶振動子を使用して6Tモードで動作する場合、内部クロック周波数は2MHzであり、クロックパルス幅は0.5us(1 / 2MHz = 0.5us)です。
 

51のモードと作業方法は面倒です。覚えておく必要はありません。一度実行するだけで、組み込みのSTM32を習得するとはるかに簡単になります。
次のいくつかのセクションでは、マニュアルを通じてタイマーのメインレジスタに焦点を当てます


1.10.4。タイマーのメインレジスタの概要

MSBビッグエンディアン、LSBリトルエンディアンP136

1.10.4.1、TCON(タイマー制御)タイマー/カウンター制御レジスタ

0b11000011はB7-B0
(1)8ビットからのものですが、TF、TR、IE、ITの4つの名前があり、各名前の記号は2です。 1、T0とT1に対応する0と1が続きます。
(2)TF:タイマーフラグ、タイマー(オーバーフロー)フラグビット

  • これは読み取り専用です(ソフトウェアは、このビットを書き込んでハードウェアのステータスを設定するのではなく、TF1を読み取ることによってのみハードウェアのステータスを認識します)。
  • タイマーが期限切れになると、2つのことが行われます。1つはTFフラグを1に変更すること、もう1つはCPUが処理を中断するための割り込みを生成することです。CPUが応答すると、TFはハードウェアによってクリアされます(1から0)。自動であり、ソフトウェアの介入は必要ありません。)
  • クリアするソフトウェアを必要とするCPU設計がいくつかあります(主流のマイクロプロセッサ)。このとき、ユーザーのプログラムはフラグビットをクリアすることを忘れないでください。そうしないと、繰り返し割り込みに入ります。
  • = 1オーバーフロー、= 0オーバーフロークリア

(3)TR:タイマー実行、タイマーのカウントを開始するスイッチです。

  • タイマー全体を初期化した後、TRビットに1を書き込むことでカウントを開始できます。だが!
  • TRビットとGATEビットには一定の相関関係があります。GATEはTMODレジスタのレジスタビットです。最初に見てください!

(4)IE:割り込みイネーブル、外部割り込み(INTx)要求ソースフラグ

  • 役割は、ハードウェアの変更の状態を表示することです。
  • INT1が中断されると、ハードウェアは自動的にIE1 = 1になります
  • CPUがINT1割り込みを処理すると、ハードウェアは自動的にIE1 = 0に設定します(ハードウェアは自動的にクリアされます)。

(5)IT:割り込みトリガー、外部割り込みトリガーモード制御ビット

  •   外部割り込みの割り込みトリガーモードを設定するために使用します。
  •    いわゆる割り込みトリガーモードとは、ハードウェアが特定の条件下で割り込みを生成すると判断されることを意味するため、実際には割り込み生成の条件です。
  • 一般に、割り込みトリガーモードはエッジトリガーとレベルトリガーです。エッジトリガーは、立ち上がりエッジトリガー、立ち下がりエッジトリガー、およびダブルエッジトリガーに分けられますレベルトリガーモードは、高レベルトリガーと低レベルトリガーに分けられます
  • = 0  外部割り込み1は低レベルのトリガーモードで、INTx入力が低レベルの場合、IE = 1
  • = 1  外部割り込み(INTx)ポートが「1」→「0」に移行すると、IE = 1

1.10.4.2、TMOD(タイマーモード)タイマー/カウンター作業モードレジスタ

(1)GATE:中国語名はゲート制御ビット

  • これはTMODレジスタにあり、それぞれT0とT1に対応する2つがあります。

    作業の方法:

  • GATE = 0の場合、    タイマーはタイマー動作モードになります。このとき、タイマースイッチはTRビットの影響のみを受けます。具体的には、TR = 1がカウントを開始し、TR = 0がカウントを終了します。
  • GATE = 1の場合、タイマーはカウンター作業モードになりますタイマーをカウントに使用する場合、どの条件でカウントするかではなく、どの条件でカウントするかが非常に重要です。したがって、GATE = 1の場合、カウントするかどうかはTR1だけでなくINT1ピン(P3.3)にも依存します。実際のルールは、TR1 = 1でINT1ピンもハイの場合、カウントします。

(2)C / T位置

  • T0 / T1をタイマーモードまたはカウンターモードで動作するように設定します。
  • = 1はカウンターモードを意味します
  • = 0はタイマーモードを意味します。

(3)M1 + M0
       2ビットを合わせて、T0 / T1の動作モードを示します。通常、13ビット、16ビット、8ビットの自動リロード、ダブル8ビットの4種類があります。   


1.10.4.3、TLx、THx
TL0 + TH0:タイマー0の16ビットレジスタ
TL1 + TH1:タイマー1の16ビットレジスタ
パルス幅を0.5usとすると、タイミングを0.5msと4.444msに設定する必要があります。カウントは次のとおりです
。1000= 0x3E8 =高0x3低0xE8 => TL0 = 0xE8 TH0 = 0x3
8888 = 0x22B8 =高0x22低0xB8 => TL0 = 0xB8 TH0 = 0x22前のエラー

修正するには、オーバーフローはタイマーを超えることを意味します最大桁数!

1.10.5。タイマープログラミングの練習1

1.10.5.1。実験タスク
元々、フリッカーの遅延は遅延機能によって実現されていましたが、遅延中はここでCPUを消費する必要があり、他のことはできません。これは以前の欠点です

割り込み+タイミング:
CPUはメインタスク(静的デジタルチューブ表示0-F)を実行でき、タイマーは500msで、タイミングに達すると割り込みが生成され、割り込みハンドラーisrでLEDが点滅します!

1.10.5.2プログラミング方法
1.アイデア:

(1)タイミング(タイマーの初期化)

  • TMODに値を割り当てて、T0の動作モードを決定します。
  • タイマーカウントの初期値を計算し、TH0、TL0に書き込みます。
  • タイマー割り込みを開き、ET0とEAに値を割り当てます
  • TR0を設定して、タイマーのタイミングを開始します。

(2)メインプログラムは何をすべきですか?
(3)割り込みハンドラー

は、前のレッスンのキー割り込みプログラムで直接変更できます!【SCM学習】レッスン9:ボタン

2.質問の考え方:0.5秒の計算方法は?
     マシンサイクルは、CPUが基本的な操作を完了するのに必要な時間です。マシンサイクル= 1 /シングルチップクロック周波数。

  • シングルチップマイクロコンピュータの外部水晶振動子は12MHz12Tモードで動作するため、内部クロック周波数は1MHz、マシンサイクルは1usです。最大65535(16ビットタイマー動作モード)のパルスを設定できます。つまり、最大タイミング時間は65535 * 1us = 65535us = 65.535msです。
  • 比較的長い時間(たとえば、500ms)を設定したい場合、タイマーを直接満たすことはできません。解決策は、複数のタイミングの後に長い時間を合計することです。

    タイミング方法:最初にタイマーを使用して50msを設定し、次に* 10を設定します
    
。タイミング50msの初期値はいくつですか。

  • 12Tモード、外部水晶振動子12MHz、内部クロック周波数1MHz、内部マシンサイクル:1us
  • タイミング番号は次のとおりです:50ms / 1us = 50000
  • 初期値:65535-50000 + 1からカウント開始します(カウンターがオーバーフローする前に実際には65536までカウントするため)= 15536​​ = 0x3CB0初期値は0x3CB0に等しくなります
  • TL0 = 0xB0、TH0 = 0x3C(次のように理解することもできます:TH0 = 15536 /256、TL0 = 15536​​%256

これらの2つの写真を一緒に見て、プログラミングの必要性を分析しましょう。

  • MCUは12Tで動作し、選択の余地はありません
  • タイマー0を選びましょう

作業モードの構成

  • 内部クロックでカウントされるため、タイマーモードと同等です。GATE= 0
  • タイマーモードなので、C / T = 0
  • 16ビットタイマーモードが選択されているため、M1 = 0、M0 = 1
  • 上記の3つのポイントを組み合わせる:TMOD = 0x01

タイマーの初期値を設定します(手動、16ビットタイマーモード、TH0およびTL0をリロードする必要があることに注意してください)

  • TH0 = 0x3C
  • TL0 = 0xB0

割り込みイネーブル

  • ET0 = 1
  • EA = 1

タイマー/カウンター制御構成

  • カウントを許可、TR0 = 1
  • 外部からの中断はなく、ITとIEは気にしません
  • カウントがオーバーフローするとIFが自動的に変更されます。気にしないでください

タイマー割り込みハンドラーリファレンスマニュアルP141

最終的な手順は次のとおりです

#include <reg51.h>
 
/**************代码说明**************************
			本程序采用定时器中断方式,实现了静态数码管显示0-F并且每隔0.5s时,LED1闪一次
				P0--静态数码管
				P1.0 LED1
*************************************************/
 
sbit led = P1^0;//LED接在P1.0

unsigned char  CNT = 10;   //每次计数50ms,重复10次
unsigned char  count;
 
// 独立数码管的段码表
unsigned char val[16] = 
{
	0xc0, 0xf9, 0xa4, 0xb0, 
	0x99, 0x92, 0x82, 0xf8, 
	0x80, 0x90, 0x88, 0x83,
	0xc6, 0xa1, 0x86, 0x8e
};

/*************延时函数*************/
void delay()
{
	unsigned char i = 200,j = 100;
	while(i--)
		while(j--);
}
 
/******************************定时器中断服务程序*************************/
void tm0_isr() interrupt 1 using 1
{
		TH0 = 0x3C;
		TL0 = 0xB0;   //手工重载
	
		if (count--== 0)
		{
			// 说明已经中断了10次了,0.5s已经到了
			led = !led;				// LED取反
			count = CNT;
		}
}
 
/***************************主函数*********************************/
void main(void)
{
		unsigned char i = 0;
		/************定时器初始化*************/
		TMOD = 0x01;
		TH0 = 0x3C;
		TL0 = 0xB0;
		ET0 = 1;
		EA = 1;
		TR0 = 1;
	
		led = 1;
		count = CNT; 
	
		while (1)
		{
			//主线任务
			for (i=0; i<16; i++)
			{
				P0 = val[i];
				delay();
			}
		}
}

1.10.6.3、51タイマーウィジェットの使用

ダウンロードリンク:51タイマー計算

このセクションのプログラムダウンロードリンク:タイマー
このレッスンは終了しました。

おすすめ

転載: blog.csdn.net/qq_27148893/article/details/109690947
おすすめ