EEPROM в PIC микроконтроллере
Во все микроконтроллерах есть своя энергонезависимая память, которая позволяет сохранить немного данных, когда контроллер выключен. В этой статье будет рассказано, как работать с EEPROM на примере PIC16F628A.
При работе с энергонезависимой памятью контроллера участвует 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 микроконтроллеров
Alex_EXE | 25.12.2010 | Микроконтроллеры |
илья пишет 16.10.2013 в 04:33 #
что то оно в протеусе не как не работает , если можно к примеру описать программу которая бы запоминала состояние светодиода при пропадании питания управляемого кнопкой
Alex_EXE пишет 18.10.2013 в 00:05 #
В протеусе есть небольшие глюки с еепромом, но только с трудностью ручной записи значений в память МК (как при прошивке).
Пример: состояние диода храним в переменной Led;
Когда меняем состояние диода — то меняем и состояние переменной Led и сохраняем её значение в память:
ee_write(0, Led);
Во время запуска считываем сохранённое состояние и устанавливаем его у диода:
Led=ee_read(0);
Как вариант вместо переменной можно запрашивать и устанавливать нужный бит регистра порта.
Но частое изменение статуса диода приведет к быстрому износу EEPROM микроконтроллера. Для избежания этого нужно или в ручную перед выключением вызывать запись или добавить в МК цепь контроля питания и хорошею какую-нибудь емкость с диодом, что бы как только МК зафиксирует падение напряжения сразу сохранить данные.
илья пишет 20.10.2013 в 18:20 #
большое спасибо ,
а в протеусе у меня просто были проблемы с телминалом
Денис пишет 27.10.2014 в 23:24 #
А частое чтение из EEPROM влияет на срок службы EEPROM?
Просто есть один проект, в котором хотелось бы что начальные установки писались в момент программирования контроллера, а не редактированием переменных прошивки, в дальнейшем меняться они не будут. По частоте чтения EEPROM предполагается максимум 10-20 раз в день. Контроллер на постоянном питании круглый год.
Alex_EXE пишет 10.11.2014 в 21:23 #
Чтение не влияет. В последних версия вольтметра так же сделал.
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
Борис пишет 30.06.2016 в 15:24 #
Написана стандартная программа записи чисел 1и 5 в ячейки 240 и 241 EEPROM PIC16F688 на ассемблере в MPLAB v 8.63. Окончание записи каждого числа фиксируется в цикле
btfsc EECON1,WR
goto $-1
Запись из цикла не выходит. Флаг EEIF в регистре
остается нулевым.
Может быть в симуляторе MPLAB запись не проявляется? Чтение работает нормально.
Если можно прояснить ситуацию
Alex_EXE пишет 19.07.2016 в 23:26 #
По данному вопросу не подскажу, давно уже с пиками не работал.