У кого-нибудь еще были случаи, когда AVR загадочно прекращал работать через несколько месяцев, но перепрограммирование вернуло бы его обратно?
Я использую несколько ATMEGA328 в беспроводной сенсорной сети. У меня сейчас было 3 раза (примерно за год), когда один из них только что перестал работать. Я заново запишу программу, и она снова начнет работать. Это не всегда одно и то же устройство, поэтому не похоже, что это неисправный чип.
Кажется, что это было бы довольно пагубной вещью, которая помешала бы людям использовать AVR, так что это, очевидно, что-то в моих конкретных обстоятельствах. Мне было просто интересно, если кто-то еще столкнулся с этим и может иметь некоторые указатели.
Я работаю на 3,3 В от батарей, поэтому напряжение будет падать слишком низко, чтобы работать раз в пару месяцев, и мне придется заменить аккумуляторы. Модули используют спящий режим и сторожевой таймер для ожидания в течение 60 секунд, чтения, передачи его обратно на базовую станцию и последующего сна. Модули совместимы с Arduino, поэтому я не включил бит «не позволяй мне перезаписать это».
Ответы:
Вы используете БПК? Иногда могут случиться неприятные вещи, если чип обжаривается.
источник
Вероятно, обнаружение коричневого цвета является правильным способом, но ...
У меня было только программное обеспечение проблема которая вызвала очень похожие симптомы, но гораздо быстрее. Я считаю, что какой-то плохой C ++ (компиляция?) Привел к повреждению стека, и функция вернулась за пределы реальной программы, выполняя случайные инструкции. Я не уверен, что именно произошло потом, но единственный способ исправить это - перезапустить программу (очевидно, некоторые из этих случайных инструкций включали запись в память программы).
Ошибка была просто деструктором, вызванным в неподходящее время. Создание глобальной переменной (чтобы она никогда не уничтожалась) устранило проблему. Проблема была очень легко воспроизводимой (для ее запуска потребовалась около одной минуты) и при очень стабильном питании. Конкретной настройкой был Arduino + WaveShield с использованием библиотеки WaveHC, но я думаю, что это может случиться с каждым, кто использует C ++.
Если вы предпочитаете языки низкого уровня, я случайно сделал примерно то же самое в сборке, но чудесным образом это никогда не вызывало ничего, кроме спорадических проблем с синхронизацией: большинство инструкций имеют длину 2 байта, но некоторые длиннее, и я по глупости сам вычислил расстояние прыжка и прыгнул в середине инструкции 4 байта. Он был перестроен довольно быстро, но нетрудно представить что-то подобное в редко используемом пути кода, вызывающем безумие.
источник
Я также видел, что недостаточные / плохо размещенные / отсутствующие конденсаторы развязки Vcc вызывают аналогичные эффекты. У вас есть местная развязка как можно ближе к IC? (Керамический тип 100 нФ - 1 мкФ является предпочтительным)
источник
Другим фактором, который может привести к потере памяти устройствами, являются электростатические разряды (ESD).
Помещение нескольких варисторов на все внешние разъемы, которые подвергаются воздействию, может облегчить эту проблему. Я видел это раньше в некоторых коммерческих продуктах на основе микроконтроллеров PIC Microchip, так что это не случайно.
Есть несколько удобных варисторов, которые также служат конденсаторами фильтра (порядка 10-150 пФ). Проверьте это http://www.tdk.co.jp/tefe02/e9c11_avr.pdf
Они маленькие, дешевые и будут защищать ваше устройство. Разместите их как можно ближе к разъемам, подающим на плату внешние сигналы, и проложите все следы сразу от выводов разъема.
источник