Titelbild Mikrocontroller

L-Befehle


oben LD - Load Indirect from Data Space to Register using Index X

Syntax: (a) LD Rd,X
(b) LD Rd,X+
(c) LD Rd,-X
Funktion: Dieser Befehl lädt ein Byte, das über das X-Register adressiert ist, aus dem Datenspeicher. Bei Bausteinen mit SRAM besteht der Datenspeicher aus den Registern, den I/O-Speichern und dem internen SRAM (sowie dem externen SRAM, wenn möglich). Bei Bausteinen ohne SRAM besteht der Datenspeicher lediglich aus den Registern. Das EEPROM hat immer einen eigenen Adressbereich.
Die 16 Bit - Adresse der Speicherzelle wird im X-Pointer angegeben, womit maximal 64k Speicher adressiert werden können. Der LD - Befehl benutzt das RAMPX-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPX-Registers verändert werden. Nicht alle Varianten des Befehls sind in allen Bausteinen verfügbar.
Das X-Register kann mit dem Befehl entweder unverändert bleiben oder automatisch (nach)inkrementiert oder (vor)dekrementiert werden. Das Inkrementieren und Dekrementieren wirkt sich auf die verketteten RAMPX- und X-Register aus. Bei Bausteinen mit nicht mehr als 256 Byte Datenspeicher bleibt das High-Byte des X- Pointers unberücksichtigt und kann auch für andere Zwecke verwendet werden.
Operation: (a) Rd ← (X)
(b) Rd ← (X), X ← X + 1
(c) X ← X - 1, Rd ← (X)
Operanden: 0 ≤ d ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 3
16 Bit Operations Code: (a) 1001 000d dddd 1100
(b) 1001 000d dddd 1101
(c) 1001 000d dddd 1110

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
    clr r27        ;High-Byte X-Pointer löschen
    ldi r26,$60    ;Low-Byte X-Pointer aus 60h setzen
    ld r0,X+       ;R0 mit Wert aus Adresse 60h laden
    ld r1,X        ;R1 mit Wert aus Adresse 61h laden
weiter
    ld r3,X        ;R3 mit Wert aus Adresse 61h laden
    ld r2,-X       ;R2 mit Wert aus Adresse 60h laden

oben LD (LDD) - Load Indirect from Data Space to Register using Index Y

Syntax: (a) LD Rd,Y
(b) LD Rd,Y+
(c) LD Rd,-Y
(d) LDD Rd,Y+q
Funktion: Dieser Befehl lädt ein Byte, das mit oder ohne Verschiebung (q) über das Y-Register adressiert ist, aus dem Datenspeicher. Bei Bausteinen mit SRAM besteht der Datenspeicher aus den Registern, den I/O-Speichern und dem internen SRAM (sowie dem externen SRAM, wenn möglich). Bei Bausteinen ohne SRAM besteht der Datenspeicher lediglich aus den Registern. Das EEPROM hat immer einen eigenen Adressbereich.
Die 16 Bit - Adresse der Speicherzelle wird im Y-Pointer angegeben, womit maximal 64k Speicher adressiert werden können. Der LD - Befehl benutzt das RAMPY-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPY-Registers verändert werden. Nicht alle Varianten des Befehls sind in allen Bausteinen verfügbar.
Das Y-Register kann mit dem Befehl entweder unverändert bleiben oder automatisch (nach)inkrementiert oder (vor)dekrementiert werden. Das Inkrementieren, Dekrementieren und die Verschiebung wirken sich auf die verketteten RAMPY- und Y- Register aus. Bei Bausteinen mit nicht mehr als 256 Byte Datenspeicher bleibt das High- Byte des Y-Pointers unberücksichtigt und kann auch für andere Zwecke verwendet werden.
Operation: (a) Rd ← (Y)
(b) Rd ← (Y), Y ← Y + 1
(c) Y ← Y - 1, Rd ← (Y)
(d) Rd ← (Y+q)
Operanden: 0 ≤ d ≤ 31, (d) 0 ≤ q ≤ 63
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 3
16 Bit Operations Code: (a) 1000 000d dddd 1000
(b) 1001 000d dddd 1001
(c) 1001 000d dddd 1010
(d) 10q0 qq0d dddd 1qqq

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
clr r29        ;High-Byte Y-Pointer löschen
ldi r28,$60    ;Low-Byte Y-Pointer aus 60h setzen
ld r0,Y+       ;R0 mit Wert aus Adresse 60h laden
ld r1,Y        ;R1 mit Wert aus Adresse 61h laden
ld r2,-Y       ;R2 mit Wert aus Adresse 60h laden
ld r3,Y+2      ;R3 mit Wert aus Adresse 62h laden

oben LD (LDD) - Load Indirect from Data Space to Register using Index Z

Syntax: (a) LD Rd,Z
(b) LD Rd,Z+
(c) LD Rd,-Z
(d) LDD Rd,Z+q
Funktion: Dieser Befehl lädt ein Byte, das mit oder ohne Verschiebung (q) über das Z-Register adressiert ist, aus dem Datenspeicher. Bei Bausteinen mit SRAM besteht der Datenspeicher aus den Registern, den I/O-Speichern und dem internen SRAM (sowie dem externen SRAM, wenn möglich). Bei Bausteinen ohne SRAM besteht der Datenspeicher lediglich aus den Registern. Das EEPROM hat immer einen eigenen Adressbereich. Nicht alle Varianten des Befehls sind in allen Bausteinen verfügbar.
Die 16 Bit - Adresse der Speicherzelle wird im Z-Pointer angegeben, womit maximal 64k Speicher adressiert werden können. Der LD - Befehl benutzt das RAMPZ-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPZ-Registers verändert werden. Da der Z- Pointer auch für indirekte Unterprogrammaufrufe, indirekte Sprünge und das Auslesen von Tabellen aus dem Programmspeicher verwendet wird, sollten besser die X- und Y- Pointer für das Adressieren von Speicherplätzen verwendet werden.
Das Z-Register kann mit dem Befehl entweder unverändert bleiben oder automatisch (nach)inkrementiert oder (vor)dekrementiert werden. Das Inkrementieren, Dekrementieren und die Verschiebung wirken sich auf die verketteten RAMPZ- und Z- Register aus. Bei Bausteinen mit nicht mehr als 256 Byte Datenspeicher bleibt das High- Byte des Z-Pointers unberücksichtigt und kann auch für andere Zwecke verwendet werden.
Operation: (a) Rd ← (Z)
(b) Rd ← (Z), Z ← Z + 1
(c) Z ← Z - 1, Rd ← (Z)
(d) Rd ← (Z+q)
Operanden: 0 ≤ d ≤ 31, (d) 0 ≤ q ≤ 63
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 3
16 Bit Operations Code: (a) 1000 000d dddd 0000
(b) 1001 000d dddd 0001
(c) 1001 000d dddd 0010
(d) 10q0 qq0d dddd 0qqq

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
clr r31        ;High-Byte Z-Pointer löschen
ldi r30,$60    ;Low-Byte Z-Pointer aus 60h setzen
ld r0,Z        ;R0 mit Wert aus Adresse 60h laden
ld r3,Z+2      ;R3 mit Wert aus Adresse 62h laden

oben LDI - Load Immediate

Syntax: LDI Rd,K
Funktion: Dieser Befehl lädt eine Konstante in das Register Rd. Der Befehl kann nur mit den Registern R16 bis R31 verwendet werden.
Operation: Rd ← K
Operanden: 16 ≤ d ≤ 31, 0 ≤ K ≤ 255
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1110 KKKK dddd KKKK

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
ldi r30,$F0    ;Low-Byte Z-Pointer mit F0h laden

oben LDS - Load Direct from Data Space

Syntax: LDS Rd,k
Funktion: Dieser Befehl lädt ein Datum aus dem Datenspeicher in das Register Rd. Bei Bausteinen mit internem SRAM besteht der Datenspeicher aus den Registern, dem I/O-Speicher und dem internen SRAM (sowie dem externen SRAM, wenn beschaltbar). Bei Bausteinen ohne internen SRAM besteht der Datenspeicher nur aus den Registern. Das EEPROM hat immer einen eigenen Adressbereich. Die 16 Bit - Adresse muss immer angegeben werden, wobei der Speicherzugriff auf die tatsächlich vorhandenen Speicherzellen begrenzt ist.
Der LDS - Befehl benutzt das RAMPD-Register, um Speicherbereiche über 64k anzusprechen. Um auf ein anderes 64k-Segment zuzugreifen, muss also der Inhalt des RAMPD-Registers verändert werden.
Der Befehl ist nicht in allen AVR - Mikrocontrollern verfügbar.
Operation: Rd ← (k)
Operanden: 0 ≤ d ≤ 31, 0 ≤ k ≤ 65535
Programmzähler: PC ← PC + 2
Words: 2 (4 Byte)
Zyklen: 2
32 Bit Operations Code: 1001 000d dddd 0000
kkkk kkkk kkkk kkkk

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:

lds r30,$FF00    ;Datum aus Adresse FF00h in R30 laden.

oben LPM - Load Program Memory

Syntax: (a) LPM
(b) LPM Rd,Z
(c) LPM Rd,Z+
Funktion: Dieser Befehl lädt ein Byte, das über das Z-Register adressiert ist, aus den unteren 64k- Byte des Programmspeichers in das Register Rd. Der Programmspeicher enthält an jeder Adresse 2 Byte (1 Word). Daher adressiert das Z-Register, wenn das LSB 0 ist, das niederwertige Byte der Adresse und mit LSB = 1 das höherwertige Byte des Wortes an der Adresse. Das Z-Register kann mit dem Befehl entweder unverändert bleiben oder automatisch inkrementiert werden.
Bei Bausteinen mit der Möglichkeit des Selbstprogrammierens kann der LPM - Befehl verwendet werden, um die Werte der Fuse- und Lock-Bits zu lesen. Nicht alle LPM- Varianten sind in allen Bausteinen verfügbar. Im AT90S1200 ist der Befehl gar nicht implementiert.
Operation: (a) R0 ← (Z)
(b) Rd ← (Z)
(c) Rd ← (Z), Z ← Z + 1
Operanden: (a) keiner, R0 ist das Ziel (b) 0 ≤ d ≤ 31 (c) 0 ≤ d ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 3
16 Bit Operations Code: (a) 1001 0101 1100 1000
(b) 1001 000d dddd 0100
(c) 1001 000d dddd 0101

Flags im Status-Register (SREG):
ITHSVNZC
--------

Beispiel:
ldi r30,$00    ;Low-Byte Z-Pointer mit 00h laden
ldi r31,$01    ;High-Byte Z-Pointer mit 01h laden
lpm r20,Z+     ;Low-Byte aus Adresse 0100h in R20 laden
...
lpm r20,Z      ;High-Byte aus Adresse 0100h in R20 laden


oben LSL - Logical Shift Left

Syntax: LSL Rd
Funktion: Mit diesem Befehl werden alle Bits des Registers Rd eine Position nach links geschoben. Das Bit 7 wird in das Carry-Flag geschoben, das Bit 0 wird gelöscht. Damit stellt dieser Befehl unabhängig vom Vorzeichen des Wertes in Rd eine Multiplikation mit 2 dar.
Operation: Operation lsl
Operanden: 0 ≤ d ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 0000 11dd dddd dddd

Flags im Status-Register (SREG):
ITH S V N Z C
--
H: Das H-Flag enthält nach dem Linksschieben das ursprüngliche Bit 3 des Registers Rd.
S: Das S-Flag wird gesetzt, wenn entweder das N-Flag oder das V-Flag gesetzt ist. Wenn beide Flags gleich sind, wird das S-Flag gelöscht.
V: Das V-Flag wird gesetzt, wenn nach dem Linksschieben entweder das N-Flag oder das C-Flag gesetzt ist. Wenn beide Bits gleich sind, wird das V-Flag gelöscht.
N: Das N-Flag wird gesetzt, wenn das MSB (Bit 7) des Ergebnisses gesetzt ist, andernfalls wird es gelöscht.
Z: Das Z-Flag wird gesetzt, wenn das Ergebnis 0000h ist, andernfalls wird das Flag gelöscht.
C: Das C-Flag enthält nach dem Linksschieben das ursprüngliche Bit 7 des Rd Registers.

Beispiel:
lsl r16    ;Multipliziert das Register R16 
           ;mit 2 durch Linksschieben.

oben LSR - Logical Shift Right

Syntax: LSR Rd
Funktion: Mit diesem Befehl werden alle Bits des Registers Rd eine Position nach rechts geschoben. Das Bit 0 wird in das Carry-Flag geschoben, das Bit 7 wird gelöscht. Damit stellt dieser Befehl bei einem vorzeichenlosen Wert in Rd eine Division mit 2 dar. Das Carry kann genutzt werden, um das Ergebnis zu runden.
Operation: Operation lsr
Operanden: 0 ≤ d ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 010d dddd 0110

Flags im Status-Register (SREG):
ITH S V N Z C
---0
S: Das S-Flag wird gesetzt, wenn entweder das N-Flag oder das V-Flag gesetzt ist. Wenn beide Flags gleich sind, wird das S-Flag gelöscht.
V: Das V-Flag wird gesetzt, wenn nach dem Rechtsschieben entweder das N-Flag oder das C-Flag gesetzt ist. Wenn beide Bits gleich sind, wird das V-Flag gelöscht.
N: Das N-Flag wird gelöscht.
Z: Das Z-Flag wird gesetzt, wenn das Ergebnis 0000h ist, andernfalls wird das Flag gelöscht.
C: Das C-Flag enthält nach dem Rechtsschieben das ursprüngliche Bit 7 des Rd Registers.

Beispiel:
lsr r16    ;Schiebt die Bits des Registers R16 eine 
           ;Position nach rechts.

Impressum