PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Befehl RCALL



Exodus
04.05.2006, 08:47
Hallo leute!

Möchte euch was fragen! Der Befehl "RCALL" beim Assembler springt zum unterprogramm. für was ist dann dass gut? Warum nimmt man nicht einfach den Befehl "RJMP".

Bitte um Rückantwort
MFG
Mike 8-[

uwegw
04.05.2006, 08:58
Mit RJMP kann man an eine bestimmte Stelle im Programm springen. Man kommt von dort aber wiederum nur über einen Sprung zurück. Daher kann man dieses Unterprogramm nur an einer Stelle anwenden, weil an seinem Ende ein Verweis auf die Stelle für die Fortsetzung im Hauptprogramm stehen muss.

Dieses Problem lässt sich mit RCALL lösen: dieser Befehl packt die Rücksprungadresse automatisch auf den Stack, und man kann einfach mit RET wieder dahin zurück gelangen, wo man hergekommen ist.

Exodus
04.05.2006, 08:59
Dass heißt: Der uC kann gleichzeitig etwas anderes machen oder?

MFG
Mike

uwegw
04.05.2006, 09:00
nein, aber man kann ein Unterprogramm an mehreren Stellen benutzen...

Exodus
04.05.2006, 09:01
ah noch was: Unterprogramme sind z.b.: Zeitschleifen! oder?
Hauptprogramm ist dann was??

MFG
Mike

Exodus
04.05.2006, 09:04
Ah ich glaub ich kapiere!

Beispiel:

out PORTB, r16

rcall Zeitschleife

out PORTB, R17

Zeitschleife:
;steht irgendwas
ret

Erklärung:
mit rcall Zeitschleife springt er zu rcall
mit ret dann wieder zu out PORTB!

MFG
Mike

uwegw
04.05.2006, 09:19
genau! (und denk ran, vorher den Stack einzurichten!)

Exodus
04.05.2006, 09:22
und wann liest er "OUT PORTB, R17"

MFG
Mike

uwegw
04.05.2006, 09:31
Nachdem er das Unterprogramm abgearbeitet hat...

Exodus
04.05.2006, 09:32
.include "4433def.inc" ; bzw. 2333def.inc

ldi R16, 0xff

ldi R16, RAMEND ; Stackpointer initialisieren
out SPL, R16

ldi R16, 0xFF
out DDRB, R16 ; Port B = Ausgang

ldi R17, 0b10101010 ; einen Wert ins Register R17 laden

rcall sub1 ; Unterprogramm "sub" aufrufen

out PORTB, R17 ; Wert von R17 an den Port B ausgeben

loop: rjmp loop ; Endlosschleife


sub1:
push R17 ; Inhalt von R17 auf dem Stack speichern

; hier kann nach belieben mit R17 gearbeitet werden,
; als Beispiel wird es hier auf 0 gesetzt

ldi R17, 0

pop R17 ; R17 zurückholen
ret ; wieder zurück zum Hauptprogramm

wenn ich es simulieren will, dann geht dass nicht. Der assembler schreit eine fehlermeldung, "undefinied symbol: SPL"
plz help

mfg
mike

uwegw
04.05.2006, 10:00
fiese Falle: der 4433 hat nur wenig RAM, daher kommt er mit nem 8bit-Stackpointer aus. Und der heißt SP. Bei den größeren AVRs ist der Stackpointer 16bit groß und daher auf SPL und SPH aufgeteilt...

EDIT: ich hab bei mir zwei Versionen der 4433def.inc gefunden. Bei der alten (1999) ist SPL einfach zusätzlich definiert und hat denselben Wert wie SP. Bei der Variante von 2004 ist dies nicht mehr der Fall...