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.
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.
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.
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
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.
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.
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