搜索
bottom↓
回复: 7

avr studio调用_delay_ms(double _ms)的问题

[复制链接]

出0入0汤圆

发表于 2013-2-27 21:50:44 | 显示全部楼层 |阅读模式
本帖最后由 仗剑天涯 于 2013-2-27 21:51 编辑

avr studio6中,我想要调用库函数_delay_ms(double _ms)进行延时,晶振频率设置了8MHZ:
# define F_CPU 8000000UL

这是在while循环里的一个延时后反转PORTA0的状态:
while (1)
{               
         _delay_ms(10.0);
         PORTA ^= BIT(0);   //取反       
}
但是不知为何,通过软件调试,发现函数的延时时间没有10ms


不知这是因为什么原因,和编译器配置优化有关系吗?求大神相助~~~

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-2-27 23:20:42 | 显示全部楼层
我今天也在调试这个延时,同样发现问题,也不知如何操作

出0入0汤圆

发表于 2013-2-27 23:59:14 | 显示全部楼层
本帖最后由 yklstudent 于 2013-2-28 10:03 编辑

AS6.0自带的延时函数很准确的 比AS4准确多了 不是一个等级的
不准只能说你还不会用

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2013-3-7 14:27:50 | 显示全部楼层
yklstudent 发表于 2013-2-27 23:59
AS6.0自带的延时函数很准确的 比AS4准确多了 不是一个等级的
不准只能说你还不会用
...

嗯,也正是因为它的延时比较准,所以我才用库里带的延时函数,但是现在的问题是调试信息显示没有延时这么长时间,而且我程序下到我的开发板上,可以很明显感受到LED的闪动频率太快了。您能帮我分析一下是什么原因吗?
下面这是相关的代码:
  1. #define  BIT(n)   (0x01<<n)
  2. for(int i=0;i<100;i++)
  3. {
  4.      delay_ms(10.0);
  5. }
  6. PORTA ^=BIT(0);
复制代码

出0入0汤圆

发表于 2013-3-7 14:55:05 | 显示全部楼层
仗剑天涯 发表于 2013-3-7 14:27
嗯,也正是因为它的延时比较准,所以我才用库里带的延时函数,但是现在的问题是调试信息显示没有延时这么 ...

不全啊 不太好看啊  

出0入0汤圆

 楼主| 发表于 2013-3-9 11:16:54 | 显示全部楼层
yklstudent 发表于 2013-3-7 14:55
不全啊 不太好看啊
  1. #include <avr/io.h>

  2. #include <util/delay.h>

  3. # define F_CPU 8000000UL
  4. #define uchar    unsigned char
  5. #define BIT(n)  (0x01<<n)

  6. void mydelay_s(int time)
  7. {
  8.         volatile int i;
  9.         for(i=0;i<time;i++)
  10.         {
  11.                 _delay_ms(10);
  12.         }
  13. }
  14. int main()
  15. {
  16.         DDRF =0x00;
  17.         DDRF |= BIT(2);   //设置F口输出
  18.         DDRF |= BIT(1);
  19.         PORTF |= BIT(2);
  20.         PORTF |=BIT(1);
  21.        
  22.         DDRC |= 0xff;   //关数码管
  23.         PORTC |= 0xff;
  24.         DDRA |= 0xff;
  25.         PORTA |= 0xff;
  26.        
  27.         DDRF = 0xff;
  28.         DDRF &= ~BIT(2);
  29.         DDRF &= ~BIT(1);
  30.         PORTF |= BIT(3);
  31.         //前面都是开发板的配置
  32.        
  33.        
  34.         DDRA = 0xff;   //A管脚设为输出
  35.         PORTA = 0xfe;   //最后一个亮
  36.         while (1)
  37.         {
  38.                 mydelay_s(500);   //5S为一个周期
  39.                 PORTA ^= BIT(0);   //反向       
  40.         }
  41. }

复制代码

出0入0汤圆

发表于 2013-3-9 12:35:42 | 显示全部楼层
仗剑天涯 发表于 2013-3-9 11:16

F_CPU应该先定义 再把delay.h包含进来才对
不然delay.h内的F_CPU应该使用的还是默认的值
所以跟你想的有误差吧

出0入0汤圆

 楼主| 发表于 2013-3-11 18:39:06 | 显示全部楼层
yklstudent 发表于 2013-3-9 12:35
F_CPU应该先定义 再把delay.h包含进来才对
不然delay.h内的F_CPU应该使用的还是默认的值
所以跟你想的有 ...

恩恩,果然是这个问题!谢谢您!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表