Forum: Mikrocontroller und Digitale Elektronik Zu häufige schreiben in den Flash verhindern?


von Frank W. (Gast)


Lesenswert?

Hallo,

ich habe ein "denkproblem".
Ich will die Leistungsdaten eines Solarmoduls erfassen.

So gut so schön. Geht auch alles.

Ich würde jetzt gerne den Leistungswert bei unterschreiten einer 
bestimmten Spannung (4Volt) einmal speichern danach darf er erst wieder 
speichern nach überschreiten von 10Volt - hat also eine Hysterese von 6 
Volt.

Reicht das um zu häufiges schreiben in den Festspeicher des AtMega zu 
verhindern?

Oder sollte ich besser in einen extra Flash speicher schreiben?

Programm usw. krieg ich schon hin - wollte nur wissen ob das so hinhaut 
oder ob ich den Mega damit in kürzester Zeit über den Jordan jage...

Mit herzlichen Grüß
Frank

von Stefan F. (Gast)


Lesenswert?

> Ich würde jetzt gerne den Leistungswert bei unterschreiten einer
> bestimmten Spannung (4Volt) einmal speichern danach darf er erst wieder
> speichern nach überschreiten von 10Volt - hat also eine Hysterese von 6
> Volt. Reicht das um zu häufiges schreiben in den Festspeicher des AtMega
> zu verhindern?

Kommt ganz drauf an, wie oft diese Wechsel stattfinden. Wahrscheinlich 
reicht es nicht.

Solche Daten sollte man nicht im Flash Speicher sammeln, sondern im 
EEPROM, weil der sehr viel mehr Schreibzyklen aushält. Unabhängig davon, 
ob du Flash oder EEPROM verwendest, gilt:

Bei Anwendungsfällen wie deinem implementiert man einen Wear-Levelling 
Algorithmus. Dessen Aufgabe ist es, die Daten so zu verteilen, dass alle 
Speicherzellen gleichmäßig verschleißen. Wie du das machst, bleibt Dir 
überlassen.

Eine Möglichkeit wäre, auszunutzen, dass das EEPROM initial mit 0xFF 
gefüllt ist. Bei jeden Schreibzugriff suchst du vom Anfang an 
aufsteigend die erste freie Zelle und beschreibst sie. Beim Lesen suchst 
du vom Ende beginnen die erste benutze Zelle, dort steht der aktuellste 
Wert drin.

Wenn alle Zellen einmal benutzt wurden, machst du tabula rasa und fängst 
wieder von vorne an.

Mir ein bisschen Nachdenken fällt Dir sicher eine klügere Methode ein.

von Tobi (Gast)


Lesenswert?

Hi Frank,

Die Frage ist jetzt wie oft das vorkommt. Ich meine die AVRs haben einen 
max Lese-Schreibzyklus von 100000?

Ich bezweifle aber dass ein externes EEPROM höhere Lese-Schreibzyklen 
hat als das interne. Du könntests zumindest die Werte die im EEPROM 
stehen mit dem aktuellen Wert vergleichen und nur wenn es einen 
signifikanten Unterschied gibt diesen auch schreiben.

Mit Zusatzaufwand könntest du auch sogenanntes Wear-Leveling 
durchführen, d.h. du legst einen gewissen Speichergröße fest (einen 
Block) und unterteilst den gesamten Speicher in N-Blöcke. Bei jedem 
Schreibvorgang nimmst du einen anderen Block (kannst wie eine Art 
Ringpuffer sehen). Ein zusätzlicher Zähler in jedem Block zeigt an 
welches der aktuelleste Wert ist.


Gruß

Tobi

von Falk B. (falk)


Lesenswert?


von M. K. (sylaina)


Lesenswert?

Tobi schrieb:
> Ich bezweifle aber dass ein externes EEPROM höhere Lese-Schreibzyklen
> hat als das interne.

Einfach mal nachschaun: Ein 24LC1025 z.b. (1024 kB) hat über 1.000.000 
Schreibzyklen. Das sind etwas mehr als die 100.000 Zyklen, die das 
interne EEPROM eines Atmegas aufweist. ;)

von Falk B. (falk)


Lesenswert?

@Tobi (Gast)

>Die Frage ist jetzt wie oft das vorkommt.

In der Tat.

> Ich meine die AVRs haben einen
>max Lese-Schreibzyklus von 100000?

Nö, 100.000 garantierte Schreibzyklen. Lesen kann man so oft man will, 
das ist verschleißfrei.

>Ich bezweifle aber dass ein externes EEPROM höhere Lese-Schreibzyklen
>hat als das interne.

Falsch. Es gibt EEPROMs mit 1.000.000 garantierten Schreibzyklen.
Oder man nimmt FRAM, dort sind die garantierten Schreibzyklen so 
exorbitant hoch (10e12 und mehr), daß man nur wenig nachdenken muss. OK, 
als RAM-Ersatz mit 1000++ Schreibzyklen/Sekunde sollte man es nicht 
mißbrauchen!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Frank W. schrieb:
> Reicht das um zu häufiges schreiben in den Festspeicher des AtMega zu
> verhindern?

Du könntest prüfen, ob der Wert im EEPROM schon drinsteht, den Du 
reinschreiben willst, oder ist Dein "Leistungswert" ein Wert, der immer 
größer wird?

Die nächste Möglichkeit wäre, daß Du nur eine bestimmte Anzahl von 
Schreibvorgängen pro Zeiteinheit zulässt - ich nehme nicht an, daß es 
wichtig ist, den bei "Geflacker" im Minutentakt oder gar häufiger zu 
erfassen. Wenn Du Dir also einen Zeitstempel (Timer o.ä.) im RAM merkst, 
in dem Du erfasst, wann Du das letzte Mal den Wert ins EEPROM 
geschrieben hast, dann lässt sich auch damit die Schreibrate reduzieren 
(vorausgesetzt, daß Dein Programm so stabil läuft, daß es nicht selbst 
im Minutentakt o.ä. neu startet ...)

von Philipp G. (geiserp)


Lesenswert?

Falk B. schrieb:
> Nö, 100.000 garantierte Schreibzyklen. Lesen kann man so oft man will,
> das ist verschleißfrei.

Was genau verschleisst eigentlich darin? Irgendeine Dotierung?

von Falk B. (falk)


Lesenswert?

@Philipp G. (geiserp)

>> Nö, 100.000 garantierte Schreibzyklen. Lesen kann man so oft man will,
<> das ist verschleißfrei.

>Was genau verschleisst eigentlich darin? Irgendeine Dotierung?

Die Isolationsschicht des Floating Gates. Die wird durch häufiges 
Löschen und Schreiben "löchrig", die Leckströme nehmen zu und damit 
fließt die eingesperrte Ladung deutlich schneller ab. Dan halten deine 
Daten nicht mehr Jahre sondern eher noch Stunden bis Wochen, manchmal 
reicht es nicht mal mehr zum Prüfen nach dem Schreiben (verify).

von Tobi (Gast)


Lesenswert?

Falk B. schrieb:


>> Ich bezweifle aber dass ein externes EEPROM höhere Lese-Schreibzyklen
>> hat als das interne.

>Einfach mal nachschaun: Ein 24LC1025 z.b. (1024 kB) hat über 1.000.000
>Schreibzyklen. Das sind etwas mehr als die 100.000 Zyklen, die das
>interne EEPROM eines Atmegas aufweist. ;)

Ja hast ja recht ;)

>
>> Ich meine die AVRs haben einen
>>max Lese-Schreibzyklus von 100000?
>
> Nö, 100.000 garantierte Schreibzyklen. Lesen kann man so oft man will,
> das ist verschleißfrei.
>

Jo ist richtig ich meinte auch Schreibe-Lösch Zyklen, sorry.
...und die 100.000 sind der Wert den man annehmen muss als Worst-Case 
Parameter, im Endeffekt ist das ein Minimalwert.
Wenn es mehr Zyklen sein sollen, dann könnte man mit CRC arbeiten und so 
defekte Blöcke erkennen oder man hat ein ECC (nicht im AVR ich weiß ;) )

von Stephan (Gast)


Lesenswert?

Frank W. schrieb:
> Ich würde jetzt gerne den Leistungswert bei unterschreiten einer
> bestimmten Spannung (4Volt) einmal speichern danach darf er erst wieder
> speichern nach überschreiten von 10Volt - hat also eine Hysterese von 6
> Volt.
>
> Reicht das um zu häufiges schreiben in den Festspeicher des AtMega zu
> verhindern?

Hört sich für mich erst mal nach 12V-Modul an.
Die 4 Volt erreichst du eigentlich nur Nachts oder wenn dein Verbraucher 
noch läuft wenn nichts mehr zu holen ist.
Schalte den Verbraucher unter 6V ab, dann musst du vmtl. genau einmal am 
Tag nen Wert schreiben.

Und wenn Wolken in der Dämmerung doch noch ein Problem sind: Erst ab 
einer gewissen Mindestenergiemenge den Wert aktualisieren.

von P.S. (Gast)


Lesenswert?

Im Falle vieler Schreibzyklen käme auch in EERAM in Frage. Das ist ein 
serieller RAM-Baustein mit einem Backup-EEPROM. Bei Stromausfall wird 
der RAM-Inhalt automatisch in das EEPROM kopiert. Die dazu notwendige 
Energie liefert ein Kondensator.

von Wolfgang (Gast)


Lesenswert?

Frank W. schrieb:
> Reicht das um zu häufiges schreiben in den Festspeicher des AtMega zu
> verhindern?
>
> Oder sollte ich besser in einen extra Flash speicher schreiben?

Was spricht gegen eine microSD-Karte o.ä.
Speicher so viel du möchtest und wenn du dafür sorgst, dass nicht jedes 
Einzelbit geschrieben wird, sondern vernünftige Blöcke, braucht es 
alleine schon etliche Zeit, bevor überhaupt die erste Zelle zum zweiten 
Mal beschrieben wird.

von M. K. (sylaina)


Lesenswert?

Wolfgang schrieb:
> Was spricht gegen eine microSD-Karte o.ä.

Wahrscheinlich Komplexität, wäre aber eine gute Idee sich das mal 
beizubringen. Kann ja später auch bei anderen Anwendungen mal gut sein.

von Stefan F. (Gast)


Lesenswert?

P.S. schrieb:
> Im Falle vieler Schreibzyklen käme auch in EERAM in Frage. Das ist ein
> serieller RAM-Baustein mit einem Backup-EEPROM. Bei Stromausfall wird
> der RAM-Inhalt automatisch in das EEPROM kopiert. Die dazu notwendige
> Energie liefert ein Kondensator.

Im Prinzip kann das auch der AVR selbst.

von Tobi (Gast)


Lesenswert?

M. K. schrieb:
> Wolfgang schrieb:
>> Was spricht gegen eine microSD-Karte o.ä.
>
> Wahrscheinlich Komplexität, wäre aber eine gute Idee sich das mal
> beizubringen. Kann ja später auch bei anderen Anwendungen mal gut sein.

Der Meinung bin ich auch, ist aber auch die Frage wie viel Aufwand er 
reinstecken will.

Aber wenn das ein einfacher Datenlogger sein soll, nichts zeitkritisches 
dann würde ja ein Arduino Nano o.ä ausreichen und für die gibts ja ne 
SD-Lib.

von M. K. (sylaina)


Lesenswert?

Stefanus F. schrieb:
> P.S. schrieb:
>> Im Falle vieler Schreibzyklen käme auch in EERAM in Frage. Das ist ein
>> serieller RAM-Baustein mit einem Backup-EEPROM. Bei Stromausfall wird
>> der RAM-Inhalt automatisch in das EEPROM kopiert. Die dazu notwendige
>> Energie liefert ein Kondensator.
>
> Im Prinzip kann das auch der AVR selbst.

In der Regel ist dessen EEPROM aber nicht groß genug um den RAM 
aufzunehmen, Beispiel: Atmega328P hat 2 kB RAM aber nur 1 kB EEPROM.
Ginge hier also nur, wenn man nur 1 kB RAM nutzen würde.

von S. R. (svenska)


Lesenswert?

Man muss ja auch nicht das gesamte RAM da reinkopieren, sondern nur den 
Datenteil. Der Rest des Raminhalts lässt sich ja aus dem Flash 
rekonstruieren (aka "Einschalten").

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Der ATMega1284 hat 16kB SRAM und 4kB EEPROM. Bei dem könnte man mit 
vernünftigen Wear-Leveling-Routinen auch in den Flash schreiben, da hat 
er ganze 128kB von. Wenn man das einmal pro Woche komplett vollschreibt 
und ihm 10.000 garantierte Zyklen zugesteht, erreicht er sein Lebensende 
in 192 Jahren. Sollte wohl reichen.

von Sebastian S. (amateur)


Lesenswert?

In all den Jahren habe ich noch nie Probleme mit dem Beschreiben von 
EEPROMs gehabt.
Natürlich sollte man ein wenig Disziplin dabei halten und, was fast 
genau so wichtig ist, wissen was man tut.
Hält man sich also an ein paar einfache Regeln, so kann fast nichts 
passieren.
1. Nur dann etwas schreiben, wenn sich auch was geändert hat.
2. Doppelte Vorsicht beim Versuch in Schleifen zu schreiben.
3. Genau überlegen, was man schreibt. Wird also die Raumtemperatur
   überwacht, so ist es sinnlos alle 5 ms zu messen und diesen Wert
   zu speichern.
4. Genau überlegen wann man schreibt. In Zeiten, wo nur wenige
   Schreibzyklen möglich waren, haben wir eine Art lasy write
   verwendet. Wurde z.B. ein Wert schrittweise verändert, so wurde
   zyklisch auf Veränderungen reagiert. Also nur dann wenn ein
   eingestellter Wert "stabil" war. Nicht die 5, 6, 7, 8 während der
   Einstellung, sondern erst, wenn die Änderung einige Zeit stabil
   war.
   Jeder kennt diese Logik von der Fernbedienung her. Nur ein Knopf
   für lauter und einer für leiser. Würde hier jeder Schritt
   gespeichert, so hätte man früher schnell die paar hundert erlaubten
   Schreibzyklen überschritten. Wartet man aber einen Moment, ob sich
   noch was ändert, so erübrigen sich viele Schreibzyklen.
   Natürlich ist hier das "Timing" das A & O.

von Manfred (Gast)


Lesenswert?

Frank W. schrieb:
> schreiben in den Festspeicher des AtMega zu verhindern?

Ich habe Anwendungen, wo ich zyklisch Meßwerte protokollieren muß. Da 
hängt eine SD-Karte dran, auf deren x-Gigabyte kann man lange schreiben 
bevor die voll ist.

Ich habe aber definierte Ruhephasen, wo ich dann entnehme, an den PC 
stecke und die .csv dort einlese. Kommt das für Dich in Frage?

von Frank W. (Gast)


Lesenswert?

Hallo,

Rufus Τ. F. schrieb:
> Frank W. schrieb:
> Du könntest prüfen, ob der Wert im EEPROM schon drinsteht, den Du
> reinschreiben willst, oder ist Dein "Leistungswert" ein Wert, der immer
> größer wird?

1. Ersteinmal muss ich erst schreiben wenn die Spannung unter 5V sinkt.
Dafür hab ich mir eine Hysterese von 6V gebastelt also er schreibt 
einmal bei unterschreiten von 5V danach darf erst weider schreiben nach 
üerschreiten von 11V - war einfach...

2. Ich werd überprüfen ob sich der Wert essenzielle verändert hat.
Es wird erst geschrieben wenn der neue Wert um mind. 5% größer ist als 
der bereits geschriebene.

Ja, der Leistungswert Wh des Solarmoduls wird ständig größer.
Immer wenn Sonne scheint steigt der Wert
Watt = Volt * Ampere
Watt = Watt / 3600
Der Wert wird einmal pro Sekunde erfasst.
WattStunde = WattStunde + Watt
Nur mal so angerissen ohne anspruch auf Vollständigkeit.

>
> Die nächste Möglichkeit wäre, daß Du nur eine bestimmte Anzahl von
> Schreibvorgängen pro Zeiteinheit zulässt - ich nehme nicht an, daß es
> wichtig ist, den bei "Geflacker" im Minutentakt oder gar häufiger zu
> erfassen. Wenn Du Dir also einen Zeitstempel (Timer o.ä.) im RAM merkst,
> in dem Du erfasst, wann Du das letzte Mal den Wert ins EEPROM
> geschrieben hast, dann lässt sich auch damit die Schreibrate reduzieren
> (vorausgesetzt, daß Dein Programm so stabil läuft, daß es nicht selbst
> im Minutentakt o.ä. neu startet ...)

Wahrscheinlich binde ich einen externen Speicher an per Sockel - damit 
ich bei defekt tauschen kann. Außerdem brauch ich nur wenige Byte 
Speicher.
Vielleicht Speichere ich auch einen Wert pro Tag - so würde ich 
automatisch sicher stellen das die Speicherzelle seltener genutzt wird.

Da ich alles auf einer Experimentierplatine aufbaue - "freu" ich mich 
schon jetzt auf das gefädele (um es zu verdrahten)

Grüße
Frank

von M. K. (sylaina)


Lesenswert?

Frank W. schrieb:
> Wahrscheinlich binde ich einen externen Speicher an per Sockel - damit
> ich bei defekt tauschen kann. Außerdem brauch ich nur wenige Byte
> Speicher.

Dann könnte sich der 24LC1025 EEPROM Baustein schon lohnen. Der ist sehr 
preiswert und wird via I2C an den µC angebunden. Schau ihn dir mal an.

von Falk B. (falk)


Lesenswert?

@Frank W. (Gast)

>Der Wert wird einmal pro Sekunde erfasst.
>WattStunde = WattStunde + Watt
>Nur mal so angerissen ohne anspruch auf Vollständigkeit.

>Wahrscheinlich binde ich einen externen Speicher an per Sockel - damit
>ich bei defekt tauschen kann. Außerdem brauch ich nur wenige Byte
>Speicher.

Eben darum braucht man sicher KEINEN externen Speicher. Rechne doch 
einfach mal grob!!!

>Vielleicht Speichere ich auch einen Wert pro Tag - so würde ich
>automatisch sicher stellen das die Speicherzelle seltener genutzt wird.

Auch das ist ein Schritt in die richtige Richtung.

>Da ich alles auf einer Experimentierplatine aufbaue - "freu" ich mich
>schon jetzt auf das gefädele (um es zu verdrahten)

Tja, andere Leute rechnen lieber mal 3 Minuten und lassen es dann 
bleiben. Aber heute zählen ja nicht mehr Fakten und Realität, sondern 
nur noch Gefühl und Wunschdenken . . .

von M. K. (sylaina)


Lesenswert?

Falk, trink doch erst mal deinen Kaffee aus.

von Stefan F. (Gast)


Lesenswert?

Ich denke auch, dass der externe Speicher technisch nicht notwendig ist. 
Aber es ist ein Hobby Projekt. Mit externem Speicher hat er etwas zum 
Basteln und zum Lernen.

Ob er sich jetzt lieber mit Wear Levelling oder mit I²C Bus auseinander 
setzt, ist doch Sache des TO.

von M. K. (sylaina)


Lesenswert?

Stefanus F. schrieb:
> Ich denke auch, dass der externe Speicher technisch nicht notwendig ist.
> Aber es ist ein Hobby Projekt. Mit externem Speicher hat er etwas zum
> Basteln und zum Lernen.
>
> Ob er sich jetzt lieber mit Wear Levelling oder mit I²C Bus auseinander
> setzt, ist doch Sache des TO.

Das sehe ich genauso.

von LostInMusic (Gast)


Lesenswert?

Ich würde die Daten einfach alle 15 Minuten in ein externes 256 
kByte-EEPROM schreiben und gut ist.

Rechnung: Ein Update-Intervall von 15 Minuten (was auf der Zeitskala von 
Wetteränderungen eine ausreichende Auflösung sein sollte) entspricht 
4*24 = 96 Messungen pro Tag. Bei einer angenommenen Datensatz-Größe von 
5 Byte macht das 5*96 = 480 Byte pro Tag. Zuzüglich 32 Byte für 
irgendwelche Verwaltungsinformationen (Tages-Zeitstamp etc.) fallen also 
pro Tag genau 512  Bytes = ein halbes Kilobyte Daten an. Ein 256 
kByte-EEPROM reicht somit für 512 Tage; das ist etwas mehr als 1.4 
Jahre. Einmal im Jahr muss man das EEPROM also auslesen, wenn die Daten 
nicht verloren gehen sollen. Ein kleinerer Datensatz von 4 Byte und eine 
Speicher-Pause von z. B. 23 bis 5 Uhr erhöht den Wert auf über 2 Jahre.

Der Möglichkeiten der anschließenden Darstellung der Daten z. B. in 
tollen Excel-Diagrammen sind dann keine Grenzen gesetzt.

>Vielleicht Speichere ich auch einen Wert pro Tag - so würde ich
>automatisch sicher stellen das die Speicherzelle seltener genutzt wird.

Vielleicht wäre es sinnvoll, mal zu sagen, was genau Du überhaupt für 
welchen Erkenntnisgewinn speichern willst.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Tobi schrieb:
> Ich bezweifle aber dass ein externes EEPROM höhere Lese-Schreibzyklen
> hat als das interne.
Die Zweifel sind absolut unberechtigt. Und wenn, dann kann man extern 
ein serielles FRAM anflanschen. Dann muss man das Gehirn nicht extra 
aktivieren, wenn es um die Zahl der Schreibzyklen geht...

Frank W. schrieb:
> Ich will die Leistungsdaten eines Solarmoduls erfassen.
Definiere "Leistungsdaten".
Willst du die Summe der gelieferten Energie protokollieren? Also 
einen "Stromzähler" bauen?

Frank W. schrieb:
> Wahrscheinlich binde ich einen externen Speicher an per Sockel - damit
> ich bei defekt tauschen kann. Außerdem brauch ich nur wenige Byte Speicher.
Dann nimme einfach z.B. 64 Bytes des EEPROMs und schreibe dort immer auf 
die nächste Speicherzelle den aktuell aufsummierten Wert. Beim 
Stromausfall findest du ganz einfach den zuletzt geschriebenen Wert, 
wenn du durch die Zellen läufst und den Sprung von "hoch" nach "niedrig" 
suchst. Dort schreibst du dann weiter. Und wenn du am Ende der 64 Zellen 
ankommst, dann geht es vorne weiter. Damit reichen die aufsummierten 
möglichen 32 Mio. Schreibzyklen (bei 64 Zellen und zu speichernden 
16-Bit-Werten) ewig und drei Tage.

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.