-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Befehl RCALL

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153

    Befehl RCALL

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    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.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    Dass heißt: Der uC kann gleichzeitig etwas anderes machen oder?

    MFG
    Mike

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    nein, aber man kann ein Unterprogramm an mehreren Stellen benutzen...

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    ah noch was: Unterprogramme sind z.b.: Zeitschleifen! oder?
    Hauptprogramm ist dann was??

    MFG
    Mike

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    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

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    genau! (und denk ran, vorher den Stack einzurichten!)

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    und wann liest er "OUT PORTB, R17"

    MFG
    Mike

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    Nachdem er das Unterprogramm abgearbeitet hat...

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2006
    Beiträge
    153
    .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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •