Forum: Mikrocontroller und Digitale Elektronik Programmwechsel nach Interrupt


von R. S. (frederenke)


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.

von kaplic (Gast)


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."

von kopfkratzer (Gast)


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.

von Ottmar K. (wil1)


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

von Gefunden (Gast)


Lesenswert?

Ottmar K. schrieb:
> Es geht hier wohll um die Fortführung des Threads:
> [Beitrag "Interrupt an PIC16F886"]

oder den hier Beitrag "Re: MSP430 Interrupt-Routine, Rücksprung"

von Falk B. (falk)


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.

von Düsendieb (Gast)


Lesenswert?

Was machen denn diese 4 "Programme"?


Bau ein Programm, dass auf vier Werte einer Variable in vier 
unterschiedlichen Arten reagiert.
Sprich dein Ansatz ist falsch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.