写了个最简单的定时器 延时函数delay_ms(1000), 想测试下1秒闪烁LED灯延时准不准,结果总是跑快。大概5秒闪烁7次。
用porteus仿真和实际烧片测试,发现每两个周期会出现一个延时只有800ms . 各种尝试都不行。
具体程序代码如下:
#include <avr/io.h>
#include <avr/interrupt.h>
#define Fosc 1000000 //系统时钟设置,采用内置1M
unsigned int count=0;
void Timer0_init()//频率:Fosc/8=1M/8=125000,计数周期(计数加1用时)为1/125000=8us
{
TCCR0 = 0x00; //停止定时器0工作
TCNT0 = 256-(Fosc/8.0)*0.001; //定时1ms,需计数次数为1000us/8=125次,初值:256-125
TIMSK |= 0x01; //T0中断允许
SREG |= 0x80; //开总中断
TCCR0 = 0x02; //启动定时器0,8分频
}
void delay_ms1(unsigned int t)
{
Timer0_init();
count=t;
while(count);
TCCR0=0x00;
}
int main()
{
PORTB=0xff;
DDRB=0xff;
Timer0_init();
while(1)
{
delay_ms1(1000);
PORTB=~PORTB;
}
}
ISR(TIMER0_OVF_vect)
{
TCNT0 = 256-(Fosc/8.0)*0.001;
count--;
}
porteus 仿真时用测试的波形如下
按照道理说不应该出现这种情况的,程序也是简单到不行,如果时间长点还能理解,但是快了就完全不明白了。
求解答啊。总不会是AVR的单片机定时器不准吧……
|