Titelbild Mikrocontroller

R-Befehle


oben RCALL - Relative Call to Subroutine

Syntax: RCALL k
Funktion: Dieser Befehl springt zu einem Unterprogramm, das innerhalb des Bereiches von PC- 2k+1 bis PC+2k (Word) liegen kann. Die Rücksprungadresse, also die Adresse des Befehls, der auf den RCALL-Befehl folgt, wird in den Stack gesichert. Bei der Assemblerprogrammierung werden anstatt der relativen Adresse Labels verwendet. Bei Bausteinen, die über maximal 8k Bytes (4k Word) Programmspeicher verfügen, kann der ganze Adressbereich von jeder Stelle aus angesprochen werden.
Operation: (a) PC ← PC + k + 1, STACK ← PC + 1, SP ← SP - 2 bei 16-Bit Adressen
(b) PC ← PC + k + 1, STACK ← PC + 1, SP ← SP - 3 bei 22-Bit Adressen
Operanden: -2K ≤ k < 2K
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 3 (bei 16-Bit Adressen)
4 (bei 22-Bit Adressen)
16 Bit Operations Code: 1101 kkkk kkkk kkkk

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

Beispiel:
rcall sprung    ;Unterprogramm ab Label sprung aufrufen

sprung:
    push r3    ;R3 in Stack sichern
    push r4    ;R4 in Stack sichern
    ...        ;das eigentliche Unterprogramm
    pop r4     ;Alten Wert von R4 aus dem Stack zurückholen
    pop r3     ;Alten Wert von R3 aus dem Stack zurückholen
    ret        ;Rücksprung

oben RET - Return from Subroutine

Syntax: RET
Funktion: Dieser Befehl beendet ein Unterprogramm. Die Rücksprungadresse wird aus dem Stack geladen.
Operation: (a) PC(15:0) ← STACK bei 16-Bit Adressen SP ← SP + 2
(b) PC(21:0) ← STACK bei 22-Bit Adressen Sp ← SP + 3
Operanden: keine
Programmzähler: Siehe Operation
Words: 1 (2 Byte)
Zyklen: 4 (bei 16-Bit Adressen)
5 (bei 22-Bit Adressen)
16 Bit Operations Code: 1001 0101 0000 1000

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

Beispiel:
call sprung    ;Unterprogramm ab Label sprung aufrufen

sprung:
    push r3    ;R3 in Stack sichern
    ...        ;das eigentliche Unterprogramm
    pop r3     ;Alten Wert von R3 aus dem Stack zurückholen
    ret        ;Beenden Unterprogramm und Rücksprung

oben RETI - Return from Interrupt

Syntax: RETI
Funktion: Dieser Befehl beendet eine Interruptroutine. Die Rücksprungadresse wird aus dem Stack geladen und das Global Interrupt-Flag wird gesetzt. Zu beachten ist, dass das Status- Register beim Aufruf der Interruptroutine nicht automatisch gesichert wird.
Operation: (a) PC(15:0) ← STACK bei 16-Bit Adressen SP ← SP + 2
(b) PC(21:0) ← STACK bei 22-Bit Adressen Sp ← SP + 3
Operanden: keine
Programmzähler: Siehe Operation
Words: 1 (2 Byte)
Zyklen: 4 (bei 16-Bit Adressen)
5 (bei 22-Bit Adressen)
16 Bit Operations Code: 1001 0101 0001 1000

Flags im Status-Register (SREG):
ITHSVNZC
1-------
I: Das I-Flag wird gesetzt, damit werden alle Interrupts global freigegeben.

Beispiel:
call sprung    ;Unterprogramm ab Label sprung aufrufen

interrupt1:
    push r3    ;R3 in Stack sichern
    ...        ;die eigentliche Interrupt-Routine
    pop r3     ;Alten Wert von R3 aus dem Stack zurückholen
    reti       ;Beenden die Interrupt-Routine und Rücksprung
               ;zum unterbrochenen Hauptprogramm

oben RJMP - Relative Jump

Syntax: RJMP k
Funktion: Dieser Befehl springt zu einer Adresse, die innerhalb des Bereiches von PC-2k+1 bis PC+2k (Word) liegen kann. Bei der Assemblerprogrammierung werden anstatt der relativen Adresse Labels verwendet. Bei Bausteinen, die über maximal 8k (4k Word) Bytes Programmspeicher verfügen, kann der ganze Adressbereich von jeder Stelle aus angesprochen werden.
Operation: PC ← PC + k + 1
Operanden: -2K ≤ k < 2K
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 2
16 Bit Operations Code: 1100 kkkk kkkk kkkk

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

Beispiel:
cpi r16,$42    ;Register R16 mit 42h vergleichen
brne fehler    ;Sprung, wenn R16 ungleich 42h
rjmp ok        ;Sprung, wenn R16 gleich 42h

fehler:
    inc r16    ;R16 um eins erhöhen
    ...

ok:
    nop        ;Weiter, Leerbefehl


oben ROL - Rotate Left through Carry

Syntax: ROL Rd
Funktion: Mit diesem Befehl werden alle Bits des Registers Rd eine Position nach links geschoben. Das Carry-Bit wird in das Bit 0 geschoben, das Bit 7 wird in das Carry-Flag geschoben. In Kombination mit dem LSL - Befehl können so Mehrbyte-Zahlen mit 2 multipliziert werden. Dieser Befehl arbeitet unabhängig vom Vorzeichen des Wertes in Rd.
Operation: Operation rol
Operanden: 16 ≤ d ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 0001 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:
Multiplizieren des Registerpaares R16:R17 mit 2.

lsl r16        ;Multipliziert das Register R16 
               ;durch Linksschieben mit 2.
rol r17        ;Multiplizieren des Registers R17 
               ;incl Carry mit 2.

oben ROR - Rotate Right through Carry

Syntax: ROR Rd
Funktion: Mit diesem Befehl werden alle Bits des Registers Rd eine Position nach rechts geschoben. Das Carry-Bit wird dabei in das Bit 7 geschoben, das Bit 0 wird anschließend in das Carry-Bit geschoben. In Kombination mit dem ASR - Befehl kann eine Division durch 2 mit vorzeichenbehafteten Mehrbyte - Werten vorgenommen werden. Das Carry-Flag kann benutzt werden, um das Ergebnis zu runden.
Operation: Operation ror
Operanden: 0 ≤ d ≤ 31
Programmzähler: PC ← PC + 1
Words: 1 (2 Byte)
Zyklen: 1
16 Bit Operations Code: 1001 010d dddd 0111

Flags im Status-Register (SREG):
ITH S V N Z C
---
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 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 wird gesetzt, wenn das Bit 0 im Register Rd vor dem Schieben gesetzt war. War das Bit 0 vorher gelöscht, so wird auch das Carry-Flag gelöscht.

Beispiel:
lsr r19        ;Division des Registerpaares R19:R18
ror r18        ;durch 2. R19:R18 sind ohne Vorzeichen.
brcc zero0     ;Sprung, wenn Carry 0 ist.

oder:
asr r17        ;Division des Registerpaares R17:R16
ror r16        ;durch 2. R17:R16 sind mit Vorzeichen.
brcc zero1     ;Sprung, wenn Carry 0 ist.

Impressum