Hallo an alle, Im Tutorial steht: include "4433def.inc" ldi R16, 0xFF out DDRB, R16 ; Port B: Ausgang ldi ZL, LOW(daten*2) ; Low-Byte der Adresse in Z-Pointer ldi ZH, HIGH(daten*2) ; High-Byte der Adresse in Z-Pointer lpm ; durch Z-Pointer adressiertes Byte nach R0 lesen mov R16, R0 ; nach R16 kopieren out PORTB, R16 ; an PORTB ausgeben ende: rjmp ende ; Endlosschleife daten: .db 0b10101010 Hm, nebenbei steht auch noch man soll sich keine Gedanken über "(daten*2)" machen, das ist eben so. Trotzdem wüßte ich gerne warum *2? Leider hab ich noch keine Literatur gefunden, die mir das beschreibt!? Grüße und Dank für Eure Antwort Mike
Das ist eine Eigenheit des Atmel AVR Assemblers. Dort sind Labels im .cseg Word orientiert bedingt durch die Busbreite (16 Bit). Der Zugriff mit LPM über die Index-Register R31:R30 (ZH:ZL) erfolgt aber Byte orientiert daher hier die Multiplikation Label * 2.
Weil Tabellen wordweise gespeichert sind, aber Z-Register wird byteweise adressiert. Flashspeicher von AVR ist so gebaut, dass man nur Words auslesen kann. Und mit Z-Register kann man auch RAM-Speicher zugreifen, da werden die Daten als Bytes gespeichert.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.