Forum: Compiler & IDEs Betriebsstundenzähler mal anders


von Martin (Gast)


Lesenswert?

Ich möchte die Betriebsstunden meines Gerätes ins EEPROM abspeichern.
Nun habe ich gedacht, dass ich es wie folgt mache:

Ich lege mir 10 unsigned int-Variablen ins EEPROM.
Alle 6min zähle ich eine ander int-Variable hoch. Den Ort, welche 
int-Variable ich hochzählen möchte, merke ich mir mit einer
static unsigned char counter_position-Variablen
1
if(counter_position == 0)
2
{
3
 std_counter0++;
4
 counter_position++;
5
}
6
else if(counter_position == 1)
7
{
8
 std_counter1++;
9
 counter_position++;
10
}
11
else if(counter_position == 2)
12
{
13
 std_counter2++;
14
 counter_position++;
15
}
16
else if(counter_position == 3)
17
{
18
 std_counter3++;
19
 counter_position++;
20
}
21
...
22
else if(counter_position == 9)
23
{
24
 std_counter9++;
25
 counter_position++;
26
}

Für die Auswertung mache ich es dann so, dass

std_counter9 die volle Stunde anzeigt und die Kommazahl ist dann 
counter_position

So habe ich eine Betriebsdauer von 3,5 Stunden wenn
std_counter9 = 3 und counter_position = 5

So kann ich eine Betriebsdauer von 65.535*10 Variablen *6min = 3932100
das sind 7 Jahre darstellen.

Ist das alles so richtig, oder habe ich irgendwo einen Denkfehler?!!

von Karl H. (kbuchegg)


Lesenswert?

Und woher weißt du nach einem Stromausfall, welchen Wert 
counter_position haben muss? Der muss also ebenfalls ins EEPROM. Damit 
hast du jetzt zwar deine Zähle aufgeteilt, wohl weil du um die 
Lebensdauer fürchtest, aber counter_position hat immer noch alle 6 
Minuten ein Update.

Mein Rat. Rechne dir erst einmal aus, wie lange das es mindestens EEPROM 
aushält, wenn du alle 6 Minuten eine neue Zahl reinschreibst. Dann 
bedenkst du, dass die Zahl von 100000 Schreibvorgängen vom Hersteller 
die Mindestgarantie ist, die in der Praxis leicht überschritten werden 
kann, ohne das etwas passiert. Dann denkst du darüber nach, wieviele 
Bestriebsstunden dein Gerät geschätzt erwartungsgemäss im Einsatz sein 
wird und stellst die beiden varianten gegenüber.
Es bringt nichts, wenn man Vorkehrungen für einen Fall trifft, der in 
der Praxis nie eintreffen wird.

Wenn dein Gerät alle paar Tage mal ein paar Stunden läuft, dann hält das 
EEPROM dafür lange genug, dass du keine Sonderbehandlung brauchst.

von Carsten W. (eagle38106)


Lesenswert?

Und was ist mit der Variable counter_position? Wird die auch mit im 
EEPROM abgelegt? Dann stimmt die Rechnung nicht. Wird sie nicht 
abgelegt, sondern ihr Wert am Programmstart neue ermittelt, dann stimmt 
die Rechnung.

Man sollte aber immer vom Worst-Case Fall ausgehen: Mitten im 
Schreibvorgang fällt die Spannung aus. Was machst Du dann mit den 
gespeicherten Daten?

Man kann zum Beispiel jede Variable zweimal im EEPROM ablegen (In zwei 
getrennten Schreibvorgängen speichern.) Ist der Wert beim Auslesen nicht 
gleich, sind die Daten zu verwerfen. D.h. durch den maximalen Wert der 
anderen Variablen zu ersetzen. Auf diese Weise lässt sich mit 
verhältnismäßig geringem Mehraufwand verhindern, daß der 
Betriebsstundenzähler irgendwann Mondwerte anzeigt.

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und woher weißt du nach einem Stromausfall, welchen Wert
> counter_position haben muss? Der muss also ebenfalls ins EEPROM. Damit
> hast du jetzt zwar deine Zähle aufgeteilt, wohl weil du um die
> Lebensdauer fürchtest, aber counter_position hat immer noch alle 6
> Minuten ein Update.

Counter_position muss eigentlich nicht gespeichert werden. Es würde 
reichen bei Wiederinbetriebnahme die 10 Werte nach dem höchsten Wert zu 
durchsuchen. Dort fand also der letzte Schreibzugriff statt.

von Stefanie B. (sbs)


Lesenswert?

Oder gleich einen gescheiten Code verwenden der Redundanz vorsieht.
Widerholungscodes sind nicht gerade das Gelbe vom Ei ;)

Aber ernsthaft, rechne erstmal aus wie lange du mit nur einer 
Speicherzelle kommst.

von Peter D. (peda)


Lesenswert?

Beim AVR kann man die interne Band-Gap messen mit VCC als Referenz. 
Damit kriegt man raus, wann die VCC anfängt abzusinken. Und erst dann 
speichert man den Zählerstand im EEPROM ab.

Du kannst das Gerät selbst ohne Wear-leveling mindestens 100.000 mal an- 
und ausschalten.


Peter

von avr (Gast)


Lesenswert?

Schau dir mal diese Aplikation von Atmel an
wenn dir die 100000 Zyklen nicht reichen:

http://www.atmel.com/dyn/resources/prod_documents/doc2526.pdf

avr

(aber besser und einfacher nur Speichern wenn nötig, also
wenn die Versorgung einbricht)

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.