[AVR单片机] 延时函数_delay_ms能实现准确延时么?

[复制链接]
5505|10
 楼主| liangquan6 发表于 2015-4-27 09:11 | 显示全部楼层 |阅读模式
#include <avr/io.h>
#include <util/delay.h>

int main( void )
{
        unsigned char led=0;
       
        DDRA=0xFF;
        while (1)
        {
                if(led)
                        PORTA|=0X01;
                else
                        PORTA&=0XFE;

                led=!led;
                //延时
                _delay_ms(20);
        }
}

程序的目的是延时20ms,但是真正烧写到单片机中发现要比20ms慢得多,实际估计大约300~500ms
正常情况下是这样么?还是程序或硬件有问题
SevenWans 发表于 2015-4-27 09:41 | 显示全部楼层
跟系统时钟有关吧
 楼主| liangquan6 发表于 2015-4-27 09:55 | 显示全部楼层
SevenWans 发表于 2015-4-27 09:41
跟系统时钟有关吧

我买的HC6800-EM3.0开发板,售后说时钟是12MHz
我用的winavr编译器,在makefile中我已经指定了时钟
F_CPU = 12000000
 楼主| liangquan6 发表于 2015-4-27 09:59 | 显示全部楼层
SevenWans 发表于 2015-4-27 09:41
跟系统时钟有关吧

我又编写了下面的定时器程序

  1. /* 测试定时器 */
  2. #include <avr/io.h>

  3. #define uchar unsigned char

  4. #define SET_LED PORTA&=0xFE;
  5. #define CLR_LED PORTA|=0x01;

  6. int main(void)
  7. {
  8.         uchar i, j=0;
  9.        
  10.         DDRA = 0xFF;
  11.                
  12.         // 配置T/C0
  13.         TCNT0 = 0;                // T/C0开始值
  14.         TCCR0 = _BV(CS02) | _BV(CS00);        // 预分频ck/1024,计数允许
  15.        
  16.         while(1)
  17.         {
  18.                 // 查询定时器方式等待1s
  19.                 // 12000000/1024/256/45=1s
  20.                 for(i=0;i<45;i++)
  21.                 {
  22.                         loop_until_bit_is_set(TIFR,TOV0);
  23.                         //写入逻辑1,清零T0V0位
  24.                         TIFR|=_BV(TOV0);
  25.                 }
  26.                
  27.                 if(j)
  28.                 {
  29.                         SET_LED;
  30.                         j=0;
  31.                 }
  32.                 else
  33.                 {
  34.                         CLR_LED;
  35.                         j=1;
  36.                 }
  37.         }
  38. }


本应该是1s,可实际的定时时间是10多s
SD10A 发表于 2015-4-28 15:15 | 显示全部楼层
我估计你是肯定是熔丝位没设置对  你是不是用了默认熔丝位?
SevenWans 发表于 2015-4-28 15:22 | 显示全部楼层
liangquan6 发表于 2015-4-27 09:59
我又编写了下面的定时器程序

时钟没对,可能跟楼上说的有关……
 楼主| liangquan6 发表于 2015-5-4 14:07 | 显示全部楼层
SD10A 发表于 2015-4-28 15:15
我估计你是肯定是熔丝位没设置对  你是不是用了默认熔丝位?

确实用的是默认的熔丝位,我考虑也可能是这个问题,谢谢提醒
 楼主| liangquan6 发表于 2015-5-4 14:07 | 显示全部楼层
SevenWans 发表于 2015-4-28 15:22
时钟没对,可能跟楼上说的有关……

谢谢
 楼主| liangquan6 发表于 2015-5-4 14:21 | 显示全部楼层
SD10A 发表于 2015-4-28 15:15
我估计你是肯定是熔丝位没设置对  你是不是用了默认熔丝位?

我觉得应该是我的熔丝位设置的问题,我尝试使用ProgIsp软件设置熔丝位,采用向导方式设置外部RC振荡器时钟,结果接连锁住两片Atmega16a单片机,这是怎么回事?我该怎么办?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
desertsailor 发表于 2015-5-4 16:27 | 显示全部楼层
可以通过逻辑分析仪看时序来调节Delay函数的参数,还是可以调得比较准的
SD10A 发表于 2015-5-4 19:20 | 显示全部楼层
liangquan6 发表于 2015-5-4 14:21
我觉得应该是我的熔丝位设置的问题,我尝试使用ProgIsp软件设置熔丝位,采用向导方式设置外部RC振荡器时 ...

你选了RC振荡就使用这个,不要用晶振就是了,不然当然用不了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

24

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部