找到延时不准确的原因:时钟频率设置问题
找到原因了,跟设置的系统时钟频率有关。在此程序中,我设置的
Clock frequency : 4.000000 MHz
我把时钟频率设为16.000000MHz就正常了,
但是,问题是:为什么系统时钟频率越小延时的时间会越短呢?不是时钟频率越小,延时时间越长才对吗?
使用CAVR时,设置chip的参数时,该时钟频率一定要设置为与外部硬件的晶振相同。delay是不可以分频什么的。所以当强行把频率设置为4MHz时,其实实际还是以16Mhz在工作,那样子实际的频率为那个编译的频率的4倍,所以肯定会变快,延时不准确。
下面程序为mega16接LCD1602控制显示时钟的程序,在code vision AVR上已经调试成功,并且在lcd上显示了,但是问题是:时钟不准确,delay函数基本没有延时,大概一秒的时间数字跳了两次
/*****************************************************
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz //时钟频率设置出的问题!!
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#asm
.equ __lcd_port=0x18
#endasm
#include <lcd.h>
#include<delay.h>
// Declare your global variables here
void main(void)
{
char h0='0',h1='0',m0='0',m1='0',s0='0',s1='0';
int i="0",j=0,k=0;
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
lcd_init(16);
lcd_clear();
while (1)
{
lcd_gotoxy(0,0);
lcd_putsf("time:");
lcd_gotoxy(11,0);
lcd_putchar(':');
lcd_gotoxy(8,0);
lcd_putchar(':');
for(i=0;i<9;i++)
{
lcd_gotoxy(13,0); //秒
lcd_putchar(s0);
lcd_gotoxy(12,0);
lcd_putchar(s1);
lcd_gotoxy(10,0); //分
lcd_putchar(m0);
lcd_gotoxy(9,0);
lcd_putchar(m1);
lcd_gotoxy(7,0); //时
lcd_putchar(h0);
lcd_gotoxy(6,0);
lcd_putchar(h1);
delay_ms(1000); // 这一句好像没有执行一样,是什么问题呢?
s0++;
}
s0='0';
s1++;
if(s1=='6')
{
s1='0';
m0++;
j++;
if(j==10)
{
m0='0';
j="0";
m1++;
if(m1=='6'&&h1<'2')
{
m1='0';
h0++;
k++;
if(k=='10')
{
h0='0';
k=0;
h1++;
}
}
else if(m1=='6'&&h1=='2')
{
m1='0';
h0++;
if(h0=='4')
{
h0='0';
h1='0';
}
}
}
}
}
}
用户566233 2010-9-2 14:31
用户188034 2009-9-9 19:58