2012-08-23 18 views
1

我遇到了一些微控制器C代码的问题。它看起来像一个语言或编译器问题,但程序会编译得很好。然而,当在微控制器上运行时,问题就会显现出来。无法在avr-gcc中使用自己更改变量?

(这是爱特梅尔AVR ATtiny26上。)

我读从模拟值到数字转换器和10相乘:

int SD; 
SD = ADCH * 10; 

这并不能正常工作。我想尝试从计算的ADC读了这个问题,所以我尝试:

int SD; 
SD = ADCH; 
SD = SD * 10; 

这也没有工作,在微导致不稳定。 (它只要模拟值低的工作,但一旦达到一定值时,不会从ADC再次获得的值,直到复位。)

这似乎工作:

int SD; 
int TEMP; 
TEMP = ADCH; 
SD = TEMP * 10; 

介绍另一变量修复了这个问题,但似乎令人困惑。这是怎么回事?在EE

相关问题:https://electronics.stackexchange.com/q/38404/2028

编辑:

这可能是与编译优化。当我在编译时在命令行上指定-Os与-O2或-O3时,我会得到不同的结果。优化能否改变这种变量赋值的工作方式?

+0

使用Atmel Studio 6和GCC 4.6.2我已经尝试编译你的两个场景(使用临时变量而不是)。查看.LSS文件中的汇编指令似乎都能按预期工作。特别是没有什么会导致你提到的闩锁行为。你能否非常详细地解释当你不知道时会发生什么;使用临时变量?例如。在什么样的电压值下,它需要锁定在需要重置电路板的地方。 – justing

+0

我有两个330欧姆的电阻连接到一个50k电位器,使得电位器连接到+ 5V,并通过330的地,中心引脚连接到ATTINY26 ADC(引脚7)。当使用缺乏临时变量的版本中的代码时,从引脚7读到地时,微型锁存器的电压约为2伏。我期望这是一个大约100的ADC的整数值。换句话说,它从0到2伏正常工作,然后卡住。 – JYelton

+0

当你使用临时变量时,闭锁不会发生?它的工作范围从0到5V(完美如预期)?这很有趣,我无法弄清楚在软件中会导致什么。 – justing

回答

0

你必须声明SDvolatile

volatile int SD; 

这意味着,该寄存器的值可以通过硬件来改变(不是由编译器控制)。在你的情况下,ADCH的值可能会被硬件改变,所以通过设置SDvolatile,在使用它之前,你将强制编译器再次读取它(更新它)。