1 bit ins EEPROM schreiben ATTINY85/avr-gcc

OP #4944963
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
Gast
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.
Gast
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.
Moderator (Firma: Titel) Persönliche Seite
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.
OP
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
(Firma: Vescomp)
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...
OP
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.