yao2013lin 发表于 2013-7-8 20:13:57

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

我用的编译器是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");
           
    }
}

xiaoziwen 发表于 2013-7-8 20:19:13

精确的延时 还是拿示波器调吧

李鸿鸿 发表于 2013-7-8 20:22:10

这样写肯定不精确

cdwess 发表于 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
最好还是示波器测试调

yao2013lin 发表于 2013-7-8 20:27:26

xiaoziwen 发表于 2013-7-8 20:19 static/image/common/back.gif
精确的延时 还是拿示波器调吧

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

yao2013lin 发表于 2013-7-8 20:29:32

李鸿鸿 发表于 2013-7-8 20:22 static/image/common/back.gif
这样写肯定不精确

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

xiaoziwen 发表于 2013-7-8 20:32:04

yao2013lin 发表于 2013-7-8 20:29 static/image/common/back.gif
请问下兄弟你 写过那样的程序不

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

yao2013lin 发表于 2013-7-8 20:35:34

我写了一个18b20程序,没有用,用液晶显示,液晶显示乱码。所以我在怀疑是不是延时出问题了。

李鸿鸿 发表于 2013-7-8 20:37:48

yao2013lin 发表于 2013-7-8 20:29 static/image/common/back.gif
请问下兄弟你 写过那样的程序不

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

李鸿鸿 发表于 2013-7-8 20:39:37

yao2013lin 发表于 2013-7-8 20:35 static/image/common/back.gif
我写了一个18b20程序,没有用,用液晶显示,液晶显示乱码。所以我在怀疑是不是延时出问题了。 ...

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

xiaoziwen 发表于 2013-7-8 20:40:26

18b20的时序是比较要严格 但是也没必要精度为1us的delay

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

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

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

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

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

yao2013lin 发表于 2013-7-8 20:50:39

李鸿鸿 发表于 2013-7-8 20:39 static/image/common/back.gif
这个DS18B20也要这么精确,还没见过,只要按照手册上的要求就可以了

嗯,我试试

yao2013lin 发表于 2013-7-8 20:51:26

xiaoziwen 发表于 2013-7-8 20:40 static/image/common/back.gif
18b20的时序是比较要严格 但是也没必要精度为1us的delay

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


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

李鸿鸿 发表于 2013-7-8 20:53:02

yao2013lin 发表于 2013-7-8 20:50 static/image/common/back.gif
嗯,我试试

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

yao2013lin 发表于 2013-7-8 22:25:30

李鸿鸿 发表于 2013-7-8 20:53 static/image/common/back.gif
你那个LCD1602没有延时,即你调用调用写命令或写数据没有延时,所以液晶出现乱码 ...

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

yao2013lin 发表于 2013-7-8 22:26:32

cdwess 发表于 2013-7-8 20:25 static/image/common/back.gif
用C延时差距很大的
void main(void)
{


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

李鸿鸿 发表于 2013-7-8 22:53:30

yao2013lin 发表于 2013-7-8 22:26 static/image/common/back.gif
请问下你用的是什么编译软件

看看主函数,应该是这样的
while(1)
{
read_temp();//多加
delay_ms(5);//多加
temp=read_temp();
disp=temp/10;
disp=temp%10;
dipaly_1602();
}
页: [1]
查看完整版本: 请教一个avr软件延时的问题