Forum: Mikrocontroller und Digitale Elektronik Eeprom


von Peter Lustig (Gast)


Lesenswert?

Hallo Leute,

ich habe eine frage zu Eeprom.
ich habe ein Programm in Assembler geschrieben und möchte nun mehre
werte die in registern stehen in den eeprom speichern und dann wieder
auslesen, ist dies in der form überhaupt möglich?

Mfg Peter

von Andi (Gast)


Lesenswert?

Ja logisch!
Wenns ein AVR ist, im Datenblatt über Deines µC steht alles drinn,
sogar ein Sample-Programm.

Gruß
Andi

von Peter Lustig (Gast)


Lesenswert?

Hallo,
danke für deine schnelle antwort ich musste etwas suchen habe aber
schliesslich das beispiel programm gefunden allerdings nicht im
datenplatt meines mikros at90s8515 und at90s2313 sondern in den
Atmel-Appnotes.

Nunja ich bin nicht so gut in englisch und verstehe das nicht so ganz!

Ich müsste mehrere register speichern und wieder auslesen.
Ich habe erst mal das auslesen von festen werten versucht und das
brachte nicht das erwartete ergebniss.

eepromread:   ldi r23, HIGH(daten)              ; Adresse laden
           out EEARH, r23
           ldi r23, LOW(daten)
           out EEARL, r23

           sbi EECR, EERE                    ; Lesevorgang aktiviere


                  in r23, EEDR
     ret

.eseg
Daten:
0b00110101

es sollte eigentlich 0b00110101 in r23 geladen werden, stattdessen aber
bekomme ich einen anderen wert, ich weis auch nicht genau welchen da ich
mit dem simulator nicht klar komme, ich denke das es folgender wert ist
0b01100000.

Vielleicht könnt mir ja mal einer auf deutsch erklären wie ich ein
register in einen eeprom speichere und wieder auslese.

von Andi (Gast)


Lesenswert?

Das kann doch nicht so schwierig sein!
Hier zwei Routinen zum lesen vom uns schreiben in das EEPRO welche ich
mal gemacht habe:

;Schreiben eines Byte in das EEPROM.
;Dabei wird vor dem Schreiben an der gleichen
;Adresse gelesen und geprüft, ob der Wert in
;der angegebenen Adresse schon vorhanden ist
;um die Schreibzyklen zu erhöhen.
.def EEPByte=r16
.def EEPTemp=r17
EEPWB:
  push  EEPTemp
  mov  EEPTemp,EEPByte
  rcall  EEPRB
  cp  EEPTemp,EEPByte
  breq  EEPWBExit
  out  EEDR,EEPTemp
  cli
  sbi  EECR,EEMWE
  sbi  EECR,EEWE
  sei
EEPWBExit:
  pop  EEPTemp
  ret

EEPRB:
  sbic  EECR,EEWE
  rjmp  EEPRB
  out  EEARH,xh
  out  EEARL,xl
  sbi  EECR,EERE
  adiw  xl,1
  in  EEPByte,EEDR
  ret

Die Routine "EEPRB" ist zum lesen eines Bytes (EEP Read Byte) und die
Routine "EEPWB" zum schreiben (EEP Write Byte).
Die Routine EEPWB ruft Anfangs die Routine EEPRB auf um zu checken, ob
der gleiche Wert in einer EEPROM-Zelle schon enthalten ist.
Ist das der Fall, wird nicht geschrieben um die Write-Zyklen zu erhöhen
da der selbe Wert schon enthalten ist.
Auch ganz paraktisch einen ganzen Block von z. B. Einstellbaren
Parametern zu speichern wenn nur einer der Parameter verändert wird.
Da kann man dann jedes mal mit einer Routine alle speicherbaren
Parameter übergeben ohne das man für jeden Parameter eine Adresse
errechnen lassen muß und ohne das die Schreib-Zyklen unnötig minnimiert
werden.

An beiden Routinen übergibt man in X (XL und XH) die EEPROM-Adresse und
in R16 den zu schreibenden Wert.
Beim lesen ist nach EEPRB der Wert in R16.

Beispiel:
Schreiben:
 ldi  r16,105    ;Zu schreibende Zahl
 ldi  xl,low(312)  ;Adresse low-Byte
 ldi  xh,high(312)  ;Adresse high-Byte
 rcall  EEPWB    ;Wert in R16 in EEPROM schreiben

Lesen:
 ldi  xl,low(312)  ;Adresse low-Byte
 ldi  xh,high(312)  ;Adresse high-Byte
 rcall  EEPWB    ;Wert in R16 vom EEPROM lesen
 ...      ;In R16 ist der Wert von der EEPROM-Adresse X.

Wenn das mit X (XL und XH) für die Adress-Übergabe nicht passt, kann
man ja ändern auf Y (YL und YH) oder Z (ZL und ZH).
Innerhalb der beiden Routinen wird der Adress-Pointer, in diesem Fall
X, nach einer Aktion áutomatisch um 1 erhöht.
Ist auch ganz Hilfreich für Block-Lese/Schreib-Routinen die sich dann
das erhöhen des Pointers schenken können.

Gruß
Andi

von Peter Lustig (Gast)


Lesenswert?

Hallo,

vielen dank für deine Hilfe, mein Problem ist gelöst dank deiner
erklärung!

Mfg Peter

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.