Hallo Maik,
für Deine Frage bin ich nur halb kompetent - ich bin kein Bascom-Spezialist. Es geht aber um Interrupts - die habe ich einigermassen im Griff. Allerdings sind die obigen Einwände gravierend - zeitlich und codemässig (zu) lange Interruptroutinen sind unschön, oft schädlich für den Programmablauf oder für den Controller sogar ein Grund ins Koma zu fallen.
Ja, die Möglichkeit gibt es. Ich zitiere Dir mal das Datenblatt des mega328 als Beispiel. Dieser Abschnitt gilt für alle mir bekannten Atmelcontroller :... Gibt es also eine Möglichkeit, einen Interrupt zu unterbrechen ...
Das heißt: jede InterruptServiceRoutine verbietet nach ihrem Aufruf weitere Interrupts. Die werden im Normalfall mit Ende der ISR wieder erlaubt : es wird der Befehl RETI ausgeführt, der setzt das I-Bit (automatisch) . Die Interrupts kannst Du per eigenem Programmbefehl >>sofort, innerhalb der laufenden ISR<< erlauben, wenn Du innerhalb dieser ISR (nennen wir die mal ISR-X) den Interrupt wieder global erlaubst. In C heißt der Befehl sei(); - Set Enable Interrupt. Sinnvoll kann nun sein diese ISR-X jetzt so aufzubauen, dass sie mehrfach gestartet werden kann weil das u.U. eben passieren kann: ISR-X(a) startet-und-läuft, ISR-X(b) startet-und-läuft, ISR-X(c) startet-und-läuft ... und erst dann ist (nur beispielhaft) die ISR-X(a) wieder zu Ende. Auch hier wieder die Möglichkeit ein Koma des Controllers zu provozieren....
6.7 Reset and Interrupt Handling
...
When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled.
The user software can write logic one to the I-bit to enable nested interrupts. All enabled
interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a
Return from Interrupt instruction – RETI – is executed...
Ansonsten wie von den Vorgängern beschrieben - viel Platz für Stack vorsehen. Ich habe Routinen mit nested Interrupts in einigen Controllern problemlos in Betrieb.
Lesezeichen