|
Interrupt (wie man einen Timer benutzt)
Interrupt bedeutet Unterbrechung.
Unterbrochen wird der normale Programmablauf.
Wozu ist das nützlich?
Das kannst Du hier
nachlesen.
Hier ein Timerinterrupt-Beispiel für
Atmega8.
Zwei LEDs blinken mit unterschiedlicher Frequenz:
- LED2 blinkt als Folge des normalen Programmablaufes.
- LED1 blinkt bei jedem Timerinterrupt.

Natürlich kannst Du auch einfach unser Experimentierboard benutzen.
Hier das Programm:
#include <avr/io.h>
#define F_CPU 1000000UL // 1 MHz
#include <util/delay.h>
#include <stdint.h>
#include <avr/interrupt.h>
ISR(TIMER0_OVF_vect){
PORTB ^= _BV(PB2); //durch Timer
ausgeloestes Blinken (hier die langsame LED)
}
int main(void)
{
DDRB = DDRB | _BV(PB2) | _BV(PB3); //
PB2 & PB3 sind Ausgaenge (für LED)
TCCR0 = 0x05; TIMSK
=0x01;
// Timer0 mit Prescaler 1024
sei();
//
Interrupts ermoeglichen
while (1)
{
PORTB ^= _BV(PB3); _delay_ms(50); //normales
LED-Blinken (hier die schnelle LED)
}
return(0);
}
Hier gibt es den
Code-Ordner zum
Programmieren des Atmega8.
Ein paar Anmerkungen
dazu:
ISR steht für Interrupt Service
Routine. Hier springt die Abarbeitung des Programmes hin, wenn der
Interrupt "geworfen" wurde.
Üblicherweise solltest Du Dir überlegen, da evtl. nur wenige Befehle
hineinzuschreiben. Denn bedenke: Die Abarbeitung der Main-Funktion
bleibt solange unterbrochen, wie die ISR abgearbeitet wird.
Andererseits benutzen wir gerade einen mit 1MHz getakteten
Mikrocontroller und reden hier deshalb von ein paar millionstel
Sekunden.
TIMER0_OVF-vect steht für Timer0-Overflow-Vector und bedeutet
soviel wie: "Zeitgeber Überlauf Anzeiger"
Der Timer Nr. 0 wurde so programmiert, daß er zu bestimmten Zeiten
"überläuft", was im "Zeitgeber Überlauf Anzeiger" bemerkt wird.
Dieser "Zeitgeber Überlauf Anzeiger" sagt dann: "es ist Zeit, das
normale Programm zu unterbrechen und die Interrupt Service Routine
auszuführen!".
Das ^ in PORTB ^= ... bedeutet
toggeln (den Zustand des Bits umkehren).
Näheres wie immer im Datenblatt.
|