- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 6 von 6

Thema: indirekte Adressierung

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    04.12.2004
    Ort
    Rottweil
    Alter
    39
    Beiträge
    64

    indirekte Adressierung

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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
    Irren ist menschlich. Aber wenn man richtig Mist bauen will, braucht man einen Computer.

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569

    Re: indirekte Adressierung

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

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    15.07.2004
    Alter
    39
    Beiträge
    807
    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?

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    04.12.2004
    Ort
    Rottweil
    Alter
    39
    Beiträge
    64

    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)
    Irren ist menschlich. Aber wenn man richtig Mist bauen will, braucht man einen Computer.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    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

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    15.07.2004
    Alter
    39
    Beiträge
    807
    Ah nagut, dann ist das tatsächlich so bescheiden gelöst. Ich dachte immer ich wäre zu doof dazu.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen