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.
Ich wage zu bezweifeln dass sich das EEPROM bitweise adressieren laesst.
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 was hindert einen daran zu schreiben, ohne vorher zu löschen? Genau das hätte dann nämlich den von Dieter vorgeschlagenen Effekt.
> 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.
Das Layout steht leider schon, deswegen muss es in Software gelöst werden
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.