|
|
  |
Запись в EEPROM с протоколом |
|
|
|
May 5 2011, 11:02
|
Участник

Группа: Участник
Сообщений: 49
Регистрация: 15-10-07
Из: г.Екатеринбург
Пользователь №: 31 379

|
Цитата(GDI @ May 5 2011, 16:59)  Настройки записываются в одно и то же место или Вы храните некую историю настроек и потому данные могут располагаться по разным адресам ЕЕПРОМ? В разных местах, чтобы в случае ошибки чтения можно было сделать откат на предыдущие настройки.
|
|
|
|
|
May 5 2011, 11:34
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

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

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(Oleg_DI @ May 5 2011, 14:53)  В любом моём приборе требуется сохранение настроек пользователя, имеем блок данных которые требуется сохранить.В одних приборах используется внутренняя ЕЕПРОМ в других внешняя FROM.Но каждое сохранение записывается с протоколом.Сейчас я беру за основу протокол для UART там байт начала байт команды кол байт блок данных контрольная сумма.Раз протокол для UART то там много дополнительного.Вот я и спрашивал кто как делает в этих случаях. Да о чём мы говорим ! Это всего лишь EEPROM. Применять к ней протоколы сЕти , это нонсенс. Только "утяжеление" программы. Есть данные , которые пишутся и которые можно считать с EEPROM после записи . Сравнил данные и успокоился. Даже CRC считать и то - деньги на ветер. К тому же совершенно не понятно , ну записалось не то , дальше чё? Надо ещё тупо вычислить , что не прошло - кодовое слоао , команда, данные или "битая" ячейка EEPROM. Не тот случай , что бы страховаться по полной. И надо же было найти самое "быстродейсвующее" в мире устройство , что бы "напрячь" МК по полной
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
May 6 2011, 07:01
|
Участник

Группа: Участник
Сообщений: 49
Регистрация: 15-10-07
Из: г.Екатеринбург
Пользователь №: 31 379

|
Спасибо!Идеи Уважаемых ILYAUL и GDI очень понравились.Хочу написать функцию где оба способа реализованы.Запись с протоколом это быстрая запись плюнул в функцию, записал и больше не заморачиваешся полетел дальше.А второй способ неторопливый ,записал сравнил если ошибка снова записал,можно сделать несколько таких циклов.При этом способе возможен быстрый старт устройства так как не надо проверять достоверность данных.Эти данные всегда верны.
|
|
|
|
|
May 6 2011, 07:11
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата(Oleg_DI @ May 6 2011, 11:01)  Эти данные всегда верны. Вот как раз в еепром, да и любых других вариантах non-volatile ROM, данные могут побиться, пролетело нейтрино и изменило состояние ячейки. Просто явление это редкое и стоит ли так бороться за целостность данных? Лично я никогда такого не делал. Но, на другом форуме, встречал человека который говорил что его приборы настолько надежные, что он хранит 2 копии программы во флеше с контрольной суммой и во время работы ее периодически сверяет и, если что, перезагружается из другой копии. Видно ему это было надо, а для сторонних посетителей форума, его рассуждения выглядели как параноидальный бред. В общем, всё зависит от задачи, путей решения множество - выбирайте и реализуйте.
--------------------
|
|
|
|
|
May 20 2011, 11:33
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Integral @ May 4 2011, 04:24)  поетому для меня в хорошем стиле программирования должны отключатся прерывания на момент записи в еепром Уважаемый, шли бы вы со своим хорошим стилем проповедовать на anekdots.ru, а не на форумах electronix. Запись одного байта в eeprom может длиться до 10 __миллисекунд__ (это примерно 100 символов на 115200), если на это время блокировать все прерывания, все функции устройства отключатся и может потеряться например контрольный пакет данных, важный входной импульс, измерение, или еще чего. Если Вы этого не понимаете, то лучше сюда вообще ничего не постить. На тему, когда, и зачем, нужно запрещать прерывания, для успешной записи в eeprom - курите даташит. Защитить нужно только timed sequence - две идущих подряд инструкции - установка флага EEMWE, и затем установка флага EEWE в регистре EECR. Всё. Цитата кому интересно роскажу ... по приреванич??? "роскажу" вам дети байку, я про зайку однояйку, и про ж.л.глазку "роскажу" вам дети сказку. В детцкий сад, пожалуйста, с такими рассказами.
|
|
|
|
|
May 20 2011, 13:17
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Oleg_DI @ May 5 2011, 13:53)  В любом моём приборе требуется сохранение настроек пользователя, имеем блок данных которые требуется сохранить.В одних приборах используется внутренняя ЕЕПРОМ в других внешняя 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;
|
|
|
|
|
May 23 2011, 04:17
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 24-02-09
Из: Екатеринбург
Пользователь №: 45 296

|
CRC -- это надёжно. Но если CRC защищает большую струкутру, то поле CRC обновляется гораздо чаще, чем любое другое поле структуры. Поэтому я выбрал вариант, когда в структуре из 5 байтов хранится только одно 16-разрядное значение. В контрольный байт пишу флаг верной копии 0x00/0xFF (и ресурс по записи в структуру ограничен ресурсом информационных байтов).
Илья
|
|
|
|
|
May 23 2011, 06:10
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 17-08-07
Пользователь №: 29 855

|
Mega8A, бытовой градусник наружной температуры с часами, датчик DS18B20 на 10м кабеле, кабель проходит через ферритовое колечко 5вит. В EEPROM коэффициент датчика, месяц градусник поработал и EEPROM слетел, пришлось переписать во флеш. В программе было одно единственное обращение к EEPROM при старте программы. Питание +5В и резервное литиевая батарейка через Шоттки, т.е. меньше 3В никак не должно падать. Батарейка работает исключительно на Mega8A, все остальные части схемы при этом отсекаются диодами, поэтому вряд ли могла возникнуть сильная просадка на батарее, тем более работа без сети - это штатный режим, сеть за месяц выключалась несколько раз и проблем не было. Блок питания - старая трансформаторная зарядка от нокии. Грешу на какие-то электромагнитные помехи и электростатические разряды (может и гроза была где-то рядом может у кого-то из соседей частотник в стиралке барахлит или накрылся и т.д. и т.п.). Замечу, что при сильной статике были случаи, что и флеш полностью стиралась, как будто там программы и не было (желающие могут поиграться электрошокером просто рядом с контроллером).
|
|
|
|
|
May 23 2011, 12:59
|
Профессионал
    
Группа: Свой
Сообщений: 1 508
Регистрация: 26-06-06
Из: Киев
Пользователь №: 18 364

|
Цитата Замечу, что при сильной статике были случаи, что и флеш полностью стиралась, как будто там программы и не было (желающие могут поиграться электрошокером просто рядом с контроллером).  Игрался и шокером, и разрядником, и жужжащим контактором... Все работает как часы. Собственно и часы там также работают. Еще добавлю - там кондерный БП так что МК не имеет гальваноразвязки от сети. И все работает. Несколько лет. ЗЫ. Причем замечено, что DS18B20 при том уровне помех временами подвисал. ЗЗЫ. И работают тысячи блоков. Правда там AtMega48 или AtTiny26. Но по опыту Mega8a не менее устойчива чем AtMega48. А уж " и флеш полностью стиралась" это вообще что-то из области ... Цитата Скорее всего, это у Вас разводка платы сделана плохо, раз сбоит от ЭМП и память стирается. С вероятностью 90%. Еще 10% - где-то явный ляп со схемой питания процессора.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|