打印
[AVR单片机]

ICC换WINAVR了,第一个程序就出现了问题,Delay()函数的问题。

[复制链接]
4028|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aishiqi|  楼主 | 2012-3-14 09:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 aishiqi 于 2012-3-14 09:33 编辑

我用MEGA8做了个闪烁LED的程序,但是始终不成功,我很郁闷,然后反复和实例对比,发现是一个怎么也想不到的问题,就是Delay()函数,如果要是用我以前的
Delay(){
int ;
for(i=0;i<6000;i++);
}
怎么都不行,改成delay.h里面的函数就没有问题了。

主程序是这样的:
int main(void)
{
  DDRB=0XFF;
  PORTB=0XFF;
  while(1)
  {
Delay();
PORTB&=~1;
Delay();
PORTB|=1;
}
}
更奇怪的是我不用任何Delay函数也不行
  while(1)
  {
PORTB&=~1;
PORTB|=1;
}
不行的表现是波形乱七八糟。

相关帖子

沙发
hjl2832| | 2012-3-15 11:26 | 只看该作者
怎么我看你的
Delay(){
int ;
for(i=0;i<6000;i++);
}
这个函数有问题,i 没定义,怎么编绎通过的?
应该是
Delay(){
int i;
for(i=0;i<6000;i++);
}

使用特权

评论回复
板凳
ccxlslr| | 2012-3-17 01:01 | 只看该作者
这个函数除了延时什么都不做,被优化掉了,从另一个角度来说,是浪费时间

要用 volatile int i;

使用特权

评论回复
地板
airwill| | 2012-3-17 10:27 | 只看该作者
楼上是正解, 很可能函数被优化掉了.
ICC换WINAVR 的很大区别, winAvR 的优化能力很强!

使用特权

评论回复
5
TuBie| | 2012-3-18 08:38 | 只看该作者
老大,用volatile是什么意思?这样就不会被优化掉了吗?在其他编译器里是否也是这样?谢谢!

这个函数除了延时什么都不做,被优化掉了,从另一个角度来说,是浪费时间

要用 volatile int i;
ccxlslr 发表于 2012-3-17 01:01

使用特权

评论回复
6
晨星之光| | 2012-3-20 17:40 | 只看该作者
要不就设优化级为最低,要不就同3楼说的,加volatile 修饰变量

使用特权

评论回复
7
mtraveler| | 2012-3-21 16:40 | 只看该作者
可以使用winavr自带的延时函数。

使用特权

评论回复
8
bbslhb| | 2013-1-4 16:38 | 只看该作者
被优化的变量,定义的时候前面加一个volatile。
再就是winavr中自带有延时函数_delay_ms();括号中填写数值,可以设置多少毫秒的延时值。用的时候要include一下头文件。

使用特权

评论回复
9
qin552011373| | 2013-1-5 00:32 | 只看该作者
建议使用系统函数  还是很不错的  

使用特权

评论回复
10
wkatt1002| | 2013-5-28 14:48 | 只看该作者
ICC和winavr 编译器不同吗??ICC不是用GCC么??没用过ICC的说。。

使用特权

评论回复
11
huangxz| | 2013-5-28 14:57 | 只看该作者
wkatt1002 发表于 2013-5-28 14:48
ICC和winavr 编译器不同吗??ICC不是用GCC么??没用过ICC的说。。

不一样,
icc是国内avr比较常用的编译器

使用特权

评论回复
12
fp123123| | 2013-5-28 17:15 | 只看该作者
winavr是开源gcc的avr版本,应该是最好的

使用特权

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

本版积分规则

0

主题

2

帖子

0

粉丝