ATMAGE16定時器0初始值計算總結
定時器0是8位的故可計數(shù)的范圍是0-255這些數(shù),我們在設置初始值時就就應該告訴計數(shù)器我們開始計數(shù)的位置,這也就是TCNT0的初始值,當計數(shù)到255時,有硬件在TIFR的bit0位TOV0置位觸發(fā)中斷,如果要使用比較匹配中斷時就要告訴OCR0定時器計數(shù)的數(shù)值(也就是256-m,m為TCNT0的初始值),定時器記了多少數(shù)到達TOP值,當發(fā)生比較匹配值相同時在TIFR的bit1位OCF0置位從而觸發(fā)中斷!
以上是我學習過程的一點小總結,我會慢慢的將他彌補上的,如果說對了,有看到的網(wǎng)友有什么意見和建議給我留一下言我好肯定一下,如果說錯了,給為大蝦小蝦也不要笑話我,請您也給我留下言,好給我指正我的錯誤和建議!在這里也謝謝你們了??!
首先依照AVR使用范例--定時器應用范例
http://www.avrvi.com/avr_examples/timer.html,使用ICC application bulider快速配置定時器生成代碼如下:
//ICC-AVR application builder : 2007-8-28 0:55:55
// Target : M16
// Crystal: 7.3728Mhz
#include
#include
void
{
}
TIMER0 initialize - prescale:1024
// WGM: Normal
// desired value: 20mSec
// actual value: 19.861mSec (0.7%)
void
{
這三位設置為1 0 1 :定時器的時鐘為外部時鐘頻率的1024分頻*/
}
#pragma interrupt_handler timer0_comp_isr:20
void
{
}
#pragma interrupt_handler timer0_ovf_isr:10
void
{
}
//call this routine to initialize all peripherals
void
{
}
這里將以上程序用到的Time0寄存器如下所示:
T/C0控制寄存器
/FOC0/WGM00/COM01/COM00/WGM01/CS02/CS01/CS00
Bit 7 – FOC0: 強制輸出比較
Bit 6, 3 – WGM01:0: 波形產(chǎn)生模式
Bit 5:4 – COM01:0: 比較匹配輸出模式
Bit 2:0 – CS02:0: 時鐘選擇
MCU 控制寄存器- MCUCR
MCU 控制寄存器包含了電源管理的控制位
SM2/SE/SM1/SM0/ISC11/ISC10/ISC01/ISC00
Bits 7, 5, 4 – SM2..0: 休眠模式選擇位 2、1 和0
SM2 SM1 SM0
0
0
0
0
1
1
1
1
Bit 6 – SE: 休眠使能
Bit 3, 2 – ISC11, ISC10: 中斷1 觸發(fā)方式控制
Bit 1, 0 – ISC01, ISC00: 中斷0 觸發(fā)方式控制
通用中斷控制寄存器- GICR
INT1 INT0 INT2
Bit 7 – INT1: 使能外部中斷請求 1
Bit 6 – INT0: 使能外部中斷請求 0
Bit 5 – INT2: 使能外部中斷請求 2
Bit 1 – IVSEL: 中斷向量選擇
Bit 0 – IVCE: 中斷向量修改使能
T/C 中斷屏蔽寄存器- TIMSK
OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
Bit 1 – OCIE0: T/C0 輸出比較匹配中斷使能
Bit 0 – TOIE0: T/C0 溢出中斷使能
其余的未定義可參考ATMEGA16 datasheet!
上面啰嗦了很多,以后看的時候不用到處去翻datasheet,這里說TCNT0的初始值
如何得到這兩個值呢?
現(xiàn)假設最大計數(shù)值為M,timer0為8位,那M=256。(這是我看51的定時器/計數(shù)器的基本結構及工作原理,AVR應該差不多的吧,反正我后來用計算器算了一下,符合就得)
計數(shù)器初值X的計算式為:
X=M-比較值(計數(shù)值)
定時工作方式的計數(shù)初值X等于:
X = M -
為T/C0
現(xiàn)在我們知道
就相當于OCR0是計數(shù)值,TCNT0是初始值。TCNT0=113,那么OCR0=M- TCNT0=143。
我們?nèi)?7.3728Mhz,prescal=1024,于是,我們利用公式得出比較值=144,和結果的143有點誤差。接著呢,我們試著用公式倒推,算t
t =(143*1024)/(7.3728*
剛好和設置那里的actual value誤差一樣。所以說,以倒推的為準取TCNT0和OCR0值
最后呢,
TCCR0預分頻1024,具體可見上圖,
應該提醒的是:
8位的定時器timer0根據(jù)公式,它最多可以完成35ms的定時任務,1秒的任務它不能完成,所以當想用來定時1秒的時候,只能用16位的定時器了;
且atmega128和atmega16的timer0選擇時鐘源是不一樣的。請千萬要注意。現(xiàn)在我們討論的是atmega16;
還有上邊的討論是在工作模式(waveform mode)選擇normal情況下。其他模式初始值和比較值的不一樣的,具體你可以選擇其他模式看一下它的變化值。
這樣就得到了我們想要的TCNT0和OCR0的初始值了!
評論