unbeantwortete Frage im Tutorial

Gast #152540
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
Gast #152541
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.
Gast #152542
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren