Timer Grundfunktionen in C mit ATMEGA32
Timer/Counter0 Overflow Interrupt Test (eine LED blinkt an PA0)
Der Timer/Counter0 zählt dauernd von 0 bis 255, beim Wechsel von 255 auf 0 wird
der Timer/Counter0-Overflow-Interrupt ausgelöst.
#include <avr/io.h>
#include <avr/interrupt.h>
// Timer/Counter0 Overflow Interrupt
ISR (TIMER0_OVF_vect)
{
PORTA ^= (1 << PA0); // PA0 umkehren
}
int main()
{
DDRA |= (1 << DDA0); // PA0 als Ausgang
TIMSK |= (1 << TOIE0); // Interrupt bei Überlauf auf 0
sei(); // global Interr. aktiv.
TCCR0 |= (1 << CS00) | (1 << CS02); // Vorteiler 1024
while(1) ; // endlosschleife
return 0;
}
// Beispiel bei 4MHz:
// Taktrate = CPU_Takt / Vorteiler / 256
// = 4000000 / 1024 / 256 = 15,26 Hz
Timer/Counter0 Compare-Match-Interrupt Test (eine LED blinkt an PA1)
Der Timer/Counter0 zählt dauernd von 0 bis 128, beim Erreichen von 128 wird
der Timer0-Compare-Interrupt ausgelöst. Dort wird der Counter0 (TCNT0) wieder auf 0 gesetzt
und das Spiel beginnt von neuen. Der Counter0-Overflow-Interrupt ist wohl programmiert,
wird aber nie ausgeführt, da der Counter TCNT0 immer wieder auf 0 gesetzt wird.
Das einfache setzten von TCNT0 auf 0 ergibt keinen Overflow. Um dieses zu erreichen, und
die LED an PA0 auch zum Blinken zu bewegen, könnte man im TIMER0_COMP_vect den TCNT0
zum Beispiel auf 240 setzen.
#include <avr/io.h>
#include <avr/interrupt.h>
// Timer/Counter0 Overflow
ISR (TIMER0_OVF_vect)
{
PORTA ^= (1 << PA0); // PA0 umkehren
}
ISR (TIMER0_COMP_vect)
{
PORTA ^= (1 << PA1); // PA1 umkehren
TCNT0 = 0;
}
int main()
{
DDRA |= (1 << DDA0); // PA0 als Ausgang
DDRA |= (1 << DDA1); // PA1 als Ausgang
TIMSK |= (1 << TOIE0); // Interrupt bei Überlauf auf 0 (TOIE0)
TIMSK |= (1 << OCIE0); // Interrupt bei Compare Match (OCIE0)
OCR0 = 128; // Vergleichswert (OCR0) auf 128 einstellen
sei(); // global Interr. aktiv.
TCCR0 |= (1 << CS00) | (1 << CS02); // Vorteiler 1024
while(1) ; // endlosschleife
return 0;
}
// Beispiel bei 4MHz:
// Taktrate = CPU_Takt / Vorteiler / OCR0
// = 4000000 / 1024 / 128 = 30,51 Hz
Anregungen, Meinungen, Infos bitte an Diese E-Mail-Adresse ist gegen Spambots geschützt! JavaScript muss aktiviert werden, damit sie angezeigt werden kann.
Danke!