我遇到了一些微控制器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时,我会得到不同的结果。优化能否改变这种变量赋值的工作方式?
使用Atmel Studio 6和GCC 4.6.2我已经尝试编译你的两个场景(使用临时变量而不是)。查看.LSS文件中的汇编指令似乎都能按预期工作。特别是没有什么会导致你提到的闩锁行为。你能否非常详细地解释当你不知道时会发生什么;使用临时变量?例如。在什么样的电压值下,它需要锁定在需要重置电路板的地方。 – justing
我有两个330欧姆的电阻连接到一个50k电位器,使得电位器连接到+ 5V,并通过330的地,中心引脚连接到ATTINY26 ADC(引脚7)。当使用缺乏临时变量的版本中的代码时,从引脚7读到地时,微型锁存器的电压约为2伏。我期望这是一个大约100的ADC的整数值。换句话说,它从0到2伏正常工作,然后卡住。 – JYelton
当你使用临时变量时,闭锁不会发生?它的工作范围从0到5V(完美如预期)?这很有趣,我无法弄清楚在软件中会导致什么。 – justing