Перейти к содержанию
    

Запись в EEPROM с протоколом

Настройки записываются в одно и то же место или Вы храните некую историю настроек и потому данные могут располагаться по разным адресам ЕЕПРОМ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы сделал несколько массивов по определенным адресам, или, вернее это были бы структуры данных описывающие Ваши настройки, которые нужно сохранять, для записи я бы добавил к ним еще поле, размером 4 байта, в котором можно хранить инкрементируемый номер, чтобы можно было прочитать номера всех записей и выбрать наибольший. Еще, если Вы хотите, можно добавить поле с контрольной суммой. В процессе работы эту структуру надо хранить в RАМе, и подгружать из еепрома в момент включения, а запись в еепром делать по нажатию кнопки "сохранить" в меню настроек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ресурс записи у ЕЕПРОМ составляет, как минимум, 100000 циклов, не думаю, что пользовательские настройки будут меняться часто, так что о ресурсе тут даже и не стоит заботиться. Прикинуть ресурс можно, получив при этом сотни лет, а потом успокоиться по этому поводу навсегда :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В любом моём приборе требуется сохранение настроек пользователя, имеем блок данных которые требуется сохранить.В одних приборах используется внутренняя ЕЕПРОМ в других внешняя FROM.Но каждое сохранение записывается с протоколом.Сейчас я беру за основу

протокол для UART там байт начала байт команды кол байт блок данных контрольная сумма.Раз протокол для UART то там много дополнительного.Вот я и спрашивал кто как делает в этих случаях.

Да о чём мы говорим ! Это всего лишь EEPROM. Применять к ней протоколы сЕти , это нонсенс. Только "утяжеление" программы. Есть данные , которые пишутся и которые можно считать с EEPROM после записи . Сравнил данные и успокоился. Даже CRC считать и то - деньги на ветер. К тому же совершенно не понятно , ну записалось не то , дальше чё? Надо ещё тупо вычислить , что не прошло - кодовое слоао , команда, данные или "битая" ячейка EEPROM. Не тот случай , что бы страховаться по полной. И надо же было найти самое "быстродейсвующее" в мире устройство , что бы "напрячь" МК по полной

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо!Идеи Уважаемых ILYAUL и GDI очень понравились.Хочу написать функцию где оба способа реализованы.Запись с протоколом

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

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

так как не надо проверять достоверность данных.Эти данные всегда верны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эти данные всегда верны.
Вот как раз в еепром, да и любых других вариантах non-volatile ROM, данные могут побиться, пролетело нейтрино и изменило состояние ячейки. Просто явление это редкое и стоит ли так бороться за целостность данных? Лично я никогда такого не делал. Но, на другом форуме, встречал человека который говорил что его приборы настолько надежные, что он хранит 2 копии программы во флеше с контрольной суммой и во время работы ее периодически сверяет и, если что, перезагружается из другой копии. Видно ему это было надо, а для сторонних посетителей форума, его рассуждения выглядели как параноидальный бред. В общем, всё зависит от задачи, путей решения множество - выбирайте и реализуйте.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поетому для меня в хорошем стиле программирования должны отключатся прерывания на момент записи в еепром

Уважаемый, шли бы вы со своим хорошим стилем проповедовать на anekdots.ru, а не на форумах electronix.

Запись одного байта в eeprom может длиться до 10 __миллисекунд__ (это примерно 100 символов на 115200), если на это время блокировать все прерывания, все функции устройства отключатся и может потеряться например контрольный пакет данных, важный входной импульс, измерение, или еще чего. Если Вы этого не понимаете, то лучше сюда вообще ничего не постить.

 

На тему, когда, и зачем, нужно запрещать прерывания, для успешной записи в eeprom - курите даташит. Защитить нужно только timed sequence - две идущих подряд инструкции - установка флага EEMWE, и затем установка флага EEWE в регистре EECR. Всё.

 

 

кому интересно роскажу

... по приреванич???

"роскажу" вам дети байку,

я про зайку однояйку,

и про ж.л.глазку

"роскажу" вам дети сказку.

 

В детцкий сад, пожалуйста, с такими рассказами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В любом моём приборе требуется сохранение настроек пользователя, имеем блок данных которые требуется сохранить.В одних приборах используется внутренняя ЕЕПРОМ в других внешняя FROM.... Вот я и спрашивал кто как делает в этих случаях.

Я делаю всегда так.

 

Конфигурационная структура, которая лежит в ОЗУ всё время жизни устройства.

 

typedef struct tagDEVICE_CONFIG
{
     U8 status;
     <поля данных>
     U32 reserved[ x ];  // <--  резерв для расширения, часто просто padding до кратного странице флеш числа, либо до ближайшего кратного 2^n
     U16 crc16;
} TDEVICE_CONFIG, *PDEVICE_CONFIG;

 

В EEPROM либо FRAM, при сохранении конфигурации пишется всегда две копии по одним и тем же адресам. Далее при включении устройства:

1. в конфигурационную структуру та что в ОЗУ загружаются параметры по-умолчанию;

2. читаются обе копии из EEPROM/FRAM, увеличивается счетчик чтений конфигурации на 1 и проверяется CRC каждой записи;

3. если CRC обеих записей неверная, тогда просто сохраняются параметры по-умолчанию в обе EEPROM записи;

4. если CRC хотя бы одной записи верно, и счетчик чтений конфигурации меньше 3 (трех), тогда данные уцелевшей копии перезаписываются в "битую" копию в EEPROM, и происходит чтение с п.2;

5. если после 3-й попытки восстановить битую запись неудалось в поле status выставляется флажек read-only - запрещающий запись конфигурации, и в структуру в ОЗУ копируется уцелевшая копия.

5. если CRC обеих копий верно, тогда данные любой копии (пусть первой) копируются в структуру в ОЗУ;

6. в процессе работы устройство работает с данными из структуры в ОЗУ, по мере необходимости/обновления в процессе работы устройства вся структура из ОЗУ записывается в обе копии EEPROM (если флажек Read-only в поле статус не установлен).

 

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

 

typedef struct tagDEVICE_CONFIG
{
     U8 status;
     <поля данных>

     U8   new_param1;
     U8   new_param2;
     U16 reserved_U16;

     U32 reserved[ x - 1]  // <--  резерв для расширения
     U16 crc16;
} TDEVICE_CONFIG, *PDEVICE_CONFIG;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В моих устройствах много данных которые необходимо хранить. Использую NVRAM.

Данные разбиты на группы (состояние,события,настройки и.д.).

Размер некоторых групп более 2-х Kб и вероятность выключения питания во время их записи довольно высока.

Если это произошло то необходимо вернуть предыдущие значения (откат).

 

 

Я делаю так:

В памяти присутствуют две копии каждой группы (пусть будет 'A' и 'B').

Каждая группа имеет следующюю структуру :

 

N байт - данные

1 байт - F флаг достоверности(True/False).

4 байта - CRC32 (от начала данных по F включительно)

 

Основная программа меняет поля данных только блока 'A' и при необходимости вызывает процедуру записи.

Процедура записи:

1. F=true в 'A'

2. подсчет и сохранение CRC в 'A'

3. полное копирование 'A' -> 'B'

4. F=false в 'A'

5. Выход

 

При включении вызывается процедура проверки.

Процедура проверки:

Если (F и CRC) в 'A' = true то вызывается процедура записи и выход.

Иначе

Если (F и CRC) в 'B' = true то копируем только поле данных из 'B' в 'A' , процедура записи и выход.

Иначе

Сообщаем главной программе что восстановление не удалось (т.е. Гаплык) и выход.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CRC -- это надёжно. Но если CRC защищает большую струкутру, то поле CRC обновляется гораздо чаще, чем любое другое поле структуры. Поэтому я выбрал вариант, когда в структуре из 5 байтов хранится только одно 16-разрядное значение. В контрольный байт пишу флаг верной копии 0x00/0xFF (и ресурс по записи в структуру ограничен ресурсом информационных байтов).

 

Илья

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Mega8A, бытовой градусник наружной температуры с часами, датчик DS18B20 на 10м кабеле, кабель проходит через ферритовое колечко 5вит. В EEPROM коэффициент датчика, месяц градусник поработал и EEPROM слетел, пришлось переписать во флеш. В программе было одно единственное обращение к EEPROM при старте программы. Питание +5В и резервное литиевая батарейка через Шоттки, т.е. меньше 3В никак не должно падать. Батарейка работает исключительно на Mega8A, все остальные части схемы при этом отсекаются диодами, поэтому вряд ли могла возникнуть сильная просадка на батарее, тем более работа без сети - это штатный режим, сеть за месяц выключалась несколько раз и проблем не было. Блок питания - старая трансформаторная зарядка от нокии. Грешу на какие-то электромагнитные помехи и электростатические разряды (может и гроза была где-то рядом может у кого-то из соседей частотник в стиралке барахлит или накрылся и т.д. и т.п.). Замечу, что при сильной статике были случаи, что и флеш полностью стиралась, как будто там программы и не было (желающие могут поиграться электрошокером просто рядом с контроллером).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорее всего, это у Вас разводка платы сделана плохо, раз сбоит от ЭМП и память стирается. В этом контексте стирание ЕЕПРОМ не кажется чем то экстраординарным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Замечу, что при сильной статике были случаи, что и флеш полностью стиралась, как будто там программы и не было (желающие могут поиграться электрошокером просто рядом с контроллером).

:lol: Игрался и шокером, и разрядником, и жужжащим контактором... Все работает как часы. Собственно и часы там также работают. Еще добавлю - там кондерный БП так что МК не имеет гальваноразвязки от сети. И все работает. Несколько лет.

ЗЫ. Причем замечено, что DS18B20 при том уровне помех временами подвисал.

ЗЗЫ. И работают тысячи блоков. Правда там AtMega48 или AtTiny26. Но по опыту Mega8a не менее устойчива чем AtMega48. А уж " и флеш полностью стиралась" это вообще что-то из области ...

 

Скорее всего, это у Вас разводка платы сделана плохо, раз сбоит от ЭМП и память стирается.

С вероятностью 90%. Еще 10% - где-то явный ляп со схемой питания процессора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...