Adressierungsarten AVR

Die AVR-Mikrocontroller unterstützen mächtige und effiziente Adressierungsarten, um auf den Programmspeicher (Flash) und den Datenspeicher (SRAM, Register, I/O-Speicher und erweiterten I/O-Speicher) zuzugreifen. Nachfolgend werden die verschiedenen Arten der Adressierung beschrieben.

In den Abbildungen bedeutet OP das Stück des Operationscodes innerhalb des Befehlswortes. Aus Gründen der Vereinfachung zeigen nicht alle Bilder den exakten Ort der adressierenden Bits. Die Variablen RAMEND und FLASHEND stehen für die höchste Speicherzelle im Daten- und Programmspeicher. Nicht alle Adressierungsarten sind in allen Bausteinen verfügbar.

Direkte Adressierung eines Registers

Der Operand für den Befehl ist im Register d (Rd).
Direkte Adressierung eines Registers


Direkte Adressierung von zwei Registern (Rd und Rr)

Die Operanden für den Befehl sind in den Registern d (Rd) und r (Rr) enthalten. Das Ergebnis der Operation wird im Register d (Rd) abgelegt.
Direkte Adressierung von zwei Registern


Direkte I/O-Adressierung

Die Adresse des I/O-Operanden ist in den 6 Bits des Befehlswortes enthalten. Rr/Rd ist die Adresse des Ziel- oder Quellregisters. In manchen Bausteinen sind mehr als 64 Speicherzellen im I/O-Bereich vorhanden. Dieser erweiterte Speicherbereich von 64 bis 255 kann nur über die Datenadressierung und nicht über die I/O-Adressierung erreicht werden.
Direkte I/O-Adressierung


Direkte Datenadressierung

Die 16-Bit-Adresse in den unteren 16 Bit des zwei Worte langen Befehls gibt die Speicherzelle im Datenspeicher an. Rr/Rd ist die Adresse des Ziel- oder Quellregisters.
Direkte Datenadressierung


Indirekte Datenadressierung mit Versatz

Die Adresse des Operanden ergibt sich aus der Addition des Y- oder Z-Registers mit den 6 Bits (Versatz) in dem Befehlswort. Rr/Rd ist die Adresse des Ziel- oder Quellregisters.
Indirekte Datenadressierung mit Versatz


Indirekte Datenadressierung

Die Adresse des Operanden wird über den Inhalt des X-, Y- oder Z-Registers bestimmt. In Bausteinen ohne SRAM entspricht die indirekte Datenadressierung der indirekten Registeradressierung. Die indirekte Registeradressierung ist eine Teilmenge der indirekten Datenadressierung, da der Datenspeicher von 0 bis 31 im Registerbereich liegt.
Indirekte Datenadressierung


Indirekte Datenadressierung mit vorherigem Dekrement

Bei dieser Art der Adressierung wird das X-, Y- oder Z-Register vor der Ausführung des Befehls dekrementiert. Die Adresse des Operanden ist also der um eins verminderte Inhalt des entsprechenden Registers.
Indirekte Datenadressierung mit vorherigem Dekrement


Indirekte Datenadressierung mit anschließendem Inkrement

Bei dieser Art der Adressierung wird das X-, Y- oder Z-Register nach der Ausführung des Befehls inkrementiert. Die Adresse des Operanden ist also der Inhalt des entsprechenden Registers, bevor dieses um eins erhöht wird.
Indirekte Datenadressierung mit anschließendem Inkrement


Laden von Konstanten aus dem Programmspeicher mit LPM und ELPM

Die Adresse der Daten wird im Z-Register angegeben. Die oberen 15 Bit geben die Wortadresse an. Beim LPM-Befehl selektiert das LSB das Low-Byte (LSB=0) oder High-Byte (LSB=1). Beim SPM-Befehl muss das LSB=0 sein, da er sich auf ganze Worte (zwei Bytes) bezieht. Wenn der ELPM-Befehl genutzt wird, adressiert das RAMPZ-Register den erweiterten Speicherbereich, das Z-Register die Seite.
Adressierung von Konstanten


Laden von Konstanten aus dem Programmspeicher mit LPM Z+ und ELPM Z+

Die Adresse der Daten wird im Z-Register angegeben. Nach dem Zugriff auf die angegebene Speicherzelle wird der Z-Pointer inkrementiert. Die oberen 15 Bit geben die Wortadresse an. Das LSB adressiert das Low-Byte (LSB=0) oder das High-Byte (LSB=1). Wenn der ELPM Z+ Befehl genutzt wird, adressiert das RAMPZ-Register den erweiterten Speicherbereich, das Z-Register die Seite.
Adressierung von Konstanten mit den LPM Z+ und ELPM Z+


Direkte Programmadressierung, JMP und CALL

Die Ausführung des Programms wird an der Adresse fortgesetzt, die in den 22 Bit des gesamten Befehlswortes angegeben ist.
Direkte Programmadressierung, JMP und CALL


Indirekte Programmadressierung, IJMP und ICALL

Die Ausführung des Programms wird an der Adresse fortgesetzt, die in den 16 Bit des Z-Registers angegeben ist.
Indirekte Programmadressierung, IJMP und ICALL


Relative Programmadressierung, RJMP und RCALL

Die Ausführung des Programms wird an der Adresse fortgesetzt, die sich aus der Addition des aktuellen PC mit der relativen Adresse k und 1 ergibt. Die relative Adresse k kann Werte zwischen -2048 und +2047 annehmen.
Relative Programmadressierung, RJMP und RCALL