PIC16F877A的EEPROM使用
unsigned char eeprom_read(unsigned char addr);void eeprom_write(unsigned char addr, unsigned char value);這兩個函數是PIC內部函數,可以直接調用;
-----------------------------以下內容是baidu空間的一位博主寫的-------http://hi.baidu.com/wxg923/item/17d65d23942ea9fd50fd8788---------
-上周在做一個項目時,需要對測試數據實時的保存,以被重新上電后讀取.采用了PIC的內部EEPROM,正常讀取時沒有什么問題.反復上電掉電就出現(xiàn)了EEPROM被清0(改寫).
查閱相關資料:EEROM寫過程包括兩個階段:先擦除(電壓為20V) 再寫入(電壓18V);EEPROM在寫入過程中如果電壓不穩(wěn)定,很容易導致錯誤.先使用了軟件冗余法,同一個data寫在連續(xù)3個地址,使用時比較,只有2個相同時才使用.這樣做,反復上電掉電出錯幾率小了很多,但是還是會出錯.在反復上電100多次時還是出錯.另一個解決辦法就是使能BOD,寫EEPROM時,先檢測BOD.網上一位兄弟使用此方法反復上電2000多次才錯誤一次.
上述方法有兩個致命缺陷:1.EEPROM壽命短,EEPROM按最低10萬次算,我的項目每2s寫一次EEPROM,連續(xù)使用2周后EEPROM就可能壽命以盡.2還是有錯誤,沒有100%正確.
解決方案:使用掉電檢測,如果成本許可還可以使用法拉電容.
電源電壓掉電時,產生一個INT信號,PIC進入外部中斷程序:首先將IO清零以降低電流損耗,此時利用電容C1的放電時間將要保存的數據寫入EEPROM.470uF D型鉭電容可供PIC工作20ms左右,足夠寫8bety EEPROM.
---------------------以下內容是我實驗內容--------摘自博客園的--“業(yè)精于勤,荒于嬉;行成于思,毀于隨---------
/******************************************
******PIC16F877A 內部EEPROM讀寫實驗*******
Author:hnrain
Date:2010-12-25
Version:V0.1
Email:hnrain1004@gmail.com
Forum:http://bbs.cepark.com
_______________________________
實驗現(xiàn)象:先給內部EEPROM的0~7字節(jié)寫數據1~8,再讀出第0字節(jié)的
內容,并判斷讀出來的數據是不是1,如果是1則點亮RD0口的LED。
重點內容:
內部EEPROM的操作主要通過4個寄存器
EECON1,EECON2,EEDATA,EEADR
EEDATA寄存器存放8位讀寫數據
EEADR存放EEPROM被訪問過的地址
EECON1寄存器定義:
bit7:5 未用;讀為0
bit4 EEIF:EEPROM寫操作中斷標志位
1 = 寫操作完成(必須軟件清零)
0 = 寫操作未完成或還未開始
bit3 WRERR:EEPROM錯誤標志位
1 = 寫操作過早終止
0 = 寫操作已完成
bit2 WREN:EEPROM寫使能位
1 = 允許寫入
0 = 禁止寫入EEPROM
bit1 WR:寫操作控制位
1 = 啟動寫周期,一旦寫入完成,該位將被硬件清零
寫操作控制位只能用軟件置"1"
0 = EEPROM的寫周期已完成
bit0 RD:讀控制位
1 = 啟動EEPROM讀操作。讀需要一個周期,RD由硬件清零
RD只能用軟件置“1”
0 = 未啟動EEPROM讀操作
寫入EEPROM有一個特定的過程:將55H寫入EECON2,將AAH寫入EECON2
然后將WR位置1
*******************************************/