要做一個報警功能的東東,要求可以通過遙控來改變遙控內容。由於對系統的穩定性要求很高,所以用了看門狗。
可是看門狗復位會引起所有寄存器重置,恢復到默認狀態。遙控要改變的內容也被復位了,所以只能借助EEPROM來存儲報警標志了。
我用的是MPLAB X IDE +XC8 編譯器,XC8在語法上跟PICC有點不一樣
EEPROM操作有兩種方法,在該存儲空間中定義命名變量,或者使用塊訪問程序來讀取或寫入EEPROM。
1. EEPROM 對象
__eeprom限定符可用於指示應將變量定位到EEPROM中。
例 __eeprom int serialNos[4]
將int 類型數組serialNos[]放到EEPROM中,注意,在XC8中int長度是16bit,而在其他MCU中,比如PC,int數值大小跟系統有關。
2. EEPROM初始化
對於那些支持對其EEPROM數據區域進行外部編程的器件,可以使用__EEPROM_DATA()宏將初始值放入可用於編程的HEX文件。
例:#include <xc.h>
__EEPROM_DATA(0,1,2,3,4,5,6,7);
該宏有8個參數,代表8個數據值,每個值為1BYTE。未使用的值用指定為零,否則編譯器會報錯。
每次使用時,__EEPROM_DATA將從EEPROM地址零開始寫入,自動遞增8。
若想使用更多的數據,可通過多次調用該宏來定義所需數量的EEPROM數據。最好將該宏放在所有函數定義之外。
該宏不能在運行時寫入EEPROM里,而是編程燒寫的時候裝入EEPROM中的。
使用__EEPROMSIZE來表示可用的EEPROM字節數。
3 . 訪問函數
可以調用庫函數來讀取和寫入EEPROM。
void eeprom_write(unsigned char addr, unsigned char value);
unsigned char eeprom_read(unsigned char addr);
使用這些函數時,會自動測試,並等待對EEPROM的所有並發寫操作完成,再去執行所需的操作。
4. 訪問宏
宏版本跟訪問函數不同,宏用法如下。
EEPROM_READ(address)
EEPROM_WRITE(address, value)
EEPROM_READ宏會返回讀取的字節。
在低檔和中檔器件中,如PIC8 PIC16 PIC18系列中,宏函數讀取不會等EEPROM寫操作完成,使用時應查詢標志。
再使用宏版本訪問時,最好將中斷關閉。
例 : xc.h
while (WR)
continue;
value=EEPROM_READ(address);