Hardware-Interrupts - Elektronik befiehlt, AVR gehorcht
Materialbedarf
Anz. | Bezeichnung | Datenblatt |
1 | Batterie/Spannungsquelle 9V | |
1 | Spannungsregler 7805 | |
1 | ATMega8 AVR-Prozessor | |
1 | Widerstand 220 Ohm | |
2 | Widerstand 10 kOhm | |
1 | Elektrolytkondensator 100 µF/16V | |
1 | Kondensator 100nF | |
1 | Mikrotaster | |
1 | Standard-Leuchtdiode 3mm oder 5mm | 3mm, 5mm |
Der AVR hört auf die Umwelt
In einigen Anwendungen ist es notwendig, dass der AVR sofort reagiert wenn er von der Hardware ein entsprechendes Signal bekommt. Als Beispiel sei mal eine laufende Maschine genannt. Diese soll unverzüglich stoppen sobald z.B. die Abdeckung geöffnet wird. So eine Funktion erreicht man mit Hardware-Interrupts.
Ähnlich wie Timer-Interrupts, sorgen Hardware-Interrupts dafür, dass der AVR unverzüglich in ein Unterprogramm springt sobald der Interrupt ausgelöst wird. Der ATMega8 besitzt 2 Eingänge für Hardware-Interrupts. Diese liegen auf den Portpins Port D Bit 2 und Bit 3.
Um die Interrupt-Funktion zu testen, schließen wir einen Taster an Int 0 an. Port B.0 versorgt eine Leuchtdiode. |
$regfile "m8def.dat" $crystal = 1000000 Config Portb.0 = Output Config Int0 = Falling On Int0 Int0set Enable Interrupts Enable Int0 Do Loop Int0set: Toggle Portb.0 : Waitms 100 Return |
Nach der Übertragung des Programms auf den AVR, ist es möglich mit dem Taster S1 die an Port B.0 angeschlossene Leuchtdiode ein- bzw. auszuschalten. Das Programm dürfte für den geübten Bascom-Programmierer schon soweit verständlich sein.
Durch 'On Int0 Int0Set' sagen wir dem AVR zu welchem Programmpunkt er springen soll, wenn ein Hardware-Interrupt auftritt. Damit Interrupts überhaupt verarbeitet werden müssen, diese durch die beiden Enable-Befehle 'Enable Interrupts' und 'Enable Int0' aktiviert werden.
Es muss dem AVR aber noch gesagt werden, wann er einen Interrupt auslösen soll, wenn sich am Int0-Eingang etwas ändert. Hierzu dient die Anweisung
Config Int0 = Falling |
Hier legen wir fest, dass der AVR einen Interrupt auslösen soll, wenn an Int0 sich der Signalpegel von 1 auf 0 ändert. Nur dann wird die Unterroutine aufgerufen. Bleibt der Signalpegel bei 0 oder ändert sich wieder von 0 auf 1, reagiert der AVR nicht drauf.
Möchte man, dass der AVR solange die Unterroutine aufruft, wie ein 0-Pegel am Int0-Eingang festgestellt wird, so muss man die Config-Anweisung ändern.
Config Int0 = Low Level |
Nun wird die Interrupt-Routine ständig immer wieder aufgerufen, solange am Int0-Eingang ein 0-Signal vorliegt. In unserem Beispiel blinkt die Leuchtdiode, wenn man den Taster gedrückt hält.
Unter Umständen möchte man aber, dass der AVR nicht bei einem Wechsel von 1 auf 0 reagiert, sondern bei einem 0 auf 1-Wechsel. Auch hierfür kann man den AVR konfigurieren:
Config Int0 = Rising |
Ab jetzt wird der Interrupt erst ausgelöst, wenn man den Taster los lässt. Hier ist es jetzt möglich, dass wir den Taster den Pluspol durchschalten lassen und der Interrupt wieder bei Betätigung ausgelöst wird.
Nach
dem Umbau der Schaltung reagiert der AVR wieder auf das drücken des
Tasters. Es gibt noch eine 4. Betriebsart, welche insbesondere für serielle Datenübertragungssysteme interressant ist. Setzt man im Config-Befehl die Betriebsart 'Change' ein, reagiert der ATMega immer, sobald sich am Int0-Eingang etwas ändert. |