AVR deprogrammiert sich selbst


8

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.


Wo können Sie das Problem identifizieren? Wir haben ähnliche Probleme mit einem ähnlichen Setup. Haben Sie jemals den "beschädigten" Flash-Speicher vorgelesen und mit dem ursprünglichen HEX-Inhalt verglichen?
Rev1.0

Antworten:


6

Verwenden Sie BSB? Böse Dinge können gelegentlich passieren, wenn ein Chip bräunt.


3
Zur Verdeutlichung sollte edebill BSB verwenden.
Kevin Vermeer

BoD nicht verwenden. Ich muss sehen, wie ich es hinzufüge. Das Szenario hier wäre also, dass der Chip gerade anfängt herumzuschlagen, wenn die Spannung zu niedrig wird und versehentlich seinen eigenen Blitz beschädigt?
edebill

@edebill - Auf PICs habe ich gesehen, dass dies in der Produktion häufig vorkommt, wenn keine BORV-Schwellenwerte festgelegt sind.
J. Polfer

Was ist BSB? Brown-Out-Erkennung?
Peter Mortensen

2
Ja, es ist Brown-Out-Erkennung.
Leon Heller

6

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.


Dies kann auch bei Prozessoren der Fall sein, die einen Teil des Flash-Speichers dem Hauptspeicherplatz zuordnen. Ich weiß, dass zumindest die dsPICs und PIC24s dies tun. Wenn Sie einen beschädigten Zeiger und die richtigen Umstände hätten, könnten Sie Flash überschreiben.
Thomas O

3

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)


2

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.


Varistoren sind nicht für den ESD-Schutz vorgesehen (sie dienen zum Schutz von Überspannungen von 10 bis 100 Millisekunden). Die internen Dioden des Geräts reichen normalerweise aus, aber wenn dies nicht der Fall ist, funktioniert das Hinzufügen einiger in Sperrrichtung vorgespannter Dioden zu beiden Schienen (Vdd und GND) normalerweise. Seien Sie jedoch vorsichtig, da dies die Kapazität des E / A erhöht und das Hochgeschwindigkeitsmaterial beeinträchtigen kann .
Thomas O

1
Thomas hat einen Blick auf das TDK-Datahseet geworfen. Diese Geräte wurden speziell für ESD-Gegenmaßnahmen entwickelt und funktionieren nachweislich in der Produktion für elektronische Kommunikationsgeräte. Wir testen unsere Geräte im Haus mit bis zu 8 kV ESD und diese Geräte schützen andere Komponenten.
smashtastic

Sie haben Recht mit der zusätzlichen Kapazität, und das muss berücksichtigt werden.
smashtastic
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.