Interrupts: Warum?
Abschlussbedingungen
Das folgende
Beispiel soll zeigen,
warum die Programmierung mit Interrupts sinnvoller ist als kontinuierlich den Zustand zu prüfen, der den Interrupt auslöst.
Die Funktion des Programms soll darin bestehen, eine LED blinken zu lassen.
Zur Erinnerung noch einmal das Blinkprogramm OHNE Interruptsteuerung:
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
int main(void)
{
DDRB=0x10;
while (1)
{
//kein weiteres Hauptprogramm möglich
_delay_ms(1050);
PORTB^=0x10;
}
}
Das Hauptprogramm besteht im
Wesentlichen nur aus der Warteschleife (Funktion _delay_ms), während deren Abarbeitung der
Mikrocontroller keine andere Aufgabe erfüllen kann.So sieht das gleiche Programm mit Interruptsteuerung aus:
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
int main(void)
{
DDRB=0x20;
TCCR1B=(0<<ICNC1)|(0<<ICES1)|(0<<WGM13)|(0<<WGM12)|(1<<CS12)|(0<<CS11)|(0<<CS10); //Konfiguration des Timers
TIMSK1|=(1<<TOIE1); // Aktivierung des Timerinterrupts
sei(); //Globale Freischaltung der Interrupts
while (1)
{
//frei verfügbar für das Hauptprogramm
}
}
ISR(TIMER1_OVF_vect)
{
PORTB^=0x20;
}
Hinweis: Die Timerkonfiguration wird später im Kurs erläutert! Sie muss an dieser Stelle noch nicht verstanden werden. Der Programmcode mit
Interruptsteuerung fällt
durch die Timerkonfiguration, die Timeraktivierung und das ISR länger aus.
Trotzdem empfiehlt es sich, die Variante mit Interruptsteuerung zu verwenden, da diese noch die Möglichkeit eines unabhängigen Hauptprogrammablaufes offen lässt. Der Timer läuft im Hintergrund und erzeugt alle 1000 ms einen Interrupt, der den LED-Zustand toggelt.
Zuletzt geändert: Montag, 21. Februar 2022, 08:51