Что такое чип памяти и как программировать микросхемы. Как очистить EEPROM (Энергонезависимую память) Использование eeprom памяти
В прошлый раз, когда я писал свой "развёрнутый ответ на вопрос" о том, как забэкапить прошивку с "Меги" меня упрекнули, что я не упомянул про бэкап EEPROM. В тот раз я не сделал этого сознательно, т.к. справедливо рассудил, что не стоит всё усложнять на этапе первоначального "подхода к снаряду". Дело в том, что не для всех очевиден тот факт, что EEPROM не прошивается при компиляции и заливки прошивки из Arduino IDE. То есть, это означает, что абсолютно ничего в EEPROM не заливается, когда прошивка заливается из IDE. А манипуляции с EEPROM (если его использование вообще включено в прошивке) производятся абсолютно на другом уровне. И следовательно, для бэкапа голой прошивки без тонких настроек, которые ВОЗМОЖНО (только возможно) могут храниться в EEPROM, вполне было достаточно сохранить только голую прошивку. Но раз уж возник вопрос, то почему бы его не "разжевать". Давайте пройдёмся по порядку.Что такое EEPROM и зачем вести о нём речь?
EEPROM - (Electrically Erasable Programmable Read-Only Memory) область энергонезависимой памяти микроконтроллера, в которую можно записать и прочитать информацию. Зачастую его используют для того, чтобы хранить настройки программы, которые могут меняться в процессе эксплуатации, и которые необходимо хранить при отключенном питании.
Как 3D принтер использует EEPROM?
Рассмотрим на примере Marlin"а. В Marlin Firmware "из коробки" EEPROM не используется. Параметры конфигуратора (Configuration.h), которые включают возможность его использования, по умолчанию, закомментированы.
#define
EEPROM_SETTINGS
#define
EEPROM_CHITCHAT
Если включено использование EEPROM, то принтер может хранить и использовать следующие настройки (подсмотрено у буржуев):
- Количество шагов на миллиметр
- Максимальная/минимальная скорость подачи [мм/с]
- Максимальное ускорение [мм/с^2]
- Ускорение
- Ускорение при ретракте
- Настройки PID
- Отступ домашней позиции
- Минимальная скорость подачи во время перемещения [мм/с]
- Минимальное время участка [мс]
- Максимальный скачок скорости по осям X-Y [мм/с]
- Максимальный скачок скорости по оси Z [мм/с]
- Store memory
- Load memory
- Restore Failsafe
- M500 Сохраняет текущие настройки в EEPROM до следующего запуска или выполнения команды M501.
- M501 Читает настройки из EEPROM.
- M502 Сбрасывает настройки на значения по-умолчанию, прописанные в Configurations.h. Если выполнить после неё M500, в EEPROM будут занесены значения по-умолчанию.
- M503 Выводит текущие настройки – ""Те, что записаны в EEPROM.""
Как считать и записать данные в EEPROM?
Аналогично, описанному в , методу бэкапа прошивки, используя ключ -U
. Только в данном случае после него будет указатель на то, что считывать нужно EEPROM.
Этой командой производится чтение данных EEPROM"а в файл "printer_eeprom.eep". В случае успеха, на экране вы увидите примерно следующее.avrdude.exe -p atmega2560 -c wiring -PCOM5 -b115200 -Ueeprom:r:"printer_eeprom".eep:i
Запись тоже не представляет из себя ничего сложного и выполняется аналогичной командой, которая отличается только тем, что в ключе -U
стоит не "r", а "w".
В случае успеха, на экране вы увидите примерно следующее сообщение.Как и зачем стирать EEPROM?avrdude.exe -p atmega2560 -c wiring -PCOM5 -b115200 -Ueeprom:w:"printer_eeprom".eep:i
Для начала,- "зачем это делать?". Стирать EEPROM нужно в том случае, если предыдущая прошивка тоже его использовала, и в памяти мог остаться мусор. Где-то я уже натыкался на людей с проблемами, что после перехода с одной прошивки на другую (с Marlin на Repitier ЕМНИП), у них принтер начинал вести себя, скажем так, "творчески". Это связанно с тем, что разные прошивки хранят свои данные под разными адресами. И при попытке читать данные из неверного адреса начинается свистопляска.
Затереть EEPROM можно только программно из прошивки, но для этого придётся - на время залить в контроллер специальный скетч. Подробно об этом можно прочитать в официальной документации по Arduino .
Если же стирается EEPROM не в Arduino плате, а в каком-то абстрактном контроллере, то код скетча нужно будет изменить с учётом размера EEPROM в конкретном контроллере на плате. Для этого нужно будет поменять условие окончания в цикле "For". Например, для ATmega328, у которой 1kb памяти EEPROM, цикл будет выглядеть так:
Вывод.
Я довольно долго распинался, а всё для чего? Для того, чтобы подвести к заключению о том, что при бэкапе прошивки, EEPROM тоже можно сохранить, но только в том случае если вам нужны сохранённые в нём настройки. Если же вы готовы ими пожертвовать, то забейте на это. Так же, если вы меняете одну прошивку на другую, или переходите с версии не версию, не поленитесь очистить EEPROM перед заливкой новой прошивки. Ну и заодно мы узнали много нового.
Наш контроллер печи почти готов – однако пока он остаётся контроллером-«золотой рыбкой», который помнит все настройки только пять минут до первого выключения питания. Чтобы запомнить наши настройки, значение заданной температуры и точки калибровки даже после отключения питания, нужно использовать энергонезависимую память – EEPROM.
Очень хорошо о работе с EEPROM написано у наших товарищей и .
Главное, что нам нужно знать – что память EEPROM лучше рассматривать не как «просто память», а как отдельное внутреннее устройство в микросхеме.
У EEPROM отдельное адресное пространство
, не имеющее никакого отношения к адресному пространству процессора (FLASH и SRAM); для того, чтобы получить доступ к данным по определённому адресу в энергонезависимой памяти, нужно выполнить определённую последовательность действий с использованием целого ряда регистров (регистров адреса EEARH и EEARL, регистра данных EEDR и регистра управления EECR).
Согласно даташиту, для записи байта по определённому адресу в EEPROM нужно выполнить следующее:
- ждём готовности EEPROM к записи данных (сброса бита EEPE регистра EECR);
- ждём окончания записи в FLASH-память (сброса бита SELFPRGEN регистра SPMCSR) – нужно выполнить, если в программе присутствует загрузчик;
- записываем новый адрес в регистр EEAR (при необходимости);
- записываем байт данных в регистр EEDR (при необходимости);
- устанавливаем в единицу бит EEMPE регистра EECR;
- в течение четырёх тактов после установки флага EEMPE записываем в бит EEPE регистра EECR логическую единицу.
После этого процессор пропускает 2 такта перед выполнением следующей инструкции.
Второй пункт нужно выполнять при наличии загрузчика в программе – дело в том, что запись в EEPROM не может выполняться одновременно с записью во FLASH-память, поэтому перед записью в EEPROM нужно убедиться, что программирование FLASH-памяти завершено; если же микроконтроллер не имеет загрузчика, то он никогда не изменяет содержимое FLASH-памяти (помним, что avr имеет гарвардскую архитектуру: память программ (FLASH) и память данных (SRAM) разделены).
Длительность цикла записи зависит от частоты внутреннего RC-генератора микросхемы, напряжения питания и температуры; обычно для моделей ATmega48x/88x/168x это составляет 3.4 мс (!), для некоторых старых моделей – 8.5 мс (!!!).
Кроме того, при записи в EEPROM могут возникнуть проблемы с вызовом прерываний в процессе выполнения последовательности действий выше – так что прерывания в процессе записи в EEPROM лучше запретить.
Чтение энергонезависимой памяти происходит чуть проще:
- ждём готовности EEPROM к чтению данных (сброса бита EEWE регистра EECR);
- записываем адрес в регистр EEAR;
- устанавливаем в единицу бит EERE регистра EECR;
- считываем данные из регистра EEDR (на самом деле, когда запрошенные данные будут перемещены в регистр данных, происходит аппаратный сброс бита EERE; но отслеживать состояние этого бита не требуется, так как операция чтения из EEPROM всегда выполняется за один такт).
После установки бита в EERE в единицу процессор пропускает 4 такта перед началом выполнения следующей инструкции.
Как мы видим, работа с энергонезависимой памятью – процесс времязатратный; если мы часто будем записывать-считывать данные с EEPROM – программа может начать тормозить.
Однако мы пишем программу в среде IAR, и нам повезло: всю работу с чтением-записью из EEPROM будет выполнять среда разработки – в iar есть модификатор «__eeprom», который создает переменные в энергонезависимой памяти – а далее нам нужно будет просто или считывать из «постоянных» переменных в «текущие» (при инициализации контроллера), или записывать из «текущих» переменных в «постоянные» – то есть, при изменении текущего значения нужно изменять и значение переменной в энергонезависимой памяти.
Выглядеть новые переменные будут вот так:
Eeprom uint16_t EEP_MinTemperature;
Ещё пару общих слов: и хотя указатели на eeprom-переменные у нас не предполагаются, нужно помнить, что eeprom – отдельное адресное пространство, и чтобы создать указатель на eeprom (и это позволяет нам сделать компилятор), необходимо указывать, что это указатель на адрес в eeprom:
Uint16_t __eeprom *EEP_MinTemperatureAdr;
Возвращаемся к контроллеру печки и EEPROM. В нашем случае, для EEPROM никакой виртуальной машины, конечно, не предполагается; более того, стоит подумать, нужна ли отдельная библиотека для работы с энергонезависимой памятью – уж больно «разбросаны» по программе записи важных настроек; если пытаться сделать отдельную библиотеку, то придётся делать перекрестные ссылки: в библиотеке для EEPROM подключать библиотеки АЦП, нагревательного элемента, глобальных настроек; а в этих библиотеках периферии подключать библиотеку EEPROM – такой подход не очень хорош.
Другой вариант – дописать в каждую библиотеку, где нужно сохранять настройки, eeprom-переменную, и сохранять соответствующие настройки прямо в виртуальных машинах. Мы реализуем этот вариант.
Сначала перечислим, какие переменные нам нужно сохранять в EEPROM:
- точки калибровки
- значения максимальной-минимальной задаваемой температуры и шага настройки температуры
- значение заданной температуры
- коэффициенты ПИД-регулятора
Значение кухонного таймера не сохраняем – будем считать, что пользователь после выключения питания должен сам каждый раз настраивать таймер печки.
Все эти настройки задаются пользователем посредством поворотов энкодера и дальнейшего краткого нажатия на пользовательскую кнопку. При этом помним, что количество циклов чтения-записи EEPROM все-таки ограничено, поэтому лишний раз одну и ту же информацию (например, если пользователь выбрал то же самое значение какой-то настройки, что и было) не перезаписывать. Поэтому перед каждым изменением __eeprom-переменной проверяем, а нужно ли её переписывать:
//если значение изменилось - перезаписываем в энергонезависимой памяти if (ADCTemperature.atMinTemperatureValue != (uint16_t)VMEncoderCounter.ecntValue) { ADCTemperature.atMinTemperatureValue = (uint16_t)VMEncoderCounter.ecntValue; EEP_MinTemperature = ADCTemperature.atMinTemperatureValue; }
С чтением настроек из EEPROM тоже все просто – при инициализации «текущих» настроек мы просто считываем значение из энергонезависимой памяти:
ADCTemperature.atMinTemperatureValue = EEP_MinTemperature;
Для того, чтобы наше устройство с самого начала имело какие-нибудь настройки в EEPROM, проект для первой загрузки можно скомпилировать с инициализацией этих переменных:
Eeprom uint16_t EEP_MinTemperature = 20; … //массив для хранения точек калибровки в энергонезависимой памяти __eeprom TCalibrationData EEP_CalibrationData = {{20, 1300}, {300, 4092}};
В этом случае компилятор инициализирует __eeprom переменные до начала работы с основной функцией. Чтобы получить файл с энергонезависимой памятью (.eep), нужно залезть в следующие настройки:
Project->Options..->Linker->Extra Options
Если галочка «Use command line options» не стоит, поставьте её и добавьте строку
-Ointel-standard,(XDATA)=.eep
Компилируем сначала проект с инициализированными переменными, сохраняем eep-файл отдельно; затем убираем инициализацию при создании переменных.
Вот и все – наша печка готова!
Arduino – это целое семейство различных устройств для создания электронных проектов. Микроконтроллеры очень удобны для использования, доступны к освоению даже новичку. Каждый микроконтроллер состоит из платы, программ для обеспечения работы, памяти. В этой статье будет рассмотрена энергонезависимая память, используемая в Arduino.
Описание памяти EEPROM
Ардуино предоставляет своим пользователям три типа встроенной памяти устройств: стационарное ОЗУ (оперативно-запоминающее устройство или SRAM - static random access memory) – необходимо для записи и хранения данных в процессе использования; флеш-карты – для сохранения уже записанных схем; – для хранения и последующего использования данных.
На ОЗУ все данные стираются, как только происходит перезагрузка устройства либо отключается питание. Вторые две сохраняют всю информацию до перезаписи и позволяют извлекать ее при необходимости. Флеш-накопители достаточно распространены в настоящее время. Подробнее стоит рассмотреть память EEPROM.
Аббревиатура расшифровывается, как Electrically Erasable Programmable Read-Only Memory и в переводе на русский дословно означает – электрически стираемая программируемая память только для чтения. Производитель гарантирует сохранность информации на несколько десятилетий вперед после последнего отключения питания (обычно приводят срок в 20 лет, зависит от скорости снижения заряда устройства).
При этом нужно знать, что возможность перезаписи на устройство ограничена и составляет не более 100 000 раз. Поэтому рекомендуют аккуратно и внимательно относиться к вносимым данным и не допускать перезаписи лишний раз.
Объем памяти, в сравнении с современными носителями, очень небольшой и разный для различных микроконтроллеров. Например, для:
- ATmega328 – 1кБ
- ATmega168 и ATmega8 – 512 байт,
- и 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 | позволяет использовать идентификатор "EEPROM" как массив, чтобы записывать данные в память и считывать их из памяти. |
Запись целых чисел
Запись целых чисел в энергонезависимую память EEPROM осуществить достаточно просто. Внесение чисел происходит с запуском функции EEPROM.write() . В скобках указываются необходимые данные. При этом числа от 0 до 255 и числа свыше 255 записываются по-разному. Первые вносятся просто – их объем занимает 1 байт, то есть одну ячейку. Для записи вторых необходимо использовать операторов highByte() высший байт и lowByte() низший байт.
Число делится на байты и записывается отдельно по ячейкам. Например, число 789 запишется в две ячейки: в первую пойдет множитель 3, а во вторую – недостающее значение. В итоге получается необходимое значение:
3 * 256 + 21 = 789
Для « воссоединения» большого целого числа применяется функция 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. Благодаря данные записываются в EEPROM и контролируется содержимое энергонезависимой памяти.
// проверка работы EEPROM
#include
Пример №2
Для большего понимания мы можем создать небольшой скетч, который поможет в понимании работы с энергонезависимой памятью. Считаем все ячейки этой памяти. Если ячейка не пустая - вывод в последовательный порт. После чего заполняем ячейки пробелами. Потом вводим текст через монитор последовательного порта. Его записываем в EEPROM, и при последующем включении считываем.
#include
Пример №3
Запись в память два целых числа, чтение их из EEPROM и вывод в последовательный порт. Числа от 0 до 255 занимают 1 байт памяти, с помощью функции EEPROM.write() записываются в нужную ячейку. Для чисел больше 255 их нужно делить на байты с помощью highByte() и lowByte() и записывать каждый байт в свою ячейку. Максимальное число при этом – 65536 (или 2 16).
#include
Пример №4
Запись чисел с плавающей запятой и строк - метод EEPROM.put() . Чтение – EEPROM.get() .
#include
Пример №5
Использование EEPROM как массива.
#include
Работа с EEPROM
Как упоминалось ранее, ресурс памяти EEPROM ограничен. Для продления срока службы энергонезависимой памяти, вместо функции write() запись, лучше применять функцию update обновление. При этом перезапись ведется только для тех ячеек, где значение отличается от вновь записываемого.
Еще одной полезной функцией рассматриваемой памяти микроконтроллера является возможность использования ячеек хранения байтов, как деталей целостного массива EEPROM. При любом формате использования необходимо постоянно осуществлять контроль целостности записанных данных.
Такая память на Ардуино стандартно хранит самое важное для работы контроллера и устройства. К примеру, если на такой базе создается регулятор температуры и исходные данные окажутся ошибочными, устройство будет работать «неадекватно» существующим условиям – сильно занижать или завышать температуру.
Существует несколько ситуаций, когда память EEPROM содержит неправильные данные:
- При первоначальной активации – еще не было ни одной записи.
- В момент неконтролируемого отключения питания – часть или все данные не запишутся или запишутся некорректно.
- После завершения возможных циклов перезаписи данных.
Чтобы избежать возникновения неприятных последствий, устройство можно запрограммировать на несколько вариантов действий: применить данные аварийного кода, отключить систему полностью, подать сигнал о неисправности, использовать заранее созданную копию или другие.
Для контроля целостности информации используют контрольный код системы. Он создается по образцу записи первоначальных данных и, при проверке, он вновь просчитывает данные. Если результат отличается – это ошибка. Самым распространенным вариантом такой проверки является контрольная сумма – выполняется обычная математическая операция по сложению всех значений ячеек.
Опытные программисты добавляют к этому коду дополнительное «исключающее ИЛИ», например, E5h. В случае если все значения равны нулю, а система по ошибке обнулила исходные данные – такая хитрость выявит ошибку.
Таковы основные принципы работы с энергонезависимой памятью EEPROM для микроконтроллеров Arduino. Для определенных проектов стоит использовать только этот вид памяти. Он имеет как свои плюсы, так и свои недостатки. Для освоения методов записи и чтения лучше начать с простых задач.
Все микроконтроллеры семейства Mega имеют в своем составе энергонезависимую память (EEPROM память). Объем этой памяти колеблется от 512 байт в моделях ATmega8x до 4 Кбайт в старших моделях. EEPROM память расположена в своем адресном пространстве и так же, как и ОЗУ, организована линейно. Для работы с EEPROM памятью используются три регистра ввода/вывода: регистр адреса, регистр данных и регистр управления.
Регистр адреса
Регистр адреса EEPROM
памяти EEAR (EEPROM Address Register)
физически размещается в двух РВВ EEARH:EEARL
, расположенных по
адресам $1F ($3F) и $1E ($3E) соответственно. В этот регистр загружается адрес ячейки, к которой будет производиться обращение. Регистр адреса доступен как для записи, так и для чтения. При этом в регистре EEARH
задействуются только младшие разряды (количество задействованных разрядов зависит от объема EEPROM
памяти). Незадействованные разряды регистра EEARH
доступны только для чтения и содержат «0».
Регистр данных
Регистр данных EEPROM памяти EEDR (EEPROM Data Register) расположен по адресу $1D ($3D). При записи в этот регистр загружаются данные, которые должны быть помещены в EEPROM , а при чтении в этот регистр помещаются данные, считанные из EEPROM .
Регистр управления
Регистр управления EEPROM
памяти EECR (EEPROM Control Register)
расположен по адресу $1C ($3C). Этот регистр используется для
управления доступом к EEPROM
памяти. Его описание показано ниже в таблице:
Разряд | Название | Описание |
7..4 | - | не используются, читаются как "0" |
3 | EERIE | Разрешение прерывания от EEPROM. Этот разряд управляет генерацией прерывания, возникающего при завершении цикла записи в EEPROM. Если этот разряд установлен в «1», прерывания разрешены (если флаг I регистра SREG также установлен в «1»). При сброшенном разряде EEWE (см. далее в таблице) прерывание генерируется постоянно |
2 | EEMWE | Управление разрешением записи в EEPROM. Состояние этого разряда определяет функционирование флага разрешения записи EEWE. Если данный разряд установлен в «1», то при записи в разряд EEWE «1» происходит запись данных в EEPROM. В противном случае установка EEWE в «1» не производит никакого эффекта. После программной установки разряд EEMWE сбрасывается аппаратно через 4 машинных цикла |
1 | EEWE | Разрешение записи в EEPROM. При установке этого разряда в «1» происходит запись данных в EEPROM (если EEMWE равен «1») |
0 | EERE | Разрешение чтения из EEPROM. После установки этого разряда в «1» выполняется чтение данных из EEPROM. По окончании чтения этот разряд сбрасывается аппаратно |
Для записи одного байта в EEPROM необходимо:
1. Дождаться готовности EEPROM к записи данных (ждать пока не сбросится флаг EEWE регистра EECR).
2. Дождаться завершения записи во FLASH память программ (ждать пока не сбросится флаг SPMEN регистра SPMCR).
3. Загрузить байт данных в регистр EEDR, а требуемый адрес - в регистр EEAR (при необходимости).
4. Установить в «1» флаг EEMWE регистра EECR.
5. Записать в разряд EEWE регистра EECR лог. «1» в течение 4-х машинных циклов. После установки этого разряда процессор
пропускает 2 машинных цикла перед выполнением следующей инструкции.
Для чтения одного байта из EEPROM необходимо:
1. Проконтролировать состояние флага EEWE. Дело в том, что пока выполняется операция записи в EEPROM память (флаг EEWE установлен), нельзя выполнять ни чтения EEPROM памяти, ни изменения регистра адреса.
2. Загрузить требуемый адрес в регистр EEAR.
3. Установить в «1» разряд EERE регистра EECR.
Когда запрошенные данные будут помещены в регистр данных EEDR, произойдет аппаратный сброс этого разряда. Однако следить за состоянием разряда EERE для определения момента завершения операции чтения не требуется, т. к. операция чтения из EEPROM всегда выполняется за один машинный цикл. Кроме того, после установки разряда EERE в «1» процессор пропускает 4 машинных цикла перед началом выполнения следующей инструкции.
В среде AVR Studio GCC есть стандартная библиотека для работы с EEPROM которая включается подключением файла
Для начала подключаем необходимые для работы библиотеки, в том числе EEPROM. Определяем переменные. Переменная "s" хранит значение для вывода на индикатор, при нажатии на кнопку SB1 это значение увеличивается на единицу, но не больше 10. Переменная eeprom_var будет взаимодействовать с EEPROM. При включении питания читается EEPROM, считанные данные присваиваются переменной "s", исходя из этого на индикатор выводится определенная цифра. При нажатии на SB2 данные из переменной "s" записываютя в EEPROM, при этом индикатор мигнет один раз.
#include
Комментарии
0 AntonChip 02.05.2013 22:15
Цитирую Макс:
Может я что-то путаю,но если у Вас индикатор с ОА, то достаточно одного резистора на линии 5в.Зачем ставить токоограничительные резисторы после элемента, который они должны защищать от большого тока??
Просто представь, что будет если замкнет один сегмент индикатора при такой и при другой схеме подключения резистора.
0 AntonChip 15.05.2013 11:16
Цитирую gydok:
А как записать в eeprom двумерный массив?
Код:
#include
EEMEM unsigned char colors={{1, 2, 3}, // Объявляем массив в EEPROM
{4, 5, 6}};
eeprom_write_byte(&colors, 1); // Запись элементов массива в EEPROM
eeprom_write_byte(&colors, 2);
eeprom_write_byte(&colors, 3);
eeprom_write_byte(&colors, 4);
eeprom_write_byte(&colors, 5);
eeprom_write_byte(&colors, 6);
unsigned char temp;
temp = eeprom_read_byte(&colors); // Извлекаем из EEPROM элемент массива, 2 строка(), 1 столбец(), т.е. цифру 4
Обнуление памяти EEPROM
Пример циклом проходим по всем ячейкам памяти, и записывает в них нули.
// Подключение библиотеки для работы с EEPROM. #include "EEPROM.h" void setup() { // Проход всех ячеек(байтов) и запись в них нулей. for (int i = 0; i < EEPROM.length(); i++) EEPROM.update(i, 0); } void loop() { // Пустой цикл... }
Откат к заводским настройкам
Если вы хотите вернуть память к заводским настройкам необходимо заменить 0 на 255, т.е. записать не нули, а число 255. Таким образом, в дальнейшем при помощи функции isNaN() возможно проверить была ли произведена запись в память EEPROM или нет.
// Подключение библиотеки для работы с EEPROM. #include "EEPROM.h" void setup() { // Проход всех ячеек(байтов) и запись в них чисел 255. for (int i = 0; i < EEPROM.length(); i++) EEPROM.update(i, 255); } void loop() { // Пустой цикл... }
Расскажи о нас
Сообщение
Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в