Forum: Mikrocontroller und Digitale Elektronik unbeantwortete Frage im Tutorial


von Mike (Gast)


Lesenswert?

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

von mmerten (Gast)


Lesenswert?

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.

von Aleksej Kiselev (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

Jo, danke werds mir merken!!!

Mike

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
Noch kein Account? Hier anmelden.