0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎樣在兩種不同模式下使用ATmega168上的Timer0

454398 ? 來源:工程師吳畏 ? 2019-07-31 17:02 ? 次閱讀

原理圖

怎樣在兩種不同模式下使用ATmega168上的Timer0

為什么要使用計時器?

大多數(shù)微控制器項目都需要使用精心計時的事件,包括多任務(wù),位沖擊協(xié)議,測量等等。這些定時事件可以通過在循環(huán)的每次迭代中使用遞增計數(shù)器來在軟件中完成。但是,這會浪費可用于執(zhí)行其他操作的CPU資源,并且此類循環(huán)的使用可能難以正確計時。這就是定時器被引入微控制器的原因?,F(xiàn)在它們非常普遍,很少找到?jīng)]有控制器的控制器。

大多數(shù)ATmega設(shè)備至少有一個定時器,ATmega168有三個定時器。因此,在本教程中,我們將看看定時器0以及在兩種不同模式下使用時如何將它用于定時事件:正常和比較。

定時器0

定時器0是一個通用的8位定時器,具有一些相當強大的功能,包括比較模式,快速PWM生成和波形生成功能。雖然定時器0可能看起來很復(fù)雜,但實際上它使用起來相當簡單,只要你了解其工作原理背后的基礎(chǔ)知識。

定時器0外設(shè)布局

首先,AVR上的定時器幾乎與一個由鏈中的一堆觸發(fā)器組成的簡單向上計數(shù)器相同。每次定時器計時時,它都會遞增一個計數(shù)器寄存器,用于跟蹤當前定時器的值。

當定時器達到最大值然后計時時(timer0是一個8位計數(shù)器,這意味著它最大值為255),定時器回繞到0并設(shè)置定時器溢出位。此位可用于查看計數(shù)器是否已溢出,并且在確定特定代碼段是否已停止或未響應(yīng)的情況下非常有用。

定時器通??梢詠碜圆煌脑?,包括內(nèi)部時鐘源和外部I/O引腳。這意味著外部電路可以提供方波,使定時器遞增,或者微控制器本身可以遞增定時器(這通常用作時鐘源)。

一些定時器(如定時器0)有比較單位,允許定時器在定時器等于某個值時觸發(fā)中斷。當微控制器需要執(zhí)行在特定時間過去時執(zhí)行的事件時,這非常有用。

一個這樣的例子涉及在需要每64uS發(fā)送一次脈沖同步脈沖時創(chuàng)建視頻信號(朋友)。其他示例包括多任務(wù),其中微控制器可以每毫秒切換到不同的任務(wù)。一旦匹配發(fā)生,也可以使這樣的比較單元清除定時器,這樣用戶就不必自己重置定時器。

定時器0:正常模式

在正常模式下,定時器0將在每個時鐘遞增,并且一旦計數(shù)器超過其最高值值(255,因為它是一個8位定時器),定時器回繞到值0并設(shè)置溢出位(TOV0位在寄存器TIFR0中找到)。

設(shè)置定時器0運行在正常模式下,WGM02-WGM01位需要設(shè)置為0(注意; WGM02位于TCCR0B中,而位WGM01和WGM00位于寄存器TCCR0A中。

寄存器TCCR0A和TCCR0B中的波形位

定時器0:CTC模式

比較匹配模式(CTC)上的清除定時器與普通模式類似,除非定時器達到的值寄存器OCR0A,定時器清零(復(fù)位為0x00)。這可用于創(chuàng)建定時事件,包括延遲和中斷,而無需使用軟件資源(全部在硬件中完成)。

當定時器等于OCR0A的值時,則設(shè)置OCF0A,表示匹配在定時器和OCR0A之間發(fā)生。要在CTC模式下配置定時器0,需要將WGM02-WMG00位設(shè)置為0x02。

定時器0時鐘源

定時器0可以通過外部源(通過T0引腳)或內(nèi)部I/O時鐘提供時鐘。某些I/O時鐘源可以如表所示進行預(yù)分頻,時鐘源選擇位可在TCCR0B寄存器中找到。

從顯示預(yù)分量選項的ATmega數(shù)據(jù)表中提取

關(guān)于中斷標志的注意事項

重要的是要注意AVR是為了清除標志,你必須在標志上寫一個邏輯的。這意味著,例如,如果要清除溢出標志,則將1寫入寫入0的寄存器INSTEAD

示例1:正常模式

此模式顯示在正常模式下使用定時器0來打開和關(guān)閉LED每次計數(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(?。═IFR0 & (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模式

當定時器0等于OCR0A的值時,該模式將切換LED。一旦匹配發(fā)生,定時器將自動復(fù)位并設(shè)置OCF0A標志。

/*

* 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é)論

本教程僅涉及計時器能夠做更多事情的計時器。例如,這些定時器可以啟用它們的中斷,這將允許微控制器在設(shè)置標志后立即運行時間敏感的代碼。或者,我們可以執(zhí)行其他代碼,而不是使用while循環(huán)來等待溢出標志觸發(fā),這樣可以更有效地利用CPU。很明顯,定時器非常強大,可以為大多數(shù)項目帶來巨大的變化!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ATmega168
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    9271
  • TIMER0
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    7436
收藏 人收藏

    評論

    相關(guān)推薦

    噪聲傳導(dǎo)的兩種模式

    噪聲傳導(dǎo)有兩種模式,一為差模傳導(dǎo),一為共模傳導(dǎo)。
    的頭像 發(fā)表于 10-15 11:33 ?128次閱讀
    噪聲傳導(dǎo)的<b class='flag-5'>兩種</b><b class='flag-5'>模式</b>

    兩種工作模式,opa695的應(yīng)用是不是不同呢?

    為什么opa695的datesheet寫道:急可以雙電源又可以單電源供電,是不是兩種工作模式,opa695的應(yīng)用不同呢?
    發(fā)表于 09-13 06:25

    紅石比較器兩種模式的作用

    紅石比較器是Minecraft中的一非常重要的紅石元件,它用于比較個紅石信號的強度,并根據(jù)比較結(jié)果輸出不同的信號強度。比較器有兩種模式:比較模式
    的頭像 發(fā)表于 09-05 09:17 ?281次閱讀

    晶閘管的阻斷狀態(tài)有兩種是什么

    晶閘管(Thyristor)是一半導(dǎo)體器件,具有單向?qū)щ娦?,廣泛應(yīng)用于電力電子領(lǐng)域。晶閘管的阻斷狀態(tài)有兩種:正向阻斷狀態(tài)和反向阻斷狀態(tài)。以下是對這兩種阻斷狀態(tài)的分析。 正向阻斷狀態(tài) 正向阻斷狀態(tài)
    的頭像 發(fā)表于 08-14 16:49 ?400次閱讀

    GD32E230C8T6高級定時器timer0無法正常輸出PWM波形的原因?

    原本想用高級定時器的中央對齊計數(shù)模式來輸出SPWM波,但是TIMER0的CH0,CH1等口,都無法正常輸出PWM波形,換成普通定時器就可以了,STM32里對于高級定時器輸出PWM波形,需要多加一個TIM_CtrlPWMOutpu
    發(fā)表于 07-26 06:34

    變頻器的兩種無速度傳感器矢量控制模式有什么區(qū)別?

    變頻器控制模式中,有無速度矢量傳感器模式,該模式又分為兩種,無感矢量0和無感矢量1,這
    發(fā)表于 02-22 21:45

    T0_EXT(PA7)上裝了一個按鍵,每次按鍵觸發(fā)CAPIF中斷好幾次,并且捕獲值一直為零的原因?

    , TIMER_COUNTER_FALLING_EDGE);//使能事件計數(shù)模式 TIMER_EnableCapture(TIMER0, TIME
    發(fā)表于 01-17 07:59

    使用ADSP-21479 timer0時,不管如何修改*pTM0PRD 和*pTM0W的值進入定時器中斷的時間永遠不變是怎么回事?

    使用ADSP-21479 timer0時,遇到一問題,希望大俠能幫忙看一。 1、IDE: CrossCore Embedded Studio 1.1.0 2、處理器:ADSP-21479 3
    發(fā)表于 01-12 06:03

    AD773816位和24位這兩種不同的模式,offset校準寄存器值的有效位數(shù)分別是多少位?

    ) xCH. FS CAL. REG. 200000h 請問 ADC result 與輸入電壓 是什么關(guān)系? 16位和24位這兩種不同的模式,offset 校準寄存器的值的有效
    發(fā)表于 12-19 06:25

    時鐘樹是什么?介紹兩種時鐘樹結(jié)構(gòu)

    今天來聊一聊時鐘樹。首先我先講一我所理解的時鐘樹是什么,然后介紹兩種時鐘樹結(jié)構(gòu)。
    的頭像 發(fā)表于 12-06 15:23 ?1474次閱讀

    兩種timing分析模式—GBA與PBA簡單梳理

    今天想來聊一聊STA相關(guān)的內(nèi)容。GBA和PBA是在做STA分析的時候的兩種分析模式
    的頭像 發(fā)表于 12-06 15:00 ?1043次閱讀

    oracle數(shù)據(jù)庫的操作模式分為哪兩種

    Oracle數(shù)據(jù)庫的操作模式分為兩種:在線(Online)操作模式和離線(Offline)操作模式。 在線操作模式是指數(shù)據(jù)庫在運行狀態(tài)下接受
    的頭像 發(fā)表于 12-06 10:07 ?708次閱讀

    五級環(huán)路振蕩電路的兩種工作模式

    五級環(huán)路振蕩電路的兩種工作模式
    的頭像 發(fā)表于 11-23 16:25 ?2159次閱讀

    串口接收數(shù)據(jù)的兩種方式是什么

    上方是發(fā)送數(shù)據(jù)的例子,那么串口接收又該如何配置,又要在串口發(fā)送的例子做哪些更改呢? 這里我們可以通過查詢或者中斷的方式來進行接收數(shù)據(jù)的兩種方式。 查詢方式就是通過不斷的查詢RXNE標志位,通過判斷
    的頭像 發(fā)表于 11-10 16:20 ?2068次閱讀
    串口接收數(shù)據(jù)的<b class='flag-5'>兩種</b>方式是什么

    單端反激式變換器兩種工作模式特性比較

    電子發(fā)燒友網(wǎng)站提供《單端反激式變換器兩種工作模式特性比較.pdf》資料免費下載
    發(fā)表于 11-01 14:25 ?1次下載
    單端反激式變換器<b class='flag-5'>在</b><b class='flag-5'>兩種</b>工作<b class='flag-5'>模式</b><b class='flag-5'>下</b>特性比較