AVR中分频的问题 TCNT0=0xF7
{
CLI();
DDRB=_BV(PB0);
PORTB=_BV(PB0);
DDRB=_BV(PB1);
PORTB=_BV(PB1);
DDRB=_BV(PB2);
PORTB=_BV(PB2);
TCNT0=0xF7;
TCCR0B=_BV(CS00);
TIMSK0=_BV(TOIE0);
SEI();
while(1);
}
我是用的是ATmega48V,按照程序我是想对1M的时钟进行9分频,具体体现在 TCNT0=0xF7;,可是现在我无论怎么改动 TCNT0=0xF7;这个语句,如改成 TCNT0=0xFF;或者 TCNT0=0x00;都没有反应,默认256分频,这是为什么呀?望各位大神指导,小女子不胜感激!
那就说明需要改的不是这个值,或者需要设置另外一个寄存器的某个位,才能更新
很多芯片都有这样的设计,防止程序跑飞的时候,某些寄存器内容被意外更改导致外部损坏
这个不能改,要改的话,还要其它寄存器的配合设置
我用的timer0,所以设置TCNT0应该是相对应的,不知道问题在哪里?
void timer0_init(void)
{
TCCR0B=0x00;
MCUCR=0X00;
TCCR0A=0x00;
TIFR0=0x01;
TIMSK0=_BV(TOIE0);
TCCR0B=_BV(CS00);
TCNT0=0xF7;
}
能详细一点吗?谢谢。
我用的timer0的溢出功能:
void timer0_init(void)
{
TCCR0B=0x00;
MCUCR=0X00;
TCCR0A=0x00;
TIFR0=0x01;
TIMSK0=_BV(TOIE0);
TCCR0B=_BV(CS00);
TCNT0=0xF7;
}
当TCCR0!=0x00任何模式下,只要MCU一上电,T/C就开始计时工作。TCCR0主要是定时器的预分频和波形模式、比较匹配模式的设置,这个模块是T/C0、T/C1共用的一个模块,但可以有不同的分频设置。
定时器是如何进行工作的:三个重要参数:TCNT0、OCR0,TIMSK,TCNT0是设置定时器的计时初始值,定时器开始工作后立即从TCNT0一直累加到0XFF,累加过程所消耗的时间就是我们需要的定时时间;OCR0是一个比较设定值,当TCNT0的值累计到OCR0时(TNCT0==OCR0),如果有开启比较匹配中断功能,那么此时就会产生比较中断,所以,OCR0的值一般都是设置在TCNT0初始值和0XFF之间,之外的任何值都不会产生比较中断。TIMSK是一个中断使能位设置,就是我们需要计时器溢出中断或是比较匹配中断功能或两者都要时就对TIMSK的相应寄存器位进行设置。
定时器的中断使用,一个定时器可以有两个中断资源可利用,一个只溢出中断,另一个是比较匹配中断,如上面2所说的。想说明的溢出中断子程序内一般要有重载TCNT0的初始值,否则,TCNT0就会从0X00开始累加计数到0XFF,所耗费的时间就不我们想要的时间。比较中断就是当TCNT0==OCR0时,发生比较匹配中断;所以,中断子程序中一般只插入少量的处理代码,否则,会发生所谓的中断套嵌的现象,由于M16不支持中断套嵌,这样会使得中断子程序中的部分代码无法执行,严重时会造成系统崩溃。
TCNT0和OCR0的值换算:对于8bit的计时器,TCNT0一般可以由下面的公式换算:
TCNT0=256-(TV*F)/N;
TV: 所想要设定的定时时间,单位,us
F:晶振频率(MHz)
N: 分频因子
从上描述,你需要修改TCCR0来改变分频因子
举例说明:
1、选择定时器时钟分频系数,由TCCR0的CS01,CS01,CS00决定。
2、定时器计数器付初始值,TCNT0=61,TCNT0位8位寄存器,计数范围为0-255,付初始值61后,从61开始计数到255时产生溢出中断,赋初值后定时就开始工作。
3、定时时间计算: 每个计数时钟脉冲的时间T=1/f,f=晶振频率/分频系数,如晶振为8MHZ ,分频系数为1024,则定时器器时钟频率为
f=8000000HZ/1024 =7812.5HZ,
单个时钟脉冲时间:
T=1/f=1/7812.5=0.128ms(毫秒),T/C0最大的计数值 为256,
最大计时时间为256*0.128ms=32.768ms 。
定时器初值计算公式:定时器初值=256- 定时时间/单个时钟脉冲时间: 如定时25ms,
初值=256- 25ms/0.128ms=256-195=61
4、设置代码如下,溢出中断方式
void timer0_init()
{
SREG = 0x80; //使能全局中断
TIMSK|=(1<<TOIE0); //使能T0溢出中断
// T/C0工作于普通模式,1024分频,定时器频率 = 8M/1024 =7812.5Hz
TCCR0|=(1<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0 = 61; //定时初值设置,定时时间 =(256-61)/7812.5=25ms
}
AVR 相关文章: