PIClist RUS
микроконтроллеры PIC и интерфейсы
техническая документация
статьи и разработки на русском языке

Пример работы со встроенной EEPROM (PIC18F2580 + HT-PICC 18)

« назад на главную страницу

Статья © PIClist-RUS (piclist.ru)


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).



Page copy protected against web site content infringement by Copyscape

© PIClist-RUS (piclist.ru), 2007 г.

PIClist RUS (piclist.ru) © 2008
все права сохранены. перепечатка статей и переводов с данного сайта запрещена.