原理圖
為什么要使用計(jì)時(shí)器?
大多數(shù)微控制器項(xiàng)目都需要使用精心計(jì)時(shí)的事件,包括多任務(wù),位沖擊協(xié)議,測量等等。這些定時(shí)事件可以通過在循環(huán)的每次迭代中使用遞增計(jì)數(shù)器來在軟件中完成。但是,這會浪費(fèi)可用于執(zhí)行其他操作的CPU資源,并且此類循環(huán)的使用可能難以正確計(jì)時(shí)。這就是定時(shí)器被引入微控制器的原因。現(xiàn)在它們非常普遍,很少找到?jīng)]有控制器的控制器。
大多數(shù)ATmega設(shè)備至少有一個(gè)定時(shí)器,ATmega168有三個(gè)定時(shí)器。因此,在本教程中,我們將看看定時(shí)器0以及在兩種不同模式下使用時(shí)如何將它用于定時(shí)事件:正常和比較。
定時(shí)器0
定時(shí)器0是一個(gè)通用的8位定時(shí)器,具有一些相當(dāng)強(qiáng)大的功能,包括比較模式,快速PWM生成和波形生成功能。雖然定時(shí)器0可能看起來很復(fù)雜,但實(shí)際上它使用起來相當(dāng)簡單,只要你了解其工作原理背后的基礎(chǔ)知識。
定時(shí)器0外設(shè)布局
首先,AVR上的定時(shí)器幾乎與一個(gè)由鏈中的一堆觸發(fā)器組成的簡單向上計(jì)數(shù)器相同。每次定時(shí)器計(jì)時(shí)時(shí),它都會遞增一個(gè)計(jì)數(shù)器寄存器,用于跟蹤當(dāng)前定時(shí)器的值。
當(dāng)定時(shí)器達(dá)到最大值然后計(jì)時(shí)時(shí)(timer0是一個(gè)8位計(jì)數(shù)器,這意味著它最大值為255),定時(shí)器回繞到0并設(shè)置定時(shí)器溢出位。此位可用于查看計(jì)數(shù)器是否已溢出,并且在確定特定代碼段是否已停止或未響應(yīng)的情況下非常有用。
定時(shí)器通??梢詠碜圆煌脑矗▋?nèi)部時(shí)鐘源和外部I/O引腳。這意味著外部電路可以提供方波,使定時(shí)器遞增,或者微控制器本身可以遞增定時(shí)器(這通常用作時(shí)鐘源)。
一些定時(shí)器(如定時(shí)器0)有比較單位,允許定時(shí)器在定時(shí)器等于某個(gè)值時(shí)觸發(fā)中斷。當(dāng)微控制器需要執(zhí)行在特定時(shí)間過去時(shí)執(zhí)行的事件時(shí),這非常有用。
一個(gè)這樣的例子涉及在需要每64uS發(fā)送一次脈沖同步脈沖時(shí)創(chuàng)建視頻信號(朋友)。其他示例包括多任務(wù),其中微控制器可以每毫秒切換到不同的任務(wù)。一旦匹配發(fā)生,也可以使這樣的比較單元清除定時(shí)器,這樣用戶就不必自己重置定時(shí)器。
定時(shí)器0:正常模式
在正常模式下,定時(shí)器0將在每個(gè)時(shí)鐘遞增,并且一旦計(jì)數(shù)器超過其最高值值(255,因?yàn)樗且粋€(gè)8位定時(shí)器),定時(shí)器回繞到值0并設(shè)置溢出位(TOV0位在寄存器TIFR0中找到)。
設(shè)置定時(shí)器0運(yùn)行在正常模式下,WGM02-WGM01位需要設(shè)置為0(注意; WGM02位于TCCR0B中,而位WGM01和WGM00位于寄存器TCCR0A中。
寄存器TCCR0A和TCCR0B中的波形位
定時(shí)器0:CTC模式
比較匹配模式(CTC)上的清除定時(shí)器與普通模式類似,除非定時(shí)器達(dá)到的值寄存器OCR0A,定時(shí)器清零(復(fù)位為0x00)。這可用于創(chuàng)建定時(shí)事件,包括延遲和中斷,而無需使用軟件資源(全部在硬件中完成)。
當(dāng)定時(shí)器等于OCR0A的值時(shí),則設(shè)置OCF0A,表示匹配在定時(shí)器和OCR0A之間發(fā)生。要在CTC模式下配置定時(shí)器0,需要將WGM02-WMG00位設(shè)置為0x02。
定時(shí)器0時(shí)鐘源
定時(shí)器0可以通過外部源(通過T0引腳)或內(nèi)部I/O時(shí)鐘提供時(shí)鐘。某些I/O時(shí)鐘源可以如表所示進(jìn)行預(yù)分頻,時(shí)鐘源選擇位可在TCCR0B寄存器中找到。
從顯示預(yù)分量選項(xiàng)的ATmega數(shù)據(jù)表中提取
關(guān)于中斷標(biāo)志的注意事項(xiàng)
重要的是要注意AVR是為了清除標(biāo)志,你必須在標(biāo)志上寫一個(gè)邏輯的。這意味著,例如,如果要清除溢出標(biāo)志,則將1寫入寫入0的寄存器INSTEAD。
示例1:正常模式
此模式顯示在正常模式下使用定時(shí)器0來打開和關(guān)閉LED每次計(jì)數(shù)器翻轉(zhuǎn)(超過255)。
/*
* AVR Timer.c
*
* Created: 08/01/2018 13:16:36
* Author : RobinLaptop
*/
#define setBit(reg, bit) (reg = reg | (1 《《 bit))
#define clearBit(reg, bit) (reg = reg & ~(1 《《 bit))
#define toggleBit(reg, bit) (reg = reg ^ (1 《《 bit))
#define clearFlag(reg, bit) (reg = reg | (1 《《 bit))
#include
int main(void)
{
// Initialize Registers
clearBit(TCCR0A, WGM00); // Configure WGM to be 0x00 for normal mode
clearBit(TCCR0A, WGM01);
clearBit(TCCR0B, WGM02);
setBit(TCCR0B, CS00); // Configure clock source to be clock io at 1024 pre-scale
clearBit(TCCR0B, CS01);
setBit(TCCR0B, CS02);
DDRD = 0xFF; // Make PORT D and output
while (1)
{
// Wait until the TOV0 bit is set
while(!(TIFR0 & (1 《《 TOV0)))
{
}
// Clear the overflow flag by writing a 1 to it. I know, thats dumb but that‘s how it is!
clearFlag(TIFR0, TOV0);
// Toggle the LED (PD0 , Pin 2)
PORTD = PORTD ^ (1 《《 PD0);
}
}
示例2:CTC模式
當(dāng)定時(shí)器0等于OCR0A的值時(shí),該模式將切換LED。一旦匹配發(fā)生,定時(shí)器將自動復(fù)位并設(shè)置OCF0A標(biāo)志。
/*
* Example 2 - CTC.c
*
* Created: 08/01/2018 13:43:06
* Author : RobinLaptop
*/
#define setBit(reg, bit) (reg = reg | (1 《《 bit))
#define clearBit(reg, bit) (reg = reg & ~(1 《《 bit))
#define toggleBit(reg, bit) (reg = reg ^ (1 《《 bit))
#define clearFlag(reg, bit) (reg = reg | (1 《《 bit))
#include
int main(void)
{
// Initialize Registers
clearBit(TCCR0A, WGM00); // Configure WGM to be 0x00 for normal mode
setBit(TCCR0A, WGM01);
clearBit(TCCR0B, WGM02);
setBit(TCCR0B, CS00); // Configure clock source to be clock io at 1024 pre-scale
clearBit(TCCR0B, CS01);
setBit(TCCR0B, CS02);
DDRD = 0xFF; // Make PORT D and output
OCR0A = 0x7F; // Reset the timer once the value of the timer reaches 127
while (1)
{
// Wait until the OCF0A bit is set
while(?。═IFR0 & (1 《《 OCF0A)))
{
}
// Clear the overflow flag by writing a 1 to it. I know, thats dumb but that’s how it is!
clearFlag(TIFR0, OCF0A);
// Toggle the LED (PD0 , Pin 2)
PORTD = PORTD ^ (1 《《 PD0);
}
}
結(jié)論
本教程僅涉及計(jì)時(shí)器能夠做更多事情的計(jì)時(shí)器。例如,這些定時(shí)器可以啟用它們的中斷,這將允許微控制器在設(shè)置標(biāo)志后立即運(yùn)行時(shí)間敏感的代碼。或者,我們可以執(zhí)行其他代碼,而不是使用while循環(huán)來等待溢出標(biāo)志觸發(fā),這樣可以更有效地利用CPU。很明顯,定時(shí)器非常強(qiáng)大,可以為大多數(shù)項(xiàng)目帶來巨大的變化!
-
ATmega168
+關(guān)注
關(guān)注
0文章
9瀏覽量
9314 -
TIMER0
+關(guān)注
關(guān)注
0文章
21瀏覽量
7478
發(fā)布評論請先 登錄
相關(guān)推薦
電流輸出 vs 電壓輸出:兩種傳感器輸出模式有什么區(qū)別?
![電流輸出 vs 電壓輸出:<b class='flag-5'>兩種</b>傳感器輸出<b class='flag-5'>模式</b>有什么區(qū)別?](https://file1.elecfans.com//web3/M00/07/99/wKgZO2enMQOAFclSAADJqIhumi8455.jpg)
TLV5616和TLV5636兩種工作模式FAST和SLOW分別有什么特點(diǎn),優(yōu)勢,選擇時(shí)應(yīng)該注意什么?
ADS1259讀取模數(shù)轉(zhuǎn)換結(jié)果的時(shí)候是否是兩種讀取模式?
求助一下關(guān)于51系列單片機(jī)的Timer0的計(jì)時(shí)問題,TH0、TL0+1的時(shí)間是怎么算的?
ADS1292R有 \"1 ch ECG + 1 ch呼吸偵測\" 或 \"2 ch ECG\" 兩種模式,是否可以在產(chǎn)品上實(shí)現(xiàn)自行切換兩種使用模式?
兩種轉(zhuǎn)換控制模式Zone 1 Transfer和Zone 2 Transfer怎么區(qū)分使用?
兩種工作模式下,opa695的應(yīng)用是不是不同呢?
紅石比較器兩種模式的作用
晶閘管的阻斷狀態(tài)有兩種是什么
GD32E230C8T6高級定時(shí)器timer0無法正常輸出PWM波形的原因?
wdm設(shè)備的兩種傳輸方式
BOOST兩種電路工作模式效率對比
![BOOST<b class='flag-5'>兩種</b>電路工作<b class='flag-5'>模式</b>效率對比](https://file1.elecfans.com/web2/M00/DA/49/wKgaomYqAJSAafihAAAY5sGYSak220.png)
評論