(→Bascom Interrupts (Mega8 und andere)) |
(→Bascom Interrupts (Mega8 und andere)) |
||
Zeile 2: | Zeile 2: | ||
Wie arbeitet man mit [[Interrupt|Interrupts]] unter Bascom. Das hier gezeigte Beispiel läßt sich eigentlich auf alle [[AVR]]-Boards bzw. Controller übertragen. | Wie arbeitet man mit [[Interrupt|Interrupts]] unter Bascom. Das hier gezeigte Beispiel läßt sich eigentlich auf alle [[AVR]]-Boards bzw. Controller übertragen. | ||
+ | === Zweck === | ||
Interrupts werden immer dort verwendet, wo Zeitkritische Anwendungen gefordert sind. | Interrupts werden immer dort verwendet, wo Zeitkritische Anwendungen gefordert sind. | ||
Wenn man z.B. ein ganz kurzes Signal an einem Pin messen/detektieren will, kann man es mit dem normalem Hauptprogramm leicht übersehen. (z.B. durch eine Wait-Anweisung o.ä.) | Wenn man z.B. ein ganz kurzes Signal an einem Pin messen/detektieren will, kann man es mit dem normalem Hauptprogramm leicht übersehen. (z.B. durch eine Wait-Anweisung o.ä.) | ||
− | Bei | + | |
+ | Bei Verwendung eines Interrupts, reagiert der Prozessor, bei auftreten des Signals, unbedingt und verzweigt zu seiner ISR (Interrupt Service Routine), um dort darauf zu reagieren. | ||
+ | (Anschliessend springt er wieder in das Hauptprogramm) | ||
=== Struktur: === | === Struktur: === |
Version vom 14. Januar 2006, 18:08 Uhr
Inhaltsverzeichnis
Bascom Interrupts (Mega8 und andere)
Wie arbeitet man mit Interrupts unter Bascom. Das hier gezeigte Beispiel läßt sich eigentlich auf alle AVR-Boards bzw. Controller übertragen.
Zweck
Interrupts werden immer dort verwendet, wo Zeitkritische Anwendungen gefordert sind. Wenn man z.B. ein ganz kurzes Signal an einem Pin messen/detektieren will, kann man es mit dem normalem Hauptprogramm leicht übersehen. (z.B. durch eine Wait-Anweisung o.ä.)
Bei Verwendung eines Interrupts, reagiert der Prozessor, bei auftreten des Signals, unbedingt und verzweigt zu seiner ISR (Interrupt Service Routine), um dort darauf zu reagieren. (Anschliessend springt er wieder in das Hauptprogramm)
Struktur:
Config InterruptXXX ‘Konfiguriere Interrupt Enable Interrupts ‘generell Interrupts zulassen Enable InterruptXXX ‘schalte speziell den InterruptXXX ein On InterruptXXX SprungXXX ‘verzweige bei InterruptXXX zu SprungXXX Do ....Hauptprogramm ‘Hauptprogramm Loop End SprungXXX: ‘Unterprogramm von InterruptXXX ....Ausführung ‘arbeitet hier etwas ab und springt mit Return Return ‚ wieder zurück, zum Hauptprogramm
Am Anfang muss man den beabsichtigten Interrupt mit „Config“, konfigurieren.
Dann das generelle Einschalten von Interrupts.
Dann mit „Enable“ den bestimmten Interrupt einschalten.
Mit „On“ das Unterprogramm (ISR) definieren, an die der Interrupt springen soll,
wenn dieser ausgelöst wird. (ISR= Interrupt Service Routine)
Grundsätzlich kann man das so betrachten, dass es das Hauptprogramm gibt (mit eventuellen Unterprogrammen) und die Interrupt Service Routinen (ISR).
Bei einem Interrupt, wird das Hauptprogramm unterbrochen und der Prozessor springt in die ISR. Die ISR wird abgearbeitet und mit Return wird wieder an die Stelle zurückgesprungen, wo vorher das Hauptprogramm unterbrochen wurde.
Man soll darauf achten, dass in der ISR immer nur kurze Anweisungen abgearbeitet werden und der Hauptteil dann im Hauptprogramm bearbeitet wird. Sonst kann es sein, dass man den Prozessor damit blockiert.
Interrupt: Int0
Config Int0 = Low Level ‘Configuriere Int0 auf Low Level Enable Interrupts ‘einschalten der Interrupts Enable Int0 ‘einschalten von Interrupt Int0 On Int0 Isr_von_Int0 ‘springe zu Isr_von _Int0 Do ....Hauptprogramm Loop End Isr_von_Int0: ‘ISR von Int0 .....Programm-Code Return
Int0 ist ein Interrupt, der ausgelöst wird, wenn am INT0 (Pin.d2 beim Mega8), eine Veränderung auftritt. (Int1 bei Pin.d3)
Es gibt für diesen Interrupt drei Einstellmöglichkeiten auf die er reagieren kann:
Low Level: reagiert wenn der Pin auf Masse gesetzt wird.
Falling: reagiert auf eine fallende Flanke
Rising: reagiert auf eine steigende Flanke