Не целы числа в EEPROM

Тема в разделе "Arduino & Shields", создана пользователем avgaz, 21 ноя 2015.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Я бы не морочился - умножил бы на 10/100/1000 и - в еепром. Главное не забыть разделить "взад". Плавающая арифметика дофига жрет памяти. А больше двух знаков после запятой - оно и редко надо.
     
    Simon и Daniil нравится это.
  2. akl

    akl Гуру

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

    но если количество знаков после запятой четко определено, то конечно лучше тупо умножить на нужное количество порядков и орудовать как с целыми
     
    Последнее редактирование: 27 июн 2020
  3. Asper Daffy

    Asper Daffy Иксперд

    Может, я подробностей не знаю.

    Там с EEPROM была ещё одна проблема (она описана в ERRATA многих даташитов). Если использовать для записи бита EERE команды STS или ST, то возникает левое прерывание (см, например даташит на ATMEGA32A или просто поищи по фразе "Reading EEPROM by using ST or STS to set EERE bit triggers unexpected interrupt request" - там куча даташитов вылезет).

    Ошибка не исправлена до сих пор. ERRATA советует использовать команды OUT и SBI, но тут засада - в библиотеке от производителя долгое время использовалась именно ST, потом поменяли, но старые библиотеки гуляют везде и проблема целиком не ушла.
     
  4. SergeiL

    SergeiL Оракул Модератор

    Посмотрел. Спасибо!

    Да это в общем то вопрос был к @parovoZZ, он же у нас только учебник и даташит считает правильным источником, а тут инфа из интернета.
    Как то не серьезно. :)

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

    Посмотрел фьюзы на двух оригинальных платах, Мега2560 и Леонарда ETH.
    BODLEVEL установлен на 2,7В и 2,6В соответственно. Причем у обеих плат частота 16МГц.
    При такой частоте питание должно быть в диапазоне 4,5-5,5В.
    Корректно ли будут выбираться команды из памяти программ при 16МГц и питании 2,7В - неизвестно.
    Если команды будут читаться с ошибками, возможно, процессор, молотя по некорректно считанным командам, может испортить и данные в EEPROM.

    Мы в свое время на 8051 с внешней памятью с этим сталкивались. Приходилось ставить супервайзеры питания отслеживающие рабочий диапазон напряжения и формирующие Reset процессора. Это было еще до AVR. В AVR появился встроенный BOD.
    Я Ардуино ИДЕ первый раз поставил только в 2015-ом году, до этого для AVR писал под ICC, Atmel Studio.
    Всегда включал BOD и ни разу не сталкивался с проблемой порчи данных в EEPROM.
     
  5. parovoZZ

    parovoZZ Гуру

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

    Запись в EEPROM происходит при напряжении на затворах в 12 вольт. Такое напряжение формирует контроллер EEPROM. И где-то я видел рекомендацию, что при работе с EEPROM желательно обеспечить уровень напряжения не ниже определённого. Но вот никак не вспомню, где это я видел.