Beschädigung der EEPROM-Daten bei Stromausfall

Ich habe kürzlich ein Problem mit dem EEPROM eines PIC16F877A gefunden, der zur Steuerung der Drehzahl eines Gleichstrommotors verwendet wird. Der Antrieb soll auch bei Stromausfall mit der zuletzt eingestellten Drehzahl arbeiten. Aber das Problem ist manchmal (nicht immer), dass nach dem Stromausfall die eingestellte Geschwindigkeit (die aus dem EEPROM gelesen wird) nicht mit der zuletzt eingestellten Geschwindigkeit übereinstimmt. Wenn dieses Problem auftritt, wird der Wert normalerweise auf den Standard-EEPROM-Wert 255 geändert (aber nicht immer, einige zufällige Werte auch). Was könnten die möglichen Ursachen sein?.

Die Stromversorgung fällt zu stark ab, bevor der Schreibvorgang abgeschlossen ist.
Hat Ihr Controller eine Brownout-Erkennung? Das kann helfen, diese Situation zu verhindern.
@IgnacioVazquez-Abrams hat über den Leistungsabfall nachgedacht. Aber es gibt einen Spannungsstabilisator, der die Versorgung unterbricht, wenn die Netzspannung unter 170 V fällt. Außerdem würde ich gerne wissen, wie man das System von den Spannungsspitzen im Netz unabhängig macht, da die höchste Versorgungsspannung im System nur 12 V beträgt.
@jippie Es hat BOD und ist bereits aktiviert.
Sie wollen die Versorgung nicht unterbrechen, Sie wollen einen geordneten Shutdown durchführen. Einschließlich des Nichtschreibens in das EEPROM nach einem bestimmten Punkt.

Antworten (1)

Nehmen wir an, Sie haben eine Art Linearregler, der Ihren PIC speist. Dieser Regler hat wahrscheinlich viel Headroom (sagen wir, er hat 12 V Eingang und 3,3 V Ausgang). Der Regler funktioniert gut, obwohl der Eingang beispielsweise nur 8 V beträgt.

Sie müssen diesen Abschaltpunkt wählen und ihn einem Komparator zuführen, der ein logisches Signal namens Power Good (PG) erzeugt. Dieses Signal geht aus, lange bevor der Regler nicht mehr regelt und der BSB einsetzt.

Wenn PG nicht vorhanden ist, sollten Sie keine EEPROM-Schreibvorgänge durchführen.

Sie sollten den Sollwert auch mit einem Kontrollwert speichern. Ein einfaches Schema besteht darin, das 1er-Komplement der Geschwindigkeit zu verwenden. Bei einer Geschwindigkeit von 0x88 ist das 1er-Komplement beispielsweise 0x77. In C:

typedef struct {
  uint8_t speed;
  uint8_t speed_complement;
} SetpointSlot;

Wenn ein Sollwert-Slot einen ungültigen Prüfwert hat, ignorieren Sie ihn einfach.

Sie sollten sogar mehrere SetpointSlots speichern - mindestens zwei. Wenn Ihr EEPROM seitenweise ist, dürfen die Slots keine Seiten überqueren und müssen sich über zwei Seiten erstrecken (oder mehr Seiten, wenn sie nicht alle auf zwei Seiten passen). Bei 2 Sollwerten haben Sie beispielsweise jeden auf einer eigenen Seite.

Beim Starten:

  1. Iterieren Sie die Slots. Verwenden Sie die erste gültige, auf die Sie stoßen (wobei speed == ~speed_complement).
  2. Wenn keine gültigen Slots gefunden werden, verwenden Sie den Standardwert.

Beim Speichern eines neuen Werts gehen Sie wie folgt vor:

  1. Abrufen des aktuell verwendeten Sollwert-Slots.
  2. Löschen des nächsten Sollwertschlitzes (der nächste in einer Round-Robin-Weise, wechselnde Seiten).
  3. Tragen Sie dort den neuen Sollwert ein.
  4. Überprüfen Sie die geschriebenen Werte. Wenn sie falsch sind, nullen Sie sie, um sicherzustellen, dass sie falsch bleiben, wählen Sie den nächsten Sollwertschlitz und gehen Sie zu 1.
  5. Setzen Sie den aktuellen Sollwert-Slot auf Null (nicht löschen) - aber nur, wenn es nicht derselbe Slot ist, in dem der neue Wert gespeichert wurde. Das könnte der Fall sein, wenn Sie zwei Steckplätze hätten und einer davon in einem "schlechten" Bereich des Eeproms wäre.