打印
[AVR单片机]

延时函数_delay_ms能实现准确延时么?

[复制链接]
4803|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#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
跟系统时钟有关吧

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

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

#define uchar unsigned char

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

int main(void)
{
        uchar i, j=0;
       
        DDRA = 0xFF;
               
        // 配置T/C0
        TCNT0 = 0;                // T/C0开始值
        TCCR0 = _BV(CS02) | _BV(CS00);        // 预分频ck/1024,计数允许
       
        while(1)
        {
                // 查询定时器方式等待1s
                // 12000000/1024/256/45=1s
                for(i=0;i<45;i++)
                {
                        loop_until_bit_is_set(TIFR,TOV0);
                        //写入逻辑1,清零T0V0位
                        TIFR|=_BV(TOV0);
                }
               
                if(j)
                {
                        SET_LED;
                        j=0;
                }
                else
                {
                        CLR_LED;
                        j=1;
                }
        }
}


本应该是1s,可实际的定时时间是10多s

使用特权

评论回复
5
SD10A| | 2015-4-28 15:15 | 只看该作者
我估计你是肯定是熔丝位没设置对  你是不是用了默认熔丝位?

使用特权

评论回复
6
SevenWans| | 2015-4-28 15:22 | 只看该作者
liangquan6 发表于 2015-4-27 09:59
我又编写了下面的定时器程序

时钟没对,可能跟楼上说的有关……

使用特权

评论回复
7
liangquan6|  楼主 | 2015-5-4 14:07 | 只看该作者
SD10A 发表于 2015-4-28 15:15
我估计你是肯定是熔丝位没设置对  你是不是用了默认熔丝位?

确实用的是默认的熔丝位,我考虑也可能是这个问题,谢谢提醒

使用特权

评论回复
8
liangquan6|  楼主 | 2015-5-4 14:07 | 只看该作者
SevenWans 发表于 2015-4-28 15:22
时钟没对,可能跟楼上说的有关……

谢谢

使用特权

评论回复
9
liangquan6|  楼主 | 2015-5-4 14:21 | 只看该作者
SD10A 发表于 2015-4-28 15:15
我估计你是肯定是熔丝位没设置对  你是不是用了默认熔丝位?

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

使用特权

评论回复
10
desertsailor| | 2015-5-4 16:27 | 只看该作者
可以通过逻辑分析仪看时序来调节Delay函数的参数,还是可以调得比较准的

使用特权

评论回复
11
SD10A| | 2015-5-4 19:20 | 只看该作者
liangquan6 发表于 2015-5-4 14:21
我觉得应该是我的熔丝位设置的问题,我尝试使用ProgIsp软件设置熔丝位,采用向导方式设置外部RC振荡器时 ...

你选了RC振荡就使用这个,不要用晶振就是了,不然当然用不了~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

24

帖子

0

粉丝