Archiv verlassen und diese Seite im Standarddesign anzeigen : Befehl RCALL
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-[
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.
Dass heißt: Der uC kann gleichzeitig etwas anderes machen oder?
MFG
Mike
nein, aber man kann ein Unterprogramm an mehreren Stellen benutzen...
ah noch was: Unterprogramme sind z.b.: Zeitschleifen! oder?
Hauptprogramm ist dann was??
MFG
Mike
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
genau! (und denk ran, vorher den Stack einzurichten!)
und wann liest er "OUT PORTB, R17"
MFG
Mike
Nachdem er das Unterprogramm abgearbeitet hat...
.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
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...
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.