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
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
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.
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.
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
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
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
>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 ;-)
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.
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
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.
> 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.
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.
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.
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).
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.
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.
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?
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.
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
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.
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.
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.
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?