Forum: Mikrocontroller und Digitale Elektronik Betriebsstundenzähler ohne hohen EEPROM-Verschleiß


von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Wie kriegt man es am besten/einfachsten hin, einen Betriebsstunden- oder 
kWh-Zähler zu bauen, ohne den EEPROM innerhalb kurzer Zeit zu 
verschleißen?

Die Daten im RAM halten ist klar, aber wie erkennt man am besten wann 
das Gerät abgeschaltet wird, so daß man die Daten noch zuverlässig in's 
EEPROM bekommt?

von Aufschnapper (Gast)


Lesenswert?

Vielleicht mit Hilfe einer kurzen Pufferung der Versorgungsspannung des 
µC. Wird festgestellt, dass die Spannung ausgefallen ist, werden die 
Daten noch schnell vom RAM ins EEPROM geschrieben?

von Falk B. (falk)


Lesenswert?

@ Ben B. (Firma: Funkenflug Industries) (stromkraft)

>Die Daten im RAM halten ist klar, aber wie erkennt man am besten wann
>das Gerät abgeschaltet wird, so daß man die Daten noch zuverlässig in's
>EEPROM bekommt?

https://www.mikrocontroller.net/articles/Speicher#EEPROM_Schreibzugriffe_minimieren

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ben B. schrieb:
> Wie kriegt man es am besten/einfachsten hin, einen Betriebsstunden- oder
> kWh-Zähler zu bauen, ohne den EEPROM innerhalb kurzer Zeit zu
> verschleißen?

 Was für Eeprom ?
 Was für Daten ?
 Wie oft ?
 Welcher Zeitraum ?

von Guest (Gast)


Lesenswert?

Wear Leveling?

von Linus Mettler (Gast)


Lesenswert?

Wie oft wird denn ein- und aus geschaltet? Und kommt es auf jede Sekunde 
an, oder reicht es, wenn alle 1/ 10/ /30 /60 Minuten mal ein Wert ins 
den EEPROM geschrieben wird? 100.000 Schreibzyklen sind schon eine 
Menge, und man kann ja einen kleinen wear-leveling Funktion einbauen, 
bei der immer ein eine Adresse bzw. Page weiter geschrieben wird. Das 
dürfte schon einiges bringen.

von Jürgen H. (calor)


Lesenswert?

Falls es sich um einen externen EEPROM handelt, statt des EEPROM einfach 
einen FRAM einsetzen.
Die sind sehr haltbar ( 10^14 Schreib- und Lesezyklen), ziemlich flink 
und im pinkompatiblen Gehäuse erhältlich.

: Bearbeitet durch User
von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Wear Leveling könnte man zusätzlich machen und da wüßte ich auch wie. 
Allerdings möchte ich nicht jede Änderung der Daten direkt ins EEPROM 
schreiben. Ich würd lieber den Datenblock zusammen mit einem 
Änderungs-Flag im RAM vorhalten und beim Abschalten ins EEPROM schieben 
wenn Daten geändert wurden.

Okay, ich komme also wohl nicht drum herum, die Betriebsspannung extern 
zu messen. Schade, ich dachte da wüßte jemand was.

Ich muß mal messen... das Netzteil ist ein ATX-Standby-Netzteil, es 
erzeugt 12V und 5V, wobei die 12V nicht so stark gepuffert, aber gut 
belastet (FET-Treiberleistung und PWM-Controller, ggf. 100mA Lüfter) 
sind. Die 5V sind ähnlich belastet (Controller, LCD mit 
Hintergrundbeleuchtung und Messtechnik), aber deutlich besser gepuffert. 
Vielleicht brechen die 12V ausreichend schnell ein, so daß ich da mit 
Z-Diode und normaler Diode (plus Pull-Down) einen Controller-Pin auf 
Masse kriege, bevor die 5V zu weit eingebrochen sind.

Würdet ihr den internen EEPROM benutzen oder einen externen? Intern 
hätte den Vorteil, daß ich die Daten nicht verschlüsseln brauche weil 
niemand der sie manipulieren will so einfach da drankommt. Externer 
EEPROM heißt halt man müßte die Daten verschlüsseln und eine Kennung für 
den EEPROM im Controller hinterlegen (damit der nicht einfach 
ausgetauscht oder entnommen werden kann), aber dafür altert der 
Controller nicht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dafür gibts z.B. den Brownout Detektor. Wenn man den hoch genug 
einstellt (z.B. auf 4,3V) dann hat er genug Zeit, um die EEPROM 
Schreibroutine zu triggern und ist längst fertig, wenn die Spannung 
unters Limit für den EEPROM gefallen ist.
Wenn das ein komplettes ATX Netzteil ist, liefert das auch ein PowerGood 
Signal, klingt aber so, als würdest du nur ein Stückchen vom Netzteil 
benutzen?

: Bearbeitet durch User
von Gästchen (Gast)


Lesenswert?

Es gibt dazu diverse Verfahren. Das hir könnte lesenswert sein:
http://www.atmel.com/images/doc2526.pdf

Ein FRAM oder Batteriegepuffertes SRAM ist da natürlich schöner.

Noch eine Anmerkung:
Die oben erwähnte Vorausfallsmeldung / Pufferung der Versorgung oder 
irgendwie gestaltete andere Maßnahmen braucht man eigentlich immer wenn 
man im Betrieb Daten in nichtflüchtige Speicher schreibt. Wenn nämlich 
die Versorgung während eines beliebigen Schreibvorgangs im Speicher 
einbricht, kann man sich schon mal auf Datenverlust einstellen.

Bei meinem Arbeitgeber hat sich beispielsweise ein (beim Ausschalten) 
unterversorgtes FPGA sich sporadisch in einem Flash verewigt, in Form 
eines Page Erase Kommandos. Zumindest hat das Flash den "Todesschrei" 
des FPGA dahingehend interpretiert.

Für eine Lösung gegen sowas reichen aber oft ein paar 100µF, eine Diode 
und ein Resetbaustein oder Komparator. Manchmal reichen schon die 
ohnehin nötigen Pufferkondensatoren.

Wenn man das schon hat, kann man auch gleich den Betriebsstundenzähler 
schreiben, wenn sich das zeitlich ausgeht.

von S. Landolt (Gast)


Lesenswert?

Matthias S. schrieb:
> Dafür gibts z.B. den Brownout Detektor...

Funktioniert das auch auf einem ATMEL AVR8?

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Nein, es ist kein komplettes ATX-Netzteil. Manchmal findet man in diesen 
Dingern 5V-Standby-Netzteile, die auf einer extra Platine sitzen. Sowas 
hab ich verwendet weil ich von 80..230Vdc, mit denen der Wandler läuft, 
runter muß.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Wenn man es richtig macht, funktioniert das auch auf einem klassischen 
AVR.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

(Man helfe mir aufs Pferd - ) Wie geht das?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Beim klassischen AVR nutzt man den Analog-Komparator, der die interne 
Referenz mit der über einen Spannungsteiler passend eingestellten 
Betriebsspannung vergleicht. Wird diese zu niedrig, wird ein Interrupt 
ausgelöst, der den Inhalt der nötigen RAM-Zellen in das EEPROM sichert.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Ah nein, ich bezog mich auf den Vorschlag mit dem BOD.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

S. Landolt schrieb:
> Wie geht das?

Im AVR8 ist das tatsächlich nicht drin, weil der BOD das Reset nur dann 
freigibt, wenn die Spannung wieder steigt. Bleibt Vcc unter dem BOD 
Level, wird Reset nicht verlassen.

Alternativ ist aber der Analog Komparator ein denkbarer Auslöser. Der 
Vorteil hier wäre, das direkt eine ISR zur Verarbeitung zur Verfügung 
steht.

: Bearbeitet durch User
von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Wie steil muß denn bei einem AVR die fallende Flanke am Pin für einen 
PinChange-Interrupt sein? Wenn die Eingänge über Schmitt-Trigger 
verfügen, könnte man den Analog Comparator sparen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Wenn es nicht um Tausende Stück geht, nehme ich auch einen externen FRAM 
für solche Sachen. Die ganz kleinen mit 512Byte gibts für 20Ct. Und 
Betriebsstunden kann man ja sogar ohne alle Faxen direkt auf dem 
internen EEPROM speichern (in 11 Jahren hat man dann die garantierte 
Zyklenzahl erreicht, also immer noch Luft :-)
Aber wie fast immer - es gibt mehrere Lösungen für ein Problem. Mir 
gefällt das einfache mit einem FRAM gegenüber ausgefeilten Strategien 
aller Art für solch ein triviales Problem.

von Uwe B. (uwe_beis)


Lesenswert?

Hallo zusammen,

mich wundert, dass die klassische Methode hier noch nicht erwähnt wurde. 
Meines Wissens nach wurde, zumindest früher, in elektronischen 
Kilometerzählern in KFZs folgendes gemacht:

Statt z. B. eines Bytes für die 1 km-Zählung wurden 32 Bytes verwendet. 
Zunächst sind alle 256 Bits gelöscht (= 1). Dann wird jeden km ein 
(weiteres) Bit gesetzt (-> 0). Sind alle 256 Bits gesetzt, wird zum 
ersten Mal ein Byte echt inkrementiert.

Das bedeutet: Statt bei bei jedem Ereignis ein LSByte zu ändern, wird 
nur in 8 von 256 Ereignissen ein Byte verändert. Und das muss auch nicht 
vorher gelöscht werden, denn es wird nur ein zusätzliches Bit gesetzt. 
Erst nach 256 Ereignissen wird ein Löschvorgang erforderlich.

Mit noch mehr Bits für die unteren Stellen geht das natürlich noch fast 
beliebig zu steigern.

Ich hatte diese Aufgabenstellung auch einmal. Ich hatte damals versucht, 
herauszubekommen, ob das Setzen einzelnen Bits tatsächlich, wie ich 
vermutete, das EEPROM weniger stresst, als das Löschen. Vielleicht 
stresst das Setzen aller 8 Bits nacheinander die Zellen gar nicht oder 
zumindest weniger als das anschießende Löschen des Bytes. Ich habe 
leider keine verlässliche Antwort bekommen. Vielleicht gibt es auch 
spezielle EEPROM-Technologieen, die dafür optimiert sind. Wahrscheinlich 
ist es auch klug, beim Setzen des neuen Bits nicht nur die Bits, die 
gelöscht bleiben sollen, sondern auch die, die bereits gesetzt sind, mit 
1 zu beschreiben und nur für das neue Bit eine 0 auszugeben.

Grüße, Uwe

von Linus Mettler (Gast)


Lesenswert?

Uwe B. schrieb:
> Statt z. B. eines Bytes für die 1 km-Zählung wurden 32 Bytes verwendet.
> Zunächst sind alle 256 Bits gelöscht (= 1). Dann wird jeden km ein
> (weiteres) Bit gesetzt (-> 0). Sind alle 256 Bits gesetzt, wird zum
> ersten Mal ein Byte echt inkrementiert.

Ich bin nicht sicher, ob das so mit dem internen EEPROM eines AVR zu 
machen ist. Auch bei externen EEPROMs gibt es ja das Problem, dass nur 
ganze Pages geschrieben werden können.

Welche Art von EEPROM braucht man für deine Technik?

von Klaus B. (butzo)


Lesenswert?

Ben B. schrieb:
> Wie kriegt man es am besten/einfachsten hin, einen Betriebsstunden- oder
> kWh-Zähler zu bauen, ohne den EEPROM innerhalb kurzer Zeit zu
> verschleißen?
Beitrag "Seltsames Bauteil / Was ist das"

Megaeinfach und ganz ohne Mikroprozessor :-)


Butzo

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

H.Joachim S. schrieb:
> Aber wie fast immer - es gibt mehrere Lösungen für ein Problem. Mir
> gefällt das einfache mit einem FRAM gegenüber ausgefeilten Strategien
> aller Art für solch ein triviales Problem.

 Ja, in der Tat trivial.
 Aber da der TO anscheinend selber nicht weiss, was und in welchen
 Intervallen er messen will, in welchen Intervallen er die
 Messwerte aufschreiben will, wie genau das Ganze sein soll...

 Mit max. 15KWh sind es 250W pro Minute, das passt in ein Byte.

 Man nimmt ein DS3231 mit AT24C32 - RTC mit 4KB Eeprom -
 sekundengenaue Zeit und 4KB Eeprom dazu.

 Für eine Minute in 10 Sekundenabstand und 16bit Wert reichen 192 Bytes.
 Für 24 Stunden in Minutenabstand und 8bit Wert reichen 1440 Bytes.
 Für 31 Tage in Stundenabstand und 16bit Wert reichen 1488 Bytes.
 Wearcounter, Pointer und alles andere passt in < 16 Bytes.
 Startzeit, Datum, letzte Übernahme der Daten < 16 Bytes.
 Kontrollvariablen für ev. StromAusfall und Zeitdiskrepanzen < 16 Bytes.

 Wenn man sich alle 3 Monate um 192 Bytes aufwärts bewegt, dauert es
 fast 4 Jahre bis der Eeprom seine 1Mio. Schreibzyklen erreicht.

 Dann opfert man wieder 1,1 Euro für neuen Modul, 0,4 Euro für CR2032,
 steckt 4 Kabel um und gut isses.

 P.S.
 Alles im Kopf gerechnet, ich weiss, jetzt kommen die grossen
 Mathematiker mit Fehlern von mehreren Tagen oder sogar Wochen...

: Bearbeitet durch User
von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Aber da der TO anscheinend selber nicht weiss, was und in welchen
> Intervallen er messen will, in welchen Intervallen er die
> Messwerte aufschreiben will, wie genau das Ganze sein soll...
Erzählt doch nicht immer so einen Scheiß. Ich hab schon meine 
Vorstellungen.

Ich nehme an, daß 40 Bit für die Variablen groß genug sind.

40 Bit reichen bei sekundengenauer Zählung für grob überschlagen 34.860 
Jahre. Bis dahin kennt die Menschheit schon gar keine EEPROMS mehr.

40 Bit reichen bei 1/1000 Auflösung für knapp 1,1 Terawattstunden. Davon 
ausgehend, daß das Ding 2kW Maximallast können soll bräuchte es 62.750 
Jahre Volldampf damit er Zähler überläuft. Reicht, übertrifft den 
Betriebsstundenzähler.

40*2 Bit sind 80 Bit, 10 Byte. Ein Controller mit 4kByte EEPROM könnte 
409 Wertepaare speichern. Ärgerlich, da brauchen wir 2 Byte extra für 
den Blockzähler, 1 Byte reicht nicht. Macht also 12 Byte, passt der 
Block 341mal in das EEPROM. Sprich Wear Leveling erhöht die Lebensdauer 
des EEPROM (davon ausgehend, daß sich nur jede geschriebene Zelle 
abnutzt und für 12 Byte schreiben keine Pages mit 128..256 Byte gelöscht 
werden müssen) um den Faktor 341. Macht beim AVR mit 100.000 
Schreibzyklen 34,1 Millionen Schreibzugriffe.

34.860 Jahre sind etwa 12,7 Millionen Tage. Bei optimaler Anzahl 
Schreibzugriffe (einer am Tag bei Sonnenuntergang) hält das EEPROM 
länger als die Zähler laufen.

Angenommen wir haben dauerhaftes Pech und beschreiben das EEPROM 1000mal 
am Tag, hält das EEPROM 34.100 Tage. Das entspricht etwa 95 Jahren.

Ich glaube das reicht. Um die Neuanschaffung werde ich mich 
wahrscheinlich nicht mehr kümmern müssen. Das interne EEPROM des 
verwendeten ATMega1284 bekommt den Job.

Aber FRAM schaue ich mir trotzdem mal an, evtl. gehts damit einfacher.

Gute Nacht!

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ben B. schrieb:
> 40 Bit reichen bei sekundengenauer Zählung für grob überschlagen 34.860
> Jahre. Bis dahin kennt die Menschheit schon gar keine EEPROMS mehr.

 Erstens ist das eine Milchmädchenrechnung.
 Und zweitens, wenn du es wirklich so machen willst, genügt das hier
 vollkommen:
Klaus B. schrieb:
Beitrag "Seltsames Bauteil / Was ist das"
> Megaeinfach und ganz ohne Mikroprozessor :-)

Ben B. schrieb:
> wahrscheinlich nicht mehr kümmern müssen. Das interne EEPROM des
> verwendeten ATMega1284 bekommt den Job.

 M1284 um eine 40bit Variable hochzuzählen ?

> Aber FRAM schaue ich mir trotzdem mal an, evtl. gehts damit einfacher.

 LOL.
 Noch einfacher ?

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ben B. schrieb:
> Wie kriegt man es am besten/einfachsten hin, einen Betriebsstunden- oder
> kWh-Zähler zu bauen, ohne den EEPROM innerhalb kurzer Zeit zu
> verschleißen?

Wenn du wirklich nur Stunden zählen willst:

Nimm immer zwei EEPROM-Zellen zusammen als eine 16-Bit-Zahl, die du
herunter zählst.  Das ergibt maximal 65536 Schreibvorgänge und liegt
damit unterhalb der garantierten 100000.  Wenn die ersten beiden Bytes
auf diese Weise „verbraucht“ sind, nimm die nächsten beiden.  Jedes
dieser EEPROM-Zellen-Paare kann dabei 7,5 Jahre lang die Betriebsstunden
zählen, vermutlich wirst du also mit 4 Paaren (8 Bytes) gut auf der
sicheren Seite liegen. ;-)

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Erstens ist das eine Milchmädchenrechnung.
Eine Machbarkeitsstudie.

> Und zweitens, wenn du es wirklich so machen willst, genügt das hier
> vollkommen:
> Klaus B. schrieb:
> Beitrag "Seltsames Bauteil / Was ist das"
>> Megaeinfach und ganz ohne Mikroprozessor :-)
Ja, vor allem ist das so schick digital auszulesen. Die notwendige 
Kamera und Bildauswertung wird ohne Mikroprozessor schwierig.
Nee - schicke Technik - aber keine Option. Das Ding hat ein Display und 
da sollen auch die Betriebsstunden und erzeugte kWh drauf.

> Ben B. schrieb:
>> wahrscheinlich nicht mehr kümmern müssen. Das interne EEPROM des
>> verwendeten ATMega1284 bekommt den Job.
> M1284 um eine 40bit Variable hochzuzählen ?
Nö, zwei 40 Bit Variablen. Und dann noch so Dinge wie MPP-Tracking und 
Displayansteuerung. Kriegt man auch mit einem ATMega8 hin, aber der 1284 
liegt rum und ich verwende in der Entwicklung gerne einen dickeren 
Controller als nötig. Verkleinern kann man hinterher immer noch.

>> Aber FRAM schaue ich mir trotzdem mal an, evtl. gehts damit einfacher.
> LOL.
> Noch einfacher ?
Klar, wenn es sowas genau wie einen SPI/I2C-EEPROM gibt?

Mehr Anlässe zum Meckern hast Du nicht gefunden? Schade.

Wo gibts dieses FRAM eigentlich kaufbar und ist das anfällig gegenüber 
Magnetfeldern? Etwa wenn jemand seinen neuen tollen Mega-Neodymmagneten 
da drauflegt?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ben B. schrieb:
> Mehr Anlässe zum Meckern hast Du nicht gefunden? Schade.

 Doch, aber es wird nicht helfen. Genauso wie aus deinem "Projekt"
 nichts wird.
 Das, was du angeblich machen willst, kann man auf einem Stromzähler
 umsonst lesen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.