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.
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."
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.
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
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"
@ 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.