EEPROM - это энергонезависимая память, присутствующая
на борту микрококонтроллеров. Использование EEPROM позволяет сохранять
калибровочные константы, текущие значения всевозможных счётчиков при
выключении питания, пользовательские настройки и прочую информацию,
которую необходимо извлекать в целости и сохранности после сброса МК (в
частности, перебоев в питании).
Для ознакомления с подробностями работы EEPROM смотрите переведённую часть из даташита на PIC18F2585 - "Память данных EEPROM". Здесь же приводится пример работы со встроенной EEPROM на микроконтроллере PIC18F2580 (компилятор HT-PICC 18):
//--------------------------------------------------------------------
unsigned char ee_read(unsigned char adr);
unsigned char ee_write(unsigned adr, unsigned char dat);
//--------------------------------------------------------------------
unsigned char ee_read(unsigned char adr) {
//чтение байта из встроенной EEPROM
while(WR) continue; //пока идёт цикл записи, читать из EEPROM нельзя!
EEPGD=0; //обращаемся к памяти данных EEPROM
CFGS=0;
EEADR=adr; //адрес ячейки
//ClrWdt(); //ВНИМАНИЕ: для некоторых МК здесь требуется пустой цикл (см. ERRATA!)
RD=1; //запускаем цикл чтения
return EEDATA; //прочитанный байт попадает сразу в регистр EEDATA
//--------------------------------------------------------------------
unsigned char ee_write(unsigned char adr, unsigned char dat) {
//запись байта во встроенную EEPROM
while(WR) continue; //ожидаем пока завершится предыдущий цикл записи
EEADR=adr; //адрес ячейки
EEDATA=dat; //байт данных
EECON1&=0b00111111; //обнуляем биты EEPGD и CFGS в регистре EECON1
CARRY=0; //небольшая хитрость: используем флаг CARRY для своих нужд
if(GIE) CARRY=1; //если прерывания были разрешены, запомним это
GIE=0; //принудительно запрещаем все прерывания
WREN=1; //разрешаем запись в EEPROM
EECON2=0x55; //обязательная последовательность
EECON2=0xAA;
WR=1; //запуск цикла записи
WREN=0; //не дожидаясь сброса WR, сбрасываем WREN!
if(CARRY) GIE=1; //если нужно, разрешаем прерывания
}
//--------------------------------------------------------------------
Пример использования:
unsigned char tmp;
ee_write(10, 250); //в ячейку с адресом 10 записали число 250
tmp = ee_read(10); //прочитали число из ячейки, tmp = 10
На основе этого кода можно написать более сложные и интеллектуальные функции:
- запись и чтение массива данных; - запись с последующей проверкой на чтение (защита от ошибок записи); - выборочная запись (если в ячейке уже хранится нужный байт данных, перезаписывать его не нужно); - очистка всей или нужной части EEPROM; - регенерация данных (цикл чтение-запись по всей EEPROM)© PIClist-RUS (piclist.ru), 2007 г.
|