Schlagzeilen

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

Download Studio-Projekt


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

Download Studio-Projekt



Anregungen, Meinungen, Infos bitte an Diese E-Mail-Adresse ist gegen Spambots geschützt! JavaScript muss aktiviert werden, damit sie angezeigt werden kann.

Danke!


 

Wettervorhersage