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.

 

 

Zurück zur Auswahlseite            Zur Hauptseite