Evgenii Legotckoi
Evgenii Legotckoi3 августа 2015 г. 21:30

EEPROM в микроконтроллерах AVR Atmega

Микроконтроллеры AVR Atmega48/88/168/328 содержат память EEPROM объемом 256/512/512/1K байт соответственно. EEPROM в микроконтроллерах AVR поддерживает до 100 000 циклов перезаписи. Доступ к энергонезависимой памяти осуществляется посредством регистров трёх видов:

  • EEARH, EEARL - регистры адресации ячеек памяти. В Atmega48 регистр EEARH отсутствует, поскольку в данном типе микроконтроллера присутствует всего 256 ячеек памяти. EEARH отвечает за старший байт адреса ячейки памяти, EEARL за младший байт;
  • EEDR - регистр для записи и чтения данных;
  • EECR - регистр контроля, в данном регистре производится настройка тех действий, которые должны быть выполнены с памятью.

Подробное описание регистров EEPROM

EEARH и EEARL - регистры адреса ячейки EEPROM

Биты с 9-го по 15 зарезервированы и всегда считываются со значением ноль.

Биты с 0-го по 8 используются для указания номера ячейки памяти EEPROM, к которой будет производиться обращение.

EEDR - регистр данных EEPROM

Биты с 2-го по 7 - биты в которых записывается информация, которая должна быть записана в EEPROM или прочитана из неё.

Биты с 6-го по 7 - биты являются зарезервированными

Биты с 4-го по 5 - EEPM1 и EEPM0 - используются для установки режима работы EEPROM.

  • EEPM1 = 0, EEPM0 = 0 - Атомарная операция удаления и записи данных (длительность 3,4 мс)
  • EEPM1 = 0, EEPM0 = 1 - Только удаление данных (длительность 1,8 мс)
  • EEPM1 = 1, EEPM0 = 0 - Только запись данных (длительность 1,8 мс)
  • EEPM1 = 1, EEPM0 = 1 - Зарезервировано для будущего использования

Бит 3 - EERIE - данный бит используется для включения прерывания, в том случае, если Вы разрешили прерывания в прошивке своего контроллера.

Бит 2 - EEMPE - бит защиты от записи. Откладывает процесс записи данных в EEPROM на четыре цикла, чтобы EEPROM успела подготовиться к записи данных.

Бит 1 - EEPE - бит старта записи, выставляется для запуска записи, очищается в ноль аппаратно, в тот момент когда запись завершена. Поэтому может использоваться для контроля процесса записи данных в EEPROM .

Бит 0 - EERE - бит старта чтения. выставляется для запуск чтения из EEPROM.

Операции чтения и записи

EEPROM в Atmega очень медлительный интерфейс, который требует до 4 мс для совершения операций записи. Поэтому очень важно проверять, что предыдущая операция записи завершена успешно.

;======= Процедура записи в EEPROM ======================================================
 EEWrite: 
    sbic EECR,EEPE          ; Ожидаем, когда закончится предыдущая операция записи. 
    rjmp EEWrite            ; Не выходим из цикла до тех пор, пока не очистится флаг EEPE
    cli                     ; После чего выставляем запрет на прерывания.
    out EEARL,r16           ; Устанавливаем адрес ячейки, к которой будем обращаться
    out EEDR,r17            ; а также записываем в регистр данных информацию, 
                            ; которую будем сохранять
    sbi EECR,EEMPE          ; устанавливаем защиту на запись
    sbi EECR,EEPE           ; устанавливаем флаг записи
    sei                     ; после чего разрешаем прерывания
    ret                     ; и возвращаемся из подпрограммы.
 ;======= Процедура чтения из EEPROM ====================================================
 EERead: 
    sbic EECR,EEPE          ; Ожидаем, когда закончится предыдущая операция записи. 
    rjmp EERead 
    out  EEARL, r16         ; Устанавливаем адрес ячейки, к которой будем обращаться
    sbi  EECR,EERE          ; Запускаем чтение установкой флага на чтение
    in   r17, EEDR          ; Возвращаем результат чтения в нужный регистр
    ret 
 ;=======================================================================================
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
г
  • ги
  • 24 апреля 2024 г. 3:51

C++ - Тест 005. Структуры и Классы

  • Результат:41баллов,
  • Очки рейтинга-8
l
  • laei
  • 23 апреля 2024 г. 21:19

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:10баллов,
  • Очки рейтинга-10
l
  • laei
  • 23 апреля 2024 г. 21:17

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
k
kmssr9 февраля 2024 г. 7:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 14:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 23:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 21:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 декабря 2023 г. 10:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
G
Gar22 апреля 2024 г. 17:46
Clipboard Как скопировать окно целиком в clipb?
DA
Dr Gangil Academics20 апреля 2024 г. 19:45
Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
a
a_vlasov14 апреля 2024 г. 18:41
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел Дорофеев14 апреля 2024 г. 14:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex4 апреля 2024 г. 16:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

Следите за нами в социальных сетях