Что такое eeprom в автомобиле?

Что такое eeprom в автомобиле?

Современные автомобили всё больше и больше становятся похожими на средний по размерам офис на колесах, со своими кабинетами, ответственными за определённую задачу и объединенных локальной сетью для координации работы. Задачи, возложенные производителем на электронные блоки управления, становятся сложнее. Требования к скорости и стабильности работы возрастают, что в свою очередь ведёт к усложнению схемотехники, применению более современных компонентов. Программное обеспечение претерпело большие изменения. Если раньше блок обслуживал одну систему, то теперь, в современном автомобиле, практически каждый блок объединен с остальными в одну или несколько сетей, связанных межсетевым шлюзом, и обрабатывает данные не только от своих датчиков, но и те, которые получает по сети от других блоков, с которыми он связан для более гибкого решения определённой задачи.
Усложнение элементарной базы и конструкции электронных блоков, так или иначе, сказывается на надёжности их работы. Причём заметно растёт число отказов, относящихся к «программным сбоям». Этому только способствует «наш менталитет» эксплуатации, «прикурка от пускозарядного», незатянутые клеммы АКБ, плавная посадка АКБ, попытки запустить авто с разряженной батареей и т.д.
Если на автомобилях начала 90-х, в большинстве случаев, это всё сходило владельцам с рук, то современный автомобиль может и не простить таких издевательств…
Мой наставник однажды выразился так – «Современный автомобиль сродни живому существу – сердце, запущенное однажды на заводе, при полном отключении, снова может и не заработать».
Откуда же такие проблемы?
Вот мои личные соображения и анализ информации найденной в сети.
На истину ни в коем случае не претендую..
Схемотехника блоков управления 90-х годов предусматривала хранение программы блока в ультрафиолетово-стираемых ПЗУ или масочном РОМ микроконтроллера.
То есть информацию сам контроллер изменить не может даже при всём своём желании …
Масочный процессор хранит свою программу, до полного выхода из строя по какой- либо причине…
Память ЕЕПРОМ (EEPROM) – то есть пользовательские данные, информация о проведённых адаптациях, коррекциях, кодировках, привязках к каким либо определённым входным данным (к примеру, синхронизации блоков, ID транспондеров в системах иммобилайзеров), всё то, что на каждом экземпляре авто будет индивидуально и может быть изменено в процессе эксплуатации, но должно быть энергонезависимым (не факт, что именно всё, на многих коррекции при отключении АКБ очищаются).
Память ФЛЕШ (FLASH)
Производители в последнее время отдают предпочтение именно ей, в виду возможности более гибкого её использования.
Преимущество её в том, что микроконтроллер может изменить её данные (перезаписать). То есть открывается возможность изготовления блоков, конструктивно подходящих для многих моделей авто определённой группы, но программно отличающихся. И если ранее с применением масочного микроконтроллера или ПЗУ нужно было заказывать изготовление определённой партии комплектующих под каждую модель блока, то сейчас имеется возможность «прошивать» программу в блок непосредственно с диагностического оборудования уже на выходе авто с конвейера, а так же иметь возможность сменить программу в блоке, при обнаружении каких либо недостатков, не учтённых ранее, без замены самого блока.
Но обратная сторона медали – более низкая надёжность.
Есть вероятность потери данных при проблемах в бортовой электросети автомобиля.
Сами физические процессы, при которых происходит потеря данных, мне досконально не знакомы, но на просторах сети неоднократно попадались версии – «при снижении напряжения питания микроконтроллера до предела его нормального функционирования, есть вероятность сбоев, перескакивания с инструкции на инструкцию, и как следствие записи случайных данных в ЕЕПРОМ или ФЛЕШ».
Исходные данные естественно будут утеряны, и работоспособность блока будет нарушена. Сети передачи данных в современном авто довольно надёжны, но и от нарушений в их работе никто не застрахован. Некоторые блоки в авто могут быть связанны динамически меняющимся кодом , в системах иммобилайзера как правило , и при нарушении связи между блоками, даже кратковременно , в момент обмена данными , может привести к рассогласованию блоков и , как следствие, авто перестаёт запускаться родным ключём.
В блоках начала 90-х годов выпуска используются ультрафиолетово-стираемые ПЗУ для хранения программы блока. Их срок службы заявлен Производителем около 10 лет. Многие ПЗУ выходят из строя от своей старости и блок перестаёт функционировать.
Владельцы современных автомобилей, находясь в регионах, далёких от дилерских станций и крупных СТО, располагающих необходимым оборудованием и возможностями в разумные сроки и за приемлемую стоимость заказать, заменить и закодировать блок для автомобиля, — они оказываются в затруднительном положении.
Хотя, для восстановления работоспособности порой бывает достаточно поменять значение всего лишь 1 байта информации.
Остаётся только один вариант – работа с программой или данными блока непосредственно на «физическом уровне», то есть программатором.
Это устройство позволяет изменять данные в самих носителях информации – микросхемах УФПЗУ, ЕЕПРОМ, ФЛЕШ, а так же внутренних областей памяти микроконтроллеров.
Описывать разновидности и возможности существующих программаторов в этой статье я не буду, так как их довольно много и каждый имеет свои плюсы и минусы.
Остановлюсь на кратком описании комплекса «OMEGA».
Данным комплексом можно читать и программировать параллельные (ПЗУ, ФЛЕШ), последовательные (ЕЕПРОМ), микроконтроллеры MOTOROLA и TEXAS INSTRUMENTS.
Конструкция комплекса – блочная. За основу взят базовый блок , дополняемый модулями и адаптерами под конкретную задачу. Многообразие разновидностей корпусов электронных компонентов не располагает к полной универсальности, но каждый из компонентов или их группа , работа с которыми заявлена разработчиком, оснащается своим адаптером или описанием для внутрисхемной работы.
Кстати о внутрисхемном программировании.
Комплекс позволяет работать со многими компонентами не выпаивая их из устройства.
К ним относятся ЕЕПРОМ и микроконтроллеры.
Конечно не 100% любой контроллер или ЕЕПРОМ могут быть прочитаны внутрисхемно, в некоторых случаях это может не позволить конструкция устройства , но разработчик постарался как можно более упростить данную задачу..
Это очень кстати ,если микроконтроллер имеет около 100 «ног» с мелким шагом или доступ для демонтажа затруднён. Порой разборка и сборка устройства не проходят без последствий.
Протоколы чтения /записи микросхем у разных серий и производителей различаются, встречаются узкоспециализированные микросхемы, которые кроме как в авто, не встретишь нигде. Радует наличие модулей для таких случаев, когда любой другой серийный программатор расписывается в бессилии. На некоторых микроконтроллерах встречается защита от чтения, установленная производителем, чтобы помешать прочитать содержимое внутренних областей памяти. Заявлен и реально работает обход такой защиты, если возникает необходимость работы с таким микроконтроллером.
Из дополнительных модулей не могу не отметить логический анализатор/генератор и частотомер.

Окно программатора с дампом памяти микросхемы ЕЕПРОМ 93С66.


Окно программатора с дампом памяти ROM микроконтроллера MOTOROLA

В умелых руках, логический анализатор один из мощнейших инструментов для изучения работы электронных устройств. Со встроенными декодерами протоколов этот инструмент становиться гораздо приветливее и пользователь избавляется от необходимости «ковыряния» в нулях и еденицах записанного лога. Информация выдаётся в удобно воспринимаемом виде.

Логический анализатор с открытым окном декодера и различными представлениями одних и тех же данных.

В данном примере, в анализе записанного лога обмена микроконтроллера и ЕЕПРОМ мы видим, к каким ячейкам памяти обращался микроконтроллер, и какие изменения он внёс в содержимое. Появляется реальная возможность посмотреть на работающем устройстве, какие из ячеек читаются (или пишутся) в процессе выполнения каких-либо действий.
Работа с данным прибором подразумевает уровень знаний современной микропроцессорной техники и опыта работы с ней. Всего знать и понимать невозможно, поэтому форуму поддержки уделено особое внимание.
Сайт разработчика и форум http://www.cnc-lab.com/

Автор статьи:
Бочковский Алексей Иванович
СОЮЗ АВТОМОБИЛЬНЫХ ДИАГНОСТОВ

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

  • Главная
  • Рубрикация
  • Указатель А — Я
  • Порталы
  • Произвольно
  • Журнал
  • Редакторам
    • Ссылки сюда
    • Связанные правки
    • Загрузить файл
    • Спецстраницы
    • Версия для печати
    • Постоянная ссылка
    • Сведения о странице
    • Цитировать страницу
    • Читать
    • Просмотр
    • История

EEPROM (Electrically Erasable Programmable Read-Only Memory)

EEPROM (Electrically Erasable Programmable Read-Only Memory) — электрически стираемое перепрограммируемое ПЗУ (ЭСППЗУ), один из видов энергонезависимой памяти (таких, как EPROM и PROM), используемой в компьютерах и других электронных устройствах для хранения относительно небольших объемов данных но с возможностью чтения, удаления или записи байтов по отдельности. В EEPROM памяти чаще всего хранятся пользовательские данные в сотовых аппаратах, которые не должны стираться при выключении питания (например адресные книги), конфигурационная информация роутеров или сотовых аппаратов, реже эти микросхемы применяются в качестве конфигурационной памяти FPGA или хранения данных DSP. Микросхемы организованы в виде массивов плавающего затвора транзисторов [Источник 1] . Они могут быть запрограммированы и соединяются в цепи, путем применения специальных сигналов программирования. Изначально, микросхемы были ограничены для однобайтовых операций, которые сделали их медленнее, но современные микросхемы позволяют многобайтовые операции. EEPROM также имеет ограниченный срок для стирания и перепрограммирования, теперь достигает миллиона операций в современные микросхемы.

На сегодняшний день классическая двухтранзисторная технология EEPROM практически полностью вытеснена флеш-памятью типа NOR. Однако название EEPROM прочно закрепилось за сегментом памяти малой ёмкости независимо от технологии.

Содержание

  • 1 История
  • 2 Принцип действия
  • 3 Интерфейс
    • 3.1 Устройства с последовательным интерфейсом
    • 3.2 Устройства с параллельным интерфейсом
    • 3.3 Другие устройства
  • 4 Режимы отказа
  • 5 Родственные типы памяти
  • 6 Сравнение EPROM, EEPROM и Flash
  • 7 Список производителей EEPROM
  • 8 Примечания
  • 9 Источники
  • 10 Литература

История

Элай Харари в 1977 году создал EEPROM с помощью автоэлектронной эмиссии [Источник 2] через плавающий затвор. В 1978 году Джордж Перлегос в Intel разработал процессор Intel 2816, который был построен на более ранней технологии EPROM, но использовал тонкий подзатворный окисленный слой, позволяющий чипу стереть собственные байты без УФ-источника. Перлегос и другие позже использовали технологию, которая подразумевала использование на устройстве конденсаторов для обеспечения необходимого напряжения для программирования микросхемы. [1] [2]

Принцип действия

Принцип работы EEPROM основан на изменении и регистрации электрического заряда в изолированной области (кармане) полупроводниковой структуры. [3]

Ячейка памяти EEPROM представляет собой транзистор, в котором затвор выполняется из поликристаллического кремния. Затем этот затвор окисляется и в результате он будет окружен оксидом кремния — диэлектриком с прекрасными изолирующими свойствами. Изменение заряда («запись» и «стирание») производится приложением между затвором и истоком большого потенциала, чтобы напряженность электрического поля в тонком диэлектрике между каналом транзистора и карманом оказалась достаточна для возникновения туннельного эффекта. Для усиления эффекта туннелирования электронов в карман при записи применяется небольшое ускорение электронов путём пропускания тока через канал полевого транзистора (явление инжекции горячих носителей). После снятия программирующего напряжения индуцированный заряд остаётся на плавающем затворе, и, следовательно, транзистор остаётся в проводящем состоянии. Заряд на его плавающем затворе может храниться десятки лет. Чтение выполняется полевым транзистором, для которого карман выполняет функцию затвора. Потенциал плавающего затвора изменяет пороговые характеристики транзистора, что и регистрируется цепями чтения.

Ранее подобная конструкция ячеек применялась в ПЗУ с ультрафиолетовым стиранием (EPROM).Сейчас особенностью классической ячейки EEPROM можно назвать наличие второго транзистора, который помогает управлять режимами записи и стирания. Стирание информации производится подачей на программирующий затвор напряжения, противоположного напряжению записи. В отличие от ПЗУ с ультрафиолетовым стиранием, время стирания информации в EEPROM памяти составляет около 10 мс. Структурная схема энергонезависимой памяти с электрическим стиранием не отличается от структурной схемы масочного ПЗУ. Единственное отличие — вместо плавкой перемычки используется описанная выше ячейка.

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

Интерфейс

Устройства EEPROM используют последовательный или параллельный интерфейс для ввода/вывода информации.

Устройства с последовательным интерфейсом

Общий интерфейс может быть в виде шин: SPI [Источник 3] и I²C [Источник 4] , Microwire, UNI/O [Источник 5] и 1-Wire.

Типичный EEPROM протокол содержит 3 фазы: Код операции, фазы адреса и фазы данных. Код операции — обычно первые 8 бит, далее следует фаза адреса в 8-24 бита (зависит от устройства) и в конце запись или чтение информации.

Каждое устройство EEPROM, как правило, имеет свой код операций для выполнения различных функций. Функции для SPI EEPROM могут быть:

  • Write Enable (WRENAL)
  • Write Disable (WRDI)
  • Read Status Register (RDSR)
  • Write Status Register (WRSR)
  • Read Data (READ)
  • Write Data (WRITE)

Ряд других операций, которые поддерживают некоторые EEPROM устройства:

  • Program
  • Sector Erase
  • Chip Erase commands

Устройства с параллельным интерфейсом

Параллельные устройства EEPROM обычно содержат в себе 8-битную шину данных и адресную шину достаточного объёма для покрытия всей памяти. Большинство таких устройств имеют защиту записи на шинах и возможность выбора чипа. Некоторые микроконтроллеры содержат в себе такие интегрированные EEPROM. Операции на таких устройствах проще и быстрее в сравнении с последовательным интерфейсом EEPROM, но за счет того, что для его функционирования требуется большое количество точек вывода (28pin и больше), параллельная память EEPROM теряет популярность уступая место памяти типа Flash и последовательной EEPROM.

Другие устройства

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

Читайте также  Уровень электролита в аккумуляторе автомобиля

Режимы отказа

Существует два вида ограничения хранимой информации: количество перезаписи и длительность хранения. Во время перезаписи, подзатворный окисленный слой плавучего затвора транзисторов постепенно накапливает в себе электроны. Электрическое поле неподвижных электронов добавляется к полю электронов в плавающем затворе, опуская окно между пороговыми напряжениями. После достаточного количества циклов перезаписи, разница будет слишком мала, чтобы быть узнаваемой, дальнейшая запись информации на устройство невозможно и происходит отказ . Производители обычно указывают максимальное количество перезаписей в 1 млн. или более.

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

Родственные типы памяти

Флэш-память является более поздней формой EEPROM. В промышленности, существует конвенция, чтобы зарезервировать термин EEPROM для побайтно стираемой памяти относительно поблочно стираемой флэш-памяти. EEPROM занимает большую площадь кристалла, чем флэш-память для той же мощности, потому что каждая ячейка обычно требует чтения, записи и стирания, в то время как для стирания Flash схемы памяти используются большие блоки ячеек.

Новые технологии энергонезависимой памяти, такие как в FeRAM и MRAM медленно заменяют EEPROM в некоторых устройствах, но, как ожидается, останется небольшая доля рынка для EEPROM в обозримом будущем.

Сравнение EPROM, EEPROM и Flash

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

EPROM же, напротив, использует инжекцию горячих носителей [Источник 6] на плавающем затворе. Стирание осуществляется с помощью ультрафиолетового источника света, хотя на практике многие чипы упакованы в пластик, который является непроницаемым для ультрафиолета, делая их «однократно программируемыми».

Большинство устройств с Flash памятью представляет собой гибрид программирования с помощью инжекции горячих носителей и стирания с помощью автоэлектронной эмиссии.

Работа с параметрами в EEPROM, как не износить память

Введение

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

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

Но вернемся к нашей основной проблеме — мы хотим постоянно писать параметры.

Как работать с EEPROM, чтобы не износить её

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

Как я уже сказал, число записей в EEPROM ограничено. Это число варьируется, и может быть 100 000, а может и 1 000 000. Так как же быть, если я хочу записать параметр 10 000 000 раз? И здесь мы должны понять, как внутри EEPROM устроен доступ к ячейкам памяти.

Итак, в общем случае вся EEPROM разделена на страницы. Страницы изолированы друг от друга. Страницы могут быть разного размера, для небольших EEPROM это, скажем, 16, 32 или 64 байта. Каждый раз когда вы записываете данные по какому-то адресу, EEPROM копирует все содержимое страницы, в которой находятся эти данные, во внутренний буфер. Затем меняет данные, которые вы передали в этом буфере и записывает весь буфер обратно. Т.е. по факту, если вы поменяли 1 байт в странице, вы переписываете всю страницу. Но из-за того, что страницы изолированы друг от друга остальные страницы не трогаются.

Таким образом, если вы записали 1 000 000 раз в одну страницу, вы можете перейти на другую страницу и записать туда еще 1 000 000 раз, потом в другую и так далее. Т.е. весь алгоритм сводится к тому, чтобы писать параметр не в одну страницу, а каждый раз сдвигаться в следующую страницу. Можно закольцевать эти действия и после 10 раз, снова писать в исходную страницу. Таким образом, вы просто отводите под параметр 10 страниц, вместо 1.

Да придется пожертвовать память, но как сделать по другому, я пока не знаю. Если есть какие мысли — пишите в комментариях.

Анализ требований и дизайн

Итак, мы почти поняли что хотим. Но давайте немного формализуем это. Для начала, назовем наши параметры, которые нужно писать постоянно — AntiWearNvData (антиизносные данные). Мы хотим, чтобы обращение к ним было такое же простое и юзер френдли, как и к кешируемым параметрам из предыдущей статьи.

Все требования можно сформулировать следующим образом:

Пользователь должен задать параметры EEPROM и время обновления параметра

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

Количество циклов перезаписи

Время обновления параметра

Время жизни устройства

Хотя конечно, можно было дать возможность пользователю самому задавать количество записей, но что-то я хочу, чтобы все считалось само на этапе компиляции.

Каждая наша переменная(параметр) должна иметь уникальный начальный адрес в EEPROM

Мы не хотим сами руками задавать адрес, он должен высчитываться на этапе компиляции

При каждой следующей записи, адрес параметра должен изменяться, так, чтобы данные не писались по одному и тому же адресу

Это также должно делаться автоматически, но уже в runtime, никаких дополнительных действий в пользовательском коде мы делать не хотим.

Мы не хотим постоянно лазить в EEPROM, когда пользователь хочет прочитать параметр

Обычно EEPROM подключается через I2C и SPI, передача данных по этим интерфейсам тоже отнимает время, поэтому лучше кэшировать параметры в ОЗУ, и возвращать сразу копию из кеша.

При инициализации мы должны найти самую последнюю запись, её считать и закешировать.

За целостность должен отвечать драйвер.

За алгоритм проверки целостности отвечает драйвер, если при чтении он обнаружил несоответствие он должен вернуть ошибку. В нашем случае, пусть в качестве алгоритма целостности будет простое хранение копии параметра. Сам драйвер описывать не буду, но приведу пример кода.

Ну кажется это все наши хотелки. Как и в прошлой статье давайте прикинем дизайн класса, который будет описывать такой параметр и удовлетворять нашим требованиям:

Класс AntiWearNvData будет похож на, CachedNvData из прошлой статьи, но с небольшими изменениям. При каждой записи в EEPROM, нам нужно постоянно сдвигать адрес записи, поэтому необходимо хранить индекс, который будет указывать на номер текущей записи. Этот индекс должен записываться в EEPROM вместе с параметром, чтобы после инициализации можно было найти запись с самым большим индексом — эта запись и будет самой актуальной. Индекс можно сделать uint32_t точно хватит на 30 лет — даже при 100 000 циклах записи.

И вот наш класс:

Посмотрим на то, как реализуются наши требования таким дизайном.

Пользователь должен задать параметры EEPROM и время обновления параметр

В отличии от CachedNvData Из предыдущей статьи здесь появился параметр updateTime . На основе этого параметра можно посчитать сколько записей необходимо для того, чтобы уложиться в ожидаемое время жизни EEPROM. Сами параметры EEPROM можно задать в отдельном заголовочнике. Например, так:

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

При каждой следующей записи, адрес параметра должен изменяться, так, чтобы данные не писались по одному и тому же адресу

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

По нему мы будет рассчитывать следующий адрес записи

Для того, чтобы после выключения/включения датчика найти последнюю запись, считать её и проинициализировать значением по адресу этой записи кеширумое значение в ОЗУ.

Для этого заведена специальная структура tAntiWear . Её то мы и будем сохранять при вызове метода Set(. ) , который, кроме непосредственно записи, еще сдвигает индекс текущей записи на 1.

Давайте посмотрим как реализован метод расчета текущего адреса записи:

Мы не хотим постоянно лазить в EEPROM, когда пользователь хочет прочитать параметр

Метод Get() — крайне простой, он просто возвращает копию из ОЗУ

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

В общем-то и все класс готов, полный код класса:

Полный код класса

По аналогии с CachedNvData из прошлой статьи, все параметры должны быть зарегистрированы в едином списке, причем, в этом списке мы можем регистрировать как и CachedNvData , так и наши AntiWearNvData параметры.

Я немного переделал список, так как IAR компилятор все еще не понимает много фишек из С++17, и собственно теперь список принимает только типы, а не ссылки на параметры. Кроме того, теперь у него появились методы SetToDefault и Init . Первый нужен, например, чтобы сбросить все параметры в их начальное значение. А второй, чтобы проинициализировать кешируемые в ОЗУ копии.

Читайте также  Как правильно тонировать стекла автомобиля своими руками?

Также в CachedNvData я добавил параметр recordSize и recordCounts = 1 . Чтобы расчет адреса параметра был унифицирован для разного типа параметров.

Результат

Собственно все, теперь мы можем регистрировать в списке любые параметры:

Замечу, что пользователю параметров нужно только объявить параметр и список, а вся портянка с кодом, до этого, пишется один раз. Используются параметры точно также как и CachedNvData .

Что произойдет в этом примере, когда мы будем писать 10,11,12. 15 в наш параметр. Каждый раз при записи, адрес параметра будет смещаться на размер параметра + размер индекса + размер копии параметра и индекса. Как только количество записей превысит максимальное количество, параметр начнет писаться с начального адреса.

На картинке снизу как раз видно, что число 15 с индексом 5 записалось с начального адреса, а 10 теперь нет вообще.

В данном случае после сброса питания, при инициализации, будет найдена запись с индексом 5 и значением 15 и это значение и индекс будут записаны в кэшируемую копию нашего параметра.

Вот и все, надеюсь в этой статье цель получилось пояснить более детально, спасибо за то, что прочитали до конца.

Программатор, редактор прошивок ЭБУ автомобилей для перепиновки блока управления двигателем от угона

Что такое еепром в эбу, eeprom? Что такое еепром в эбу, eeprom? ‘roman000′ *’Oct 7 2005, 12:21’]Обясните плиз ,с начала считал что прошивка заливаеться в

  1. Рекомендованные сообщения
  2. Принцип действия [ править| править код]
  3. Arduino EEPROM работа с памятью
  4. Список производителей EEPROM [ править| править код]
  5. Создайте аккаунт или войдите в него для комментирования
  6. Присоединяйтесь к обсуждению
  7. Литература [ править| править код]
  8. Как избежать износа EEPROM
  9. Самостоятельная диагностика
  10. Прерывание по снижению уровня питания

Рекомендованные сообщения

Доброго времени суток всем!

Простите за невежество начинающего, почитал некоторые ветки в форуме и мануалы к программам и возник такой вопрос по теории работы ЭБУ – после прошивки блока рекомендуют очищать EEPROM – зачем это нужно делать(это вроде бы память ЭБУ в которой хранятся ошибки и некоторые параметры)

Доброго времени суток всем!

Простите за невежество начинающего, почитал некоторые ветки в форуме и мануалы к программам и возник такой вопрос по теории работы ЭБУ – после прошивки блока рекомендуют очищать EEPROM – зачем это нужно делать(это вроде бы память ЭБУ в которой хранятся ошибки и некоторые параметры)

Не во всех эбу можно очищать епром.

Зачем еепромм очишять я его ни когда не трогаю кроме того когда надо убить иммо,а так смысл его вообше трогать.

Как раз в еепроме и есть “смысл”…

Я так понимаю EEPROM это энергонезависимая память ЭБУ в которой хранятся ошибки и настройки(типа УОЗа) – и при перепрошивке эти ошибки и настройки пожет подцепить новая прошива, или не так?

Тогда конкретный вопрос – имеется Микас 7.1 241.3763 000-63 по 538, при перепрошивке стоит чистить EEPROM?

Тогда конкретный вопрос – имеется Микас 7.1 241.3763 000-63 по 538, при перепрошивке стоит чистить EEPROM?

Я менял регулятор ХХ на Калине. После этого у меня обороты начинают зависать на 3000 обмин. Может это быть вызвано не сброшенной EEPROM? ЭБУ с процессором ST10F273. Какая прошивка я еще не знаю.

А еще скажите пожалуйста. Часто возникает вопрос. EEPROM сбрасывается при отключении АКК или нет?

А еще скажите пожалуйста. Часто возникает вопрос. EEPROM сбрасывается при отключении АКК или нет?

Это энергонезависимая память, данные не сбрасываются.

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

Я так понимаю EEPROM это энергонезависимая память ЭБУ в которой хранятся ошибки и настройки(типа УОЗа) – и при перепрошивке эти ошибки и настройки пожет подцепить новая прошива, или не так?

Что то я не понял насчёт УОЗ? А на 797+надо стирать?

Сотрёшь,потом не заведёшь.

Если не сбрасываются, то почему существует мнение, что при отключении АКК сбрасываются ошибки.

Вообщем чтобы сбросить EEPROM нужен хотя бы диагностический тестер, или OBD-II, и все сбросится через диагностичес кий разъем.

Если не сбрасываются, то почему существует мнение, что при отключении АКК сбрасываются ошибки.

А почему Вы решили, что коды ошибок храняться в eeprom? Ну а насчет существующих мнений. я промолчу..

Еще раз внимательно прочитайте по ссылке или погуглите..

Вообщем чтобы сбросить EEPROM нужен хотя бы диагностический тестер, или OBD-II, и все сбросится через диагностичес кий разъем.

Ничего Вы там не сбросите сканером..

Значит если тебе говорят где нить в СУПЕРМАСТЕРСКОЙ, что вот мол я щас тебе скину все твои ошибки, или скину тебе контроллер, а имеют только лишь тестер подключаемый через диагностический разъем, то можно их сразу посылать?

Значит если тебе говорят где нить в СУПЕРМАСТЕРСКОЙ, что вот мол я щас тебе скину все твои ошибки, или скину тебе контроллер, а имеют только лишь тестер подключаемый через диагностический разъем, то можно их сразу посылать?

Ну почему же посылать. со сканера можно сделать сброс ошибок и адаптаций, вот только еепром здесь не при делах.

)) улыбнула тема )) Как можно очистить ЕЕПРОМ? Откуда потом, если говорить понятным языком, блок управления двигателем, а именно его процессор, будет нужные для работы и управления данные брать?

Изменено 12 августа 2010 пользователем lexie

)) улыбнула тема )) Как можно очистить ЕЕПРОМ? Откуда потом, если говорить понятным языком, блок управления двигателем, а именно его процессор, будет нужные для работы и управления данные брать?

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

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

Изменено 12 августа 2010 пользователем Yaroha

У мерседеса, например, ошибки лежат в EEPROM. При снятии клеммы они не сбрасываются. А у тойоты в ОЗУ. Чтобы сбросить ошибки – достаточно скинуть клемму.

Принцип действия [ править | править код ]

Принцип работы EEPROM основан на изменении и регистрации электрического заряда в изолированной области (кармане) полупроводниковой структуры.[1]

Изменение заряда («запись» и «стирание») производится приложением между затвором и истоком большого потенциала, чтобы напряженность электрического поля в тонком диэлектрике между каналом транзистора и карманом оказалась достаточна для возникновения туннельного эффекта. Для усиления эффекта туннелирования электронов в карман при записи применяется небольшое ускорение электронов путём пропускания тока через канал полевого транзистора (явление инжекции горячих носителей).

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

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

Эта конструкция снабжается элементами, которые позволяют ей работать в большом массиве таких же ячеек. Соединение выполняется в виде двумерной матрицы, в которой на пересечении столбцов и строк находится одна ячейка. Поскольку ячейка EEPROM имеет третий затвор, то, помимо подложки, к каждой ячейке подходят 3 проводника (один проводник столбцов и 2 проводника строк).

Arduino EEPROM работа с памятью

EEPROM Arduino ➜ позволяет сохранять данные во время работы программы. Рассмотрим, как работать с EEPROM памятью Ардуино – запись и чтение различных типов данных.

EEPROM память Arduino позволяет сохранять важные данные во время работы программы, например настройки работы системы, даже при отключении питания или при перезагрузке микроконтроллера, так как она является энергонезависимой. Рассмотрим, как работать с EEPROM памятью Ардуино с примерами записи и чтения различных типов данных с помощью команд стандартной библиотеки EEPROM.h.

Список производителей EEPROM [ править | править код ]

  • Mikron Sitronics
  • Aplus Flash Technology
  • Mitsubishi Electric
  • Atmel
  • Hitachi
  • Infineon
  • Maxwell Technologies
  • Microchip Technology
  • NXP Semiconductors
  • Renesas Technology
  • ROHM Electronics
  • Samsung Electronics
  • SmarfTech
  • STMicroelectronics
  • Seiko Instruments
  • Winbond
  • Интеграл
  • Catalyst Semiconductor Inc
  • Микрон

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Присоединяйтесь к обсуждению

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

Литература [ править | править код ]

  • Угрюмов Е. П. Цифровая схемотехника : учеб. пособие для вузов. — 3-е изд., перераб. и доп. — СПб. : БХВ-Петербург, 2010. — С. 301—305. — ISBN 978-5-9775-0162-0.

Как избежать износа EEPROM

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

Самостоятельная диагностика

Определить некоторые неисправности ЭБУ можно и самостоятельно. Или, по крайней мере, понять, подает ли он «признаки жизни». Это также возможно благодаря системе самодиагностики, которую имеют практически все блоки управления. Если автолюбитель хочет произвести самостоятельную диагностику, ему понадобится специальный тестер или же компьютер с предустановленной программой . Ее будет несложно найти в интернете. Кроме того, понадобится адаптер. Вот что нужно сделать:

  • Подключить адаптер к USB-порту компьютера и к выходу электронного блока;
  • Включить зажигание (сам двигатель запускать не обязательно);
  • Запустить предварительно скачанную и установленную диагностическую проверку на компьютере;
  • Наблюдать за тем, как на экране появится сообщение о начале диагностики. Если его нет, проверьте надежность подключения;
  • Перейти в раздел DTC (может иметь другое название в зависимости от программы) – он содержит коды всех неисправностей. Коды зашифрованы, а расшифровать их можно в той же программе или с помощью данных из технической документации к вашему автомобилю.

К несчастью, бывают случаи, когда компьютер не удается подключить к блоку. В этом случае автолюбителю понадобится осциллограф, кабель и специализированное программное обеспечение. Нужный софт найти несложно, а вот с осциллографом могут возникнуть проблемы. Далее, диагностику нужно будет продолжить уже при помощи тестера или же мультиметра. Автолюбителю придется внимательно изучить электрическую схему контроллера и производить замеры сопротивлений. Лучше всего обратиться к специалистам, но если у автолюбитель хорошо подкован в вопросам электротехники и имеет много времени для диагностики, выявить проблему он сможет и самостоятельно.

Прерывание по снижению уровня питания

В некоторых процессорах имеется прерывание по низкому уровню питания, которое можно использовать для записи одного последнего значения в EEPROM, в то время как система выключается по потере питания. В общем случае, вы храните интересующее значение в ОЗУ, и сохраняете его в EEPROM только при выключении питания. Или, возможно, вы записываете EEPROM время от времени, и записываете другую копию в EEPROM как часть процедуры выключения, чтобы убедиться, что самые последние данные запишутся.
Важно убедиться, что есть большой конденсатор по питанию, который будет поддерживать напряжение, достаточное для программирования EEPROM достаточно продолжительное время. Это может сработать, если вам нужно записать одно или два значения, но не большой блок данных. Осторожно, тут имеется большое пространство для ошибки!

Электроника для всех

Блог о электронике

AVR. Учебный Курс. Использование EEPROM

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

Чтобы что-то записать в EEPROM нужно в регистры адреса EEARH и EEARL (EEPROM Address Register) положить адрес ячейки в которую мы хотим записать байт. После чего нужно дождаться готовности памяти к записи – EEPROM довольно медленная штука. О готовности к записи нам доложит флаг EEWE (EEPROM Write Enable) регистра управления состоянием EECR, когда он будет равен 0, то память готова к следующей записи. Сам байт, который нужно записать, помещается в регистр EEDR (EEPROM Data Register). После чего взводится предохранительный бит EEMWE (EEPROM Master Write Enable), а затем, в течении четырех тактов, нужно установить бит EEWE и байт будет записан. Если в течении четырех тактов не успеешь выставить бит EEWE то предохранительный бит EEMWE сбросится и его придется выставлять снова. Это сделано для защиты от случайной записи в EEPROM память.

Читайте также  Что такое раздаточная коробка в автомобиле?

Чтение происходит примерно аналогичным образом, вначале ждем готовности памяти, потом заносим в регистры нужный адрес, а затем выставляем бит чтения EERE (EEPROM Read Enable) и следующей командой забираем из регистра данных EEDR наше число, сохраняя его в любом регистре общего назначения. Чтобы было понятно, я тебе набросал две процедурки – на чтение и на запись. Чтобы записать байт , нужно в регистры R16 и R17 занести младший и старший байт адреса нужной ячейки, а в регистр R21 байт который мы хотим записать. После чего вызвать процедуру записи. Аналогично и с чтением – в регистра R16 и R17 адрес, а в регистре R21 будет считанное значение.

Вот так выглядит запись в память:

… LDI R16,0 ; Загружаем адрес нулевой ячейки LDI R17,0 ; EEPROM LDI R21,45 ; и хотим записать в нее число 45 RCALL EEWrite ; вызываем процедуру записи.

LDI R16,0 ; Загружаем адрес нулевой ячейки LDI R17,0 ; EEPROM из которой хотим прочитать байт RCALL EERead ; вызываем процедуру чтения. После которой ; в R21 будет считанный байт.

Ну и, разумеется, сами процедуры чтения и записи

EEWrite: SBIC EECR,EEWE ; Ждем готовности памяти к записи. Крутимся в цикле RJMP EEWrite ; до тех пор пока не очистится флаг EEWE CLI ; Затем запрещаем прерывания. OUT EEARL,R16 ; Загружаем адрес нужной ячейки OUT EEARH,R17 ; старший и младший байт адреса OUT EEDR,R21 ; и сами данные, которые нам нужно загрузить SBI EECR,EEMWE ; взводим предохранитель SBI EECR,EEWE ; записываем байт SEI ; разрешаем прерывания RET ; возврат из процедуры EERead: SBIC EECR,EEWE ; Ждем пока будет завершена прошлая запись. RJMP EERead ; также крутимся в цикле. OUT EEARL, R16 ; загружаем адрес нужной ячейки OUT EEARH, R17 ; его старшие и младшие байты SBI EECR,EERE ; Выставляем бит чтения IN R21, EEDR ; Забираем из регистра данных результат RET

Да, при работе с EEPROM нужно в цикле ожидания готовности не забывать командой WDR сбрасывать Watch Dog Timer — специальный сторожевой таймер, отслеживающий зависание процессора. Если его не сбрасывать с нужной периодичностью, то он сбрасывает контроллер. Это, конечно, если Watch Dog используется. По дефолту он вырублен. Но помнить надо, иначе огребете трудно отслеживаемый глюк.

Впрочем, у EEPROM тоже есть свои прерывания. Это:

.ORG $01E RETI ; (EE_RDY) EEPROM Ready

И никто не помешает выбросить цикл ожидания и сделать массовую запись в ЕЕПРОМ на прерываниях! Аналогично как это сделано для USART. А если надо что то сохранить очень быстро, то можно и буферизированную с пробросом через RAM таким же образом запись заюзать. Т.е. сначала быстро сожрали в оперативку, а потом, неспеша, по прерываниям, загнать в EEPROM.

Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!

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

132 thoughts on “AVR. Учебный Курс. Использование EEPROM”

Спасибо! Отличная статья! Как раз сейчас нужно будет использовать EEPROM. Конечно можно прочитать даташит, что я обычно и делаю, но там все довольно разбросано, а здесь раз прочитал и в голове сложилась четкая структура.

P.S. Еще интересно, может у тебя уже был опыт по использованию карт памяти SD/MMC? Там же вроде элементарно по SPI с ними общаться.

До SPI пока руки не доходили. А так да, в планах. С этими карточками проблема составляет не SPI доступ, а FAT :)

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

Забыл написать, что у атмеловских контроллеров есть так называемая «мертвая зона» EEPROM-a. У 64й атмеги, например, это все адреса от 0x00 — 0x100. Так же была замечена тенденция (по крайней мере на атмегах), чем круче модель (ATMeag32->64->128), тем больше у нее мертвая зона EEPROM. Причем в документации, про нее нифига не написано и подбирать придется в ручную. Ах да, чем же она такая мертвая эта зона. А тем, что запись и чтение в ней происходят через раз, а то и не происходят вообще. Дрочится конечно можно, но лучше оставить эти 100 адресов на советси разработчиков и работать со стабильным ПЗУ.

Может это контроллеры бракованные были? Или может запись производилась без проверки готовности EEPROM’а?

Нет, контроллеры н бракованные и запись проводилась так как нужно, будь уверен.

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

Задание:
Разработать систему измерения частоты и скважности сигнала с ТТЛ – совместимыми уровнями и вывод результата на индикатор МТ-16S2х (частота – верхняя строка, скважность — нижняя). Диапазон измеряемых частот — 1÷1000 Гц. Абсолютный шаг измерения скважности – не менее 0,1 мс. Период накопления данных при измерении частоты – 1 секунда.
ядро м/п системы:
ATMEGA-8, ATTINY2313 (AVR)
Нужны:
расчетные параметры устройств (адреса, режимы работы и.т.д.),
принципиальную электрическую схему системы,
блок-схему программы, программу на языке ассемблера.

Помогите пожалуйста, я не понимаю в этом ничего. А вам может будет интересно.
Зарание спасибо.

Не, нам это не интересно уже. Если будут _конкретные_ вопросы, на которые можно будет дать четкий ответ, то задавай.

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

Я догадался.
Ну что я могу сказать. Вы, похоже, сильно ошиблись специальностью, мне вас искренне жаль. В таком случае ничем помочь не могу. Если кто из комментов откликнется, то может быть вам повезет.

Блин, парюсь уже часа 3 с этим EEPROM
В .ESEG объявил константы, так Студия не цапает их сама при эмуляции — пришлось вручную через меню указывать файл .epp. Ладно, вроде заработало.
Но!! В Протеусе никак не могу загрузить данные EEPROM. Уж и конвертер hex2bin скачал, .epp файл конвертнул в .bin, указал в настройках ATMega8 — Initial Contens of EEPROM этот файл. А нифига — смотрю в паузе на содержимое EEPROM — везде 0xFF
Помогите, плиз!

Хм… Помог сброс данных модели и последующий выбор .bin файла….
И все-таки протеус очень веселый….

З.Ы. Студия тоже не фонтан… Сменил в простеньком проекте мегу8 на мегу 32 — так студия перестала показывать состояние всех РВВ… Создал пустой проект, скопипастил код туда — все заработало :-) Чудеса просто…

А вот такой насущный вопрос:
Собираю схему электронного одометра. Надо будет хранить пробег включая сотни метров. Ясно, что возможность записи в EEPROM закончится очень быстро. Вопрос: 100,000 записей это для всей памяти либо для одной ячейки? Т.е. могу ли я записать в оду ячейку 100000 раз потом перейти к следующей и т.д. таким образом использовать EEPROM долгое время? Если нет, то какой выход в данной ситуации можно посоветовать?
Спасибо!

1 применить память типа FRAM от Ramtron у ней число циклов перезаписи такое, что скорей у твоей машины все молекулы сотрутся.

2 держать данные в памяти, а на епром сбрасывать раз в 10-15 минут.

И 100 000 это для каждой ячейки.

Почему фигня в еепром при включении питания пишется? бодлевел вроде поставил.

Введение

Если вы читали предыдущий материал, то знаете как объявлять, читать и записывать данные в EEPROM. Но давайте разберемся, как же на самом деле происходят эти операции и что от нас скрывает компилятор. Это позволит лучше понимать работу микроконтроллера, и при желании написать свои специфические функции для работы с EEPROM.

Регистры для работы с EEPROM

Для работы с EEPROM используются три регистра ввода/вывода: регистр адреса, регистр данных и регистр управления.

Регистр адреса EEAR (EEPROM Address Register) предназначен для адресации однобайтной ячейки EEPROM памяти, к которой будет производиться обращение.
Для полной адресации хотя бы минимального объема EEPROM памяти (512-ти байт) требуется 9 разрядов (2 в 9-ой степени = 512), поэтому регистр EEAR является 16-ти разрядным и физически расположен в двух регистрах ввода/вывода – EEARH и EEARL. Регистр EEARL полностью доступен для записи/чтения. А в регистре EEARH для записи/чтения доступны только младшие разряды, используемые для адресации. Остальные разряды доступны только для чтения и содержат «0».

Для чтения/записи используется один и тот же регистр данных – EEDR (EEPROM Data Register). Если выполняется процедура записи, мы должны поместить в EEDR байт данных, если выполняется процедура чтения, прочитать байт данных из EEDR.


Регистр управления EECR (EEPROM Control Register)
предназначен для управления доступом к EEPROM.

Бит EERIE (EEPROM Ready Interrupt Enable) – разрешение/запрещение прерывания по событию готовности EEPROM. Если бит EERIE установлен в 1, установлен флаг глобального разрешения прерываний (бит I регистра SREG) и бит EEWE очищен, то микроконтроллер будет генерировать прерывание “EEPROM Ready Interrupt”.

Бит EEMWE (EEPROM Master Wirte Enable) — главное разрешение записи. Если в течении 4-ех тактов после установки этого бита, устанавливается бит EEWE, то микроконтроллер выполняет запись в EEPROM. Бит EEMWE аппаратно сбрасывается в ноль после 4-ех периодов тактовой частоты.

Бит EEWE (EEPROM Write Enable) — разрешение записи. Этот бит выполняет роль стартового сигнала записи в EEPROM. Когда установлен адрес, данные и бит EEMWE, установка бита EEWE инициирует запись в EEPROM. Бит EEWE должен быть установлен в течении 4-ех тактов после установки EEMWE. Если это произойдет позже, то запись в EEPROM не будет произведена. Чтобы избежать возможных проблем, рекомендуется запрещать прерывания на время выполнения записи в EEPROM.
Бит EEWE аппаратно сбрасывается, после завершения операции записи. Поэтому перед каждой операцией записи в EEPROM нужно проверять состояние этого разряда.

Бит EERE (EEPROM Read Enable) — разрешение чтения. Установка бита EERE инициирует процесс чтения из EEPROM. Перед каждым циклом чтения нужно проверять состояние разряда EEWE, если выполняется операция записи, то чтение из EEPROM не даст результата.

Низкоуровневая запись в EEPROM на Си

Разберем вариант низкоуровневой работы с EEPROM, то есть без использования встроенных макросов/функций компиляторов. Допустим, мы объявили в EEPROM переменную, как нам изменить ее значение из своего приложения?

Процедура записи в EEPROM состоит из следующих шагов:

1. Ожидаем готовности EEPROM, опрашивая бит EEWE регистра EECR.
2. Устанавливаем адрес в регистре EEAR.
3. Записываем байт данных в регистр EEDR.
4. Устанавливаем основной флаг разрешения записи EEMWE регистра EECE
5. Устанавливаем флаг разрешения записи EEWE регистра EECE

Тут есть два нюанса.
Запись в EEPROM не может производиться одновременно с записью во флэш память. Если ваше приложение в какие то моменты пишет во флэш, то перед записью EEPROM`а, проверьте флаг SPMEN регистра SPMCR. Он должен быть сброшен в ноль. Более подробную информацию смотрите в даташите.

Второй нюанс связан с флагом EEWE. Он должен быть установлен в течении 4 циклов после флага EEMWE. Если в проекте используются прерывания, то на каком-то из этапов этой последовательности их нужно запрещать. Это можно сделать или в самом начале или перед установкой флага EEMWE.

В Си коде описанная последовательность будет выглядеть так:

где adr- это адрес байта в EEPROM, value — данные для записи, EEAR — 16-ти разрядный регистр адреса.

Использовать абсолютный адрес байтов EEPROM не удобно и чаще всего адрес берется у переменной, объявленной в EEPROM. Код в этом случае будет таким:

где data — переменная объявленная в EEPROM, а & — оператор взятия адреса.

Этот код будет одинаковым для IAR AVR, CodeVison и Atmel Studio, а если оформить его в виде функции, то возникнут отличия.

Для IAR AVR и CodeVision AVR:

Для Atmel Studio:

Вариант функции записи с запрещением прерываний будет выглядеть следующим образом.
Для IAR AVR и CodeVision AVR:

Низкоуровневое чтение из EEPROM на Си

Процедура чтения EEPROM состоит из следующих шагов:

1. Ожидаем готовность EEPROM, опрашивая бит EEWE регистра EECR.
2. Устанавливаем адрес в регистре EEAR.
4. Устанавливаем флаг разрешения чтения EERE регистра EECR
5. Считываем содержимое регистра данных EEDR

На Си описанная последовательность будет выглядеть так:

Доступ к объявленной в EEPROM переменной:

Код оформленный в виде функции будет выглядеть следующим образом.
Для IAR AVR и CodeVision AVR:

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: