PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : indirekte Adressierung



F@be
08.08.2006, 14:02
Hallo,

ich bin gerade dabei mir die indirekte Adressierung näher zu bringen-
bei meinem angefügten beispielcode
wird r0 aber nicht mit dem 1. Byte in der "Table:" gefüllt.

Was habe ich falsch gemacht, bzw. nicht verstanden.

>Ich simuliere mit dem AVR Studio
>und habe den Stack zuvor initialisiert.


mfg

F@be



Test: ldi xl, LOW(Table)
ldi xh, HIGH(Table)
ld r0, x

ldi r18, 0x05
rjmp Test

;#######################

Table: .db 0x01, 0x02, 0x03, 0x04

Hanni
08.08.2006, 14:21
Hallo,

ich bin gerade dabei mir die indirekte Adressierung näher zu bringen-
bei meinem angefügten beispielcode
wird r0 aber nicht mit dem 1. Byte in der "Table:" gefüllt.

Was habe ich falsch gemacht, bzw. nicht verstanden.

>Ich simuliere mit dem AVR Studio
>und habe den Stack zuvor initialisiert.


mfg

F@be



Test: ldi xl, LOW(Table)
ldi xh, HIGH(Table)
ld r0, x

ldi r18, 0x05
rjmp Test

;#######################

Table: .db 0x01, 0x02, 0x03, 0x04


okay, ich versuchst mal.

Du begehst einen kleinen aber feinen Denkfehler.
Deine Daten aus Table liegen im Flash (weil so definiert). Der Befehl LD greift aber aufs RAM zu. Das sind aber bei AVR Microcontrollern 2 verschiedene Paar Schuhe. Im übrigenb sollte man dabei noch beachten,. das der RAM erst zu Laufzeit mit Daten gefüllt werden kann.

Anbei der korregierte Code
a) fürs RAM:


Test: ldi xl, LOW(Table)
ldi xh, HIGH(Table)
ld r0, x

ldi r18, 0x05
rjmp Test

;#######################

.dseg
Table: .db 0x01, 0x02, 0x03, 0x04


b) für den Flash


Test: ldi zl, LOW(Table * 2)
ldi zh, HIGH(Table * 2)
lpm r0, z

ldi r18, 0x05
rjmp Test

;#######################

Table: .db 0x01, 0x02, 0x03, 0x04


Im übrigen muss man bei einem Zugriff aufs Flash beachten, das dieser Wortweise adressiert wird daher kommt übrigens auch die Multiplikation mit 2. Des weiteren kann nur das Z Registerpaar zum auslesen aus dem Flash verwendet werden.

Grüße,
da Hanni.

Madgyver
08.08.2006, 14:31
Da wir schon dabei sind, eine Frage:

Wenn ich mit .eseg im EEprom einen Speicherbereich definiere den ich schreiben und auslesen will wird das bei mir im Avrstudio 4 nicht richtig gemacht. Will heißen der von mir definierte Speicherbereich ist gar nicht im EEprom simuliert. Kann ich das irgendwie ändern, so das das automatisch geladen wird?

F@be
08.08.2006, 14:39
#-o
Hm jetz funkioniert die sache mit dem Zugriff auf den Flash.
Danke sehr. Jetz bin ich wieder schlauer - Danke.

aber warum multipliziere ich die Adresse mit 2???

sagen wir "Table:" hat die Adresse $0060,

Für das Low-Byte:

= 0110000 (60)

Das *2

=11000000 (C0)

Hanni
08.08.2006, 14:44
Nunja, im Flash werden die Befehle wortweise gespeichert. das heisst 2 Bytes = 1 Befehl.
Damit bekommst du mit mit dem Label table erst einmal die Adresse des Bytepaares, das an dieser Adresse steht.
Der Zugriff via LPM erfolgt aber Byteweise. Das heisst, das du die Adresse des Bytepaares umwandeln musst (also mit 2 multiplizieren).

@ Madgyver: nicht das ich wüsste ... ich muss die Werte für EEPROM auch immer manuell eintragen :(

Madgyver
08.08.2006, 14:47
Ah nagut, dann ist das tatsächlich so bescheiden gelöst. Ich dachte immer ich wäre zu doof dazu.