我遇到了一些微控制器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