In diesem Kapitel wird gezeigt, wie ein Overflow-Interrupt mit Voreinstellung realisiert werden kann. Bei der Voreinstellung handelt es sich um die Einstellung eines Zähler-Startwertes. Dies gibt die Möglichkeit beliebige Zeitintervalle/Frequenzen zwischen zwei aufeinanderfolgende Interrupts einzustellen. Die "beliebige" Frequenz kann beim Atmega328P nicht kleiner als 0,238 Hz und nicht größer als 16 MHz generiert werden.

Die Frequenz des Overflow-Interrupts aus dem vorherigen Kapitel lag bei 3,815 Hz. Es kam ein Timer1 (16-Bit-Timer) zum Einsatz, welcher von 0 bis 65535 zählte und jeweils beim Overflow zu einem Interrupt führte. Die Blinkfrequenz liegt damit bei 1,907 Hz. Ist eine "beliebige" Blinkfrequenz erforderlich, kann in der interrupt standert routine, der Wert des Zählerstnades festgelegt und somit der Startwert des nächsten Zählerdurchlaufes definiert werden. z.B kann der Zählerstand auf 20 000 gesetzt werden. In diesem Fall würde der µC von 20 000 bis 65535 Zählen. Der Zähler durchläuft also nicht mehr 65536 sondern nur noch 45536 Schritte. Für die Frequenzberechnung (siehe Formel im vorherigen Kapitel) ergibt sich ein Wert von 5,49 Hz (Blinkfrequenz = 2,745 Hz).

Das Register zum Festlegen des Startwertes für Timer1 lautet TCNT1 und wird in der Interrupt-Standard-Routine gesetzt.

Quellcode:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util//delay.h>
#define F_CPU 16000000UL

ISR(TIMER1_OVF_vect)				//ISR wird ausgelöst, sobald Timer1 einen Overflow generiert
{
	PORTD++;						//Register PORTD wird inkrementell erhöht
	TCNT1 = 20000;					//Timer-Startwert wird gesetzt
}

int main(void)
{
    DDRD = 0b11111111;				//Ausgänge setzen
	
	PORTD = 0;						//Startwert für PORTD auf 0 setzen
	
	TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);	//Timer1 konfigurieren (16 Bit Timer mit Takt/64 durch den Vorteiler)
	
	TIMSK1 |= (1<<TOIE1);			//TIMSK - Timer Interrupt Mask Register für Timer1
									//TOIE1 - Timer Overflow Interrupt Enable: kommt es zu einem Overflow, wird ein Interrupt generiert, der die ISR auslöst
									
	sei();							//Aktivierung allgemeiner Interrupts
	
    while (1) 
    {
    }
}

Zuletzt geändert: Freitag, 4. Februar 2022, 11:46