打印
[AVR单片机]

AtmelStudio的一个诡异问题

[复制链接]
1844|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
go21|  楼主 | 2015-10-26 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟初学AVR,尝试边学边把林夕依然ATmega16学习笔记移植到AtmelStudio上去(好吧,我电脑上没装ICCAVR),移到实验33时,出现了一个有些诡异的问题。

代码是这样的:

int main()
{
……
  while(1)
{
      if(AdcConCom==1)
      {
                 //清ADC转换完成标志
AdcConCom = 0;
…………
}
}

输入1后,串口中断检查到1,就打开ADC中断,ADC中断把AdcConCom置1,然后main函数中的if(AdcConCom==1)里的语句就开始执行。

但问题是,前面中断都没有问题,偏偏到了if(AdcConCom==1)后就是死活不执行。试了很久,最后在if前面加个if(AdcConCom==1) USART_Transmit('\n');,好了,现在一切正常。

去掉,又是一个样。问题是这一句除了发送一个没有用处的字符外,没有任何作用呀!

分别用6.2与7.0试过,都是一个样。

请各位大侠帮忙看看是哪出了问题,多谢!

源码与DSN文件下载链结如下

pan.baidu.com/s/1jGGpJ8M
pan前面要加个http
密码:1ac6

相关帖子

沙发
yubsh| | 2015-10-27 10:02 | 只看该作者
字符‘1’和ascii的1是不一样的。

使用特权

评论回复
板凳
go21|  楼主 | 2015-10-27 22:35 | 只看该作者
yubsh 发表于 2015-10-27 10:02
字符‘1’和ascii的1是不一样的。

不是这个原因,你下载源码就可以看到,中断运行完后,就会把AdcConCom置1,然后while(1)中的if语句就会被置行。

使用特权

评论回复
地板
go21|  楼主 | 2015-10-27 23:12 | 只看该作者
刚刚调了半天,怀疑又是被AtmelStudio给自作聪明的优化掉了。估计多半是编译器发现没有语句能改变AdcConCom的值,认为 if(AdcConCom==1)永远都不会成立,故自作聪明的把里面的语句都不编译。至于为什么加个if(AdcConCom==1) USART_Transmit('\n');就好了,还是不明白。

尝试在AdcConCom定义语句前加个关键字:volatile。一切都正常了。

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝