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
Druckbare Version
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
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
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]
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
Hallo
Indem die entsprechenden bits in den entsprechenden Registern gelöscht werden.
Mit freundlichen Grüßen
Benno
Dank Euch,
ich habe festgestellt, wenn ich aus dem Interrupt springe,
wird der nicht mehr ausgefuhrt.Ist das richtig?
Wigbert
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.
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.
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.
GENAU so wirds gemacht. Man setze ein Flag :)
und schon ist die ISR schön kurz.