mikrocontroller.net

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


Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: 3353 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wage zu bezweifeln dass sich das EEPROM bitweise adressieren laesst.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Zweifel sind berechtigt.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: 3354 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine RTC mit Batterie ist auch nocht praktisch.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann halt andersrum, ist doch kein Problem

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: i5007 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So war der Plan...

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marvin M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Layout steht leider schon, deswegen muss es in Software gelöst 
werden

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.