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
> 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.
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
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. ;)
@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!
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 ...)
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?
@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).
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ß ;) )
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.
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.
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.
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.
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.
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.
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.
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").
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.
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.
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?
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
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.
@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 . . .
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.