PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Subroutinen durch Interrupt beenden



stefan_Z
21.07.2007, 14:28
Ich probiere gerade mit Interrupts rum...
Funktioniert soweit auch alles prima, er springt bei Knopfdruck und tut was er soll.
Ich aber verschiedene Unterprogramme, von denen immer eines laufen soll. Wenn INT1 gezündet wird, dann erhöht er einen Zähler und dann kommt der RETURN zurück.
Die Hauptschleife ist einfach nur ein DO/LOOP wo über SELECT/CASE der Zähler ausgewertet wird und dann die entsprechende SUB angesprungen wird.

Jetzt die eigentliche Frage:
Eines der Unterprogramme ist recht lang, daher würde ich diese SUB gerne über den Interrupt beenden. Ist das möglich?
Aus Code-Größengründen (Tiny2313) möchte ich ungerne ständige Abfragen (IF Zähler THEN) in das Unterprogramm einbauen, weil da einige Schleifen drin sind.

Gibts hier eine elegante Lösung?

Stefan Z

PicNick
21.07.2007, 15:24
Verträgt das denn die SUB, daß sie mittendrin abgemurkst wird ?

stefan_Z
21.07.2007, 15:26
Jo, klar, das is egal.. Nix wildes, kann bedenkenlos abgeschossen werden.

Yossarian
21.07.2007, 15:48
Hallo
Da Du den Zeitpunkt des Interuptes nicht kennst, weißt Du auch nicht aus welchem Unterprogramm die Routinen gerade 'herausgerissen' wurden.
Du müßtest also feststellen , ob der Interrupt in einem Unterprogramm oder im Hauptprogramm erfolgte und dementsprechend den Stack zurücksetzen sowie die Adresse, an der das Programm landen soll auf den Stack legen.Das alles in der Interruptroutine.Mit dem RETI holt er sich die abgelegte Adresse vom Stack und macht da weiter.
Mit freundlichen Grüßen
Benno

stefan_Z
21.07.2007, 15:54
Ah stimmt, das hatte ich garnicht bedacht...
Da die Routinen aber alle eher unwichtig sind, bzw, deren Parameter sowieso von einander ausgelöscht werden (ist nur ein RGB-Fader), würde ich einfach gerne den Zähler erhöhen und dann zurück in die Hauptschleife.
Wenn es in der Hauptschleife passiert, dann soll er natürlich nix machen, bzw. die Hauptschleife neu sterten.
Ich sehe schon, dass wird nicht ohne Inline-Assembler gehen, oder?
Welche Register muss ich denn womit manipulieren? Ist ein ATTiny2313 DIP-20...