AVR депрограммирует себя

8

У кого-нибудь еще были случаи, когда AVR загадочно прекращал работать через несколько месяцев, но перепрограммирование вернуло бы его обратно?

Я использую несколько ATMEGA328 в беспроводной сенсорной сети. У меня сейчас было 3 раза (примерно за год), когда один из них только что перестал работать. Я заново запишу программу, и она снова начнет работать. Это не всегда одно и то же устройство, поэтому не похоже, что это неисправный чип.

Кажется, что это было бы довольно пагубной вещью, которая помешала бы людям использовать AVR, так что это, очевидно, что-то в моих конкретных обстоятельствах. Мне было просто интересно, если кто-то еще столкнулся с этим и может иметь некоторые указатели.

Я работаю на 3,3 В от батарей, поэтому напряжение будет падать слишком низко, чтобы работать раз в пару месяцев, и мне придется заменить аккумуляторы. Модули используют спящий режим и сторожевой таймер для ожидания в течение 60 секунд, чтения, передачи его обратно на базовую станцию ​​и последующего сна. Модули совместимы с Arduino, поэтому я не включил бит «не позволяй мне перезаписать это».

edebill
источник
Где вы смогли выявить проблему? У нас возникают похожие проблемы с аналогичной настройкой. Вы когда-нибудь считывали «испорченную» флэш-память и сравнивали ее с оригинальным содержимым HEX?
Откр. 1

Ответы:

6

Вы используете БПК? Иногда могут случиться неприятные вещи, если чип обжаривается.

Леон Хеллер
источник
3
Чтобы уточнить, edebill должен использовать BOD.
Кевин Вермеер
Не использует BoD. Я должен видеть о добавлении этого. Таким образом, сценарий здесь будет таким, что микросхема просто начинает вращаться, когда напряжение становится слишком низким и случайно повреждает собственную вспышку?
edebill
@edebill - На PIC я видел, как много происходит в производстве, когда пороги BORV не установлены.
Дж. Полфер
Что такое БПК? Обнаружение Брауна?
Питер Мортенсен
2
Да, это Обнаружение Брауна.
Леон Хеллер
6

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

У меня было только программное обеспечение проблема которая вызвала очень похожие симптомы, но гораздо быстрее. Я считаю, что какой-то плохой C ++ (компиляция?) Привел к повреждению стека, и функция вернулась за пределы реальной программы, выполняя случайные инструкции. Я не уверен, что именно произошло потом, но единственный способ исправить это - перезапустить программу (очевидно, некоторые из этих случайных инструкций включали запись в память программы).

Ошибка была просто деструктором, вызванным в неподходящее время. Создание глобальной переменной (чтобы она никогда не уничтожалась) устранило проблему. Проблема была очень легко воспроизводимой (для ее запуска потребовалась около одной минуты) и при очень стабильном питании. Конкретной настройкой был Arduino + WaveShield с использованием библиотеки WaveHC, но я думаю, что это может случиться с каждым, кто использует C ++.

Если вы предпочитаете языки низкого уровня, я случайно сделал примерно то же самое в сборке, но чудесным образом это никогда не вызывало ничего, кроме спорадических проблем с синхронизацией: большинство инструкций имеют длину 2 байта, но некоторые длиннее, и я по глупости сам вычислил расстояние прыжка и прыгнул в середине инструкции 4 байта. Он был перестроен довольно быстро, но нетрудно представить что-то подобное в редко используемом пути кода, вызывающем безумие.

Джек Шмидт
источник
Это также может произойти с процессорами, которые отображают часть флэш-памяти в пространство основной памяти. Я знаю, что по крайней мере dsPIC и PIC24 делают это. Если у вас есть поврежденный указатель и правильные обстоятельства, вы можете перезаписать флэш-память.
Томас О
3

Я также видел, что недостаточные / плохо размещенные / отсутствующие конденсаторы развязки Vcc вызывают аналогичные эффекты. У вас есть местная развязка как можно ближе к IC? (Керамический тип 100 нФ - 1 мкФ является предпочтительным)

Адам Лоуренс
источник
2

Другим фактором, который может привести к потере памяти устройствами, являются электростатические разряды (ESD).

Помещение нескольких варисторов на все внешние разъемы, которые подвергаются воздействию, может облегчить эту проблему. Я видел это раньше в некоторых коммерческих продуктах на основе микроконтроллеров PIC Microchip, так что это не случайно.

Есть несколько удобных варисторов, которые также служат конденсаторами фильтра (порядка 10-150 пФ). Проверьте это http://www.tdk.co.jp/tefe02/e9c11_avr.pdf

Они маленькие, дешевые и будут защищать ваше устройство. Разместите их как можно ближе к разъемам, подающим на плату внешние сигналы, и проложите все следы сразу от выводов разъема.

smashtastic
источник
Варисторы не предназначены для защиты от электростатических разрядов (они предназначены для защиты от скачков длительностью от 10 до 100 миллисекунд); внутренних диодов устройства обычно достаточно, но когда это не так, добавление некоторых диодов с обратным смещением к любой шине (Vdd и GND) обычно работает, будьте осторожны, потому что это увеличивает емкость для ввода-вывода и может повлиять на высокоскоростную работу ,
Томас О
1
Томас взглянул на набор данных TDK, эти устройства специально разработаны для противодействия электростатическим разрядам, и доказано, что они работают в производстве для электронных устройств связи. Мы тестируем наши устройства в домашних условиях напряжением до 8 кВ, и эти устройства защищают другие компоненты.
smashtastic
Вы правы насчет дополнительной емкости, и это нужно учитывать.
smashtastic