-
        

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

Thema: Sprung aus Interrupt

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118

    Sprung aus Interrupt

    Anzeige

    Hallo Profis,
    Ein Interrupt unterbricht eine Sub-Funktion.
    Ich will aber nach den Interrupt zu einer anderen Stelle
    ins Hauptprogramm springen.
    Mit Goto kriege ich das nicht hin.Geht das überhaupt

    Wigbert

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    06.11.2006
    Beiträge
    1.078
    Hallo
    Das sollte schon gehen.Du solltest nur darauf achten,daß entsprechende Interrupflags zurückgesetzt werden und die Return Adresse vom Stack gezogen wird
    (bzw. der Stackpointer dekrementiert oder inkrementiert -je nach Prozessor- wird).
    Mit freundlichen Grüßen
    Benno
    Wo man nicht mit Vernunft handelt, da ist auch Eifer nichts nütze; und wer hastig läuft, der tritt fehl.
    Ein König richtet das Land auf durchs Recht; wer aber viel Steuern erhebt, richtet es zugrunde

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118
    Hallo Yossarian,
    soviel Fremdwörter in einem Satz.
    Also ich muss drauf achten, dass nichts überschwappt. ich sags mal so.
    Wie setze ich die Interruptflags zurück?

    Wigbert[/code]

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Einfache Lösung:

    Im Interrupt Flag setzen z.B. War_drin=1


    in der Sub 'öfter' abfragen

    if War_Drin=1 then
    War_drin=0
    exit Sub
    end if

    und in der Haubtschleife entsprechend hin wo Du willst.

    Gento

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    06.11.2006
    Beiträge
    1.078
    Hallo
    Indem die entsprechenden bits in den entsprechenden Registern gelöscht werden.
    Mit freundlichen Grüßen
    Benno
    Wo man nicht mit Vernunft handelt, da ist auch Eifer nichts nütze; und wer hastig läuft, der tritt fehl.
    Ein König richtet das Land auf durchs Recht; wer aber viel Steuern erhebt, richtet es zugrunde

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    08.08.2006
    Beiträge
    118
    Dank Euch,
    ich habe festgestellt, wenn ich aus dem Interrupt springe,
    wird der nicht mehr ausgefuhrt.Ist das richtig?

    Wigbert

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Wenn Du einen Interrupt ausführst wird automatisch das Interrupt ENABLE Flag im Status Register gelöscht und somit keine weiteren Interrupts zugelassen.
    Das könnte man zwar mit "SEI" wieder ändern ist aber nicht ganz ungefährlich.
    Du kannst nicht einfach aus einer Interruptroutine in einen Hauptprogrammanteil springen. Nach ein paar Interrupt Aufrufen läuft dir dein Stack über und der Controller macht nur noch Mist.

    Die einzige gerade noch zu akzeptierende Möglichkeit wäre im Interrupt eine Stack Manipulation durchzuführen, die die Rücksprungadresse ändert, ob das aber mit Bascom hinzukriegen ist kann ich nicht beantworten.

    Sub Routinen kann man natürlich aus Interrupts heraus aufrufen, wenn Sie sauber mit RET wieder beendet werden.
    Allerdings sollte auch hier gelten im Interrupt so wenig wie nur irgendwie möglich Code ausführen zu lassen. Ausserdem sollte die Subroutinentiefe nicht zu hoch werden, weil jeder erneute nicht abgeschlossene Subroutinen Aufruf den Stack zumüllt.

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    aus nem Interrupt, der in nem beliebigen Teil des Codes ausgelöst wird
    zu einer bestimmte Stelle ausspringen macht wenig Sinn und ist mE
    ziemlich schlechter Stil.
    Wie geschrieben, Stack overflow und ganz unliebsame Nebeneffekte können
    da die Folge von sein. Nein, das macht man nicht, auch wenns prinzipiell
    möglich ist.
    Eine Erklärung zum Interupt:
    Ein Interrupt wird für gewöhnlich von einer HArdwarekomponente des
    µC ausgelöst. TWI, UART, INT0, INT1, SPI, Timer0, Timer1, Timer2 etc.
    Der Controller macht dann folgendes. Er springt aus dem laufenden
    Programmteil raus (vorausgesetzt er ist nicht gerade in einer
    Interruptroutine), merkt sich wo er war, schaut welches Unterprogramm
    bei genau diesem Interrupt ausgeführt werden soll, springt dann genau
    da hin, arbeitet das Unterprogramm ab, löscht den jeweiligen Flag,
    schaut wo er zuletzt tätig war im Hauptprogramm, springt aus der
    Interrupt Routine raus an die ursprüngliche Programmstelle zurück
    und werkelt dann fröhlich weiter bis zum nächsten Interrupt.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    18.07.2006
    Beiträge
    51
    Warum nicht einfach in der Interruptroutine eine Variable setzen (a=1) und dann im Hauptprogramm immer mal wieder überprüfen ob a nun 1 ist und entsprechend das Hauptprogramm verzweigen, anstatt direkt aus der Interruptroutine dorthin zu springen.

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    GENAU so wirds gemacht. Man setze ein Flag
    und schon ist die ISR schön kurz.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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