Programmwechsel nach Interrupt

OP #2897879
Lesenswert?

Hallo,
ich möchte eine Art Programmwechsel mit dem Betätigen des RB0 Interrupts 
realisieren.
Beispiel: Es gibt 4 Programme - Programm 2 davon wird ausgeführt. Wird 
der RB0 Interrupt betätigt, so soll das aktuelle Programm unterbrochen 
und stattdessen das nächste (3) ausgeführt werden. Nach Programm 4 soll 
es bei Programm 1 weiter gehen.

Meine ursprüngliche Idee war es in der ISR eine Variable zu 
inkrementieren erreicht diese den Wert 3 so wird sie wieder auf 0 
gesetzt.
Diese Variable dient mit einer Computed Goto Tabelle (die immer nach dem 
letzten Befehl in der ISR (GIE=1) ausgeführt wird) zur Programmauswahl.
In einem anderen Thread hieß es aber, dass jede ISR mit RETFIE beendet 
werden MUSS, weshalb meine Lösung hinfällig ist. Wie kann ich das 
Problem lösen?
Die Unterprogramme sind sehr lang und haben viele Delays drin, weshalb 
ich gerne den Interrupt verwenden würde.
Danke!

PS ich benutze Assembler - weiß nicht ob das einen Unterschied macht.
Gast #2897987
Lesenswert?

Achtung, die folgende Idee ist kein guter Programmierstil, könnte aber 
funktionieren:

Die Computed Goto Tabelle mit der Variable behältst du bei und in deiner 
ISR manipulierst du vor RETFIE die Rücksprungadresse, so dass du in die 
GoTo-Tabelle springst. Das Manipulieren der Rücksprungadresse setzt 
voraus, dass du weißt, was wie und in welcher Reihenfolge auf dem Stack 
liegt und dass das nächste Programm mit den Registerinhalten vom vorher 
unterbrochenen Programm zurecht kommt.

Das ist schnell, aber ein "Dirty Hack."
Gast #2898020
Lesenswert?

Aha und was machst Du mit den in den jeweiligen "Programmen" vorhandenen 
Variablen die nachdem Du einfach mal "gewechselt" hast wo sind und vor 
allem wie konsistent ?
Wenn Du wirklich mehrere Programme gleichzeitig laufen lassen willst 
schau Dir mal RTOS an.
Selbstgehäkelt müßtest Du wenigstens einen Roundrobin realisieren der 
dann bei entsprechendem "Vorfall" das aktuelle Programm "rettet" um dann 
das neue aufzurufen.
#2898112
Lesenswert?

Hallo R.S.

Es geht hier wohll um die Fortführung des Threads: 
[Beitrag "Interrupt an PIC16F886"]
Der 16F886 hat einen HARDWARE-Stack, dieser ist von außen nicht 
manipulierbar. Anderst wenn Du einen Prozessor nimmst dessen Stack sich 
im RAM befindet oder sich dorthin verlagern lässt.
Dir bleibt nur die Möglichkeit Unterprogramme zu verwenden und da der 
Stack nur 8 Ebenen tief ist, ist die Tiefe der Verschachtelung von 
Unterprogrammen begrenzt. Es gibt aber auch PICs z.B. der 18F-Serie mit 
größerer Stacktiefe (32 Ebenen).

mfg Ottmar
#2898364
Lesenswert?

@  R. S. (frederenke)

>ich möchte eine Art Programmwechsel mit dem Betätigen des RB0 Interrupts
>realisieren.
>Beispiel: Es gibt 4 Programme - Programm 2 davon wird ausgeführt. Wird
>der RB0 Interrupt betätigt, so soll das aktuelle Programm unterbrochen
>und stattdessen das nächste (3) ausgeführt werden. Nach Programm 4 soll
>es bei Programm 1 weiter gehen.

Klingt nach PIC, spielt aber keine Rolle.

>Meine ursprüngliche Idee war es in der ISR eine Variable zu
>inkrementieren erreicht diese den Wert 3 so wird sie wieder auf 0
>gesetzt.

Ist so OK.

>Diese Variable dient mit einer Computed Goto Tabelle (die immer nach dem
>letzten Befehl in der ISR (GIE=1) ausgeführt wird) zur Programmauswahl.

Im Prinzip auch OK.

>In einem anderen Thread hieß es aber, dass jede ISR mit RETFIE beendet
>werden MUSS, weshalb meine Lösung hinfällig ist. Wie kann ich das
>Problem lösen?

>Die Unterprogramme sind sehr lang und haben viele Delays drin, weshalb
>ich gerne den Interrupt verwenden würde.

Nö, du willst Multitasking richtig lernen und anwenden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren