Isr-EndIsr

Mit Isr-EndIsr definiert man eine Interrupt-Serviceroutine. Der Name der Serviceroutine wird dann einem der Hardware-Interrupts des Controllers zugewiesen, z.B. einem Timer oder der seriellen Schnittstelle.

Syntax:

  • Isr Bezeichner [Schalter (siehe Tabelle)]
    • [ Dim myVar as static Datentyp ]
    • Programmcode der Serviceroutine
  • EndIsr

Vorzeitiges Verlassen der Serviceroutine erfolgt mit return.

Schalter Beschreibung
save Alle Register werden Flash-speicherplatzsparend gesichert (Vorgabe).
nosave Keine Register werden gesichert. Die enthaltene Routine muss dies selbst vornehmen.
fastall Alle Register werden gesichert (Schnelle, längere Routine).
fastauto Die zu sichernden Register werden automatisch vom Optimierer durch Verfolgung des Programmlaufs ermittelt (schnellste Variante).

Erläuterung

save/nosave/fastall/fastauto: Optionale Parameter die das Sichern der Register steuern. Tritt ein Interrupt auf, wird die aktuelle Programmausführung unterbrochen und die Serviceroutine abgearbeitet. Dabei werden Register/Daten verändert, die vorher gesichert und nach der Abarbeitung wiederhergestellt werden müssen. Ist nicht genügend Arbeitsspeicher vorhanden, oder ist die Service-Routine sehr zeitkritisch, kann man bspw. durch nosave das sichern der Register abgestimmt auf die Aufgabe selbst vornehmen bzw. durch fastauto automatisch vornehmen lassen.

Besonderheit fastauto

Mit der Option fastauto werden die genutzten Register vom Optimierer durch Verfolgung des Programmlaufs automatisch ermittelt.

Wichtiger Hinweis

Interrupt-Serviceroutinen sollten kurz gehalten werden und keine Warteschleifen, unterbrechende Befehle oder Zugriffe auf Eeprom-Speicherbereiche enthalten. Der Programmcode in der Serviceroutine sollte immer so kurz gehalten, werden, dass die Ausführung beendet ist bevor ein nächster Interrupt eintrifft. Unterprogrammaufrufe sind problemlos möglich.

Vorsicht bei Datentypen die auf dynamischen Speicher verweisen wie string oder MemoryBlock. Hier ist Sorge zu tragen, dass auf sie nicht gleichzeitig in Hauptprogramm und der Serviceroutine zugegriffen wird. Die Verarbeitung von Strings oder MemoryBlocks ist rechenintensiver. Was der Vorgabe ISR-Routinen kurz zu halten widerspricht. Es wird davon abgeraten!

Timer0.isr   = meineServiceRoutine  ' Serviceroutine zuweisen
Timer0.clock = 1024                 ' Prescaler einstellen
Timer0.enable                       ' Timer einschalten
 
Avr.Interrupts.Enable               ' Globale Interrupts einschalten
do
loop
 
Isr meineServiceRoutine
  print "Timer-Interrupt ausgelöst"
EndIsr