搜索
bottom↓
回复: 16

请教一个avr软件延时的问题

[复制链接]

出0入0汤圆

发表于 2013-7-8 20:13:57 | 显示全部楼层 |阅读模式
我用的编译器是iccv7 for avr  我想写一个1us的精确延时函数,我不知道我样写的对不,我的晶振是8mhz,程序如下void delay_us(uint us )
{
    uint i;
    for(i=0;i<us;i++)
    {          
         asm("nop");
                 asm("nop");
                 asm("nop");
                 asm("nop");
                 asm("nop");
                 asm("nop");
                 asm("nop");
                 asm("nop");
           
    }
}

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

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

出0入0汤圆

发表于 2013-7-8 20:19:13 | 显示全部楼层
精确的延时 还是拿示波器调吧

出0入0汤圆

发表于 2013-7-8 20:22:10 | 显示全部楼层
这样写肯定不精确

出0入0汤圆

发表于 2013-7-8 20:25:13 | 显示全部楼层
用C延时差距很大的
void main(void)
{
init_devices();

while(1)
{
  PORTA^=0x80;
}
}
这么一句口线翻转的语句,16M晶振,翻转时间是500多纳秒,下面是编译器翻译出来的
(0042)  while(1)
(0043)  {
(0044)   PORTA^=0x80;
FILE: <library>
    00063 E880      LDI        R24,0x80
    00064 E090      LDI        R25,0
    00065 B22B      IN        R2,0x1B
    00066 2433      CLR        R3
    00067 2628      EOR        R2,R24
    00068 2639      EOR        R3,R25
    00069 BA2B      OUT        0x1B,R2
    0006A CFF8      RJMP        0x0063
    0006B 9508      RET
最好还是示波器测试调

出0入0汤圆

 楼主| 发表于 2013-7-8 20:27:26 | 显示全部楼层
xiaoziwen 发表于 2013-7-8 20:19
精确的延时 还是拿示波器调吧

我试式,你写过1us精确的延时函数不?

出0入0汤圆

 楼主| 发表于 2013-7-8 20:29:32 | 显示全部楼层
李鸿鸿 发表于 2013-7-8 20:22
这样写肯定不精确

请问下兄弟你 写过那样的程序不

出0入0汤圆

发表于 2013-7-8 20:32:04 | 显示全部楼层
yao2013lin 发表于 2013-7-8 20:29
请问下兄弟你 写过那样的程序不

没有 因为不知道要那么精确的延时 干什么用。。。

出0入0汤圆

 楼主| 发表于 2013-7-8 20:35:34 | 显示全部楼层
我写了一个18b20程序,没有用,用液晶显示,液晶显示乱码。所以我在怀疑是不是延时出问题了。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-7-8 20:37:48 | 显示全部楼层
yao2013lin 发表于 2013-7-8 20:29
请问下兄弟你 写过那样的程序不

这样精确的延时一般都是用C+汇编的

出0入0汤圆

发表于 2013-7-8 20:39:37 | 显示全部楼层
yao2013lin 发表于 2013-7-8 20:35
我写了一个18b20程序,没有用,用液晶显示,液晶显示乱码。所以我在怀疑是不是延时出问题了。 ...

这个DS18B20也要这么精确,还没见过,只要按照手册上的要求就可以了

出0入0汤圆

发表于 2013-7-8 20:40:26 | 显示全部楼层
18b20的时序是比较要严格 但是也没必要精度为1us的delay

你可以先串口输出 检查问题是不是真的出在18b20

然后仔细对照时序 或者在网上找能够正常使用的

这些器件的时延没有那么严格 应该是时序的问题

至于你的这个代码 我没看 很久以前做个18b20

现在也不一定能明白了 抱歉

出0入0汤圆

 楼主| 发表于 2013-7-8 20:50:39 | 显示全部楼层
李鸿鸿 发表于 2013-7-8 20:39
这个DS18B20也要这么精确,还没见过,只要按照手册上的要求就可以了

嗯,我试试

出0入0汤圆

 楼主| 发表于 2013-7-8 20:51:26 | 显示全部楼层
xiaoziwen 发表于 2013-7-8 20:40
18b20的时序是比较要严格 但是也没必要精度为1us的delay

你可以先串口输出 检查问题是不是真的出在18b20

没事,我自己再对照时序来看看

出0入0汤圆

发表于 2013-7-8 20:53:02 | 显示全部楼层
yao2013lin 发表于 2013-7-8 20:50
嗯,我试试

你那个LCD1602没有延时,即你调用调用写命令或写数据没有延时,所以液晶出现乱码

出0入0汤圆

 楼主| 发表于 2013-7-8 22:25:30 | 显示全部楼层
李鸿鸿 发表于 2013-7-8 20:53
你那个LCD1602没有延时,即你调用调用写命令或写数据没有延时,所以液晶出现乱码 ...

我试了,不是延时的问题,液晶能显示字符,就是显示不了温度。

出0入0汤圆

 楼主| 发表于 2013-7-8 22:26:32 | 显示全部楼层
cdwess 发表于 2013-7-8 20:25
用C延时差距很大的
void main(void)
{

请问下你用的是什么编译软件

出0入0汤圆

发表于 2013-7-8 22:53:30 | 显示全部楼层
yao2013lin 发表于 2013-7-8 22:26
请问下你用的是什么编译软件

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

本版积分规则

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

GMT+8, 2024-7-24 01:31

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

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