DS2423 mit EEPROM-Speicherung

Schon am Anfang der DS2423-Simulation stand die Idee der EEPROM Speicherung im Raum. Das bedeutet, bei Spannungsausfall den Mikrocontroller mit einem ELKO solange zu versorgen, bis der die Werte in das EEPROM übernehmen kann. Es war dann am Ende doch etwas schwieriger und es wurde viel in Foren darüber diskutiert. Deshalb habe ich mich 2017 mich noch einmal grundlegend mit dem Problem beschäftigt. Ich will da gar nicht weiter darauf die Diskussionen eingehen, sondern nur eine Lösung präsentieren die immer funktioniert. (aktuelle Firmware vorausgesetzt).

Nebenbei bemerkt: das EEPROM des ATtiny (und auch Mega) ist nur auf 100 000 Schreibzyklen ausgelegt. Bei einem Schreiben nach jedem Zählvorgang könnte also nur bis 100 000 gezählt werden (Mit ein paar Tricks noch mehr aber auf jeden Fall begrenzt).

Schaltung

Die Schaltung ist relativ einfach. Der Mikrocontroller wird über einen ELKO versorgt, der über eine Schottky-Diode von der Versorgungsspannung getrennt ist. So lange die Versorgungspannung größer als die Spannung am Kondensator ist, wird der Kondensator geladen.

Über den Spannungsteiler an PA2 (AIN1) wird intern über den analog Comparator der Spannungszusammenbruch ermittelt. Die Widerstände können gewiss noch größer gewählt werden, nur das Verhältnis sollte erhalten bleiben.

Schaltung DS2423 Autosave
Schaltung für die DS2423-Simulation mit Autosave

Verbesserungen

Im Folgenden sind die Änderungen zur Verbesserung des Speicherns ins EEPROM beschrieben.

Comparatur-Interrupt

Gegenüber dem relativ großen undefinierten Spannungsbereich zwischen High- und Low-Level ist es mit dem Comparator möglich, die Eingangsspannung an einem Pin (vorzugsweise PA2/AIN1) mit einer anderen Spannung zu vergleichen. Für die Spannungserkennung wurde dazu die interne Spannungsreferenz gewählt. AIN1 ist dabei mit dem negativen Anschluss des Comparators verbunden, die Spannungsreferenz mit dem positiven Anschluss. Bei Spannungsabfall wird der negative Eingang kleiner als die Referenz und es wird eine steigende Flanke am Comparatorausgang erzeugt. Das ist mitunter etwas verwirrend :-).

Timeout bei der Reset-Erkennung.

Lange habe ich den Grund gesucht, warum manchmal das Speichern nicht richtig funktioniert. Der Controller entlädt in diesen Fall den Kondensator mit einem relativ hohen Strom. Ich hatte die Idee, dass vielleicht irgendwo noch versteckte Ströme fließen ...

Das Problem war dann doch ein ganz anderes: wenn ein 1-Wire Reset ausgelöst wird, wartete die Timer-Interrupt-Routine bis die Leitung wieder auf High geht, d.h. der Reset-Impuls zu Ende ist. Wenn der 1-Wire-Bus zuerst abgeklemmt wird, dann bleibt der Controller in einer Schleife im Timer-Interrupt hängen und es kann kein anderer Interrupt ausgelöst werden. Abhilfe schafft hier eine Timeout-Prüfung für zu lange Reset-Impulse.

Verändern der Taktfrequenz

Mit 8 MHz benötigt der ATtiny84A mind. 2,7V um gut zu funktionieren. Darum wird vor dem Speichern in das EEPROM die Taktfrequenz auf 4MHz geändert. Somit funktioniert der Controller bis 1,8V. Das reduziert auch den Strom etwas, aber gegenüber dem Strom der für das Speichern in das EEPROM benötigt wird fällt das nicht auf.

Bei allen 1-Wire Simulationen ist es wichtig, die BODLEVEL-Fuse auf 1,8V bzw. 2,7V zu setzen! Besonders bei Schaltungen, bei denen die Spannung sehr langsam abfällt, wie die oben beschriebene.

Kontrolle ob überhaupt gezählt wurde

Meist fällt die Spannung nicht abrupt ab, sondern schwingt. Dabei kommt es vor, dass der Comparator-Interrupt viele Male aufgerufen wird, und die Werte immer wieder in das EEPROM geschrieben werden. Mit einer einfachen Variable lässt sich prüfen, ob die Werte sich verändert haben und so eine Mehrfachspeicherung verhindern.

Timings

Hier noch zwei Bilder vom zeitlichen Verlauf der Spannung am ATtiny84A. Der Speichervorgang dauert ziemlich genau 50ms.

Speicherzeit im 20 ms Raster
Speicherzeit im 20 ms Raster

Spannungsabfall im Überblick
Spannungsabfall im Überblick

Quellcode

Unter Sourcecode gibt es eine passende Variante des Quelltextes im Verzeichnis DS2423_Autosave. Dort sind alle beschriebenen Algorithmen eingepflegt.

Zum Seitenanfang