最近用Mega16做一個步進電機的項目,以后把項目全部的內容貼上來跟大家分享呵呵,現在討論一個防止EEPROM讀寫出錯的小辦法,我編寫熔絲位是用AVRstudio里面的Jtag下載功能來燒熔絲位的,連上Jtag,AVRstudio的Jtag功能fuse選項里,把熔絲位中的Preserve EEPROM memory through the Chip Erase cycle鈎上,Brown-out detection level at VCC=4.0V鈎上,Brown-out detection enabled鈎上,就可以解決讀寫EEPROM時出錯的機會了。
如果再加上用直接地址訪問法,而不用變量定義法,會更好的避免EEPROM讀寫問題,例如我就定義了
//定義eeprom變量的地址
#define eeprom_step_num 0xA0
#define eeprom_step_r_max 0xB0
#define eeprom_step_l_max 0xC0
然后程序就沒有再跑飛了!^_^
在其它論壇上還有一些討論EEPROM讀寫錯誤的貼,我節選了一些,留作參考:
EEPROM掉電丟數據這個特點可不是AVR獨有的。很多年前在89C51+24C02的系統里面就遇到過,我不知道鐵電有什么比24C02更牛的地方,居然能保證不丟數據。原因很簡單,就是掉電過程中,電壓降低到MCU無法正常工作的程度,程序跑飛了,單片機引腳狀態完全不可控,某次掉電就可能發出錯誤的寫24C02的指令。上電的時候因為RESET處於有效狀態,MCU引腳狀態完全確定(對於51來說就是全1),是不可能誤操作24C02的。解決方案很簡單,加一片MAX813L,當電壓低於4.6V就鎖定89C51,問題徹底解決。這么多年也沒見24C02被誤改寫。
最早的一批AVR內置了EEPROM卻沒有BOD,所以EEPROM被誤改寫是家常便飯,ATMEL很快發現了這個問題,新推出的AVR全都含有BOD樂。AVR的情況比較復雜,振盪方式和復位方式都有多種,所以不僅掉電會改寫EEPROM(原因同上),上電也會!RESET過程結束前,必須有若干XTAL,MCU內部寄存器(包括軟件不可見的)才會清零,如果RESET結束了才來時鍾,上電就是程序亂飛,同樣有可能改寫EEPROM。用RC振盪方式問題不大,有電就能振起來,用石英晶體就會出問題,我測過89C51的,上電后20ms才振起來,如果電源上有大的濾波電容,VCC的上升斜率變小,晶體起振時間會變得更長!有存儲示波器的朋友可以自己測一下,對晶振的起振有個感性認識。
我遇到過的問題,m8里面有寫eeprom的程序段,數據已經寫入到eeprom了。
不停的開關電,eeprom里的值有可能隨機改變,不見得是0x00,0xFF
原因是不是上電時,程序指針跑飛到寫eeprom那段,導致往eeprom隨機地址寫了隨機數。
后來,采用isp下載2次程序,最后版本的程序是刪除了寫eeprom程序段,保留讀eeprom段。
這樣的話,開關電很多次,里面的eeprom沒見有改動。
如果系統實際運行時,需要對eeprom寫操作,可考慮存多幾次數據,用校驗方法來處理數據改變。
偶的應用一般要用到EEPROM存儲的數據比較少,一般采取反碼冗余備份校驗的方式,需要存儲的數據按照原碼和反碼存兩份,需要讀取時分別讀取原碼和反碼,進行校驗,若校驗不通過,則根據一定的算法恢復數據或者采取缺省值.
我遇到過的問題,m8里面有寫eeprom的程序段,數據已經寫入到eeprom了。
不停的開關電,eeprom里的值有可能隨機改變,不見得是0x00,0xFF
我也是一樣BOD使能 就OK了 不過我還是不放心,我用兩份數據,最后加校驗,啟動的時候讀eeprom數據 如果有異常 檢測出錯誤數據組,然后用正確的恢復。如果兩組數據均遭毒手,用flash里面的默認數據覆蓋。
一般我在eeprom里間三分拷貝,位置隔的比較遠
以下是馬潮老師的解決辦法:
作為一個正式的系統或產品,當系統基本功能調試完成后,一旦進行現場測試階段,請注意馬上改寫熔絲位的配置,啟用AVR的電源檢測(BOD)功能。
對於5V系統,設置BOD電平為4.0V;對於3V系統,設置BOD電平為2.7V。然后允許BOD檢測。
這樣,一旦AVR的供電電壓低於BOD電平,AVR進入RESET(不執行程序了)。而當電源恢復到BOD電平以上,AVR才正式開始從頭執行程序。保證了系統的可靠性!
原因分析如下:
AVR是寬電壓工作的芯片,當電壓跌至2.5V,系統程序還能工作。這是有2個可怕的現象可能出現,
1。外圍芯片工作已經混亂,AVR讀到的東西不正確,造成程序的執行發生邏輯錯誤(不是AVR本身的原因)。
2。當電源低到臨界點,如2.4V時,並且在此互上互下的,AVR本身的程序執行也不正常,取指令、讀數據都可能發生錯誤,或程序亂飛、不穩定(AVR本身的原因,實際任何的單片機都是這樣的),非常容易造成EEPROM、FALSH的破壞。有人問51怎么不會?實際上51也是這樣,只是51內部沒有直接寫EEPROM、FLASH的指令,它的程序亂飛留不下痕跡。還有人有疑問:外掛EEPROM,掉電時怎么不會改寫?實際是外掛EEPROM,當電壓低於4V(2.7V)時,它已經不工作了,程序去改內容也改不了。而AVR內部的東西在臨界電壓時都能工作,但非常不穩定。
AVR的BOD功能必須要使用,我早期使用51時,凡是產品外部都要使用電源監測芯片,現在AVR自己本身就有該功能,一定要使用。