5.2 Interrupts
Viele Mikrocontroller bieten die Möglichkeit eventbasierte Subroutinen auszuführen. Wenn ein sogenannter Interrupt ausgelöst wird, wird das Hauptprogramm unterbrochen und eine entsprechende Interrupt-Service-Routine, kurz ISR, ausgeführt. Nach Beendigung der ISR wird das Hauptprogramm an der Stelle wieder aufgenommen, an der es unterbrochen wurde. ISR dürfen nur sehr wenige Befehle enthalten und sollten innerhalb weniger Taktzyklen abgeschlossen sein.
Interrupts können z.B. der Überlauf eines internen Timer, oder ein externens Signal an einem Pin sein. Im Projekt werden Externe-Interrupts für die Endschalter, Timer-Überlauf-Interrupts für das Entprellen der Taster und der Watchdog-Interrupt zum erkennen von Fehlern genutzt.
5.2.1 Endschalter
Die Endschalter sind über die Schrittmotorkarten und eine Brücke auf der Rückseite der Einschubsteckplätze mit der Mikrocontrollerplatine verbunden. Dort sind sie an 2 Interrupt Pins angeschlossen. Bei einem Flankenwechsel an den Pins wird ein Interrupt ausgelöst.
Mit den Zeilen 1–2 des Codelistings 19 werden Pin-Change-Interrupts für bestimmte Pins zugelassen. Die Zeilen 3–7 und 8–12 zeigen die Interrupt-Service-Routinen für die beiden Interrupts.
| 1 | PCMSK3 |= ( 1 << PCINT28 ); // Interrupts definierenPD4 als Interrupt zulassen |
| 2 | PCICR |= ( 1 << PCIE3 ); // Pin Change Interrupt ControlR PCIE3 setzen fuer PCINT30 |
| 3 | ISR(PCINT3_vect){ // + Endschalter Position erreicht |
| 4 | lcd_clrscr(); |
| 5 | lcd_puts("Obere\nEndposition\nErreicht!"); |
| 6 | LED_PORT ^= (1 << LED3); |
| 7 | } |
| 8 | ISR(PCINT2_vect){ // - Endschalter Position erreicht |
| 9 | lcd_clrscr(); |
| 10 | lcd_puts("Untere\nEndposition\nErreicht!"); |
| 11 | LED_PORT ^= (1 << LED3); |
| 12 | } |
5.2.2 Watchdog
Der Watchdog ist eine Sicherungseinrichtung des Mikrocontroller. In regelmäßigen Abständen wird überprüft ob das Watchdog-Bit gesetzt ist und anschließend zurück gesetzt. Das Bit muss innerhalb der voreingestellten Zeit immer wieder neu gesetzt werden. Dies kann mit der Funktion wdt_reset() realisiert werden. Ist das Bit nicht gesetzt, wird der Mikrocontroller zurückgesetzt. Dies geschieht z.B. bei ungewollten Endlosschleifen.
Mit den Zeilen 3–10 des Codelisting 20 wird der Watchdog initialisiert und festgelegt in welchen Zeitintervallen das Watchdog-Bit überprüft werden soll. Der Ablauf zum einstellen des Zeitinveralls muss genau wie im Datenblatt des Mikrocontroller beschrieben eingehalten werden. Dies verhindert ein versehentliches Ändern der Einstellung.
Ist das Fusebit WDTON gesetzt kann der Watchdog nicht abgeschaltet werden (siehe Kapitel 5.3).
Wahlweise kann kurz vor dem zurücksetzen des Mikrocontroller noch die Watchdog-ISR durchlaufen werden. Im Projekt wird in der ISR die Fehler-LED eingeschaltet und eine Meldung auf dem LC-Display ausgegeben (siehe Codelisting 20 Zeilen 12-16).
| 1 | keywordstyle include <avr/wdt.h> |
| 2 | // Initialisierung des Watchdog |
| 3 | void init_WDT(void) { |
| 4 | cli(); |
| 5 | wdt_reset(); |
| 6 | WDTCSR |= (1 << WDCE) | (1 << WDE); |
| 7 | WDTCSR = (1 << WDE) | (1 << WDIE) | (1 << WDP3) | (1 << WDP0); //Watchdog 8s |
| 8 | //WDTCSR = 0x0F; //Watchdog Off |
| 9 | sei(); |
| 10 | } |
| 11 | // Watchdog ISR |
| 12 | ISR(WDT_vect){ |
| 13 | LED_PORT &=~(1 << LED4);// LED5 einschalten |
| 14 | lcd_clrscr(); |
| 15 | lcd_puts("Something went \nterribly wrong!\nRebooting!"); |
| 16 | } |