Forum: Mikrocontroller und Digitale Elektronik EEprom - ATmega16 Datenverlust nach schreiben


von Kie B. (kiebitz0309)


Lesenswert?

  ldi r21,0x04  ; R21 mit neuen Wert laden
EEwrite:  sbic EECR,EEWE  ; warten evtl. schreiben des vorherigen Bytes
  rjmp EEwrite      ;
  ldi r16, 0x03      ; Adresse laden  LOW-Teil
          ldi r17, 0x00      ; Adresse laden HIGH-Teil
          out EEARL, r16      ; Adressregister laden
          out EEARH, r17
  out EEDR, r21      ;R21 ins EEPROM speichern
  sbi EECR,EEMWE      ;EEPROM Master Write Enable
  sbi EECR,EEWE      ;EEPROM Master Write Enable


Mit diesem Programmteil beschreibe ich die Adresse 0003h im EEprom neu. 
Das klappt auch ausgezeichnet. Interessanterweise sind jedoch die 
Inhalte der Adressen, die vorher beschrieben waren gelöscht ??
Welche eventuell andere Möglichkeit gibt es, ca. 100 Bytes mit genauer 
Adresse im EEprom abzulegen?
Ich brauche für Einstellungen immer nur bestimmte Werte, die aus diesen 
100 Werten zusammengestellt werden. Eventuell muss es aber möglich sein, 
diese Werte zu ändern.

Vielen Dank Kiebitz

von thkaiser (Gast)


Lesenswert?

Könnte es sein, dass Du zwischendurch das Programm geändert, also den 
Flash neu beschrieben hast? Beim Löschen des Flash wird das EEPROM 
ebenfalls gelöscht. Es gibt eine Fuse, die dies verhindert.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>Welche eventuell andere Möglichkeit gibt es, ca. 100 Bytes mit genauer
>Adresse im EEprom abzulegen?

Keine, das ist schon alles korrekt so. Du mußt aber sicherstellen, daß 
Dir während der EEPROM-Routine kein Interrupt dazwischenfährt, sonst 
kann das programmieren der Speicherzelle in die Hose gehen. 
Gegebenenfalls sperrst Du unmittelbar vor dem EEPROM-Aufruf die 
Interrupts global mit "cli" und schaltest sie danach mit "sei" wieder 
ein.

von Uwe (Gast)


Lesenswert?

Hi!
>Welche eventuell andere Möglichkeit gibt es, ca. 100 Bytes mit genauer
>Adresse im EEprom abzulegen?

Im Programm
.eseg
.org 10 ;deine gewünschte Adresse
.db....... ;deine Daten

Wärend der Laufzeit nur wie du es gemacht hast nur die Ausgabe von
 out EEARL, r16      ; Adressregister laden
 out EEARH, r17

umdrehen, erst L dann H

Viel Erfolg, Uwe

von Uwe (Gast)


Lesenswert?

so ein Mist, sollte natürlich "umdrehen, erst H dann L" sein.

MFG Uwe

von Kie B. (kiebitz0309)


Lesenswert?

Vielen Dank für die umgehende Hilfe.
Dér EEprom wird bei mir tatsächlich durch das neue Flashen gelöscht. 
Meine Routine schreibt dann die neuen Werte rein und es scheint wie eine 
Löschung während der Routine. :o(
Ich muss also grundsätzlich erst die Routiene einladen.
Danach erst den EEprom flashen.
Nochmals Danke an alle! Hoffe mich mal revanchieren zu können.
Kiebitz

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Na setze doch mal die EESAVE-Fuse (in AVR-Studio "Preserve EEPROM during 
Chip-Erase"), dann wird das EEPROM beim Flashen nicht mehr 
überschrieben!

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.