前不久买的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
|