Доброго времени суток!
Сегодня мы поговорим о такой важной составляющей микроконтроллера как EEPROM. Очень часто возникает необходимость сохранения данных при отключении питания микроконтроллера. Например, констант, настроек, и так далее. Именно для таких ситуаций микроконтроллеры AVR имеют в своем составе постоянную энергонезависимую память EEPROM, в которой запросто можно разместить необходимые данные. То есть, при отключении питания контроллера или его сбросе, данные записанные в EEPROM не стираются. Объем EEPROM зависит от модели контроллера.
Однако данная память имеет хоть и огромное но, ограниченное количество циклов перезаписи (порядка 100 000), и скорость работы с ней достаточно низкая.
При работе с памятью посредством языка C, можно абстрагироваться от низкоуровневых функций и работы непосредственно с регистрами, так как в стандартной поставке среды Atmel(AVR) Studio уже присутствует библиотека для работы с данным видом памяти. При использовании Assembler, прописать данные функции, путем последовательной работы с регистрами, придется самому. Оставим Assembler на следующий урок, а сейчас поработаем с C.
Для работы с постоянной памятью данных в Atmel(AVR) Studio используются следующие функции стандартной библиотеки eeprom.h:
-
eeprom_read_byte (eeprom_read_word, eeprom_read_dword, eeprom_read_float, eeprom_read_block) — Функция чтения данных соответствующего типа из EEPROM.
-
eeprom_write_byte(eeprom_write_word, eeprom_write_dword, eeprom_write_float, eeprom_write_block) — Функция записи данных соответствующего типа в EEPROM.
-
eeprom_update_byte(eeprom_ update _word, eeprom_ update _dword, eeprom_ update _float, eeprom_ update _block) — Функция обновления данных соответствующего типа в EEPROM.
Давайте в качестве примера создадим счетчик запусков контроллера. То есть, при каждом запуске контроллера, увеличиваем счетчик на единицу.
В Atmel(AVR) Studio напишем следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#define F_CPU 16000000UL #include <avr/eeprom.h> uint8_t Num EEMEM = ; int main(void) { uint8_t tmp = eeprom_read_byte(&Num); DDRD = 0xFF; PORTD = tmp; tmp++; eeprom_write_byte(&Num,tmp); while(1) { } } |
Рассмотрим данный код подробнее. Вначале директивой include подключаем заголовочный файл eeprom.h. Затем создаем переменную num, типа uint8_t, и размещаем её в EEPROM, директивой EEMEM.
После объявления необходимых переменных, командой eeprom_read_byte, считываем значение из EEPROM в переменную tmp.
После вывода текущего значения счетчика, увеличиваем переменную на единичку и сохраняем значение в EEPROM, командой eeprom_write_byte, которая запишет значение tmp по адресу num. Надеюсь, что работа программы ясна, если возникнут вопросы — оставляйте их в комментариях.
Atmel(AVR) Studio автоматически сгенерирует файл EEPROM расширения .eep, в папке с проектом. Однако для его использования в ПО Proteus, необходимо преобразовать его в .bin , при помощи утилиты hex2bin, которую вы можете найти в Интернете.
После преобразования файла, необходимо настроить микроконтроллер в среде Proteus. Для этого, поместите соответствующий контроллер на схеме и кликните дважды на нем.
В данном окне, откройте список Advanced Properties, и выберите пункт Initial Contents of Data EEPROM. Нажав на иконку с папкой, укажите путь до файла .bin.
В этом же окне не забудьте указать путь до файла прошивки, в пункте Program File.
После всех описанных выше процедур, Вы можете запустить симуляцию работы схемы в обычном режиме.
Спасибо за внимание!
Если у Вас есть вопросы, оставляйте их в комментариях.
Любое копирование, воспроизведение, цитирование материала, или его частей разрешено только с письменного согласия администрации MKPROG.RU. Незаконное копирование, цитирование, воспроизведение преследуется по закону!
Unbielevable how well-written and informative this was.
Затем создаем переменную OUT. И где эта переменная?
Не OUT, а num. Спасибо, исправил
каким образом тут html c сss ?
Подскажите, а строчка «uint8_t Num EEMEM = 0;» не перетрёт при следующем включении МК значение переменной «Num»? Не пойдет ли счетчик «tmp++» снова с «нуля»? Или, может «&Num» должна как-то сравнить текущее значение переменной? Что-то я запутался…
Здравствуйте!
Читайте внимательнее статью, после компиляции генерируется файл с данными EEPROM, которые необходимо загрузить в EEPROM контроллера.
Тот нолик который Вас смущает будет только в этом файле, и его не будет в основном коде программы.
так а если не в протеус шить, а прямо в контроллер, в контроллер же через определенную программу нужно зашить хекс файл, а если вы говорите, что еще есть епром файл, каким образом его тоже зашить в контроллер физический ?
При прошивке контроллера, в ПО которым Вы пользуетесь для прошивки, должен быть пункт EEPROM.
Какой программой вы прошиваете контроллеры?