2012-08-23 17 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,在使用它之前,你將強制編譯器再次讀取它(更新它)。