-
-
Erfahrener Benutzer
Fleißiges Mitglied
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
-
Erfahrener Benutzer
Robotik Einstein
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.
-
Erfahrener Benutzer
Fleißiges Mitglied
Dass heißt: Der uC kann gleichzeitig etwas anderes machen oder?
MFG
Mike
-
Erfahrener Benutzer
Robotik Einstein
nein, aber man kann ein Unterprogramm an mehreren Stellen benutzen...
-
Erfahrener Benutzer
Fleißiges Mitglied
ah noch was: Unterprogramme sind z.b.: Zeitschleifen! oder?
Hauptprogramm ist dann was??
MFG
Mike
-
Erfahrener Benutzer
Fleißiges Mitglied
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
-
Erfahrener Benutzer
Robotik Einstein
genau! (und denk ran, vorher den Stack einzurichten!)
-
Erfahrener Benutzer
Fleißiges Mitglied
und wann liest er "OUT PORTB, R17"
MFG
Mike
-
Erfahrener Benutzer
Robotik Einstein
Nachdem er das Unterprogramm abgearbeitet hat...
-
Erfahrener Benutzer
Fleißiges Mitglied
.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
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen