Forum: Mikrocontroller und Digitale Elektronik Atmega 328p Eeprom schreibzugriff auf einzelne Bits


von Schmiddi T. (schmiddi10)


Lesenswert?

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

von Oliver S. (oliverso)


Lesenswert?

Die Eeprom-Pagesize ist 1 Byte. Kleinere Einheiten lassen sich nicht 
schreiben oder lesen.

Jeden Impuls einzeln als Bit speichern klingt allerdings ... seltsam.

Oliver

von leo (Gast)


Lesenswert?

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

von Schmiddi T. (schmiddi10)


Lesenswert?

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. "

von g457 (Gast)


Lesenswert?

> [..] 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

von Max D. (max_d)


Lesenswert?

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

von Jürgen (Gast)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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?

von Axel S. (a-za-z0-9)


Lesenswert?

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
von Schmiddi T. (schmiddi10)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Jo mei (Gast)


Lesenswert?

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?!

von Schmiddi T. (schmiddi10)


Lesenswert?

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!

von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.