前不久买的arduino uno r3开发板,我更换了一片atmega328p 单片机,想把它做普通avr开发板用,但我发现程序的定时器不准确,而且时间错得特别多,想请兄弟们帮我分析一下。
/* ************************************************************************ *\
Author : XiaoLoong
Date : 2015/09
IDE : Atmel Studio 6.0
Comments: 用ATmega328P写的测试程序。
\* ************************************************************************ */
#define F_CPU 16000000UL // 16 MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#define uchar unsigned char
#define uint unsigned int
#define LED_BLINK() ( PORTB ^= _BV(PB5) ) //LED闪烁
uchar T0_count=0; //用于延时累加计数
int main(void)
{
DDRB |= _BV(PB5); // PB5=19引脚为输出
PORTB |= _BV(PB5); //输出上拉
cli(); //关全局中断
TCCR0A = 0X00;
TCCR0B = 0X05; //1024预分频
TCNT0 = 0X64; //定时10毫秒 256-16M/1024*0.01=100=0X64
TIMSK0 =0X01; //定时器0 溢出中断使能
sei(); //开全局中断
while(1);
}
ISR(TIMER0_OVF_vect) //定时器0中断服务程序
{
TCNT0 = 0X64;
if (++T0_count == 100 ) //定时1秒钟
{
T0_count=0;
LED_BLINK();
}
else return ;
}
开发板用的外接16M晶振,我熔丝位配置如下:
E:\11.png |