facat 发表于 2010-7-30 23:16:27

【已解决】麻烦大家看一下为什么这个代码调试时正常,下载到目标板上运行却不正常。

#include <avr/io.h>

int main(void)

{
        unsigned int i=0,j=0,k=0,l=0;
        DDRD=0xff;
        while(1)
        {
                PORTD=0b00000000;
                for(k=0;k<10000;k++)
                for(l=0;l<10000;l++)
                for(j=0;j<10000;j++)
                for(i=0;i<10000;i++);
                PORTD=0b11111111;
                     for(k=0;k<10000;k++)
                for(l=0;l<10000;l++)
                for(j=0;j<10000;j++)
                for(i=0;i<10000;i++);
        }
}

很简单的一个入门程序,就是让LED灯闪烁。片上调试单步跟踪的时候LED灯是一闪一灭的,但把程序写到FLASH中运行的时候所有的灯却一直亮着。应该不是延迟的问题啊, 我的循环次数都设得那么大了。大家帮我想想是哪里的问题吧。
ps:我在AVR Studio中调试和编程,然后通过JTAG口把程序写到目标板上。芯片是Atmel16L-8PU

mickey 发表于 2010-7-31 08:29:21

是这样延时的呀
没用过,呵呵

jiabin1024 发表于 2010-7-31 09:01:20

不是程序问题,应该是哪里设置不对,呵呵~~~~我没用过AVR。

facat 发表于 2010-7-31 09:10:06

会是哪里设置不对呢?

jiabin1024 发表于 2010-7-31 10:08:01

用示波器看看你的晶振有没起振??还有你的延时是否过长,没看到LED变化的效果,通电时间长点看看有没有变化。要么将延时减小点看看

dodokee 发表于 2010-7-31 10:10:14

延时得太久了。。把数改小些。

wuxjim 发表于 2010-7-31 10:19:41

这么大的循环值。你单步跟踪?鼠标没点坏吧?是设的断点吧?如果真是的单步跟踪调试出来能一闪一灭的话,,猜想应该是编译器优化掉那些for了。。所以,建议把for值改小点。然后在循环体里加_nop();或者设置一下优化等级或者选项。

hsztc 发表于 2010-7-31 10:28:49

楼主的程序没有优化的话,在最快的AVR(20MHz)上得跑上几十年PORTD口才取反一次...

dengxiaojun 发表于 2010-7-31 10:36:11

刚算了一下,按照一次for循环,一个时钟周期完成,系统主频20M,那么,从亮到灭或者从灭到亮的时间是:
10000*10000*10000*10000/20000000/ 60 /60=138888.88888888888888888888888889 hour

楼主是不是想写成:
or(k=0;k<10000;k++);
for(l=0;l<10000;l++) ;
for(j=0;j<10000;j++) ;
for(i=0;i<10000;i++);
而不是
or(k=0;k<10000;k++)
for(l=0;l<10000;l++)
for(j=0;j<10000;j++)
for(i=0;i<10000;i++);

Eiman 发表于 2010-7-31 10:36:29

没用过avr的但一看延时那么就肯定要等很久很久很久很久很久很久很久很久很久很久很久很久很久很久很久.................................................................................................................................................................睡着了!

little_Monkey 发表于 2010-7-31 10:36:42

回复【7楼】hsztc
楼主的程序没有优化的话,在最快的avr(20mhz)上得跑上几十年portd口才取反一次...
-----------------------------------------------------------------------

这几十年MCU一直在跑nop。。。。

facat 发表于 2010-7-31 10:37:40

_nop在哪个头文件里?

facat 发表于 2010-7-31 10:39:39

#include <avr/io.h>


int main(void)

{
        unsigned int i=0,j=0,k=0,l=0;

        DDRD=0xff;
        while(1)
        {
                PORTD=0b00000000;
                for(i=0;i<10;i++)
                {                       
                }
       
                PORTD=0b00000001;
                for(i=0;i<10;i++)
                {
               
                }
               
        }
}

这样写也是一样的。。。

facat 发表于 2010-7-31 10:47:05

会不会是芯片没有执行我的循环?

little_Monkey 发表于 2010-7-31 10:59:21

用编译器自带的delay。。本站的新手入门就是这样的

facat 发表于 2010-7-31 11:01:14

回复【14楼】little Monkey
用编译器自带的delay。。本站的新手入门就是这样的
-----------------------------------------------------------------------

能给个例子吗?

dengxiaojun 发表于 2010-7-31 11:13:40

回复【12楼】facat
#include &lt;avr/io.h&gt;
int main(void)
{
unsigned int i=0,j=0,k=0,l=0;
ddrd=0xff;
while(1)
{
portd=0b00000000;
for(i=0;i&lt;10;i++)
{
}
portd=0b00000001;
for(i=0;i&lt;10;i++)
{
}
}
}
这样写也是一样的。。。
-----------------------------------------------------------------------

延时好短,看不到效果!

facat 发表于 2010-7-31 11:24:20

我找到解决方法了!!!!!



#include <avr/io.h>


int main(void)

{
        unsigned int i=0,j=0,l=0;
        volatile unsigned int k=0;//非常重要,一定要加上volatile关键字。
        DDRD=0xff;
        while(1)
        {k=0;
                PORTD=0b11111111;
                for(i=0;i<10000;i++)
                {
                        k++; //很重要,循环里一定要写语句。
                }
       
                PORTD=0b00000000;
                for(i=0;i<10000;i++)
                {
                        k++; //很重要,循环里一定要写语句。
                }
        }
}


我分析的原因是编译器对循环进行了优化,所以一定要在循环里写语句。不过这样还是不够的,还要给k加上volatile 关键字,否者编译器还是会跳过那两个空循环。嘻嘻!!!
我用的是avr studio 4.18+WinAvr20100110。

最后问一下,大家知道如何设置编译器不对我的程序进行优化吗?

qq开始学单片机 发表于 2014-2-26 13:57:01

延时这么久
页: [1]
查看完整版本: 【已解决】麻烦大家看一下为什么这个代码调试时正常,下载到目标板上运行却不正常。