Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: слетает память у Atmega16
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
messenger
Сталкнулся с проблемой у AtMega16.
Два устройств из партии 18 шт. первое где то через год, второе через 3 года перестали правильно работать.
Причина оказалась в том, что изменилось содержание памяти.
В ПО функции записии есть но они используются один раз при выпуске (калибровочные константы) и в процессе эксплуатации выполнить запись в
память нельзя - стоит проверка кодовым словом.
Одна константа стала близкой к 0, втора и вовсе не читается (из ПО).
Из за чего мог произойти сбой? Каие есть способы понять что случилось, если значения параметров хранящихся в памяти всех приборах разные?
ПО разрабатывалось в СodeVision.
Подскажите кто значет. Спаибо.
kovigor
Цитата(messenger @ Sep 27 2013, 21:00) *
Из за чего мог произойти сбой?

С питанием что-то. Или иголочки в линии питания, или незадемпфирована первичка сетевого трансформатора на 50 Гц, питающего устройство. Еще вариант - висящие в воздухе и в программе оставленные "на произвол судьбы" неиспользуемые выводы JTAG или GPIO (их надо бы настроить на вывод лог. нуля) ...
aaarrr
Цитата(messenger @ Sep 27 2013, 22:00) *
Одна константа стала близкой к 0, втора и вовсе не читается (из ПО).

То есто ПО цело, а изменились константы, записанные при производстве?
messenger
Цитата(aaarrr @ Sep 27 2013, 23:25) *
То есто ПО цело, а изменились константы, записанные при производстве?

так и есть, ПО рабочее
примечание: константы питались из ПО
питание 5V от USB
aaarrr
Цитата(messenger @ Sep 27 2013, 22:00) *
Одна константа стала близкой к 0, втора и вовсе не читается (из ПО).

Можно пояснить, что значит "не читается"? И что случилось с остальными данными той же страницы?
kovigor
Цитата(messenger @ Sep 27 2013, 23:53) *
питание 5V от USB

Схемку питания покажите ...
aaarrr
Цитата(kovigor @ Sep 28 2013, 01:31) *
Схемку питания покажите ...

Питание питанием, да откуда "иголочке" знать, где код, а где константы? Разве что в момент записи последних с питанием что-то было не так, что сказалось спустя время.
kovigor
Цитата(aaarrr @ Sep 28 2013, 00:35) *
да откуда "иголочке" знать, где код, а где константы?

Согласен. Еще бы уточнить, где эти константы записаны - во Flash или в EEPROM. Впоследнем случае из-за ошибки в программе прибор может вместо одной записи константы эту самую запись зациклить, в результате EEPROM портится ...
messenger
Цитата(kovigor @ Sep 28 2013, 01:51) *
Согласен. Еще бы уточнить, где эти константы записаны - во Flash или в EEPROM. Впоследнем случае из-за ошибки в программе прибор может вместо одной записи константы эту самую запись зациклить, в результате EEPROM портится ...

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

Питание прямо от USB. Паралельно 0,1 мкФ.
Santy
Рекомендуется хранить константы во FLASH- памяти, если они не меняются во время работы программы.
Меры предосторожности при работе с EEPROM хорошо написаны например в книге А.В. Евстефеев "Микроконтроллеры AVR семейств Tiny и Mega фирмы Atmel" см. стр 41.
messenger
При включении прибор читает данные из EEPROM во Flash и работает в процессе только с Flash. В процессе работы прибора запись в EEPROM не проводится.

Книгу обязательно посмотрю.
WHALE
Цитата(messenger @ Sep 28 2013, 13:03) *
При включении прибор читает данные из EEPROM во Flash и работает в процессе только с Flash. В процессе работы прибора запись в EEPROM не проводится.


читает данные из EEPROM во Flash-это навеное очепятка,а вы имели в виду вместо Flash ОЗУ?
ArtemKAD
Цитата(messenger @ Sep 27 2013, 23:53) *
так и есть, ПО рабочее
примечание: константы питались из ПО

Вот с этого и надо было начинать...


Цитата
В процессе работы прибора запись в EEPROM не проводится.

А когда и чем производится? В программе есть хоть одна процедура записи в eeprom ?
zombi
Цитата(messenger @ Sep 28 2013, 09:42) *
Записаны в EEPROM. Один раз при выпуске. Доступ к этой функции пользователю закрыт.

Каким образом закрыт? А может кто случайно (нарочно) открыл
ArtemKAD
Цитата
Доступ к этой функции пользователю закрыт.

Это как? Процедура в программе есть или ее нет? Как определяется "Один раз при выпуске."
Santy
Цитата(ArtemKAD @ Sep 28 2013, 13:25) *
Это как? Процедура в программе есть или ее нет? Как определяется "Один раз при выпуске."


Может быть подпрограмма для записи в EEPROM, которую можно вызвать только 1 раз.
ArtemKAD
Для того, что-бы "можно вызвать только 1 раз" нужен энергонезависимый признак того, что этот 1 раз уже был. Вопрос и состоит в том, что это за признак?
Santy
Цитата(ArtemKAD @ Sep 28 2013, 15:06) *
Для того, что-бы "можно вызвать только 1 раз" нужен энергонезависимый признак того, что этот 1 раз уже был. Вопрос и состоит в том, что это за признак?


Например, число читаемое из EEPROM.
kovigor
Цитата(Santy @ Sep 28 2013, 13:52) *
Может быть подпрограмма для записи в EEPROM, которую можно вызвать только 1 раз.

Раз такая подпрограмма есть, значит ее можно вызвать. Сценарий: забыли включить (или намеренно не включили) супервизор. Тогда при снижении питания программа вполне может сбиться, и не исключено, что управление получит эта самая разрушительная подпрограмма. Тот же эффект можно получить, если в программе переполняется стек. Раз в год, как говорится, и палка стреляет sm.gif
messenger
В программе есть код записи данных в память:
команда на запись с ПК;
устройство получает данные с ПК;
проверяем "кодовое слово"
если оно совпало, перезаписывем полученные данные в память.
Думаете есть вероятность того, что при подаче вполне определенных команд появилоась помеха начинающаяся командой и заканчивающаяся кодовым словом? Наверно есть, но маленькая.


kovigor
Цитата(messenger @ Sep 28 2013, 16:16) *
Думаете есть вероятность того, что при подаче вполне определенных команд появилоась помеха начинающаяся командой и заканчивающаяся кодовым словом?

Есть, безусловно. Если в программу заложена подобная "бомба замедленного действия", то она, как правило, взорвется, рано или поздно. CRC всей командной посылки и блока данных, включая кодовое слово, как я понял, не проверяется ?
krux
какой-нибудь M103С fuse?
ArtemKAD
Цитата
если оно совпало, перезаписывем полученные данные в память.
Думаете есть вероятность того, что при подаче вполне определенных команд появилоась помеха начинающаяся командой и заканчивающаяся кодовым словом? Наверно есть, но маленькая.

Достаточно отключенного BOR-а и вероятность начала программы после "если оно совпало" будет далека от нулевой.
messenger
Какая бомба? Обычная программа. Без фанатизма.

to ArtemKAD - подскажите, что такое BOR-а? если сброс по снижению питания, то он установлен на 4V.
kovigor
Цитата(messenger @ Sep 28 2013, 23:42) *
Какая бомба? Обычная программа. Без фанатизма.

Вы про защиту команд и данных с помощью CRC так и не ответили. Есть она ? Если нет, то банальный "мусор", принимаемый при переключении разъемов или плохом контакте в них может дать самые неожиданные и загадочные эффекты ...
ArtemKAD
Brown-Out Reset
messenger
Цитата(kovigor @ Sep 29 2013, 01:00) *
Вы про защиту команд и данных с помощью CRC так и не ответили. Есть она ? Если нет, то банальный "мусор", принимаемый при переключении разъемов или плохом контакте в них может дать самые неожиданные и загадочные эффекты ...

такое кодирование не делаю
kovigor
Цитата(messenger @ Sep 29 2013, 12:51) *
такое кодирование не делаю

Тогда все ясно ...
ARV
Цитата(kovigor @ Sep 29 2013, 16:04) *
Тогда все ясно ...

да ничего на самом деле не ясно. в практике с AT89S53 у меня был пренеприятный случай, когда в процессе эксплуатации с периодичностью примерно раз в 4-6 месяцев в EEPROM слетала 1 ячейка - строго определенная, и слетала всегда в строго определенное значение. Процедур записи в эту ячейку в коде не было вообще - EEPROM писалась 1 раз программатором, в коде только чтение.

никакие аппаратные меры не помогали. после долгих мытарств пришлось уйти на AVR и для страховки писать все настроечные константы во FLASH - помогло.

в случае топикстартера могу порекомендовать 2 варианта борьбы с бедой:


1. хранить в EEPROM 3 копии калибровочных констант, при старте программы считывать по мажоритарному принципу.

2. поступить так, как сделал я: калибровочные константы писать только программатором во FLASH, исключив из кода принципиальную возможность записи.

Harbinger
Писать калибровки во Flash без возможности изменения не всегда получится - они могут настраиваться в процессе регулировки изделия.
Поступал следующим образом. В EEPROM хранится несколько копий массива калибровочных параметров, защищённых CRC. При старте проверяются все копии. Если CRC в порядке, калибровки считываются в ОЗУ и переходим в штатный режим работы. В случае повреждения какой-либо копии массива она восстанавливается из неповреждённой. Если же совсем "всё пропало" - EEPROM переписывается из FLASH "среднепотолочными" значениями и выставляется признак, что устройство не настроено. Автоматически получается инициализация EEPROM при первом запуске.
Santy
Цитата(Harbinger @ Sep 30 2013, 07:39) *
Писать калибровки во Flash без возможности изменения не всегда получится - они могут настраиваться в процессе регулировки изделия.
Поступал следующим образом. В EEPROM хранится несколько копий массива калибровочных параметров, защищённых CRC. При старте проверяются все копии. Если CRC в порядке, калибровки считываются в ОЗУ и переходим в штатный режим работы. В случае повреждения какой-либо копии массива она восстанавливается из неповреждённой. Если же совсем "всё пропало" - EEPROM переписывается из FLASH "среднепотолочными" значениями и выставляется признак, что устройство не настроено. Автоматически получается инициализация EEPROM при первом запуске.

Как часто при этом появляется признак, что устройство не настроено?
demiurg_spb
Цитата(krux @ Sep 28 2013, 17:41) *
какой-нибудь M103С fuse?
Не, это из оперы mega128, а тут mega16...

Я храню 5 копий таких "сильно важных параметров" и, при старте, применяю к ним медианную фильтрацию.
Потом сравниваю результат со всеми пятью записанными и, по мере надобности, восстанавливаю битые байты.
Плюс такого метода: не нужно crc и надёжнее чем 3 копииsm.gif
Минус: 5 копий съедают больше памяти чем 2-3 копии, нужна процедура медианной фильтрации для каждого типа хранимых данных (у меня поэтому сделано всё однотипно).
Harbinger
Цитата(Santy @ Sep 30 2013, 09:50) *
Как часто при этом появляется признак, что устройство не настроено?
Ни разу не удалось отловить на пятизначных тиражах.
Но МК там вовсе не AVR были. В одном случае (давнем) - AT89S8252(3), резервирование 5-кратное, в другом - из серии LPC900 (NXP), в качестве EEPROM использовался последний сектор FLASH, резервирование 3-кратное.
ArtemKAD
Цитата
Автоматически получается инициализация EEPROM при первом запуске.

Делаю примерно аналогично. Причем по большей части по вот этой причине.
PS. Слетаний EEPROM у AVR-ок уже больше 10 лет не наблюдаю. Ни на одном устройстве из тех десятков тысяч которые были выпущены.
messenger
to ARV and Harbinger
Спасибо за дельные советы! Как это я сам не догадался)
посмотрел код) у меня память использована на 90%
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.