原创 找到延时不准确的原因:时钟频率设置问题——为什么延时不起作用?

2009-9-13 19:32 6402 8 10 分类: MCU/ 嵌入式

找到延时不准确的原因:时钟频率设置问题


找到原因了,跟设置的系统时钟频率有关。在此程序中,我设置的




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';
                         }
                     }
                   }
               }
         
         
       
       
      }
}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户566233 2010-9-2 14:31

同问

用户188034 2009-9-9 19:58

你在论坛上也发表了呀
相关推荐阅读
用户398468 2011-02-28 18:40
连接器资料整理笔记
一。为何使用连接器: 1.生产安装,提高效率; 2.方便维修 3.升级(例如存储器容量扩展) 4.整合新的电子配件 二。连接器的一些参数 1.绝缘电阻:绝缘材料在没有被击穿时的电阻值。兆欧级 2.接触...
用户398468 2010-12-24 16:27
PCB中的3W,20H原则,五五规则
PCB中的3W,20H原则,五五规则    3W规则    为了减少线间窜扰,应保证线间距足够大,当线中心距不少于3倍线宽时,则可保持70%的电场不互相干扰,称为3W规则。如要达到98%的电场不互相干...
用户398468 2010-12-24 16:26
IPC标准目录
目 录 题 目IPC-SC-60A 锡焊后溶剂清洗手册IPC-SA-61 锡焊后半水溶剂清洗手册IPC-AC-62A 锡焊后水溶液清洗手册IPC-CH-65A 印制板及组装件清洗导则IPC-FC-23...
用户398468 2010-12-24 09:56
MSD 潮湿敏感元件
MSD:moisture-sensitive device 潮湿敏感元件转载: MSD潮湿敏感器件产生的危害 1.潮湿敏感元件产生危害的因素潮敏失效是塑料封装表贴器件在高温焊接工艺中表现出来的特殊的失...
用户398468 2010-02-26 10:49
问题:如何使用单片机实现小数分频?
问题:如何使用单片机实现小数分频?...
用户398468 2009-11-21 20:17
AutoCAD画的一个机械图
...
我要评论
2
8
关闭 站长推荐上一条 /3 下一条