Введение
Доброго времени суток. Прошлая моя статья про параметры в EEPROM была, мягко говоря, немного недопонята. Видимо, я как-то криво описал цель и задачу которая решалась. Постараюсь в этот раз исправиться, описать более подробно суть решаемой проблемы и в этот раз расширим границы задачи.
А именно поговорим о том, как хранить параметры, которые необходимо писать в EEPROM постоянно.
Многим может показаться, что это очень специфическая проблема, но на самом деле множество устройств именно этим и занимаются — постоянно пишут в EEPROM. Счетчик воды, тепловычислитель, одометр, всяческие журналы действий пользователя и журналы, хранящие историю измерений, да просто любое устройство, которое хранит время своей работы.
Особенность таких параметров заключается в том, что их нельзя писать просто так в одно и то же место EEPROM, вы просто израсходуете все циклы записи EEPROM. Например, если, необходимо писать время работы один раз в 1 минуту, то нетрудно посчитать, что с EEPROM в 1 000 000 циклов записей, вы загубите его меньше чем за 2 года. А что такое 2 года, если обычное измерительное устройство имеет время поверки 3 и даже 5 лет.
Кроме того, не все EEPROM имеют 1 000 000 циклов записей, многие дешевые EEPROM все еще производятся по старым технологиям с количеством записей 100 000. А если учесть, что 1 000 000 циклов указывается только при идеальных условиях, а скажем при высоких температурах это число может снизиться вдвое, то ваша EEPROM способно оказаться самым ненадежным элементом уже в первый год работы устройства.
Поэтому давайте попробуем решить эту проблему, и сделать так, чтобы обращение к параметрам было столь же простым как в прошлой статье, но при этом EEPROM хватало бы на 30 лет, ну или на 100 (чисто теоретически).
Итак, в прошлой статье, я с трудом показал, как сделать, так, чтобы с параметрами в EEPROM можно было работать интуитивно понятно, не задумываясь, где они лежат и как осуществляется доступ к ним
Напомню:
Для начала проясню, для чего вообще нужно обращаться по отдельности к каждому параметру, этот момент был упущен в прошлой статье. Спасибо товарищам @Andy_Big и @HiSER за замечания.
Все очень просто, существует огромный пласт измерительных устройств, которые используют полевые протоколы такие как HART, FF или PF, где пользовательские команды очень атомарные. Например, в HART протоколе есть отдельные команды — запись единиц изменения, запись верхнего диапазона, запись времени демпфирования, калибровка нуля, запись адрес опроса и т.д. Каждая такая команда должна записать один параметр, при этом успеть подготовить ответ и ответить. Таких параметров может быть до 500 — 600, а в небольших устройствах их около 200.
Если использовать способ, который пользователь @HiSER- это будет означать, что для перезаписи одного параметра размером в 1 byte, я должен буду переписать всю EEPROM. А если алгоритм контроля целостности подразумевает хранение копии параметров, то для 200 параметров со средней длиной в 4 байта, мне нужно будет переписать 1600 байт EEPROM, а если параметров 500, то и все 4000.
Малопотребляющие устройства или устройства, питающиеся от от токовой петли 4-20мА должны потреблять, ну скажем 3 мА, и при этом они должны иметь еще достаточно энергии для питания модема полевого интерфейса, графического индикатора, да еще и BLE в придачу. Запись в EEPROM очень энергозатратная операция. В таких устройствах писать нужно мало и быстро, чтобы средний ток потребления был не высоким.
Очевидно, что необходимо, сделать так, чтобы микроконтроллер ел как можно меньше. Самый простой способ, это уменьшить частоту тактирования, скажем до 500 КГц, или 1 Мгц (Сразу оговорюсь, в надежных применениях использование режима низкого потребления запрещено, поэтому микроконтроллер все время должен работать на одной частоте). На такой частоте, простая передача 4000 байт по SPI займет около 70 мс, прибавим к этому задержку на сохранение данных в страницу (в среднем 7мс на страницу), обратное вычитывание, и вообще обработку запроса микроконтроллером и получим около 3 секунд, на то, чтобы записать один параметр.
Поэтому в таких устройствах лучше чтобы доступ к каждому параметру был отдельным, и обращение к ним должно быть индивидуальным. Их можно группировать в структуру по смыслу, или командам пользователя, но лучше, чтобы все они не занимали больше одной страницы, а их адреса были выравнены по границам страницы.
Но вернемся к нашей основной проблеме — мы хотим постоянно писать параметры.
Серия DataFlash AT45
AT45 идеально подходят для хранения памяти программ, данных и для замены последовательных EEPROM (рис. 3). DataFlash AT45 поделена на страницы, блоки и сектора, что позволяет оптимизировать процесс стирания и защиты данных. Запись и чтение данных производится через два буфера SRAM, за счет которых ускоряется процесс обмена данными и обеспечивается возможность выполнения механизма «чтение–модификация–запись». Благодаря этому механизму данные во Flash, с точки зрения внешнего устройства, можно изменять побайтно (функция эмуляции EEPROM).
Рис. 3. Блок-схема AT45
С 1997 года было выпущено несколько ревизий микросхем с измененными характеристиками, буквенное обозначение ревизии (А, В, С, D) указывается в конце наименования микросхемы. В последней ревизии «D» предусмотрен 128-байтный регистр для хранения служебной информации. Этот регистр включает уникальное 64-байтное число для каждой микросхемы (Device ID) и 64 байта однократно программируемой памяти (ОТР) для записи информации пользователя. Улучшенная защита секторов памяти микросхемы позволяет защищать каждый сектор отдельно.
Благодаря функции lockdown, запрещающей модификацию любого набора секторов (ячейки памяти становятся в дальнейшем доступны только для чтения), разработчик может заблокировать изменение определенной области памяти, например, кода загрузчика, и больше не беспокоиться о случайных нарушениях кода.
К концу 2007 года планируется все микросхемы серии АТ45 выпускать серийно в ревизии «D», а предыдущие версии будут постепенно сниматься с производства. Микросхемы серии АТ45 обеспечивают не менее 100 000 циклов перезаписи на страницу (начиная с ревизии «С»).
Микросхемы DataFlash выпускаются с диапазоном питающих напряжений 2,7–3,6 В (5-вольтовые микросхемы сняты с производства в 2000 году). На данный момент микросхемы выпускаются в различных корпусных исполнениях (рис. 4). При разработке новых проектов следует учитывать, что производитель планирует в ближайшем будущем снять с производства корпуса с большим количеством выводов (SOIC28, TSOP, CBGA) и свести весь ассортимент корпусов микросхем к двум видам — широкий (209 ml) или узкий (150 ml) 8-выводный SOIC (выводы наружу), и 8-выводный MLF (6×8 мм) или CASON (6×5 мм) (выводы под корпусом). В «широком» SOIC будут выпускаться микросхемы емкостью от 1 до 128 Мбит, а в «узком» SOIC — микросхемы емкостью от 1 до 32 Мбит, что позволит в случае необходимости легко заменить в текущем проекте имеющуюся микросхему на микросхему с другим объемом памяти, не меняя разводку на плате. Причем «узкий» SOIC и MLF, а также «широкий» SOIC и CASON совместимы по геометрическому расположению выводов, то есть одну микросхему можно поменять на другую без изменения разводки на плате.
Рис. 4. Корпуса микросхем DataFlash
Параметры микросхем DataFlash сведены в таблице 1. Сегодня серийно выпускаются микросхемы емкостью от 1 до 64 Мбит. Микросхема емкостью 128 Мбит была в планах Atmel, но сроки ее выпуска отодвинуты на неопределенный срок.
Таблица 1. Параметры серии AT45 DataFlash
Микросхемы DataFlash также выпускаются в виде карточек формата MultiMediaCards (MMC) емкостью 2–8 Мбит, что позволяет использовать combo-SD/MMC-разъемы (рис. 5). Карточки в таком формате удобно использовать для переноса информации.
Рис. 5. Микросхемы AT45 DataFlash в формате карточек MMC
В помощь разработчикам для программирования микросхем DataFlash поставляется программный комплект DataFlash Software Suite (DFSS, разработка компании HCC Embedded). Комплект распространяется свободно для покупателей микросхем памяти Atmel. Для получения DFSS необходимо подписать лицензионное соглашение, бланк которого можно получить у дистрибьюторов Atmel. После одобрения соглашения Atmel высылает по электронной почте DFSS конечному клиенту.
В комплект DFSS входят:
- базовые драйверы для всех функций DataFlash;
- функции организации файловой системы FAT12/FAT16;
- функции детектирования и коррекции ошибок;
- функции обеспечения равномерного «износа» ячеек памяти и автоматической перезаписи страниц;
- сжатие и распаковка данных.
Помимо этого бесплатного ПО также предлагаются программные продукты фирмы HCC-Embedded, информацию о которых можно посмотреть на web-сайте www.hcc-embedded.com.
Запись целых чисел
Запись целых чисел в энергонезависимую память 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, что значит «отсутствует числовое значение». Это говорит о том, что записанная в ячейку информация не может быть воспроизведена, как число с плавающей точкой. Такой ситуации не возникнет, если достоверно знать, в какой ячейке какой тип информации записан.
Команды библиотеки EEPROM.h Arduino
EEPROM.read(address) Считывает один байт из EEPROM Arduino по адресу address |
|
EEPROM.write(address, value) Записывает один байт со значением value в EEPROM по адресу address |
|
EEPROM.update(address, value) Аналог функции write(), но новые данные в ячейку записываются только тогда, когда они отличаются от уже записанного. Использование данной функции позволяет продлить жизнь памяти EEPROM. |
|
EEPROM.get(address, data) Считывает из EEPROM Arduino любой тип данных по адресу address. При этом данные (data) могут быть любого типа, например, int или float. |
|
EEPROM.put(address, data) Записывает в EEPROM Arduino любой тип данных по адресу address. Функция записывает в ячейку только отличающиеся данные. |
|
EEPROM[address] Позволяет обращаться с байтами EEPROM Arduino как с массивом. Байты можно считывать и записывать. |
Интересные факты
- Подавляющее большинство микросхем имеют маркировку на своём полупроводниковом чипе: название микросхемы, иногда дату копирайта, выполненные металлическими дорожками по той же технологии, по которой выполняется топология микросхемы. У большинства чипов после заливки в пластиковый корпус прочитать маркировку становится нельзя, но микросхемы EPROM относятся к тому редкому исключению, у которых это возможно. Поскольку для чтения имени чипа нужен мощный оптический микроскоп, обычно дающий перевернутое изображение, обычной практикой бывает нанесение имени чипа в перевернутом, «зеркальном» варианте, тогда в микроскоп надпись читается в нормальном виде.
- Первые советские микросхемы EPROM на практике имели ресурс всего 2-3 стирания и были очень чувствительны к передозировке экспозиции.
Проект с использованием EEPROM
Теперь создадим проект, который будет записывать температурные данные от термистора в EEPROM. Термистор — это резистор, который изменяет сопротивление с температурой.
Дополнительную информацию о термисторах вы можете прочитать в Википедии.
Компоненты
Для создания нашего проекта мы будем использовать:
- Arduino Uno
- Термистор 10 кОм
- 24LC256 EEPROM чип
- Резисторы
- Перемычки
- Макет
Не забываем, что у нас должна быть установлена среда разработки Ардуино — IDE Arduino.
Комплектующие соединяем согласно схеме ниже:
Настройка адреса
Если вы собираетесь подключить более одного 24LC256 EEPROM к микроконтроллеру, вам нужно будет изменить адреса каждого из них, сделав контакты с 1 по 3 высокими или низкими.
Поскольку имеется три (3) адресные линии, то может быть 8 устройств EEPROM (23 = 8). Но у каждого должен быть уникальный адрес. Если вы используете только один, заземлите все 3 контакта, и вы получите адрес 0x50.
Вывод Write-Protect, пин 7, обычно высокий (HIGH), но оставьте его низким (LOW).
Подключите соединение термистора и резистора 10 кОм к A0
Обратите внимание, что параметры уравнения Стейнхарта зависят от конкретного типа используемого термистора. Если у вас другой тип, результаты могут отличаться, но вы можете вычислить параметры на этой странице
Скетч
Теперь, с помощью Arduino IDE вы можете загрузить в Ардуино Уно следующий код:
После считывания температуры T мы сохраняем ее в EEPROM и затем читаем обратно. В районе строку 50, мы конвертируем значение с плавающей точкой T в символьную строку c-типа и добавляем ее в нашу строку .
Затем мы пишем и читаем ее обратно из EEPROM. Это делается с помощью «движка» программы и , где строка записывается и читается побайтово.
Таким образом, вы можете использовать функции для чтения/записи отдельных байтов или символов или через цикл или длинную строку.
Обратите внимание, что вы не должны использовать строки длиннее 32 байт. Для вашего удобства я также включил в скетч (закомментировал), как читать/писать целые числа в конце
Целое число занимает 2 байта, поэтому вам нужно разделить его на 2 байта, чтобы сохранить, а затем при чтении соединить снова с помощью .
2Софт для работы с программатором CH341A
Программатор CH341A поставляется с программой, которая, к сожалению, давно прекратила своё развитие. Последняя версия программы 1.30 датируется 2009 годом. Программа имеет предельно простой и интуитивно понятный интерфейс, который мы подробней рассмотрим чуть далее.
Программное обеспечение программатора CH341A
Также существует альтернативное программное обеспечение (например, Программатор SPI, I2C, Microwire FLASH/EEPROM v1.4.0), которое, к сожалению, также не отличается дружелюбным интерфейсом и на сегодняшний день более не поддерживается.
Однако, со своей основной задачей программатор вполне успешно справляется даже со штатным программным обеспечением. В чём мы сейчас и убедимся.
Бесконтактные микросхемы памяти
Компания STMicroelectronics является одним из лидеров по производству микросхем памяти типа EEPROM, включая стандартные блоки памяти с плотностью до 1 Мбит и специализированных микросхем памяти. Бесконтактные микросхемы памяти являются специфическим продуктом. По классификации их с одной стороны можно отнести к специализированным EEPROM, а с другой стороны они все более и более выступают как самостоятельный вид памяти, получающий в последнее время очень широкое применение в разных сферах. Компания ST участвовала в разработке нового стандарта ISO для бесконтактной коммуникационной памяти — ISO 14443 тип В (реализован в микроконтроллерных устройствах на Смарт-картах на транспорте и во многих других приложениях), а также ISO 15693 и ISO 18000.
В настоящее время ST предлагает новую серию микросхем бесконтактной памяти и бесконтактных микросхем связи с радиочастотным интерфейсом для приложений типа меток, радиочастотной идентификации (RFID) и бесконтактных систем доступа с использованием специализированных микросхем памяти (Таблица 8).
Таблица 8. Бесконтактные микросхемы памяти
Тип | Объем | Интерфейс | Рабочее расстояние | Корпус | Дополнительные возможности | Применения |
SR176 | 176 б | ISO 14443 — 2 и тип B | 0-20 см | Плоский Wafer* | 64-бит для идентификации | Одноразовая недорогая метка |
LRI512 | 512 б | Полный ISO 15693 | 0-100 см | Плоский Wafer* | 64-бит для идентификации, 512 бит пользовательской EEPROM с блокировкой данных | RFID, метки |
SRIX4K | 4 кб | ISO14443-2 и 3 тип B | 0-20 см | Плоский Wafer* | 64-бит для идентификации, функция антиклонирования, пересчетное устройство с защитой записи | Многоразовая метка с защитой от клонирования |
CRX14 | ISO 14443 | 0-10 см | S016N | Механизм связи чипа с CRC, SRC, I2C | Недорогой считыватель для встроенных приложений | |
M35102 | 2 кб | ISO 14443-2 тип B | 0-20 см | Плоский Wafer* | 64-бит идентификационная последовательность, 192-бит блокируемой области для однократной записи | Метки, RFID, память |
* Специальные корпуса, соединенные с антенной в виде полосковой линии, поставляемые партнерами ST.
Возможности SRIX4K:
- 4096 пользовательских битов E2PROM с OTP, двоичный счетчик и защита записи
- Стандарт ISO 14443 — 2 и 3 типа B
- Патентованная компанией France Telecom функция антиклонирования
- 13,56 MГц несущая частота, 847 кГц поднесущая частота и 106 кбит/с передача данных
- Внутренняя подстроечная емкость
- Модуляция данных с использованием амплитудной модуляции (ASK) при передачи с считывателя на карту и двоичная фазовая модуляция (BPSK) для передачи с карты на считыватель.
Возможности LRI512:
- 512 бит с блокировкой на уровне блока данных
- Полное соответствие стандарту ISO 15693
- E.A.S. (Электронный надзор за продуктом)
- 13,56 MГц несущая частота, 1/4 и 1/256 импульсное кодирование использующее высокую и низкую скорость передачи данных на одной или двух поднесущих частотах.
- Модуляция данных с использованием амплитудной модуляции при передаче со считывателя на карту и манчестерского кодирования при передаче с карты на считыватель
- Внутренняя подстроечная емкость
Возможности CRX14:
- Встроенный в чип механизм радиосвязи
- Протокол и модуляция согласно стандарта ISO 14443 типа B (радиоинтерфейс)
- Патентованная France Telecom функция антиклонирования
- Последовательный доступ к базе на частоте 400 кГц по двухпроводной последовательной шине I2C
- По одной последовательной шине I2C можно соединяться с восемью CRX14
- Буфер 32 байта для входного и выходного пакета
- Встроенный вычислитель циклического избыточного кода (CRC calculator)
- Корпус S016 Narrow (сжатый)
Возможности SR176:
- 176 пользовательских битов E2PROM с программируемой защитой записи
- Стандарт ISO 14443 — 2 и 3 типа B
- 13,56 MГц несущая частота, 847 кГц поднесущая частота и 106 кбит/с скорость передачи данных
- Внутренняя подстроечная емкость
- Модуляция данных с использованием амплитудной модуляции при передаче с считывателя на карту и двоичная фазовая модуляция при передаче с карты на считыватель
Возможности с M35101/102:
- 2 кбит EEPROM с защитой записи
- Соответствие стандарту ISO 14443-2 типа B
- 13,56 MГц несущая частота, 847 кГц поднесущая частота и скорость передачи данных 106 кбит/с
- Модуляция данных с использованием амплитудной модуляции при передаче с считывателя на карту и двоичной фазовой модуляции при передаче с карты на считыватель
- Внутренняя подстроечная емкость.
В последующих статьях мы планируем осветить и другие виды микросхем памяти производимых компанией STMicroelectronics.
Результат
Собственно все, теперь мы можем регистрировать в списке любые параметры:
Замечу, что пользователю параметров нужно только объявить параметр и список, а вся портянка с кодом, до этого, пишется один раз. Используются параметры точно также как и .
Что произойдет в этом примере, когда мы будем писать 10,11,12…15 в наш параметр. Каждый раз при записи, адрес параметра будет смещаться на размер параметра + размер индекса + размер копии параметра и индекса. Как только количество записей превысит максимальное количество, параметр начнет писаться с начального адреса.
На картинке снизу как раз видно, что число 15 с индексом 5 записалось с начального адреса, а 10 теперь нет вообще.
В данном случае после сброса питания, при инициализации, будет найдена запись с индексом 5 и значением 15 и это значение и индекс будут записаны в кэшируемую копию нашего параметра.
Вот и все, надеюсь в этой статье цель получилось пояснить более детально, спасибо за то, что прочитали до конца.
3Запись целых чисел в EEPROM
Давайте запишем в память EEPROM два целых числа, а затем прочитаем их из EEPROM и выведем в последовательный порт.
С числами от 0 до 255 проблем нет, они занимают как раз 1 байт памяти и с помощью функции EEPROM.write() записываются в нужную ячейку.
Если число больше, чем 255, то с помощью операторов highByte() и lowByte() его нужно делить на байты и записывать каждый байт в свою ячейку. Максимальное число при этом – 65536 (или 216).
#include <EEPROM.h> // подключаем библиотеку EEPROM void setup() { int smallNum = 123; // целое число от 0 до 255 EEPROM.write(0, smallNum); // запись числа в ячейку 0 int bigNum = 789; // число > 255 разбиваем на 2 байта (макс. 65536) byte hi = highByte(bigNum); // старший байт byte low = lowByte(bigNum); // младший байт EEPROM.write(1, hi); // записываем в ячейку 1 старший байт EEPROM.write(2, low); // записываем в ячейку 2 младший байт Serial.begin(9600); // инициализация послед. порта } void loop() { for (int addr=0; addr} delay(60000); // задержка 1 мин }
Смотрите, монитор последовательного порта в ячейку 0 просто выводит число, меньшее, чем 255. В ячейках 1 и 2 хранится большое число 789. При этом ячейка 1 хранит множитель переполнения 3, а ячейка 2 – недостающее число 21 (т.е. 789 = 3×256 + 21).
Запись целых чисел в EEPROM Arduino
Чтобы заново «собрать» большое число, разобранное на байты, есть функция word(): int val = word(hi, low), где «hi» и «low» – это значения старшего и младшего байтов числа «val».
Во всех остальных ячейках, которые не были нами ни разу записаны, хранятся числа 255.
Применение
Программируемые через маску ПЗУ при больших партиях выпуска (тысячи штук и более) имеют довольно низкую стоимость производства. Однако, чтобы их сделать, требуется несколько недель времени, так как нужно выполнить сложные работы для рисования маски каждого слоя интегральной схемы. Первоначально предполагалось, что EPROM будет стоить слишком дорого для массового производства и использования, поэтому планировалось ограничиться выпуском только опытных образцов. Вскоре выяснилось, что небольшие объёмы производства EPROM экономически целесообразны, особенно, когда требуется быстрое обновление прошивки.
Некоторые микроконтроллеры ещё до эпохи EEPROM и флэш-памяти использовали встроенную на чипе память EPROM для хранения своей программы. К таким микроконтроллерам относятся некоторые версии Intel 8048, Freescale 68HC11 и версии «С» микроконтроллеров PIC. Подобно чипам EPROM, такие микроконтроллеры перешли на оконную (дорогую) версию, что было полезно для отладки и разработки программ. Вскоре эти чипы стали делать по технологии PROM с непрозрачным корпусом (что несколько снизило стоимость его производства). Освещение матрицы памяти такого чипа светом могло также изменить его поведение непредсказуемым образом, когда производство переходило с изготовления оконного варианта на безоконный.
EEPROM. Avrdude. Снова про работу с контроллерами
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых постах.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Что такое EEPROM и зачем вести о нём речь?
EEPROM – (Electrically Erasable Programmable Read-Only Memory) область энергонезависимой памяти микроконтроллера, в которую можно записать и прочитать информацию. Зачастую его используют для того, чтобы хранить настройки программы, которые могут меняться в процессе эксплуатации, и которые необходимо хранить при отключенном питании.
Как 3D принтер использует EEPROM?
Рассмотрим на примере Marlin’а. В Marlin Firmware ‘из коробки’ EEPROM не используется. Параметры конфигуратора (Configuration.h), которые включают возможность его использования, по умолчанию, закомментированы.
Если включено использование EEPROM, то принтер может хранить и использовать следующие настройки (подсмотрено у буржуев):
- Количество шагов на миллиметр
- Максимальная/минимальная скорость подачи [мм/с]
- Максимальное ускорение [мм/с^2]
- Ускорение
- Ускорение при ретракте
- Настройки PID
- Отступ домашней позиции
- Минимальная скорость подачи во время перемещения [мм/с]
- Минимальное время участка
- Максимальный скачок скорости по осям X-Y [мм/с]
- Максимальный скачок скорости по оси Z [мм/с]
Редактировать эти настройки можно, используя экран принтера и органы управления. При включенном использовании EEPROM, в меню должны отображаться пункты:
- Store memory
- Load memory
- Restore Failsafe
Так же, можно использовать GCode для работы напрямую (через Pronterface).
- M500 Сохраняет текущие настройки в EEPROM до следующего запуска или выполнения команды M501.
- M501 Читает настройки из EEPROM.
- M502 Сбрасывает настройки на значения по-умолчанию, прописанные в Configurations.h. Если выполнить после неё M500, в EEPROM будут занесены значения по-умолчанию.
- M503 Выводит текущие настройки – ”Те, что записаны в EEPROM.”
О EEPROM в Repitier firmware можно почитать здесь.
Как считать и записать данные в EEPROM?
Аналогично, описанному в статье про бэкап, методу бэкапа прошивки, используя ключ -U. Только в данном случае после него будет указатель на то, что считывать нужно EEPROM.
Как и зачем стирать EEPROM?
Для начала,- ‘зачем это делать?’. Стирать EEPROM нужно в том случае, если предыдущая прошивка тоже его использовала, и в памяти мог остаться мусор. Где-то я уже натыкался на людей с проблемами, что после перехода с одной прошивки на другую (с Marlin на Repitier ЕМНИП), у них принтер начинал вести себя, скажем так, ‘творчески’. Это связанно с тем, что разные прошивки хранят свои данные под разными адресами. И при попытке читать данные из неверного адреса начинается свистопляска.
Затереть EEPROM можно только программно из прошивки, но для этого придётся – на время залить в контроллер специальный скетч. Подробно об этом можно прочитать в официальной документации по Arduino.
Если же стирается EEPROM не в Arduino плате, а в каком-то абстрактном контроллере, то код скетча нужно будет изменить с учётом размера EEPROM в конкретном контроллере на плате. Для этого нужно будет поменять условие окончания в цикле ‘For’. Например, для ATmega328, у которой 1kb памяти EEPROM, цикл будет выглядеть так:
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых постах.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Библиотека
Работа с памятью 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» как массив, чтобы записывать данные в память и считывать их из памяти. |
Arduino EEPROM примеры использования
Для начала рассмотрим запись в EEPROM Arduino числа больше, чем 255, например число 999. При записи в EEPROM число 999 будет разбиваться на множитель (старший байт) и недостающее число (младший байт), занимая при этом уже две ячейки в энергонезависимой памяти (т.е. 999 = 3×256 + 231). Чтобы вывести сохраненное число на монитор порта, его нужно будет «собрать» с помощью функции .
Скетч. Запись в память EEPROM int, float
#include <EEPROM.h> // импортируем библиотеку int num = 999; // разбиваем число на 2 байта byte hi = highByte(num); // старший байт byte low = lowByte(num); // младший байт void setup() { Serial.begin(9600); // запускаем монитор порта EEPROM.update(1, hi); // записываем старший байт в ячейку 1 EEPROM.update(2, low); // записываем младший байт в ячейку 2 delay(1000); byte val1 = EEPROM.read(1); // считываем 1 байт по адресу ячейки byte val2 = EEPROM.read(2); // считываем 1 байт по адресу ячейки Serial.println("highByte - "+String(val1)); // выводим старший байт на монитор Serial.println("lowByte - "+String(val2)); // выводим младший байт на монитор int NUM = word(hi, low); // "собираем" число из байтов Serial.println("int num - "+String(NUM)); // выводим полученное число } void loop() { }
Пояснения к коду:
- для записи данных в ячейку в программе использована функция , которая перезаписывает ячейку только в случае различия сохраняемых данных с данными в ячейке EEPROM Arduino Uno;
- основная проблема с сохранением больших чисел (int, float) в память EEPROM заключается в том, чтобы случайно не перезаписать нужную ячейку новой информацией. Для этого нужно учитывать размер сохраняемых данных в ПЗУ, используя функции и .
Скетч. Запись строк в EEPROM (String)
#include <EEPROM.h> // импортируем библиотеку int address = 10; // адрес первой ячейки для записи long cod = 8904; // разбиваем телефонный номер на две части long tel = 2768282; String email = ""; // сохраняем в строке адрес почты long COD; // создаём новые переменные для чистоты эксперимента long TEL; String EMAIL; void setup() { Serial.begin(9600); // запускаем монитор порта EEPROM.put(address, cod); // сохраняем код телефона в памяти Ардуино address += sizeof(cod); // узнаем адрес следующей свободной ячейки EEPROM.put(address, tel); // сохраняем номер телефона в памяти Ардуино address += sizeof(tel); // узнаем адрес следующей свободной ячейки EEPROM.put(address, email); // сохраняем электронную почту в памяти address = 10; // адрес первой ячейки для чтения Serial.print("Phone: "); // выводим телефонный номер на монитор Serial.print(EEPROM.get(address, COD)); address += sizeof(COD); Serial.println(EEPROM.get(address, TEL)); address += sizeof(TEL); Serial.print("Email: "); // выводим электронную почту на монитор Serial.println(EEPROM.get(address, EMAIL)); } void loop() { }
Пояснения к коду:
- перед сохранением новых данных в памяти, следует узнать размер данных, которые были сохранены, чтобы начать запись в новой ячейке;
- удалив из кода строчки для записи данных, вы можете каждый раз при запуске программы считывать все сохраненные данные из ПЗУ Ардуино.