Zitat von
F@be
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
Code:
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:
Code:
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
Code:
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.
Lesezeichen