Forum: Mikrocontroller und Digitale Elektronik AVR Uptime und PowerUps zählen


von Dieter (Gast)


Lesenswert?

Hallo,

wie implementiere ich denn am besten einen Uptime und einen PowerUp auf 
einem AVR. Die Werte sollen im EEPROM gespeichert werden und das hat ja 
eine endliche Anzahl an Schreibzyklen. Danke.

mfg
Dieter

von Sebastian (Gast)


Lesenswert?

Nicht so oft speichern. Oder im Speicher immer eine neue Zelle nehem. Da 
gibts jedenfalls ein paar Möglichkeiten.

Vielleicht auch die Versorgungsspannung vom AVR puffern und nur bei 
einem Spannungsaus schreiben. Das sollte dann je nach Anwendung schon 
einige Jahre halten.

Sag halt mal genauer, wieviel du wie oft speichern willst. Dann kann man 
ja mal überlegen.
Im Extremfall halt externen Speicher.

Bei einem Byte pro Sekunde hält des EEPROM übrigens mindesten 3,2 Jahre. 
Wenn man das ganze EEPROM (angenommen 1kB) nutzt und ich mich nicht 
verrechnet hab...

Sebastian

von 3353 (Gast)


Lesenswert?

Schreiben bedeutet von Eins auf Null, Loeschen bedeutet von Null auf 
Eins.
Am weitesteten kommst du wenn du jedes Bit einzeln schreibst. Das 
bedeutet du kannst in 1kByte EEPROM 8192 Ereignisse festhalten bevon 
alles 1 mal geloescht wird.

von Dieter (Gast)


Lesenswert?

Also das mit dem schreiben einzelner Bits ist ja schonmal nicht 
schlecht.

Wenn das Ding mal 10 Tage gelaufen ist macht es ja keinen Sinn noch die 
Sekunden zu speichern.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Ich wage zu bezweifeln dass sich das EEPROM bitweise adressieren laesst.

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


Lesenswert?

Deine Zweifel sind berechtigt.

von Sebastian (Gast)


Lesenswert?

Ja, wenn's dir eh nur auf Minutengenauigkeit geht oder sogar noch 
weniger, dann reicht doch die Lebensdauer, oder?

Sag halt mal genauer, was du machen willst. Dann kann man auch genauer 
helfen.

Sebastian

von 3354 (Gast)


Lesenswert?

Eine RTC mit Batterie ist auch nocht praktisch.

von Dieter (Gast)


Lesenswert?

Es geht ja nicht um bitweise Adressierung sondern darum, der Reihe 
folgendes hineinzuschreiben:

0b00000001
0b00000011
0b00000111
0b00001111
0b00011111
0b00111111
0b01111111
0b11111111

Und erst dann muss die Zelle wieder gelöscht werden

von Peter D. (peda)


Lesenswert?

3354 wrote:
> Eine RTC mit Batterie ist auch nocht praktisch.

Eine Batterie ist äußerst unpraktisch.
Sie hat ne begrenzte Lebensdauer und kann auslaufen.

Wenn schon externe Hardware, dann einfach nen seriellen FRAM nehmen, der 
kann unbegrenzt beschrieben werden.


Peter

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


Lesenswert?

>Es geht ja nicht um bitweise Adressierung sondern darum, der Reihe
>folgendes hineinzuschreiben:

>0b00000001
>0b00000011
>0b00000111
>0b00001111
>0b00011111
>0b00111111
>0b01111111
>0b11111111

>Und erst dann muss die Zelle wieder gelöscht werden

Und, merkst Du was? EEPROM funktioniert genau andersherum, Löschen 
heißt, daß die Zelle 0b11111111 enthält ;-)

von Dieter (Gast)


Lesenswert?

Dann halt andersrum, ist doch kein Problem

von Lutz (Gast)


Lesenswert?

So viuel ich weiß (ist ehrlicher Weise aber nicht allzuviel bei diesem 
Thema, also viel mehr: wie ich es mal verstanden habe), ist bei einem 
Standard-AVR das EEPROM als kleinste Einheit byteweise zu schreiben. Das 
Byte wird dabei immer komplett gelöscht und danach neu geschrieben, 
also ist jede rein optische Bitänderung de fakto eine komplette 
Byteänderung und somit ein "regulärer kompletter" Schreibzyklus.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Datenblatt Mega48:
Bits 5, 4 – EEPM1 and EEPM0: EEPROM Programming Mode Bits
The EEPROM Programming mode bit setting defines which programming action 
that will be triggered
when writing EEPE. It is possible to program data in one atomic 
operation (erase the old
value and program the new value) or to split the Erase and Write 
operations in two different
operations. The Programming times for the different modes are shown in 
Table 7-1. While EEPE

EEPM1 EEPM0
Programming
Time Operation
0 0 3.4 ms Erase and Write in one operation (Atomic Operation)
0 1 1.8 ms Erase Only
1 0 1.8 ms Write Only
1 1 – Reserved for future use

von Lutz (Gast)


Lesenswert?

It is organized as a separate data space, in which single_ _bytes can 
be read and written.
A self-timing function, however, lets the user software detect when the 
next byte can be written

Genau, also kann nur wie vermutet byteweise geschrieben werden und man 
kann wählen, ob man das ganze byte atomar löscht und neu beschreibt oder 
erst löscht und in einem zweiten Zyklus neu beschreibt.

von Stefan E. (sternst)


Lesenswert?

Und was hindert einen daran zu schreiben, ohne vorher zu löschen?
Genau das hätte dann nämlich den von Dieter vorgeschlagenen Effekt.

von i5007 (Gast)


Lesenswert?

> und man kann wählen, ob man das ganze byte atomar löscht und neu
> beschreibt oder erst löscht und in einem zweiten Zyklus neu beschreibt.
Oder ob man 1x löscht und dann 8x hintereinander nur schreibt.

von Dieter (Gast)


Lesenswert?

So war der Plan...

von Dieter (Gast)


Lesenswert?

So, nachdem das jetzt geklärt ist :-) Konkret geht es um folgendes:

Ich möchte einen Betriebsstundenzähler der mind. 50 Jahre reicht. D.h. 
ich muss bis ca. 440000 zählen.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hardware für 50 Jahre Laufzeit zu bauen ist mutig. Finde erst mal einen 
Controller der so lange durchhält... den AVR musst du zumindest alle 10 
Jahre neu programmieren.

von Andreas K. (a-k)


Lesenswert?

Andreas Schwarz wrote:

> den AVR musst du zumindest alle 10
> Jahre neu programmieren.

Wenn du ihn die 10 Jahre durchweg bei 85 Grad betreibst mag sich das 
lohnen. Bei 25° gibt Atmel 100 Jahre an (Mega8, für 1ppm failure).

von Sebastian (Gast)


Lesenswert?

Wow. Wer tatsächlich für 50 Jahre baut, dem würde ich vielleicht ein 
8051-Derivat mit echtem "fuse-type" PROM (z.B. Toshiba) als ext. 
Programmspeicher empfehlen. Aber auch da kann man nicht garantieren, daß 
nicht der Controller vor dem Speicher aussteigt. Es gibt so etwas wie 
elektrischen Verschleiß in Halbleitern.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Andreas Kaiser wrote:
> Wenn du ihn die 10 Jahre durchweg bei 85 Grad betreibst mag sich das
> lohnen. Bei 25° gibt Atmel 100 Jahre an (Mega8, für 1ppm failure).

Stimmt, hab ich mit dem SAM7 verwechselt.

von Lutz (Gast)


Lesenswert?

Ich wurde ja leider ohne Mathe-Gen geboren und muß deshalb immer ganz 
schön rudern, bis ich sowas verstanden habe.

Sebastian wrote:
Bei einem Byte pro Sekunde hält des EEPROM übrigens mindesten 3,2 Jahre.
Wenn man das ganze EEPROM (angenommen 1kB) nutzt und ich mich nicht
verrechnet hab...

3353 wrote:
Am weitesteten kommst du wenn du jedes Bit einzeln schreibst. Das
bedeutet du kannst in 1kByte EEPROM 8192 Ereignisse festhalten bevon
alles 1 mal geloescht wird.

Das Grundprinzip habe ich ja soweit verstanden, aber komme ich
1.)
auf 9 eindeutige Werte pro byte. Dieser "Fehler" von 8 auf 9 Werte tritt 
ja m.E. nur beim letzten byte (mit dem gerade gezählt wird) auf und ist 
bei vielen Tausend durchläufen sicherlich verschmerzbar, sofern die 
Taktfrequenz im Verhältnis zur jeweiligen Uptimedauer eine vernünftige 
Incrementierungsrate hat (also nicht "dutycycle 5 Sekunden bei 
Zählfrequenz 1 mal pro Sekunde).
2.)
Ein Zähler, der einmalige/eindeutige Werte abliefern soll, muß seine 
schon getätigten Durchläufe doch irgendwie sichern. Und das geht doch am 
sinnvollsten wieder nur im EEPROM. Und so komme ich auf deutlich weniger 
als die spontanen 3,17 Jahre Betriebszeitzählung bei angenommenen 1 kB 
EEPROM und einem Incrementierungstakt von 1 Hz, da ja der 
"Durchlaufzähler" ebenfalls an diese Limits gebunden ist.

Wo liegen diesmal meine Gedankenfehler?

von Dieter (Gast)


Lesenswert?

Also ich komme auf ~7 Jahre

Ich nehme 4 Byte:

3 Byte als normaler Zähler, den kann ich 100.000 mal inkrementieren. 
Dazu ein einzelnes Byte als Vorteiler bei dem immer nur ein Bit 
zusätzlich geschrieben wird. Das muss dann gelöscht werden wenn ein 
Überlauf in den 3-Byte Zähler. Der Vorteiler hält also genau so lange 
wie der 3-byte Zähler. Ich kann als mit 4 Byte bis 800.000 Zählen.

In einem 1k EEPROM könnte ich 256 dieser 4-Byte Zähler unterbringen. 
Dann komme ich auf 800.000 * 256 was ich zählen kann.

von Sebastian (Gast)


Lesenswert?

Oben wurde schon ausführlich dargestellt, dass man Bits nicht einzeln 
setzen kann, weil vor jedem Schreibzugriff das gesamte Byte gelöscht 
wird.

Aber ich seh grad:

>Ich möchte einen Betriebsstundenzähler der mind. 50 Jahre reicht. D.h.
>ich muss bis ca. 440000 zählen.

Bist du dir da sicher? Das wäre eine Zählung pro Stunde. Kommt natürlich 
aufs Gerät an, aber es sollte mindestens 10 Stunden an sein, bevor es 
jemand abschaltet. Und selbst dann hast du schon einen Fehler von bis zu 
10% in den Betriebsstunden.

Bis 440.000 kommt man ja schon mit einer Hand voll Byte. Auch von der 
Lebensdauer. Also das sollte doch echt kein Problem sein. Der Power-up 
zähler muss dann ja (wenn du sinnvoll ausgelegt hast) höchstens bis 
44.000 zählen, das passt noch wunderbar in 2 Byte!

Sebastian

von Stefan E. (sternst)


Lesenswert?

Sebastian wrote:
> Oben wurde schon ausführlich dargestellt, dass man Bits nicht einzeln
> setzen kann, weil vor jedem Schreibzugriff das gesamte Byte gelöscht
> wird.

Komisch, ich dachte oben sei genau das Gegenteil gezeigt worden.
Denn "weil vor jedem Schreibzugriff das gesamte Byte gelöscht
wird" ist schlicht falsch.

von Dieter (Gast)


Lesenswert?

Naja, setzen kann man einzelne Bits nicht, das geht immer nur mit dem 
gesamten Byte. Aber löschen kann man sie einzeln. Und zwar indem man die 
Zellen vor dem schreiben nicht löscht.

von Marvin M. (Gast)


Lesenswert?

Bei den 50 Jahren würde ich mir auch noch Gedanken über andere Bauteile, 
wie z.B. Kondensatoren, machen...

Es wurde weiter oben ja schonmal angesprochen: Den µC mit einem Elko 
Puffern, mit einem Pin die Versorgungsspannung checken und alles nur 
dann ins EEprom schreiben, wenn wirklich abgeschaltet wird. Ich würde 
aber die Minuten mitzählen, weil es sonst zu additiven Fehlern kommen 
kann...
Wenn man dann noch einen Ringpuffer im EEprom verwendet, sollte es 
reichen.

von Dieter (Gast)


Lesenswert?

Das Layout steht leider schon, deswegen muss es in Software gelöst 
werden

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Wie groß ist denn die Kapazität vor dem mikrocontroller? Vielleicht 
reicht diese ja schon aus.

Das halte ich für die einzig sinnvolle Methode (also das bei 
Spannungsabfall im EEPROM gespeichert wird, sonst im RAM mitgezählt 
wird)

Dann reichen schon 2-3 Bytes EEPROM aus, denn welches Gerät hat schon 
mehr als  100.000 Power Cycles?

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.