您的位置 首页 基础

ATMAGE16定时器0初始值核算总结

今天在学习利用定时器0完成定时时发现在计算初始值时,不是很明白如何计算,就在网上找答案,看了很多人的例子和讲解总算是有点头绪了,先

今天在学习运用守时器0完结定不时发现在核算初始值时,不是很理解怎么核算,就在网上找答案,看了许多人的比如和解说总算是有点条理了,先把那些有用的材料收拾在一起供今后运用!谢谢各位在网上共享他们学习效果的大虾小虾和给为泡泡叔叔!!!

守时器0是8位的故可计数的规模是0-255这些数,咱们在设置初始值时就就应该告知计数器咱们开端计数的方位,这也便是TCNT0的初始值,当计数到255时,有硬件在TIFR的bit0位TOV0置位触发中止,假如要运用比较匹配中止时就要告知OCR0守时器计数的数值(也便是256-m,m为TCNT0的初始值),守时器记了多少数抵达TOP值,当发生比较匹配值相一起在TIFR的bit1位OCF0置位然后触发中止!

以上是我学习进程的一点小总结,我会渐渐的将他弥补上的,假如说对了,有看到的网友有什么定见和主张给我留一下言我好必定一下,假如说错了,给为大虾小虾也不要笑话我,请您也给我留下言,好给我纠正我的过错和主张!在这儿也谢谢你们了!!

首要按照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

voidport_init(void)
{
PORTA = 0x00;
DDRA= 0x00;
PORTB = 0x00;
DDRB= 0x00;
PORTC = 0x00;//m103 output only
DDRC= 0x00;
PORTD = 0x00;
DDRD= 0x00;
}

TIMER0 initialize – prescale:1024

// WGM: Normal

// desired value: 20mSec

// actual value: 19.861mSec (0.7%)

voidtimer0_init(void)
{

TCCR0 = 0x00;//stop

TCNT0 = 0x71;//set count
OCR0= 0x 8F;//set compare
TCCR0 = 0x05;//start timer

这三位设置为1 0 1 :守时器的时钟为外部时钟频率的1024分频*/
}

#pragma interrupt_handler timer0_comp_isr:20
voidtimer0_comp_isr(void)
{
//compare occured TCNT0=OCR0
}

#pragma interrupt_handler timer0_ovf_isr:10
voidtimer0_ovf_isr(void)
{
TCNT0 = 0x71;//reload counter value
}

//call this routine to initialize all peripherals
voidinit_devices(void)
{
//stop errant interrupts until set up
CLI();//disable all interrupts
port_init();
timer0_init();

MCUCR = 0x00;
GICR= 0x00;
TIMSK = 0x03;//timer interrupt sources
SEI();//re-enable interrupts
//all peripherals are now initialized
}

这儿将以上程序用到的Time0寄存器如下所示:

T/C0操控寄存器 TCCR0
/FOC0/WGM00/COM01/COM00/WGM01/CS02/CS01/CS00 TCCR0

7 6 5 4 3 2 1 0

Bit 7 – FOC0: 强制输出比较

Bit 6, 3 – WGM01:0: 波形发生形式

Bit 5:4 – COM01:0: 比较匹配输出形式

Bit 2:0 – CS02:0: 时钟挑选

MCU 操控寄存器- MCUCR

MCU 操控寄存器包含了电源办理的操控位

SM2/SE/SM1/SM0/ISC11/ISC10/ISC01/ISC00 MCUCR

7 6 5 4 3 2 1 0

Bits 7, 5, 4 – SM2..0: 休眠形式挑选位 2、1 和0

SM2 SM1 SM0 休眠形式
0 0 0闲暇形式
0 0 1 ADC 噪声按捺形式
0 1 0 掉电形式
0 1 1 省电形式
1 0 0 保存
1 01 保存
1 1 0Standby(1) 形式
1 11 扩展Standby(1) 形式

Bit 6 – SE: 休眠使能

Bit 3, 2 – ISC11, ISC10: 中止1 触发方法操控

Bit 1, 0 – ISC01, ISC00: 中止0 触发方法操控

通用中止操控寄存器- GICR

7 6 5 4 3 2 1 0
INT1 INT0 INT2 – – – IVSEL IVCE GICR

Bit 7 – INT1: 使能外部中止请求 1

Bit 6 – INT0: 使能外部中止请求 0

Bit 5 – INT2: 使能外部中止请求 2

Bit 1 – IVSEL: 中止向量挑选

Bit 0 – IVCE: 中止向量修改使能

T/C 中止屏蔽寄存器- TIMSK

7 6 5 4 3 2 1 0
OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0 TIMSK

Bit 1 – OCIE0: T/C0 输出比较匹配中止使能

Bit 0 – TOIE0: T/C0 溢出中止使能

其他的未定义可参阅ATMEGA16 datasheet!

上面烦琐了许多,今后看的时分不必处处去翻datasheet,这儿说TCNT0的初始值

TCNT0 = 0x71;//set count
OCR0= 0x8F;//set compare

怎么得到这两个值呢?

现假定最大计数值为M,timer0为8位,那M=256。(这是我看51的守时器/计数器的根本结构及作业原理,AVR应该差不多的吧,横竖我后来用核算器算了一下,契合就得)

计数器初值X的核算式为:

X=M-比较值(计数值)

守时作业方法的计数初值X等于:

X = M –比较值= M – t / T = M – (* t) / prescal

为T/C0最高频率的时钟源,prescal为预分频数。

现在咱们知道

TCNT0 = 0x71;// set count十进制的113
OCR0= 0x8F;// set compare十进制的143

就相当于OCR0是计数值,TCNT0是初始值。TCNT0=113,那么OCR0=M- TCNT0=143。

咱们取=7.3728Mhz,prescal=1024,所以,咱们运用公式得出比较值=144,和成果的143有点差错。接着呢,咱们试着用公式倒推,算t

t =(143*1024)/(7.3728**)= 19.86111““ms

刚好和设置那里的actual value差错相同。所以说,以倒推的为准取TCNT0和OCR0值

最终呢,TCCR0 = 0x05;//start timer

TCCR0预分频1024,详细可见上图,

应该提示的是:

8位的守时器timer0依据公式,它最多能够完结35ms的守时使命,1秒的使命它不能完结,所以当想用来守时1秒的时分,只能用16位的守时器了;

且atmega128和atmega16的timer0挑选时钟源是不相同的。请千万要注意。现在咱们评论的是atmega16;

还有上边的评论是在作业形式(waveform mode)挑选normal情况下。其他形式初始值和比较值的不相同的,详细你能够挑选其他形式看一下它的改变值。

这样就得到了咱们想要的TCNT0和OCR0的初始值了!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/261057.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部