EEPROM Routine läuft nicht, bitte um Überprüfung.

Gast #2705042
Lesenswert?

Mahlzeit,
Ich schreibe gerade ein Programm für einen Atmega88pa in ASM. Ein Teil 
der Funktionalität dieses Programm umfasst, dass bei einem Interrupt 
(INT0) einige Werte in das EEPROM speichert. Leider klappt das nicht so 
ganz.

Das ist meine verwendete Schreib Routine:
1
EEPROM_write1
2
sbic EECR,EEPE
3
rjmp EEPROM_write1
4
ldi r18,0
5
ldi r17,1
6
out EEARH, r18
7
out EEARL, r17
8
lds r16,0x0101
9
out EEDR,r16
10
sbi EECR,EEMPE
11
sbi EECR,EEPE
ist fast identisch zu der aus dem Datenblatt. Ich lade zwischendurch nur 
noch die Adressregister mit Werten und Daten aus dem Ram in r16 um diese 
im EEPROM zu speichern.
1
EEPROM_read1
2
sbic EECR,EEPE
3
rjmp EEPROM_read1
4
ldi r18,0
5
ldi r17,1
6
out EEARH, r18
7
out EEARL, r17
8
sbi EECR,EERE
9
in r16,EEDR
10
mov r1,r16
Auch hier wieder die Routine aus dem Datenblatt. Ich lade wieder die 
Adressregister mit Werten und schiebe am Ende den gelesen Wert nach r1, 
wo er auch hin soll.

Das ganze funktioniert aber nicht, es wäre sehr nett, wenn ihr mal 
drüber schaut ob ihr einen Fehler finden könnt.
Gast #2705063
Lesenswert?

Wieso r5?
Laut Datenblatt fängt doch das frei verfügbare Ram bei 0x0100 an? In dem 
kann ich doch rumwerkeln wie ich will solange ich nicht in den Stack 
komme. Aber der wächst, meines Wissens nach, eh von unten.
Gast #2705069
Lesenswert?

Hmm, ich hab jetzt an die ersten vier Speicherstellen des EEPROM Null 
geschrieben.
Mit diesem Code:
1
ldi r16,0
2
EEPROM_write11:
3
sbic EECR,EEPE
4
rjmp EEPROM_write11
5
ldi r18,0
6
ldi r17,0
7
out EEARH, r18
8
out EEARL, r17
9
out EEDR,r16
10
sbi EECR,EEMPE
11
sbi EECR,EEPE
halt vier mal hinereinander mit steigender Adresse.
Dann habe ich über meinen AVR ISP MKII das EEPROM ausgeseln und mit 
einem Hex Editor ( next soft hex editor mx ) geöffnet.
Nur leider sind die ersten vier Speicherstellen nicht Null. Sie sind 3A 
31 30 30.
Gast #2705071
Lesenswert?

Hi

>Wieso r5?
>Laut Datenblatt fängt doch das frei verfügbare Ram bei 0x0100 an? In dem
>kann ich doch rumwerkeln wie ich will solange ich nicht in den Stack
>komme. Aber der wächst, meines Wissens nach, eh von unten.

0x0101 = $05. Da die Register r0...r1, IO-Register und RAM den gleichen 
Adressraum benutzen spricht lds r16,5 die Adresse 5 an. Und das ist nun 
mal r5. Der RAM fängt erst bei $100 an.

Setze doch einfach ein Label in .dseg

  .dseg
xyz:  .byte 1 ; Reserviert 1 Byte im RAM

darauf greifst du mit

  lds r16,xyz  oder
  sts xyz, r16

zu. Damit bist du die Probleme los.

MfG Spess
Gast #2705096
Lesenswert?

Hi

>Nur leider sind die ersten vier Speicherstellen nicht Null. Sie sind 3A
>31 30 30.

Das sind nicht die Speicherstellen: 3A 31 30 30 = ':100'. Das ist der 
Anfang einer Zeile im INTEL Hex Format.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren