Защита памяти eeprom

Содержание

Защита памяти eeprom

  • Подключить библиотеку EEPROM.h
  • При запуске: чтение яркости из EEPROM и включение светодиода
  • При клике: запись актуального значения в EEPROM

Сохранение яркости

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

Также в нашем коде есть ещё один неприятный момент: при самом первом запуске после прошивки EEPROM не инициализирована, каждая ячейка хранит в себе число 255, и именно такое значение примет переменная LEDbright после первого запуска, при так называемом “первом чтении”. Здесь это не имеет значения, но в более серьёзном устройстве нужно будет задать нужные значения по умолчанию в EEPROM при первом запуске, об этом мы тоже поговорим ниже. Иначе представьте, какие “настройки по умолчанию” получит ваше устройство для яркости/скорости/громкости/номера режима/прочее!

Полезные трюки

Инициализация

Под инициализацией я имею в виду установку значений ячеек в EEPROM “по умолчанию” во время первого запуска устройства. В рассмотренном выше примере мы действовали в таком порядке:

  1. Чтение из EEPROM в переменную
  2. Использование переменной по назначению

При первом запуске кода (и при всех дальнейших, в которых в ячейку ничего нового не пишется) переменная получит значение, которое было в EEPROM по умолчанию. В большинстве случаев это значение не подойдёт устройству, например ячейка хранит номер режима, по задумке разработчика – от 0 до 5, а из EEPROM мы прочитаем 255. Непорядок! При первом запуске нужно инициализировать EEPROM так, чтобы устройство работало корректно, для этого нужно определить этот самый первый запуск.

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

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

  1. Резервируем какую-нибудь ячейку (например, последнюю) под хранение “ключа” первого запуска
  2. Читаем ячейку, если её содержимое не совпадает с ключом – это первый запуск!
  3. В обработчике первого запуска пишем в ячейку нужный ключ
  4. Пишем в остальные ячейки необходимые значения по умолчанию
  5. И после этого уже читаем данные во все нужные переменные

Рассмотрим на всё том же примере со светодиодом и кнопками:

Сохранение яркости

Теперь при первом запуске мы получим инициализацию нужных ячеек. Если нужно переинициализировать EEPROM, например в случае добавления новых данных, достаточно изменить наш ключ на любое другое значение в пределах одного байта (0-254). Я пишу именно до 254, потому что 255 является значением ячейки по умолчанию и наш трюк не сработает.

Скорость

Как я писал выше, скорость работы с EEPROM составляет:

    Запись/обновление одного байта занимает

3.3 мс (миллисекунды)
Чтение одного байта занимает

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

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

Ещё один удобный хак: можно ввести макросы на чтение и запись определённых значений, например:

Получим удобные макросы, с которыми писать код будет чуть быстрее и удобнее, т.е. строка SET_MODE(3) запишет 3 в ячейку 0

Уменьшение износа

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

  • При нажатии на кнопку:
    • Если флаг опущен – поднять флаг
    • Сбросить таймер
  • Если сработал таймер и флаг поднят:
    • Опустить флаг
    • Записать значения в EEPROM

Посмотрим на всё том же примере:

Сохранение яркости

Вот таким нехитрым способом мы многократно снизили износ EEPROM, я очень часто использую этот “алгоритм” работы с настройками в своих устройствах.

Есть другие задачи, в которых данные в EEPROM пишутся не когда пользователь что-то изменит, а постоянно, т.е. память работает в режиме чёрного ящика и постоянно записывает значения. Это может быть например контроллер печи, который держит температурный режим по специальному закону, и после внезапной перезагрузки должен вернуться к тому месту в процессе, на котором прервался. Тут есть глобально два варианта:

    Ёмкий конденсатор по питанию микроконтроллера, позволяющий сохранить работу МК после отключения питания на время, достаточное для записи в EEPROM (

3.3 мс). Также МК должен знать о том, что общее питание отключилось: если это высокое напряжение (выше 5 Вольт), то это может быть делитель напряжения на аналоговый пин. Если это 5 Вольт – можно измерять напряжение МК, и момент отключения (разрядка конденсатора) тоже можно отловить и записать нужные данные. Можно взвести прерывание, которое сработает при падении напряжения питания ниже опасного уровня. Можно 5 Вольт завести напрямую на цифровой пин, а сам МК питать через диод и поставить конденсатор – тогда напряжение на измеряющем пине пропадёт до того, как отключится МК, он будет работать от конденсатора. Вот схема:

  • Можно писать данные (необязательно один байт, можно целую структуру) хитро, размазывая их по всему EEPROM. Тут глобально два варианта:
    • Писать данные каждый раз в следующую ячейку, и закольцевать переход на первую. Также понадобится хранить где-то счётчик, указывающий на адрес текущей ячейки, и этот счётчик тоже придётся хранить хитро, чтобы он не износил ячейку. Например счётчик – это структура, состоящая из счётчика перезаписей этой структуры и счётчика адреса для большой структуры.
    • Писать данные, пока не достигнут лимит количества перезаписей, количество текущих перезаписей хранить например в этой же структуре. Скажем структура занимает 30 байт, то есть в перспективе мы можем найти эту структуру по адресу, кратному 30. Программа работает, счётчик считает количество перезаписей, при достижении опасного количества вся структура “переезжает” на следующие 30 адресов.
  • Вариантов уменьшения износа ячеек EEPROM можно придумать много, уникально под свою ситуацию. Есть даже библиотеки готовые, например EEPROMWearLevel. Есть очень интересная статья на Хабре, там рассмотрено ещё несколько хороших алгоритмов и даны ссылки на ещё большее их количество.

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

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

    EEPROM (Electrically Erasable Programmable Read-Only Memory)

    Типы компьютерной памяти
    Энергозависимая
    • Современные распространённые типы
      • DRAM (в том числе DDR SDRAM)
      • SRAM
    • Перспективные
      • T-RAM
      • Z-RAM
      • TTRAM
    • Устаревшие типы
      • Память на линиях задержки
      • Запоминающая электростатическая трубка
      • Запоминающая электронно-лучевая трубка
    Энергонезависимая
    • ПЗУ
      • PROM
      • EPROM
      • EEPROM
      • Флеш-память
    • Первые разработки
      • FRAM
      • MRAM
      • PRAM
    • Перспективные
      • CBRAM
      • SONOS
      • RRAM
      • Беговая память (Racetrack)
      • Nano-RAM
      • Millipede
    • Устаревшие типы
      • Магнитный барабан
      • Память на магнитных сердечниках
      • Память на магнитной проволоке
      • ЦМД
      • Память на твисторах

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

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

    Читайте также:  Классы приборов по электробезопасности

    Содержание

    История

    Элай Харари в 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 памятью представляет собой гибрид программирования с помощью инжекции горячих носителей и стирания с помощью автоэлектронной эмиссии.

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

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

    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.

    127 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

    Эта статья содержит краткое описание популярных семейств микросхем энергонезависимой памяти, т.е. памяти, способной хранить информацию в отсутствие электропитания. Довольно часто, в качестве обобщенного названия этого класса микросхем используют аббревиатуру “ПЗУ” – Постоянное Запоминающее Устройство (по англ. ROM – Read Only Memory – память только для чтения). Следует заметить, что это не совсем корректно. Первые, наиболее старые представители энергонезависимой памяти, действительно использовались в аппаратуре только в режиме чтения, а их запись (программирование) осуществлялась либо в процессе изготовления кристалла, либо перед установкой в аппаратуру с помощью довольно сложного прибора – программатора. В дальнейшем, по мере совершенствования технологии производства и упрощения методов и алгоритмов записи, их современные модификации все чаще стали использовать в приборах и устройствах в режимах записи, стирания и перезаписи. Например, в модулях фискальной памяти кассовых аппаратов, в них заносится итоговая информация о дневной выручке и количестве покупок. В телевизорах ПЗУ используют для хранения различных настроек, а в телефонных аппаратах – для хранения и быстрого набора часто используемых телефонных номеров (записная книжка). Все эти применения противоречат самому смыслу понятия “память только для чтения”. Попытки устранить это противоречие привели к обрастанию аббревиатуры “ПЗУ” уточняющими приставками: ППЗУ – программируемые ПЗУ, СППЗУ – стираемые ППЗУ, РПЗУ – репрограммируемые ПЗУ (PROM – Programmable ROM, EPROM – Erasable PROM, EEPROM – Electrically Erasable PROM) и т.д. Однако, наиболее точным обобщающим названием этого класса приборов является “энергонезависимая память”. Этого понятия, применяя сокращение ЭП, мы и будем придерживаться в данной статье.

    MaskROM – Масочные ПЗУ

    Это наиболее старое семейство микросхем ЭП. Информация в такую память заноситься в процессе изготовления кристалла и в дальнейшем не может изменяться. Многолетняя популярность MaskROM обуславливалась низкой ценой при крупносерийном производстве. В настоящее время, в связи с резким снижением цен на программируемую и перепрограммируемую память, применяются редко. Наиболее распространенные микросхемы этого семейства – серия 23xxx.

    PROM – Программируемые ПЗУ

    Первыми программируемыми ПЗУ, пришедшими на смену MaskROM, стали микросхемы памяти на базе плавких перемычек (например, распространенные десять лет назад отечественные серии К556 и К1556). Возможность самостоятельной записи информации в них делало их пригодными для штучного и мелкосерийного производства. Наиболее существенными недостатками были большой процент брака и необходимость специальной длительной термической тренировки, без которой надежность хранения данных была невысокой. В настоящее время, также почти не применяются.

    Различные источники по разному расшифровывают аббревиатуру EPROM – Erasable Programmable ROM или Electrically Programmable ROM (стираемые программируемые ПЗУ или электрически программируемые ПЗУ). Обычно, так называют популярные микросхемы серии 27xxx (отечественный аналог – серия К573).
    Основу этой серии составляют ПЗУ, стираемые ультрафиолетовым излучением. Корпуса таких микросхем имеют окно из кварцевого стекла. Данные хранятся в виде зарядов плавающих затворов МОП-транзисторов, упрощенно говоря, представляющих собой конденсаторы с очень низкой утечкой заряда.
    Многие производители памяти выпускают серию 27xxx также в исполнении “OTP” – One Time Programmable – однократно программируемые (те же кристаллы, но в дешевом пластиковом корпусе без кварцевого окна).
    В последнее время получили широкое распространение электрически стираемые модификации EPROM производства фирм Winbond и SST, также выпускаемые в пластиковых корпусах.

    Главной отличительной особенностью Flash (FlashROM, Flash-memory, Flash-память) и EEPROM (Electrically Erasable Programmable ROM – электрически стираемые ППЗУ) от других микросхем ЭП является возможность их перепрограммирования при подключении к стандартной системной шине микропроцессорного устройства. Для Flash перед записью требуется выполнить стирание (полное или поблочное), а для EEPROM стирание каждой ячейки выполняется автоматически при записи в нее новой информации, т.е. можно изменить данные в любой ячейке, не затрагивая остальных.
    Существуют микросхемы Flash-памяти с автоматическим постраничным автостиранием и очень мелкой разбивкой на страницы, что приближает их по возможностям к EEPROM.
    Широко применяются также Flash и EEPROM с доступом к информации по последовательному каналу (Serial Flash, Serial Data Flash, Serial EEPROM или SEEPROM). В этом случае, адреса, данные и управляющие команды передаются последовательно побитно по одному проводу и синхронизируются импульсами на тактовом входе. При этом используются различные последовательные шины (2-х, 3-х и 4-х проводные), как стандартные, так и нестандартные, чаще всего I2C, Microwire, SPI и др. Преимущество последовательных микросхем в малых габаритах и минимальном количестве линий ввода-вывода, необходимых для их подключения к микропроцессору или микроконтроллеру, хотя скорость обращения к ним значительно ниже. Подавляющее большинство последовательных EEPROM выполнены в 8-выводных корпусах.
    Самые распространенные серии Flash – 28Fxxx, 29F/C/EExxx, 39SFxxx (параллельные), 45Dxxx (последовательные), EEPROM – 28Cxxx (параллельные), 24Cxxx, 93Cxxx, 25Cxxx (последовательные).

    Читайте также:  Подбор светодиодов для светильников

    Non-volatile RAM (NVRAM), FRAM

    Понятие “Энергонезависимое ОЗУ” (Non-volatile RAM или NVRAM) включает в себя несколько подсемейств памяти. Все они отличаются от других видов ЭП моментальной записью. Поэтому, вместо термина “программирование”, по отношению к этим микросхемам обычно применяют термин “запись”.
    Первая разновидность NVRAM представляет собой обычные статические ОЗУ со встроенным элементом питания (чаще всего литиевым) и усиленной защитой от искажения информации в момент включения и выключения питания. Важным преимуществом этих микросхем является неограниченное количество циклов перезаписи (для EPROM, Flash и EEPROM оно обычно составляет от одной тысячи до 100 миллионов). Мировым лидером производства такой памяти является фирма Dallas Semiconductor.
    Другой разновидностью NVRAM являются микросхемы, содержащие на одном кристалле энергозависимое ОЗУ (RAM) и резервную EEPROM-память, с возможностью сохранения (копирования) содержимого ОЗУ в EEPROM и обратного восстановления данных из EEPROM в ОЗУ. Многие из этих микросхем имеют функцию автоматического восстановления данных из EEPROM в ОЗУ при включении питания. Подразделяются на последовательные и параллельные.
    Новое поколение NVRAM, при изготовлении которых используются самые современные технологии с применением материалов – ферроэлектриков (FRAM), не требуют для хранения информации никакого элемента питания, сохраняя все остальные свойства обычных ОЗУ. Часто выпускаются в виде микросхем, полностью совместимых по расположению выводов, алгоритмам и протоколам, и даже совпадающие по маркировке с последовательными и параллельными EEPROM. Примером может служить серия 24Cxx фирмы Ramtron. Количество циклов перезаписи для FRAM обычно составляет 10 миллиардов.

    Внутренняя память микроконтроллеров

    Большинство современных микроконтроллеров имеют встроенную энергонезависимую память программ (MaskROM, OTP EPROM, Flash или EEPROM), а многие – также дополнительную память данных (EEPROM или Flash). Все вышеописанные свойства этих видов ЭП относится и к встроенной памяти микроконтроллеров.
    Фирма Atmel использует для своих программируемых в процессе производства и однократно программируемых пользователем микроконтроллеров термин QuickFlash. По своим свойствам такая память полностью соответствует MaskROM или OTP EPROM.
    Понятие FlexROM используется фирмой Microchip для обозначения программируемых в процессе изготовления PIC-контроллеров. Аналогично MaskROM.

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

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

    Когда вы записываете данные, время летит быстро

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

    Но проблема в том, что EEPROM имеет ограниченный ресурс числа записей. После 100,000 или миллиона записей (зависит от конкретного чипа), некоторые из ваших систем начнут испытывать проблемы с отказом EEPROM. (Посмотрите в даташит, чтобы узнать конкретную цифру. Если вы хотите выпустить большое число устройств, «наихудший случай», вероятно, более важен чем «типичный»). Миллион записей кажется большой цифрой, но на самом деле он закончится очень быстро. Давайте посмотрим на примере, предположив, что нам нужно сохранять измеренное напряжение в одну ячейку каждые 15 секунд.

    1,000,000 записей при одной записи в 15 секунд дают записи в минуту:
    1,000,000 / ( 4 * 60 минут/час * 24 часа/день ) = 173.6 дней.
    Другими словами, ваша EEPROM исчерпает резерв в миллион записей менее чем через 6 месяцев.

    Ниже приведен график, показывающая время до износа (в годах), основанный на периоде обновления конкретной ячейки EEPROM. Ограничительная линия для продукта с продолжительностью жизни 10 лет составляет одно обновление каждые 5 минут 15 секунд для микросхемы с ресурсом 1 миллион записей. Для EEPROM с ресурсом 100К можно обновлять конкретную ячейку не чаще одного раза в 52 минуты. Это означает, что не стоит и надеяться обновлять ячейку каждые несколько секунд, если вы хотите, чтобы ваш продукт работал годы, а не месяцы. Вышесказанное масштабируется линейно, правда, в настоящем приборе имеются еще и вторичные факторы, такие как температура и режим доступа.

    Уменьшить частоту

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

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

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

    Кольцевой буфер

    Классическое решение проблемы износа-использовать кольцевой буфер FIFO, содержащий N последних записей значения. Так-же понадобится сохранять указатель на конец буфера в EEPROM. Это уменьшает износ EEPROM на величину, пропорциональную числу копий в этом буфере. Например, если буфер проходит через 10 различных адресов для сохранения одного значения, каждая конкретная ячейка модифицируется в 10 раз реже, и ресурс записи возрастает в 10 раз. Вам также понадобится отдельный счётчик или отметка времени для каждой из 10 копий, чтобы можно было определить, которая из них последняя на момент выключения. Другими словами, понадобится два буфера, один для значения, и один для счетчика. (Если сохранять счетчик по одному и тому-же адресу, это приведёт к его износу, т.к. он должен увеличиваться при каждом цикле записи.) Недостаток этого метода в том, что нужно в 10 раз больше места чтобы получить в 10 раз большую продолжительность жизни. Можно проявить смекалку, и упаковать счетчик вместе с данными. Если вы записываете большое количество данных, добавление нескольких байт для счетчика — не такая уж большая проблема. Но в любом случае, понадобится много EEPROM.
    Atmel приготовил аппноут, содержащий все кровавые подробности:
    AVR-101: High Endurance EEPROM Storage: www.atmel.com/images/doc2526.pdf

    Особый случай для счётчика числа записей

    Иногда нужно сохранить счётчик, а не сами значения. К примеру, вы можете хотеть знать число включений прибора, или время работы вашего устройства. Самое плохое в счётчиках, это то, что у них постоянно меняется младший значащий бит, изнашивая младшие ячейки EEPROM быстрее. Но и тут возможно применить некоторые трюки. В аппноуте от Microchip есть несколько умных идей, таких как использование кода Грея, чтобы только один бит из многобайтового счётчика менялся при изменении значения счетчика. Также они рекомендуют использовать корректирующие коды для компенсации износа. (Я не знаю, насколько эффективно будет применение таких кодов, т.к. это будет зависеть от того, насколько независимы будут ошибки в битах в байтах счётчика, используйте на свой страх и риск, прим. авт.). Смотри аппноут: ww1.microchip.com/downloads/en/AppNotes/01449A.pdf

    Примечание: для тех, кто хотел бы узнать больше, Microchip подготовил документ, содержащий детальную информацию об устройстве ячеек EEPROM и их износе с диаграммами:
    ftp.microchip.com/tools/memory/total50/tutorial.html

    Дайте мне знать, если у вас имеются какие-либо интересные идеи по поводу борьбы с износом EEPROM.

    Примечание переводчика: в последние годы появились микросхемы EEPROM со страничной организацией стирания (подобной микросхемам FLASH), где логически можно адресовать ячейки (читать, записывать и стирать) побайтно, но при этом микросхема невидимо для пользователя стирает всю страницу целиком и перезаписывает новыми данными. Т.е. стерев ячейки по адресу 0, мы фактически стёрли и перезаписали ячейки с адресами 0. 255 (при размере страницы 256 байт), поэтому трюк с буфером в этом случае не поможет. При исчерпании ресурс записей у такой микросхемы выходит из строя не одна ячейка, а вся страница целиком. В даташитах для таких микросхем ресурс записи указан для страницы, а не для конкретной ячейки. Смотри, например, даташит на 25LC1024 от Microchip.

    Рейтинг
    ( Пока оценок нет )
    Загрузка ...
    Adblock
    detector