Forum: Mikrocontroller und Digitale Elektronik 1 bit ins EEPROM schreiben ATTINY85/avr-gcc


von Robert W. (rwalli)


Lesenswert?

Hallo!

Ich würde gerne im EEPROM des attiny85 einen Zähler im Minutentakt 
mitlaufen lassen.
Damit das EEPROM nicht allzufrüh den Geist aufgibt, dachte ich mir dass
ich das EEPROM stückweise mit bits vollschreibe und somit nur alle 4096 
Minuten einen "erase" brauche.

Nur wie mache ich das?

wenn ich 00000000 an Adresse x stehen habe und dann 0x01, 0x03, 0x07... 
bis 0xff mit "eeprom_write_byte" draufschreibe schreibt der attiny dann 
immer nur ein bit dazu oder löscht er bei jedem schreibvorgang das ganze 
byte?

Robert

von Uwe S. (de0508)


Lesenswert?

Hallo,

man kann nur die Bits Ändern, die eine "1" sind.
Ein EEprom startet mit 0xff.

: Bearbeitet durch User
von Robert W. (rwalli)


Lesenswert?

Ok!

Das bedeutet wenn ich 0xfe, 0xfc, 0xf8,... ins leere EEprom (0xff) 
schreibe habe ich keinen Löschvorgang und mein Zähler würde so 
funktionieren?

Robert

: Bearbeitet durch User
von Jakob (Gast)


Lesenswert?

Es gibt die EEPMn-Bit-Kombinationen im EECR,
EEPROM Control Register:
clear+write, clear, write.

Mit 'nur write' KÖNNTE dein spezieles Vorhaben möglich sein.
- Probier es doch einfach und berichte uns.

Kostet doch nicht mehr, als ein paar Write-Zyklen im
EEPROM.

von Robert W. (rwalli)


Lesenswert?

Ob's wirklich funktioniert kann ich dann aber nicht feststellen...
Aber ich probier's mal.

: Bearbeitet durch User
von Jakob (Gast)


Lesenswert?

Wieso nicht?

Wahrscheinlich nicht in der Originalschaltung, aber
mit einem Testaufbau:

Kannst doch in einem beschleunigten Testprogramm mal
die Bits schritweise umprogrammieren und jedes mal
sofort wieder auslesen.

Aber selbst wenn man jede Minute ein Byte auf NULL setzt
wären das 512 * 100.000 (max. Schreib/Lösch-Zyklen)
= 97 Jahre.

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


Lesenswert?

Robert W. schrieb:
> Ob's wirklich funktioniert kann ich dann aber nicht feststellen...
Doch natürlich: schreibe einfach in eine Zelle mit Inhalt 00001111 den 
Wert 00110011.
Was erwartest du dann, wenn die Zelle vor dem Schreiben nicht gelöscht 
wird? Richtig: es lassen sich nur 1-en auf 0 schreiben, die 
Ergebnisfunktion ist also ein "UND". 00000011 muss also das Ergebnis 
sein, wenn die Zelle vorher nicht auf 11111111 gelöscht wird.
Wird sie vor dem Schreiben gelöscht, dann kommt 00110011 heraus.

: Bearbeitet durch Moderator
von Klaus R. (klaus2)


Lesenswert?

...oder du erkennst lowvolt schnell genug und schreibst dann mit C 
gepuffert noch schnell weg.

Klaus.

von Robert W. (rwalli)


Lesenswert?

Jakob schrieb:
> Aber selbst wenn man jede Minute ein Byte auf NULL setzt
> wären das 512 * 100.000 (max. Schreib/Lösch-Zyklen)
> = 97 Jahre.

Die Frage war ob man ein Bit schreiben kann.
Das wären dann 512 x 8 x 100.000 Zyklen.

Lothar M. schrieb:
> Robert W. schrieb:
>> Ob's wirklich funktioniert kann ich dann aber nicht feststellen...
> Doch natürlich: schreibe einfach in eine Zelle mit Inhalt 00001111 den
> Wert 00110011.

Was da rauskommt ist schon klar nur ob er Kontroller das elektisch so 
umsetzt bleib meiner Meinung nach unklar.


Ich probier's trotzdem und geb euch in 776 Jahren bescheid ;-)

Robert

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


Lesenswert?

Robert W. schrieb:
> Ob's wirklich funktioniert kann ich dann aber nicht feststellen...
> Aber ich probier's mal.

 Es funktioniert 100%, EEPROM wird mit EEPM1 = 1 und EEPM0 = 0 nicht
 vorher gelöscht - ausprobiert.
 Dieser Trick wurde schon bei alten Telefonkarten angewendet um ein
 nachfüllen der Karte zu verhindern.

 Du könntest aber diese Zelle benutzen um alle 8 Minuten einen
 neuen Minutenwert  an einer anderen Stelle im Eeprom ganz normal
 reinzuschreiben.

 Ergibt sowohl 800,000 Minuten für diese Zelle als auch 800,000 Minuten
 pro normale long variable (4 Byt). Und das dann Mal 100...

 Ob es sich aber lohnt, ist eine andere Frage.
 Du kannst eine long variable an 128 verschiedenen Adressen im 512
 Byte Eeprom reinschreiben. Bei 100,000 Schreib/Löschvorgängen ergibt
 das 12,800,000 Minuten oder 24 Jahre...

 Oder, wenn man sich LONG als LL-LH-HL-HH vorstellt, und nur Bytes
 die sich verändert haben reinschreibt, kann man nach etwa 95,000
 Schreibvorgängen den Adresspointer einfach nur um 1 Byte erhöhen und
 hat auf diese Weise 48,640,000 Minuten oder etwa 92 Jahre Zeit...

: Bearbeitet durch User
von Robert W. (rwalli)


Lesenswert?

Marc V. schrieb:

>  Es funktioniert 100%, EEPROM wird mit EEPM1 = 1 und EEPM0 = 0 nicht
>  vorher gelöscht - ausprobiert.

Ich hab's jetzt auch ausprobiert.
Es scheint so zu sein wie Ihr sagt.
100% sicher bin ich mir zwar nicht ob das intern doch anders läuft aber 
99,9%.

> Ob es sich aber lohnt, ist eine andere Frage.

Interresse war auch dabei.

Danke an alle!

Robert

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.