Forum: Mikrocontroller und Digitale Elektronik EEPROM Routine läuft nicht, bitte um Überprüfung.


von derHorst (Gast)


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.

von spess53 (Gast)


Lesenswert?

Hi

>lds r16,0x0101

Damit lädst du r16 mit dem Wert von r5. Beabsichtigt?

MfG Spess

von derHorst (Gast)


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.

von derHorst (Gast)


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.

von spess53 (Gast)


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

von monster (Gast)


Lesenswert?

Wenn mich nicht alles täuscht, ist 0x0101 nicht gleich 5; 0x bedeutet: 
Zahl im Hexadezimalformat!

von Karl H. (kbuchegg)


Lesenswert?

spess53 schrieb:

> 0x0101 = $05.

Sicher?
0x ist die Spezifikation für Binär?

> Setze doch einfach ein Label in .dseg

Das wär zu einfach, wenn man den Assembler seinen Job machen lässt.

von derHorst (Gast)


Lesenswert?

Hallo spess, danke für die Tips. Ich hab jetzt die Labels definiert und 
eingefügt. Ist auch übersichtlicher :)
Aber diesen Teil "0x0101 = $05" verstehe ich immer noch nicht.
Wenn ich im Datenblatt (http://www.atmel.com/Images/doc8271.pdf) auf 
Seite 19 schaue steht da, dass die Register r0-r31 im Speicherbereich 
0x0000 - 0x001F liegen.

von spess53 (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

>0x ist die Spezifikation für Binär?

Natürlich nicht. Peinlich. Ich habe irgenwie nur Nullen und Einsen 
gesehen.

MfG Spess

von derHorst (Gast)


Lesenswert?

So, Intel Hex auch verstanden. Daraus folgt: Schreibzugriffe aufs EEPROM 
funktionieren wie gewünscht.

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.