EEPROM в PIC микроконтроллере

Во все микроконтроллерах есть своя энергонезависимая память, которая позволяет сохранить немного данных, когда контроллер выключен. В этой статье будет рассказано, как работать с EEPROM на примере PIC16F628A.

регистр EECON1

При работе с энергонезависимой памятью контроллера участвует 4 регистра:
EEADR – адрес ячейки
EEDATA – для данных
и два регистра управления EECON1 и EECON2.

В даташите к микроконтроллеру указан пример кода для работы с EEPROM на ассемблере. Здесь же приведу пример на С:


unsigned char ee_read(unsigned char address)
{
while(WR) continue;		//	пока идёт цикл записи, читать из EEPROM нельзя!
EEADR=address;			//	адрес
SetBit(EECON1,0);		//	разрешаем чтение
return EEDATA;
}

void ee_write(unsigned char a ddress, unsigned char data)
{
while(WR) continue;		//	ожидаем пока завершится предыдущий цикл записи
EEADR=address;			//	адрес
EEDATA=data;			//	данные
SetBit(EECON1,2);		//	разрешаем запись в EEPROM
CARRY=0;				//	используем регистр для запоминания наличия прерываний
if(GIE) CARRY=1;		//	запоминаем, если были приревания
GIE=0;					//	запрет приреваний
EECON2=0x55;			//	обязательная последовательность
EECON2=0xAA;
SetBit(EECON1,1);		//	запуск цикла записи
ClrBit(EECON1,2);		//	сбрасываем WREN
if(CARRY) GIE=1;		// разрешаем прерываня, если нужно
}

байт данных ee_read(адрес) — чтение байта данных из указанной ячейки EEPROM
ee_write(адрес, байт данные) — запись байта данных в указанную ячейку EEPROM

В некоторых задачах может потребоваться проверка записанных данных в EEPROM. Это можно делать дополнительно проверяя флаг EEIF регистра EECON1 или можно сразу после записи прочитать записанный байт и сверить их.

PIC16F628A содержит 128 байт энергонезависимой памяти.

Был написан простой пример для записи и чтения энергонезависимой памяти контроллера через COM порт. В примере прошивка позволяет адресоваться к первым 10 ячейкам памяти.

Скачать исходный код, прошивка и проект для Proteus7.6

При написании статьи использовался переведённый datasheet по eeprom PIC микроконтроллеров

8 комментариев на « EEPROM в PIC микроконтроллере»

  1. илья пишет 16.10.2013 в 04:33 #

    что то оно в протеусе не как не работает , если можно к примеру описать программу которая бы запоминала состояние светодиода при пропадании питания управляемого кнопкой

  2. Alex_EXE пишет 18.10.2013 в 00:05 #

    В протеусе есть небольшие глюки с еепромом, но только с трудностью ручной записи значений в память МК (как при прошивке).

    Пример: состояние диода храним в переменной Led;
    Когда меняем состояние диода — то меняем и состояние переменной Led и сохраняем её значение в память:
    ee_write(0, Led);
    Во время запуска считываем сохранённое состояние и устанавливаем его у диода:
    Led=ee_read(0);
    Как вариант вместо переменной можно запрашивать и устанавливать нужный бит регистра порта.

    Но частое изменение статуса диода приведет к быстрому износу EEPROM микроконтроллера. Для избежания этого нужно или в ручную перед выключением вызывать запись или добавить в МК цепь контроля питания и хорошею какую-нибудь емкость с диодом, что бы как только МК зафиксирует падение напряжения сразу сохранить данные.

  3. илья пишет 20.10.2013 в 18:20 #

    большое спасибо ,
    а в протеусе у меня просто были проблемы с телминалом

  4. Денис пишет 27.10.2014 в 23:24 #

    А частое чтение из EEPROM влияет на срок службы EEPROM?
    Просто есть один проект, в котором хотелось бы что начальные установки писались в момент программирования контроллера, а не редактированием переменных прошивки, в дальнейшем меняться они не будут. По частоте чтения EEPROM предполагается максимум 10-20 раз в день. Контроллер на постоянном питании круглый год.

  5. Alex_EXE пишет 10.11.2014 в 21:23 #

    Чтение не влияет. В последних версия вольтметра так же сделал.

  6. Paulwasw пишет 04.02.2016 в 15:27 #

    Небольшое добавление к статье. Столкнулся с необходимостью записать начальную информацию в EEPROM на этапе программирования кристалла (PIC16Fxxx). В ASM это делается просто:

    Org 0x2100;
    DE 0x01, 0x03, 0x2F, 0x00, 0x3E (и т.д.)

    А как выполнить это на Си? Уж больно неудобно заливать в МК программу и начальную информацию EEPROM раздельно. Информация в Сети по данному вопросу весьма скудная, хочу поделиться, может кому-то тоже понадобится. Нужно вставить строку (или строки, их м.б. несколько):

    __EEPROM_DATA (0,0×01,0x02,0x03,4,5,6,7); // в скобках – байты записываемых данных (пример)
    __EEPROM_DATA (0x0A,0xDF,0,4); // продолжение строки данных

    Строк может быть несколько, данные будут записываться последовательно, а не накладываться. Саму строку рекомендуют располагать до объявления глобальных переменных, логично после строки с __CONFIG( ).
    А вот смещать адрес данных в EEPROM хлопотно – надо писать макросы на ASM. Проще указать для начальных ячеек значения 0xFF. Проверено на HI_TECH_Software v 9.71a – работает!

    Ссылки для тех, кто хочет покопаться поглубже:
    http://www.microchip.ru/phorum/read.php?f=2&i=44120&t=44120
    http://www.microchip.ru/phorum/read.php?f=2&i=39686&t=39646

  7. Борис пишет 30.06.2016 в 15:24 #

    Написана стандартная программа записи чисел 1и 5 в ячейки 240 и 241 EEPROM PIC16F688 на ассемблере в MPLAB v 8.63. Окончание записи каждого числа фиксируется в цикле
    btfsc EECON1,WR
    goto $-1
    Запись из цикла не выходит. Флаг EEIF в регистре
    остается нулевым.
    Может быть в симуляторе MPLAB запись не проявляется? Чтение работает нормально.
    Если можно прояснить ситуацию

  8. Alex_EXE пишет 19.07.2016 в 23:26 #

    По данному вопросу не подскажу, давно уже с пиками не работал.

Комментарии RSS

Оставьте отзыв