0

Запись данных в eeprom

Что нужно для того, чтобы стать профессиональным разработчиком программ для микроконтроллеров и выйти на такой уровень мастерства, который позволит с лёгкостью найти и устроиться на работу с высокой зарплатой (средняя зарплата программиста микроконтроллеров по России на начало 2017 года составляет 80 000 рублей). Подробнее.

ATtiny13A содержит 64 байта памяти данных EEPROM. Эта память организована как отдельное пространство данных, в котором отдельные байты могут быть прочитаны и записаны. EEPROM имеет выносливость по крайней мере 100 000 циклов записи/стирания. Обмен данными между EEPROM и процессором описан далее, и основан на использовании Регистров Адреса EEPROM (EEPROM Address Registers), Регистра Данных EEPROM (EEPROM Data Register) и Регистра Управления EEPROM (EEPROM Control Register). Подробное описания последовательной загрузки данных в EEPROM описано в документации (в оригинале это страница 106, на моём сайте будет опубликовано позже).

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

  • EEAR – Регистр Адреса EEPROM (EEPROM Address Register)
  • EEDR – Регистр Данных EEPROM (EEPROM Data Register)
  • EECR – Регистр Управления EEPROM (EEPROM Control Register)

Если объём EEPROM превышает 256 байт (вообще в AVR эта память может иметь объём до 8 КБ в зависимости от модели МК), то вместо одного регистра адреса EEAR микроконтроллер имеет два регистра: EEARH и EEARL. Регистры доступа к EEPROM имеют следующие номера:

  • EEAR – 0x1E
  • EEARL – 0x1E
  • EEARH – 0x1F
  • EEDR – 0x1D
  • EECR – 0x1C

Как видите, регистры EEAR и EEARL имеют одинаковые номера. То есть в микроконтроллере, где объём EEPROM меньше 256 байт (в таком, как ATtiny13A), можно использовать только EEAR (он же EEARL).

Регистры EEAR (или EEARH и EEARL) работают только на запись. То есть в эти регистры вы можете только записать значение – адрес EEPROM, тем самым указав микроконтроллеру, с какой ячейкой памяти дальше надо будет работать.

Регистр EEDR работает как на запись, так и на чтение. При записи через этот регистр в EEPROM поступает записываемый байт. При чтениии через этот регистр микроконтроллер получает байт из EEPROM.

Регистр управления EECR устанавливает режим работы. Через него подаются команды чтения и записи EEPROM. Установка 0-го бита начинает чтение из EEPROM. Установка 1-го бита начинает запись в EEPROM. Для управляющих битов имеются соответствующие константы (биты регистра EECR будут описаны позже в других статьях, в оригинальной документации см. стр. 21).

Чтение и запись EEPROM

Регистры Адреса EEPROM (EEPROM Access Registers) доступны через область ввода-вывода.

Время доступа для записи в EEPROM приведено в таблице 5.1. Функция самоуправления временем, однако, позволяет программному обеспечению пользователя определить, когда можно записать следующий байт. Если код пользователя содержит инструкции по записи EEPROM, необходимо принять некоторые меры предосторожности. В источниках питания с мощными фильтрами, питание VCC при включении/выключении медленно повышается (понижается). По этой причине микроконтроллер в течение некоторого времени запускается на более низком напряжении, чем допустимо для используемой тактовой частоты. Дополнительные сведения о том, как избежать сложностей в таких случаях, см. ниже в разделе “Предотвращение повреждения EEPROM”.

Таблица 5.1. Биты режимов EEPROM.

EECR Время программирования Операция
EEPM1 EEPM0
3,4 мс Стирание и запись за одну операцию (Атомарная операция)
1 1,8 мс Только стирание
1 1,8 мс Только запись
1 1 Зарезервировано для будущего использования

Чтобы предотвратить непреднамеренную запись EEPROM, необходимо выполнить определенные правила записи. Подробности см. ниже в разделах “Атомарное программирование байта” и “Раздельное программирование байта”.

Когда выполняется чтение EEPROM, работа процессора приостанавливается на четыре такта, прежде чем следующая инструкция может быть выполнена. При записи EEPROM процессор останавливается на два такта перед выполнением следующей инструкции. То есть на время чтения/записи EEPROM процессор перестаёт выполнять команды и никакие другие инструкции не могут быть выполнены.

Атомарное программирование байта (Atomic Byte Programming)

Операция в общей области памяти называется атомарной, если она завершается в один шаг (не путать с тактом!) относительно других потоков (процессов), имеющих доступ к этой памяти. Во время выполнения такой операции над переменной, ни один поток не может наблюдать изменение наполовину завершенным. То есть пока атомарное обращение к памяти не будет завершено, доступ к этой памяти из другой операции невозможен. Атомарная загрузка гарантирует, что переменная будет загружена целиком в один момент времени.

Неатомарные операции не дают такой гарантии (то есть при неатомарных операциях возможен одновременный доступ к памяти из нескольких потоков, что может привести к непредсказуемым результатам).

Использование Атомарного Программирования байта (Atomic Byte Programming) – это самый простой режим. Записывая байт в EEPROM, пользователь должен записать адрес в регистр EEARL, а данные в регистр EEDR. Если биты EEPMn равны нулю, запись EEPE (в течение четырех тактов после записи EEMPE) вызовет операцию стирания/записи.

И стирание, и запись выполняются за одну операцию (полное время программирования показано в таблица 5-1 выше). Бит EEPE остается установленным до завершения операций стирания и записи. Пока микроконтроллер занят программированием, невозможно выполнять какие-либо другие операции с EEPROM.

Раздельное программирование байта (Split Byte Programming)

Можно разделить операции стирания и записи байта на две различных операции. Это может быть полезно, если системе требуется короткое время доступа в течение некоторого ограниченного периода времени (обычно при падении напряжения питания). Чтобы воспользоваться преимуществами этого способа, необходимо, чтобы записываемые ячейки памяти были очищены (стёрты) перед операцией записи. Но поскольку операции стирания и записи разделены, можно выполнять операции стирания, когда система позволяет выполнять критические по времени операции (обычно после включения питания).

Стирание EEPROM

Для того, чтобы стереть байт, его адрес необходимо записать в регистр EEARL. Если биты EEPMn равны 0b01, то запись EEPE (в течение четырех тактов после записи EEMPE) вызовет только операцию стирания (время программирования указано выше в таблице 5-1). Бит EEPE остается установленным до завершения операции стирания. Пока микроконтроллер занят программированием, невозможно выполнить какие-либо другие операции с EEPROM.

Запись EEPROM

Для записи ячейки памяти пользователь должен записать адрес в EEARL, а данные – в EEDR. Если биты EEPMn равны 0b10, то запись EEPE (в течение четырех тактов после записи EEMPE) вызовет только операцию записи (время программирования приведено выше в таблице 5-1). В EEPE бит остается установленным до тех пор, пока операция записи не завершится. Если записываемая ячейка не была очищена (стерта) перед записью, сохраненные данные должны считаться потерянными. Пока микроконтроллер занят программированием, невозможно выполнить какие-либо другие операции с EEPROM.

Читайте также:  В каком диапазоне работает мтс 4g

Калибровка генератора тактовой частоты с помощью регистра калибровки (Oscillator Calibration Register) используется для настройки времени доступа к EEPROM. Убедитесь, что частота генератора соответствует требованиям, описанным в разделе “OSCCAL – Oscillator Calibration Register " (в оригинальной документации стр. 27, на моём сайте будет описана позже).

В следующих примерах кода показана одна функция на Ассемблере и C для стирания, записи или атомарной записи EEPROM. В примерах предполагается, что прерывания управляются (например, отключением прерываний глобально) таким образом, что во время выполнения этих функций прерывания не будут происходить.

См. также пример здесь.

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

См. также пример здесь.

Предотвращение повреждения EEPROM

Если напряжение питания VCC слишком низкое (например, во время включения питания), данные в EEPROM можно повредить, потому что нарастание напряжения может оказаться слишком медленным для процессора и EEPROM, что не позволит им работать правильно. Эти вопросы такие же, как для систем, использующих память EEPROM, и должны быть применены такие же проектные решения.

Повреждение данных EEPROM может быть вызвано двумя ситуациями, когда напряжение слишком низкое. Во-первых, последовательная запись в EEPROM требует определённого напряжения для правильной работы. Во-вторых, сам процессор может неправильно выполнять инструкции, если напряжение питания слишком низкое.

Повреждения данных EEPROM можно легко избежать, следуя этому совету по проектированию:

Поддерживайте активный (низкий) сброс AVR во время недостаточного напряжения питания. Это можно сделать, включив внутренний детектор (Brown-out Detector (BOD)). Если уровень напряжения BOD не соответствует необходимому уровню напряжения, то можно использовать внешнюю цепь сброса, поддерживающую низкий уровень на выводе сброса и предохраняющую EEPROM от порчи. Если сброс происходит во время выполнения операции записи, операция записи будет завершена при условии, что напряжение питания достаточно.

ПРИМЕЧАНИЕ
Обычно все типовые схемы предусматривают такую защиту без дополнительного программирования (без использования BOD). Самое простое решение – подключить вход сброса микроконтроллера к плюсу источника питания через резистор, а к минусу – через конденсатор. При подаче питания на входе сброса будет низкий уровень, пока не зарядится конденсатор. То есть микроконтроллер не запустится, пока не зарядится конденсатор. Остаётся только рассчитать номиналы резистора и конденсатора, но это уже другая тема.

Arduino – это целое семейство различных устройств для создания электронных проектов. Микроконтроллеры очень удобны для использования, доступны к освоению даже новичку. Каждый микроконтроллер состоит из платы, программ для обеспечения работы, памяти. В этой статье будет рассмотрена энергонезависимая память, используемая в Arduino.

Описание памяти EEPROM

Ардуино предоставляет своим пользователям три типа встроенной памяти устройств: стационарное ОЗУ (оперативно-запоминающее устройство или SRAM — static random access memory) – необходимо для записи и хранения данных в процессе использования; флеш-карты – для сохранения уже записанных схем; EEPROM – для хранения и последующего использования данных.

На ОЗУ все данные стираются, как только происходит перезагрузка устройства либо отключается питание. Вторые две сохраняют всю информацию до перезаписи и позволяют извлекать ее при необходимости. Флеш-накопители достаточно распространены в настоящее время. Подробнее стоит рассмотреть память EEPROM.

Аббревиатура расшифровывается, как Electrically Erasable Programmable Read-Only Memory и в переводе на русский дословно означает – электрически стираемая программируемая память только для чтения. Производитель гарантирует сохранность информации на несколько десятилетий вперед после последнего отключения питания (обычно приводят срок в 20 лет, зависит от скорости снижения заряда устройства).

При этом нужно знать, что возможность перезаписи на устройство ограничена и составляет не более 100 000 раз. Поэтому рекомендуют аккуратно и внимательно относиться к вносимым данным и не допускать перезаписи лишний раз.

Объем памяти, в сравнении с современными носителями, очень небольшой и разный для различных микроконтроллеров. Например, для:

  • ATmega328 – 1кБ
  • ATmega168 и ATmega8 – 512 байт,
  • ATmega2560 и ATmega1280 – 4 кБ.

Так устроено потому, что каждый микроконтроллер предназначен для определенного объема задач, имеет разное количество выводов для подключения, соответственно, необходим разный объем памяти. При этом такого количества достаточно для обычно создаваемых проектов.

Для записи на EEPROM требуется значительное количество времени – около 3 мс. Если в момент записи отключается питание, данные не сохраняются вовсе либо могут быть записаны ошибочно. Требуется всегда дополнительно проверять внесенную информацию, чтобы избежать сбоев во время работы. Считывание данных происходит гораздо быстрее, ресурс памяти от этого не снижается.

Библиотека

Работа с памятью EEPROM осуществляется с помощью библиотеки, которая была специально создана для Ардуино. Главными являются способность к записи и чтению данных. Библиотека активируется командой #include EEPROM.h.

Далее используются простые команды:

  • для записи – EEPROM.write(address, data);
  • для чтения – EEPROM.read(address).

В данных скетчах: address – аргумент с данными ячейки, куда вносятся данные второго аргумента data; при считывании используется один аргумент address, который показывает, откуда следует читать информацию.

Функция Назначение
read(address) считывает 1 байт из EEPROM ; address – адрес, откуда считываются данные (ячейка, начиная с 0);
write(address, value) записывает в память значение value (1 байт, число от 0 до 255) по адресу address;
update(address, value) заменяет значение value по адресу address, если её старое содержимое отличается от нового;
get(address, data) считывает данные data указанного типа из памяти по адресу address;
put(address, data) записывает данные data указанного типа в память по адресу address;
EEPROM[address] позволяет использовать идентификатор "EEPROM" как массив, чтобы записывать данные в память и считывать их из памяти.

Запись целых чисел

Запись целых чисел в энергонезависимую память EEPROM осуществить достаточно просто. Внесение чисел происходит с запуском функции EEPROM.write(). В скобках указываются необходимые данные. При этом числа от 0 до 255 и числа свыше 255 записываются по-разному. Первые вносятся просто – их объем занимает 1 байт, то есть одну ячейку. Для записи вторых необходимо использовать операторов highByte() высший байт и lowByte() низший байт.

Число делится на байты и записывается отдельно по ячейкам. Например, число 789 запишется в две ячейки: в первую пойдет множитель 3, а во вторую – недостающее значение. В итоге получается необходимое значение:

Для «воссоединения» большого целого числа применяется функция word(): int val = word(hi, low). Нужно читывать, что максимальное целое число для записи – 65536 (то есть 2 в степени 16). В ячейках, в которых еще не было иных записей, на мониторе будут стоять цифры 255 в каждой.

Читайте также:  Где найти квартиру без посредников форум

Запись чисел с плавающей запятой и строк

Числа с плавающей запятой и строк – это форма записи действительных чисел, где они представляются из мантиссы и показателя степени. Запись таких чисел в энергонезависимую память EEPROM производится с активацией функции EEPROM.put(), считывание, соответственно, – EEPROM.get().

При программировании числовые значения с плавающей запятой обозначаются, как float, стоит отметить, что это не команда, а именно число. Тип Char (символьный тип) – используется для обозначения строк. Процесс записи чисел на мониторе запускается при помощи setup(), считывание – с помощью loop().

В процессе на экране монитора могут появиться значения ovf, что значит «переполнено», и nan, что значит «отсутствует числовое значение». Это говорит о том, что записанная в ячейку информация не может быть воспроизведена, как число с плавающей точкой. Такой ситуации не возникнет, если достоверно знать, в какой ячейке какой тип информации записан.

Примеры проектов и скетчей

Пример №1

Скетч запишет до 16 символов с последовательного порта и в цикле выведет 16 символов из EEPROM. Благодаря Arduino IDE данные записываются в EEPROM и контролируется содержимое энергонезависимой памяти.

Пример №2

Для большего понимания мы можем создать небольшой скетч, который поможет в понимании работы с энергонезависимой памятью. Считаем все ячейки этой памяти. Если ячейка не пустая – вывод в последовательный порт. После чего заполняем ячейки пробелами. Потом вводим текст через монитор последовательного порта. Его записываем в EEPROM, и при последующем включении считываем.

Пример №3

Запись в память два целых числа, чтение их из EEPROM и вывод в последовательный порт. Числа от 0 до 255 занимают 1 байт памяти, с помощью функции EEPROM.write() записываются в нужную ячейку. Для чисел больше 255 их нужно делить на байты с помощью highByte() и lowByte() и записывать каждый байт в свою ячейку. Максимальное число при этом – 65536 (или 2 16 ).

Пример №4

Запись чисел с плавающей запятой и строк – метод EEPROM.put(). Чтение – EEPROM.get().

Пример №5

Использование EEPROM как массива.

Работа с EEPROM

Как упоминалось ранее, ресурс памяти EEPROM ограничен. Для продления срока службы энергонезависимой памяти, вместо функции write() запись, лучше применять функцию update обновление. При этом перезапись ведется только для тех ячеек, где значение отличается от вновь записываемого.

Еще одной полезной функцией рассматриваемой памяти микроконтроллера является возможность использования ячеек хранения байтов, как деталей целостного массива EEPROM. При любом формате использования необходимо постоянно осуществлять контроль целостности записанных данных.

Такая память на Ардуино стандартно хранит самое важное для работы контроллера и устройства. К примеру, если на такой базе создается регулятор температуры и исходные данные окажутся ошибочными, устройство будет работать «неадекватно» существующим условиям – сильно занижать или завышать температуру.

Существует несколько ситуаций, когда память EEPROM содержит неправильные данные:

  1. При первоначальной активации – еще не было ни одной записи.
  2. В момент неконтролируемого отключения питания – часть или все данные не запишутся или запишутся некорректно.
  3. После завершения возможных циклов перезаписи данных.

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

Для контроля целостности информации используют контрольный код системы. Он создается по образцу записи первоначальных данных и, при проверке, он вновь просчитывает данные. Если результат отличается – это ошибка. Самым распространенным вариантом такой проверки является контрольная сумма – выполняется обычная математическая операция по сложению всех значений ячеек.

Опытные программисты добавляют к этому коду дополнительное «исключающее ИЛИ», например, E5h. В случае если все значения равны нулю, а система по ошибке обнулила исходные данные – такая хитрость выявит ошибку.

Таковы основные принципы работы с энергонезависимой памятью EEPROM для микроконтроллеров Arduino. Для определенных проектов стоит использовать только этот вид памяти. Он имеет как свои плюсы, так и свои недостатки. Для освоения методов записи и чтения лучше начать с простых задач.

Что нужно для того, чтобы стать профессиональным разработчиком программ для микроконтроллеров и выйти на такой уровень мастерства, который позволит с лёгкостью найти и устроиться на работу с высокой зарплатой (средняя зарплата программиста микроконтроллеров по России на начало 2017 года составляет 80 000 рублей). Подробнее.

ATtiny13A содержит 64 байта памяти данных EEPROM. Эта память организована как отдельное пространство данных, в котором отдельные байты могут быть прочитаны и записаны. EEPROM имеет выносливость по крайней мере 100 000 циклов записи/стирания. Обмен данными между EEPROM и процессором описан далее, и основан на использовании Регистров Адреса EEPROM (EEPROM Address Registers), Регистра Данных EEPROM (EEPROM Data Register) и Регистра Управления EEPROM (EEPROM Control Register). Подробное описания последовательной загрузки данных в EEPROM описано в документации (в оригинале это страница 106, на моём сайте будет опубликовано позже).

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

  • EEAR – Регистр Адреса EEPROM (EEPROM Address Register)
  • EEDR – Регистр Данных EEPROM (EEPROM Data Register)
  • EECR – Регистр Управления EEPROM (EEPROM Control Register)

Если объём EEPROM превышает 256 байт (вообще в AVR эта память может иметь объём до 8 КБ в зависимости от модели МК), то вместо одного регистра адреса EEAR микроконтроллер имеет два регистра: EEARH и EEARL. Регистры доступа к EEPROM имеют следующие номера:

  • EEAR – 0x1E
  • EEARL – 0x1E
  • EEARH – 0x1F
  • EEDR – 0x1D
  • EECR – 0x1C

Как видите, регистры EEAR и EEARL имеют одинаковые номера. То есть в микроконтроллере, где объём EEPROM меньше 256 байт (в таком, как ATtiny13A), можно использовать только EEAR (он же EEARL).

Регистры EEAR (или EEARH и EEARL) работают только на запись. То есть в эти регистры вы можете только записать значение – адрес EEPROM, тем самым указав микроконтроллеру, с какой ячейкой памяти дальше надо будет работать.

Регистр EEDR работает как на запись, так и на чтение. При записи через этот регистр в EEPROM поступает записываемый байт. При чтениии через этот регистр микроконтроллер получает байт из EEPROM.

Регистр управления EECR устанавливает режим работы. Через него подаются команды чтения и записи EEPROM. Установка 0-го бита начинает чтение из EEPROM. Установка 1-го бита начинает запись в EEPROM. Для управляющих битов имеются соответствующие константы (биты регистра EECR будут описаны позже в других статьях, в оригинальной документации см. стр. 21).

Читайте также:  Блок питания chieftec 450w

Чтение и запись EEPROM

Регистры Адреса EEPROM (EEPROM Access Registers) доступны через область ввода-вывода.

Время доступа для записи в EEPROM приведено в таблице 5.1. Функция самоуправления временем, однако, позволяет программному обеспечению пользователя определить, когда можно записать следующий байт. Если код пользователя содержит инструкции по записи EEPROM, необходимо принять некоторые меры предосторожности. В источниках питания с мощными фильтрами, питание VCC при включении/выключении медленно повышается (понижается). По этой причине микроконтроллер в течение некоторого времени запускается на более низком напряжении, чем допустимо для используемой тактовой частоты. Дополнительные сведения о том, как избежать сложностей в таких случаях, см. ниже в разделе “Предотвращение повреждения EEPROM”.

Таблица 5.1. Биты режимов EEPROM.

EECR Время программирования Операция
EEPM1 EEPM0
3,4 мс Стирание и запись за одну операцию (Атомарная операция)
1 1,8 мс Только стирание
1 1,8 мс Только запись
1 1 Зарезервировано для будущего использования

Чтобы предотвратить непреднамеренную запись EEPROM, необходимо выполнить определенные правила записи. Подробности см. ниже в разделах “Атомарное программирование байта” и “Раздельное программирование байта”.

Когда выполняется чтение EEPROM, работа процессора приостанавливается на четыре такта, прежде чем следующая инструкция может быть выполнена. При записи EEPROM процессор останавливается на два такта перед выполнением следующей инструкции. То есть на время чтения/записи EEPROM процессор перестаёт выполнять команды и никакие другие инструкции не могут быть выполнены.

Атомарное программирование байта (Atomic Byte Programming)

Операция в общей области памяти называется атомарной, если она завершается в один шаг (не путать с тактом!) относительно других потоков (процессов), имеющих доступ к этой памяти. Во время выполнения такой операции над переменной, ни один поток не может наблюдать изменение наполовину завершенным. То есть пока атомарное обращение к памяти не будет завершено, доступ к этой памяти из другой операции невозможен. Атомарная загрузка гарантирует, что переменная будет загружена целиком в один момент времени.

Неатомарные операции не дают такой гарантии (то есть при неатомарных операциях возможен одновременный доступ к памяти из нескольких потоков, что может привести к непредсказуемым результатам).

Использование Атомарного Программирования байта (Atomic Byte Programming) – это самый простой режим. Записывая байт в EEPROM, пользователь должен записать адрес в регистр EEARL, а данные в регистр EEDR. Если биты EEPMn равны нулю, запись EEPE (в течение четырех тактов после записи EEMPE) вызовет операцию стирания/записи.

И стирание, и запись выполняются за одну операцию (полное время программирования показано в таблица 5-1 выше). Бит EEPE остается установленным до завершения операций стирания и записи. Пока микроконтроллер занят программированием, невозможно выполнять какие-либо другие операции с EEPROM.

Раздельное программирование байта (Split Byte Programming)

Можно разделить операции стирания и записи байта на две различных операции. Это может быть полезно, если системе требуется короткое время доступа в течение некоторого ограниченного периода времени (обычно при падении напряжения питания). Чтобы воспользоваться преимуществами этого способа, необходимо, чтобы записываемые ячейки памяти были очищены (стёрты) перед операцией записи. Но поскольку операции стирания и записи разделены, можно выполнять операции стирания, когда система позволяет выполнять критические по времени операции (обычно после включения питания).

Стирание EEPROM

Для того, чтобы стереть байт, его адрес необходимо записать в регистр EEARL. Если биты EEPMn равны 0b01, то запись EEPE (в течение четырех тактов после записи EEMPE) вызовет только операцию стирания (время программирования указано выше в таблице 5-1). Бит EEPE остается установленным до завершения операции стирания. Пока микроконтроллер занят программированием, невозможно выполнить какие-либо другие операции с EEPROM.

Запись EEPROM

Для записи ячейки памяти пользователь должен записать адрес в EEARL, а данные – в EEDR. Если биты EEPMn равны 0b10, то запись EEPE (в течение четырех тактов после записи EEMPE) вызовет только операцию записи (время программирования приведено выше в таблице 5-1). В EEPE бит остается установленным до тех пор, пока операция записи не завершится. Если записываемая ячейка не была очищена (стерта) перед записью, сохраненные данные должны считаться потерянными. Пока микроконтроллер занят программированием, невозможно выполнить какие-либо другие операции с EEPROM.

Калибровка генератора тактовой частоты с помощью регистра калибровки (Oscillator Calibration Register) используется для настройки времени доступа к EEPROM. Убедитесь, что частота генератора соответствует требованиям, описанным в разделе “OSCCAL – Oscillator Calibration Register " (в оригинальной документации стр. 27, на моём сайте будет описана позже).

В следующих примерах кода показана одна функция на Ассемблере и C для стирания, записи или атомарной записи EEPROM. В примерах предполагается, что прерывания управляются (например, отключением прерываний глобально) таким образом, что во время выполнения этих функций прерывания не будут происходить.

См. также пример здесь.

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

См. также пример здесь.

Предотвращение повреждения EEPROM

Если напряжение питания VCC слишком низкое (например, во время включения питания), данные в EEPROM можно повредить, потому что нарастание напряжения может оказаться слишком медленным для процессора и EEPROM, что не позволит им работать правильно. Эти вопросы такие же, как для систем, использующих память EEPROM, и должны быть применены такие же проектные решения.

Повреждение данных EEPROM может быть вызвано двумя ситуациями, когда напряжение слишком низкое. Во-первых, последовательная запись в EEPROM требует определённого напряжения для правильной работы. Во-вторых, сам процессор может неправильно выполнять инструкции, если напряжение питания слишком низкое.

Повреждения данных EEPROM можно легко избежать, следуя этому совету по проектированию:

Поддерживайте активный (низкий) сброс AVR во время недостаточного напряжения питания. Это можно сделать, включив внутренний детектор (Brown-out Detector (BOD)). Если уровень напряжения BOD не соответствует необходимому уровню напряжения, то можно использовать внешнюю цепь сброса, поддерживающую низкий уровень на выводе сброса и предохраняющую EEPROM от порчи. Если сброс происходит во время выполнения операции записи, операция записи будет завершена при условии, что напряжение питания достаточно.

ПРИМЕЧАНИЕ
Обычно все типовые схемы предусматривают такую защиту без дополнительного программирования (без использования BOD). Самое простое решение – подключить вход сброса микроконтроллера к плюсу источника питания через резистор, а к минусу – через конденсатор. При подаче питания на входе сброса будет низкий уровень, пока не зарядится конденсатор. То есть микроконтроллер не запустится, пока не зарядится конденсатор. Остаётся только рассчитать номиналы резистора и конденсатора, но это уже другая тема.

admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *