mikrocontroller.net

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


Autor: Robert Walli (rwalli)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe S. (de0508)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

: Bearbeitet durch User
Autor: Robert Walli (rwalli)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Robert Walli (rwalli)
Datum:

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

: Bearbeitet durch User
Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...oder du erkennst lowvolt schnell genug und schreibst dann mit C 
gepuffert noch schnell weg.

Klaus.

Autor: Robert Walli (rwalli)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marc Vesely (Firma: Vescomp) (logarithmus)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Robert Walli (rwalli)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.