Ich verwende einen Microchip dsPIC30F6012a. Ich habe diesen Chip auf mehreren Leiterplatten, auf denen alle dieselbe Software ausführen, und beobachte auf allen das gleiche Problem. Dies impliziert ein systemisches Problem, kein einmaliges Produktionsproblem. Das Problem ist auch reproduzierbar, was bedeutet, dass ich es töten sollte, wenn ich weiß, wo ich suchen muss. Aber ich habe immer noch überraschende Schwierigkeiten beim Debuggen der Anwendung.
Die zu testende Karte akzeptiert 24 V, die über einen V7805 auf 5 V herabgesetzt werden. Der Chip läuft auf seinem internen Oszillator mit einer 16x PLL, was eine Betriebsgeschwindigkeit von ~ 29,5 MIPS ergibt. Der relevante Code auf dieser Karte ist im Wesentlichen sehr einfach: Aufwachen, Daten aus dem EEPROM lesen und dann in eine Endlosschleife eintreten. Unterbrechen Sie jede Millisekunde, beobachten Sie einige Umgebungsdaten und schreiben Sie einen aktualisierten Wert in das EEPROM. Es gibt noch andere Dinge, aber das Problem tritt immer noch auf, selbst wenn der nicht verwandte Code auskommentiert ist, sodass ich ziemlich sicher sein kann, dass er für das vorliegende Problem nicht relevant ist.
Im Allgemeinen wacht das Board in 95% der Fälle mit dem richtigen Wert im Speicher auf und geht seinem Geschäft nach. Die anderen 5% der Zeit wacht es jedoch mit einem falschen Wert auf. Insbesondere wird es mit einer etwas gespiegelten Version der Daten aktiviert, die es haben soll. Es ist ein 4-Byte-Long ohne Vorzeichen, den ich gerade beobachte, und entweder das obere oder das untere Wort des Long kann umgedreht werden. Zum Beispiel wird 10 zu 2 ^ 16-10, was später zu 2 ^ 32-10 wird. Ich kann den Fehler reproduzieren, indem ich die Stromversorgung mehrere Dutzend Mal manuell betätige, aber das ist nicht sehr konsistent, und mein Schaltfinger ist abgenutzt.
Um das Problem kontrolliert zu reproduzieren, habe ich eine zweite Karte gebaut, die die 24-V-Versorgung der zu testenden Karte steuert. (Ein weiterer dsPIC, der einen Darlington-Optokoppler antreibt.) Die Testplatine schaltet die 24 V für 1,5 Sekunden aus (lang genug, damit die 5-V-Schiene auf im Wesentlichen 0 abfällt und dort eine Sekunde bleibt) und schaltet dann die 24 V für eine konfigurierbare Zeitdauer ein . Mit einer Einschaltdauer von ca. 520 mS kann ich diesen EEPROM-Fehler jedes Mal innerhalb von fünf Stromzyklen reproduzieren.
Die 5V-Schiene verhält sich vernünftig. Es liegt bei 5 V innerhalb von 1 mS nach dem Einschalten, mit vielleicht 0,4 V Überschwingen, vorausgesetzt, ich kann meinem Zielfernrohr vertrauen. Beim Ausschalten fällt es exponentiell auf 0 V ab und erreicht 1 V innerhalb von 50 mS. Ich habe keine Build-Warnungen, die relevant erscheinen, nur nicht verwendete Variablen und fehlende Zeilenumbrüche am Ende der Dateien.
Ich habe verschiedene Dinge ausprobiert:
- Aktivieren / Deaktivieren der MCLR
- Aktivieren / Deaktivieren des WDT
- Aktivieren / Deaktivieren des Codeschutzes
- Aktivieren / Deaktivieren / Ändern der Brownout-Erkennungsspannung
- Aktivieren / Deaktivieren / Ändern des Einschalt-Timers
- Unterschiedliche PLL-Einstellungen am internen Hauptoszillator
- Anschließen / Trennen meines PICkit 3-Programmiergeräts
- Hinzufügen von 470 uF Kapazität zur 5-V-Schiene
- Hinzufügen / Entfernen von 0,1 uF über das 4,7-k-Pullup an meinem MCLR-Pin
- Deaktivieren Sie alle Interrupts im Code und lassen Sie nur EEPROM-Updates in der Hauptschleife
- Hinzufügen einer Verzögerung von 1,5 Sekunden zu meiner Startroutine, bevor ich mit dem Lesen des EEPROM beginne
Ich habe auch separaten Testcode geschrieben, der nichts anderes tut, als kontinuierlich Werte in das EEPROM zu schreiben und sie dann zurückzulesen, um sicherzustellen, dass sich der Wert nicht geändert hat. Zehntausende von Iterationen ergaben keine Fehler. Alles, was ich daraus schließen kann, ist, dass beim Lesen oder Schreiben des EEPROM etwas schief geht, insbesondere beim Ein- und Ausschalten.
Ich verwende seit 2007 dieselben EEPROM-Bibliotheken. Ich habe gelegentlich Störungen gesehen, aber nichts reproduzierbares. Den entsprechenden Code finden Sie hier:
http://srange.net/code/eeprom.c
http://srange.net/code/readEEByte.s
http://srange.net/code/eraseEEWord.s
http: / /srange.net/code/writeEEWord.s
Ich habe EEPROM-Fehler schon in anderen Anwendungen gesehen, aber immer als einmalige Störungen, nichts so reproduzierbares oder konsistentes.
Hat jemand eine Idee was los ist? Mir gehen die Dinge aus, um es zu versuchen.