Arduino энергонезависимая память: описание, библиотека

Энергонезависимая память Arduino

Понятия

EEPROM или энергонезависимая память – память, которая может стираться и записываться большое количество раз, при этом данные в такой памяти хранятся независимо от питания контроллера.

Размер памяти EEPROM различается в зависимости от типа контроллера. Размер памяти у популярных контроллеров обозначен в таблице ниже.

Наименование платы Наименование контроллера Объём памяти
Arduino UNO ATmega328 1 Кб
Smart UNO ATmega328 1 Кб
Arduino Mega ATmega2560 4 Кб
Smart Mega ATmega2560 4 Кб
Arduino Leonardo ATmega32u4 1 Кб
Smart Leionardo ATmega32u4 1 Кб
Arduino Due AT91SAM3X8E нет EEPROM
Nano, Pro Mini ATmega328 1 Кб
Pro Micro ATmega32u4 1 Кб

Обратите внимание, что на контроллерах Arduino Due EEPROM-память отсутствует. Запись возможна только во Flash-память.

Внимание! Производитель заявляет, что память EEPROM имеет жизненный цикл в 100000 раз записи/стирания, хранение информации возможно до 100 лет при температуре 25°С. Чтение данных ограничений не имеет. В связи с этим, старайтесь осторожнее относиться к операциям записи и стирания в своих скетчах. Минимальное время, требуемое для процесса записи в память составляет 3,3 мс. При использовании библиотеки EEPROM в среде Arduino эта особенность уже учтена в коде библиотеки, поэтому дополнительно закладывать время на запись не требуется.

В Arduino IDE уже встроена библиотека для работы с энергонезависимой памятью – EEPROM.

Примеры работы

Запись байта данных. write()

Для того чтобы записать байт данных в требуемую ячейку памяти, необходимо вызвать метод write()

Обновление данных. update()

Так как память имеет ограниченное число циклов записи, лучше пользоваться методом update() для записи данных. В отличии от write() он записывает данные, только в случае, если они отличаются от уже сохранённых.

Запись произвольного типа данных. put()

В отличии от метода write(), который позволяет сохранить байт данных, существует метод put(), который расширяет возможности до записи произвольных значений: примитивных типов (например, int или float) или пользовательских структур. Однако, следует внимательнее работать с данным методом, потому как с помощью него запись происходит не в одну конкретную ячейку, а в ряд ячеек.

Чтение произвольного типа данных. get()

Для того чтобы получить данные, записанные методом put() (прочитать информацию из ряда ячеек), нужно воспользоваться методом get().

Чтение из ячейки памяти. read()

Для чтения данных из определенной ячейки памяти нужно воспользоваться методом read().

Чтение всех данных из памяти. Определение размера памяти. length()

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

Обратите внимание, что ячейки памяти, которые изначально не содержали данных, имеют значение 255

© 2014-2019 УмныеЭлементы – DIY-электроника Arduino, компоненты для робототехники и электронных устройств. “УмныеЭлементы” (SmartElements) является зарегистрированным товарным знаком. Любое воспроизведение товарного знака допускается только с согласия правообладателя.

Arduino EEPROM: энергонезависимая память

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. Для определенных проектов стоит использовать только этот вид памяти. Он имеет как свои плюсы, так и свои недостатки. Для освоения методов записи и чтения лучше начать с простых задач.

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

Как сохранить данные в энергонезависимую память (EEPROM) Arduino

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

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

Сначала нужно упомянуть об ограничениях, присущих EEPROM. Во-первых, размер этой энергонезависимой памяти сильно лимитирован. Он меньше памяти данных и памяти программ, и, как правило, составляет всего несколько килобайт. Но этого должно хватить для не слишком ресурсоемких приложений. Во-вторых, количество циклов чтения/записи у EEPROM также заметно ограниченно и, как правило, не превышает 10000 циклов, поэтому работать с этой памятью нужно аккуратно и рационально и не записывать в нее слишком часто.

Для работы с функциями энергонезависимой памяти в среде Arduino IDE имеется библиотека EEPROM.h. С помощью этой библиотеки работать с EEPROM в Arduino очень просто. Для записи в память служит функция EEPROM.write(address, data). В аргумент address записывается адрес ячейки памяти, в которую будут записаны данные, представляемые вторым аргументом data. Для чтения данных из энергонезависимой памяти служит функция EEPROM.read(address), имеющая всего лишь один аргумент address, указывающий на адрес ячейки памяти, из которой нужно прочитать данные.

Для того, чтобы попрактиковаться с EEPROM в Arduino можно сделать небольшой проект. В этом примере мы сначала считаем все ячейки энергонезависимой памяти. Если в них что-то есть, то это будет выведено в последовательный порт. Далее вся ячейки будут заполнены пробелами. Также будет возможность ввести текст через монитор последовательного порта. Этот текст тоже будет записан в EEPROM, и при последующем включении его можно будет считать. Все эти процедуры выполняются не в основном (бесконечном) цикле программы loop, а в процедуре setup(), чтобы не тратить лишний раз ресурс памяти. В основном цикле только каждую секунду мигает светодиод, подключенный к выводу 6 через токоограничивающий резистор 1 КОм. Код программы Arduino для работы с EEPROM приведен ниже.

Пример использования EEPROM. Хранение настроек в arduino

Не всегда есть возможность полностью отладить устройство и прошить с нужными настройками. Это может быть связано с разными факторами: иногда подстройка производится только после установки девайса, иногда просто со временем нужно внести корректировки в работу и т.д. Для таких случаев можно использовать подстроечные резисторы, но это не всегда удобно, например, если придется менять сразу десяток конфигураций. В таких случаях можно воспользоваться, встроенной в arduino, энергонезависимой памятью – EEPROM. Ей не страшно отсутствие питания или перезагрузки устройства, данные останутся в памяти.
Я как-то писал статью про подстроечный резистор и обещал продолжение. Пришло время сдержать обещание и немного расширить функционал из старой статьи.

Энергонезависимая память EEPROM и arduino

EEPROM – это запоминающее устройство, которое позволяет хранить данные десятки лет с отключенным питанием. Перезаписывать данные можно довольно много раз, но не бесконечно. В одних источниках пишут, что EEPROM позволяет осуществлять до нескольких миллионов циклов перезаписи, а где-то пишут, что не больше ста тысяч. В любом случае, этого количества с лихвой должно хватить, если использовать с умом.
Arduino уже имеет встроенную EEPROM и управлять ею очень просто. В зависимости от версии arduino, объем памяти отличается:
— Платы с микроконтроллерами ATmega8 и ATmega168 используют EEPROM с объемом памяти в 512 байт.
— Платы с ATmega328 используют EEPROM с объемом 1 кб
— Платы на ATmega1280 и ATmega2560 имеют EEPROM с объемом в 4 кб
Для хранения настроек и других не больших массивов данных, даже 512 байт будет достаточно. Но если вы решите хранить какие-то огромные значения, не помещающиеся даже в 4 кб, то всегда можно купить дополнительную микросхему EEPROM и подключить ее к arduino. Такие микросхемы способны хранить, куда больший объем, чем встроенные. Главное при выборе обращать внимание на совместимость с arduino и способность работать с 8-битным микроконтроллером. Например, можно использовать 24LC256.

Подстроечный резистор и EEPROM

Чтобы было понятней, как работает EEPROM и как ее использовать, попробуем реализовать небольшой пример. Подключим к ардуино подстроечный резистор, кнопку и пять светодиодов(не забыв про резисторы, чтобы не сжечь светодиоды). И напишем небольшой скетч: по нажатию на кнопку будем считывать значения с подстроечного резистора и конвертировать их в число от 0 до 4х. По повторному нажатию на кнопку, будем сохранять полученное значение в EEPROM. И уже в зависимости от записанного значения, зажжем соответствующее количество светодиодов. Если после перезагрузки или после отключения питания arduino, будет гореть нужное количество огоньков, значит все работает и эксперимент можно считать успешным.
Чтобы было понятней, ниже приведена схема подключения всех элементов.

Скетч записи и чтения данных из EEPROM

Для работы EEPROM в arduino IDE уже есть встроенная библиотека EEPROM.h, ее и будем использовать. Вся память разбита на ячейки по 1 байту, соответственно в каждую ячейку можно записать не больше одного байта, если хранить целые числа, то можно записывать значения от 0 до 255 без сложностей. Этим мы и займемся в скетче – используем одну ячейку памяти и сначала сохраним в нее число от 0 до 4, а потом прочитаем содержимое.
Если вам необходимо хранить значения, превышающие размер в 1 байт, то их придется разбивать по байтам и записывать в разные ячейки по частям.
Обратите внимание: по умолчанию в пустой EEPROM в каждой ячейке хранятся значения 255. Но делать проверку на пустоту с помощью сравнения с числом 255 не стоит. Поскольку не всегда можно полагаться на заводские настройки. И перед использованием лучше прогнать все ячейки в цикле и записать в них свои значения для обнуления, чтобы быть полностью уверенным в содержимом.
Далее остается только привести скетч с подробными комментариями:

Послесловие

Я заказал себе в стране Великого Дракона десяток 24LC256, чтобы можно было поэкспериментировать с внешней EEPROM. Как посылка приедет и я «наиграюсь» с микросхемой, то постараюсь написать статью и поделиться опытом.

Источники:

http://arduinoplus.ru/arduino-eeprom/

http://digitrode.ru/computing-devices/mcu_cpu/397-kak-sohranit-dannye-v-energonezavisimuyu-pamyat-eeprom-arduino.html

http://vk-book.ru/primer-ispolzovaniya-eeprom-xranenie-nastroek-v-arduino/

http://xn--18-6kcdusowgbt1a4b.xn--p1ai/%D0%B4%D0%B0%D1%82%D1%87%D0%B8%D0%BA-%D0%B4%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B0%D1%80%D0%B4%D1%83%D0%B8%D0%BD%D0%BE/

Ссылка на основную публикацию