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