Hallo Leute, ich will mittels IR-Lichtschranke einen Stromzähler auslesen und jeden Impuls ins Eeprom speichern. Um die Lebensdauer vom internen Eeprom zu verlängern, will ich bei jedem Impuls ein einzelnes Bit setzten. Meine Frage ist, was ist die schönste Lösung die einzelnen Bits zu setzten und nach z.b. einem Reboot wieder auszulesen? Der Zähler gibt pro kWh 75 Impulse raus. Davon würde ich gerne jeden einzeln nacheinander in ein Bit schreiben. Heißt bei z.B. 3000 kWh pro Jahr wird jedes Bit nur 3000 mal geschrieben. Gruß Schmiddi
Die Eeprom-Pagesize ist 1 Byte. Kleinere Einheiten lassen sich nicht schreiben oder lesen. Jeden Impuls einzeln als Bit speichern klingt allerdings ... seltsam. Oliver
Schmiddi T. schrieb: > Davon würde ich gerne jeden einzeln > nacheinander in ein Bit schreiben. Du hast sicher das Datenblatt gelesen: "... EEPROM memory. It is organized as a separate data space, in which single bytes can be read and written." D.h. vergiss es. leo
leo schrieb: > D.h. vergiss es. Im Artikel Speicher habe ich etwas anderes gefunden. Deshalb wollte ich das mal nachfragen. https://www.mikrocontroller.net/articles/Speicher#EEPROM-Schreibzugriffe_minimieren "Eine Kondensatorstütze kann durch Verteilen der zyklischen EEPROM-Schreiblast auf mehrere Zellen oder Bits vermieden werden: Beispielsweise kann eine Uhr eines Arduino Uno mit ATmega328P, die Versorgungsausfall durch Stehenbleiben wie eine mechanische Uhr „überleben“ soll, minutenweise jeweils 1 Bit in einem 60 Bit (8 Byte) großen EEPROM-Abschnitt löschen. "
> [..] und jeden Impuls ins Eeprom speichern.
Wozu das denn? Ordentliche "Stromausfall-Erkennung" einbauen, Wert nur
beim Erkennen eines Ebensolchen (und ggf. alle n-tausend Pulse) ins
eeprom wegspeichern und beim Starten auslesen. Feddisch. kiss und
langlebig.
HTH
Afaik kann man beim mega explizit das löschen (setzt alle bits auf 1) und schreiben (setzt einzelne bits von 1 nach 0) trennen. Wenn du jetzt unbedingt jeden Puls speichern willst würde ich von dem eeprom einen entsprechenden Teil für diese Betriebsweise zuweisen und dort für jeden Puls ein bit auf 0 setzen. Wenn der Bereich voll ist, dann wird das zusammengefasst und in einen zähler geschrieben. Um Konsistenzprobleme bei Stromausfall während der Zusammenfassung zu vermeiden hält man den Zähler mehrfach mit crc im eeprom und ändert den Inhalt nacheinander. z.b. so: zähler A hochzählen, bitfeld löschen, zähler B hochzählen nach dem start kann man dann anhand des zustandes der beiden zähler und des bitfeldes den genauen stand wieder herstellen
Schmiddi T. schrieb: > ich will mittels IR-Lichtschranke einen Stromzähler auslesen und jeden > Impuls ins Eeprom speichern. Falsches Konzept. Denk nochmal drüber nach.
Schmiddi T. schrieb: > m Artikel Speicher habe ich etwas anderes gefunden. Deshalb wollte ich > das mal nachfragen. > > https://www.mikrocontroller.net/articles/Speicher#EEPROM-Schreibzugriffe_minimieren Ok, was da steht, mag in gewisser Weise stimmen. Da wird davon ausgegangen daß vor allem die gelöscht (1)-> gesetzt(0)-Übergänge die Zellen altern lassen. Wird in einem Schreibvorgang nur jeweils ein Bit per Byte gesetzt, so könnte man davon ausgehen, daß tatsächlöich die 8 einzelnen Schreibvorgänge in Summe nur so viel Verschleiß erzeugen, wie ein komplettes Löschen des Bytes. Obs stimmt, wirst du herausfinden ;) Oliver
Schmiddi T. schrieb: > ich will mittels IR-Lichtschranke einen Stromzähler auslesen und jeden > Impuls ins Eeprom speichern. Ich frage mich, wofür das ohne Timestamp gut sein soll. Das der Zähler Impulse erzeugt, ist ja sowieso sicher, aber ohne Zeitinfo ist das Speichern doch sinnlos.
Das frage ich mich auch: nach rund 13 Tagen steht da eine Reihe von 8*1024 Einsen im EEPROM, was lässt sich damit anfangen?
leo schrieb: > Schmiddi T. schrieb: >> Davon würde ich gerne jeden einzeln >> nacheinander in ein Bit schreiben. > > Du hast sicher das Datenblatt gelesen: > "... EEPROM memory. It is organized as a separate data > space, in which single bytes can be read and written." > > D.h. vergiss es. Albern. Natürlich kann man die Bits im EEPROM trotzdem einzeln setzen. Einfach den alten Wert auslesen, das gewünschte Bit ändern und wieder ins EEPROM schreiben. Und wenn man sich den alten Wert gemerkt hat, kann man sich das Lesen auch sparen. Der Fehler des TE liegt hier: > will ich bei jedem Impuls ein einzelnes Bit setzten Denn die Information steckt nicht darin, daß da ein Impuls war, sondern im Abstand zwischen diesem Impuls und dem vorherigen. Das einzelne Bit nützt ihm da überhaupt nichts, weil man dem Bit beim Lesen nachher nicht ansehen kann, wann es gesetzt wurde.
:
Bearbeitet durch User
Also... Ich wollte nicht alles hier erklären was ich vorhabe sondern nur auf mein eigentliches Problem beschränken. Hier die komplette Beschreibung: Der Zähler hat 75 Umdrehungen pro kWh. Diese wollte ich als einzelne Bits zählen. Dafür bräuchte ich 10 Byte. Heißt wenn 1 kWh erreicht wurden, kann ich den Zählerstand um eins hoch zählen. Für den Zählerstand würde ich 4 Byte im Eeprom nehmen. Auch hier könnte man dann 40 Byte Blocken um 10 Speicherplätze für den Zählerstand zu haben. Diese kann man ja im Ringbuffer betreiben. So zu dem Timestamp... Die Werte werden mit einem RFM69CW an eine "Intelligente Zentrale" geschickt. Diese wertet das dann alles aus. Also z.b. Verbrauch zwischen den zwei Impulsen... Erstmal soll das ein Atmega 2560 vom Arduino Mega Board mit SD Karte, RTC... sein, später ein mal ein Raspberry Pi 4.
Schmiddi T. schrieb: > Die Werte werden mit einem RFM69CW an eine "Intelligente Zentrale" > geschickt. Diese wertet das dann alles aus Manoman. Kauf dir ein DS3231 RTC-Modul, dieser hat RTC und Eeprom 24C32 on Board. Wenn du alle 2 Minuten Jahr(Offset), Monat, Tag, Stunde, Minute und Anzahl der Impulse reinschreibst, wird der Eeprom gute 15 Jahre aushalten. Mit 24 Stunden * 32 = 768 Bytes am Ende des Eeproms hast du sogar deinen stündlichen Energieverbrauch für einen ganzen Monat. Allerdings hält dein Eeprom dann nur 12 Jahre weil die verbleibenden Bytes öfters beschrieben werden... > geschickt. Diese wertet das dann alles aus. Also z.b. Verbrauch zwischen > den zwei Impulsen... Der Verbrauch zwischen 2 Impulsen ist immer gleich, die Zeit nicht... > Erstmal soll das ein Atmega 2560 vom Arduino Mega > Board mit SD Karte, RTC... sein, später ein mal ein Raspberry Pi 4. Bist du sicher, daß der Raspi für diese äußerst komplizierte Aufgabe auch ausreicht?
:
Bearbeitet durch User
Wenn du dir über solche Speicher Gedanken machen musst, läuft was falsch. 1. Warum überhaupt EEPROM? Die Daten sind dann doch schon längst in der 'Funkzentrale'. 2. Warum den internen EEPROM? Ein externes I2C oder SPI EEPROM kann steckbar sein und verträgt deutlich mehr Schreibzyklen als das EEPROM des AVR. Irgendwie habe ich den Eindruck, das du da mit Kanonen auf Spatzen schiesst. Die ganze Nummer würde inkl. Funkanbindung in einen Tiny44 oder 2313 passen. Und der Stromzähler läuft dann auch langsamer.
Matthias S. schrieb: > Irgendwie habe ich den Eindruck, das du da mit Kanonen auf Spatzen > schiesst. Jo mei, gell, beachte, er will Schmiddi T. schrieb: > mittels IR-Lichtschranke einen Stromzähler auslesen und jeden > Impuls ins Eeprom speichern. Man sollte die Wünsche des TO schon ernst nehmen, gelle? Wenn ich mit eckigen Reifen Auto fahren will, dann will ich eben eckige Reifen, kapiert?!
Leute Das soll nicht der einzige Sensor bleiben. Da sollen noch mehr kommen ala Smart Home. Temperatur und Luftfeuchtigkeit, Fensterkontakte. Raspberry Pi eben weil ich das Rad nicht neu erfinden will und auf bereits vorhandene Software zugreifen will wie FHEM, Home Assistent, io Broker un co. Wieso der Atmega 328p mit dem internen Eeprom, ganz einfach, weils schon da ist... Ich will damit basteln was ich hier habe. Unter anderem Einige 328p, habe ich mal im zehner pack gekauft, rfm69cw hab ich auch noch einige hier rum Fliegen genau wie ein Arduino Mega und eine RTC (DS1307). Heißt für alles was ich vor habe muss ich nur die IR Diode und den IR- Fototransistor kaufen. Es ist nur ein Bastelprojekt (Hobby) keine Produkt was in den Handel soll. Deshalb will ich mit dem arbeiten was ich habe und nicht extra was dafür kaufen. Sonst hätte ich das schon anders gemacht. Für Tipps und Tricks bin ich gerne zu haben. Ich lerne nie aus! Heißt ich bin nicht Beratungsresistent!
Normalerweise würde man die Daten nur im RAM halten und bei Stromausfall ggf. schnell ins EEprom sichern. Wenn du vor dem Spannungsregler einen dicken Elko hast, bleibt bei Stromausfall reichlich Zeit dazu.
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.