Hat jemand andere Fälle gehabt, in denen ein AVR nach einigen Monaten auf mysteriöse Weise nicht mehr funktionierte, aber eine Neuprogrammierung ihn zurückbringen würde?
Ich verwende eine Reihe von atmega328 im drahtlosen Sensornetzwerk. Ich hatte jetzt 3 Mal (in ungefähr einem Jahr), als einer von ihnen gerade aufgehört hat zu arbeiten. Ich werde das Programm erneut brennen und es wird wieder funktionieren. Es ist nicht immer das gleiche Gerät, daher scheint es kein defekter Chip zu sein.
Das scheint eine ziemlich katastrophale Sache zu sein, die die Leute davon abhalten würde, AVRs zu verwenden, also ist es offensichtlich etwas über meine besonderen Umstände. Ich habe mich nur gefragt, ob jemand anderes darauf gestoßen ist und vielleicht einige Hinweise hat.
Ich habe eine Batterie mit 3,3 V, daher sinkt die Spannung zu niedrig, um alle paar Monate betrieben zu werden, und ich muss die Akkus austauschen. Die Module verwenden den Ruhemodus und den Watchdog-Timer, um 60 Sekunden lang zu schlafen, eine Messung durchzuführen, sie per Funk an die Basisstation zurückzusenden und dann wieder zu schlafen. Die Module sind Arduino-kompatibel, daher habe ich das Bit "Lass mich das nicht neu brennen" nicht umgedreht.
Antworten:
Verwenden Sie BSB? Böse Dinge können gelegentlich passieren, wenn ein Chip bräunt.
quelle
Wahrscheinlich ist die Brown-Out-Erkennung der richtige Weg, aber ...
Ich hatte nur ein Softwareproblem , das sehr ähnliche Symptome verursachte, wenn auch viel schneller. Ich glaube, ein schlechtes C ++ (Kompilieren?) Hat zu einer Stapelbeschädigung geführt, und die Funktion wurde außerhalb des realen Programms zurückgegeben und hat zufällige Anweisungen ausgeführt. Ich bin mir nicht sicher, was genau als nächstes geschah, aber die einzige Möglichkeit, dies zu beheben, bestand darin, das Programm erneut zu starten (anscheinend enthielten einige dieser zufälligen Anweisungen das Schreiben in den Programmspeicher).
Der Fehler war nur ein Destruktor, der zur falschen Zeit aufgerufen wurde. Das Problem wurde behoben, indem die Variable global gemacht wurde (sodass sie nie zerstört wurde). Das Problem war sehr leicht reproduzierbar (es dauerte ungefähr eine Minute, um es auszulösen) und bei sehr konstanter Leistung. Das spezielle Setup war Arduino + WaveShield unter Verwendung der WaveHC-Bibliothek, aber ich denke, dass dies jedem passieren kann, der C ++ verwendet.
Wenn Sie Low-Level-Sprachen bevorzugen, habe ich in der Montage versehentlich das Gleiche getan, aber auf wundersame Weise verursachte dies nie etwas anderes als sporadische Timing-Probleme: Die meisten Anweisungen sind 2 Bytes lang, aber einige sind länger, und ich habe die Sprungdistanz dummerweise selbst berechnet und bin gesprungen in die Mitte eines 4-Byte-Befehls. Es wurde ziemlich schnell neu ausgerichtet, aber es ist nicht schwer, sich so etwas auf einem selten verwendeten Codepfad vorzustellen, der Wahnsinn verursacht.
quelle
Ich habe auch gesehen, dass unzureichende / schlecht platzierte / fehlende Vcc-Entkopplungskondensatoren ähnliche Effekte verursachen. Haben Sie eine lokale Entkopplung so nah wie möglich am IC? (100nF - 1uF Keramiktyp ist bevorzugt)
quelle
Ein weiterer Faktor, der dazu führen kann, dass Geräte ihren Speicher verlieren, sind elektrostatische Entladungen (ESD).
Das Anbringen einiger Varistoren an allen nach außen gerichteten Anschlüssen, die einer Exposition ausgesetzt sind, kann dieses Problem beheben. Ich habe es schon in einigen kommerziellen Produkten gesehen, die auf Microchip PIC-Mikrocontrollern basieren, daher ist es nicht ungewöhnlich.
Es gibt einige handliche Varistoren, die auch als Filterkondensatoren dienen (in der Größenordnung von 10-150 pF). Überprüfen Sie diese heraus http://www.tdk.co.jp/tefe02/e9c11_avr.pdf
Sie sind klein, billig und schützen Ihr Gerät. Platzieren Sie sie so nah wie möglich an den Anschlüssen, die externe Signale auf die Platine bringen, und verlegen Sie alle Spuren sofort von den Anschlussstiften weg.
quelle