Atmega32 16-bit Timer als Interruptquelle

Gast #1897421
Lesenswert?

Morgen µC Gemeinde,

im Prinzip sagt der Betreff schon alles aus. Ich möchte dass der 16-bit 
Timer des Atmega32 mir in regelmäßigem Abstand (vorerst nur ca. im 
Abstand 1ms) einen Interrupt auslöst, der sagen wir mal eine LED an PD5 
ein und ausschaltet.

Ich bin Anfänger und möchte zunächst alle Funktionen des Atmega 
austesten um damit verschiedene Projekte zu realisieren. Die hiesigen 
Tutorials habe ich schon durchforstet leider ohne Erfolg, auch das 
Datenblatt gewälzt etc.. Aber der Interrupt will einfach nicht kommen :(

Hier ein paar Code Schnipsel:


Initialisierung des Timers (CTC-Modus, Prescaler-1024, TOP = 1000, Timer 
1 CompareA Interrupt gesetzt):


TCCR1A &= ~(1<<WGM11);
TCCR1A &= ~(1<<WGM10);
TCCR1B |= (1<<WGM12);
TCCR1B &= ~(1<<WGM13);
TCCR1B |= (1<<CS12);
TCCR1B &= ~(1<<CS11);
TCCR1B |= (1<<CS10);
OCR1A = 0x03E8; /*(entsprich dual 1000)*/
TIMSK |= (1<<OCIE1A);

so weit alles richtig ;) ?

Weiterhin die Interrupt-Routine (laut s.42 Datenblatt):

ISR(TIMER1_COMPA_vect){

 PORTD |= (1<<PD5);


}

Globale Interrupts sind mit sei(); aktiviert, #include <avr/interrupt.h>
hab ich auch nicht vergessen. Den ganzen Code zu Posten wird ein wenig 
schwierig da es nur ein kleiner Teil einer Routinge zur LCD-Ansteurung 
ist, ich denke das würde stark verwirren. Die LED will einfach nicht 
angehen, was sie ja theoretisch einmal müsste. Wenn ich den 
entsprechenden Schnipsel anfangs in die main schreibe, dann leuchtet sie 
natürlich.
Gast #1897436
Lesenswert?

Matthias W. schrieb:
> TCCR1A &= ~(1<<WGM11);
> TCCR1A &= ~(1<<WGM10);
> TCCR1B |= (1<<WGM12);
> TCCR1B &= ~(1<<WGM13);
> TCCR1B |= (1<<CS12);
> TCCR1B &= ~(1<<CS11);
> TCCR1B |= (1<<CS10);
> OCR1A = 0x03E8; /*(entsprich dual 1000)*/
> TIMSK |= (1<<OCIE1A);
> so weit alles richtig ;) ?

Ersetze obiges durch:
TCCR1A =0;            // disable PWM and Compare Output Mode
TCCR1B=1;        // use CLK prescale value
TCNT1=0xff00;     // reset TCNT1
sei();      // enable interrupts
Gast #1897460
Lesenswert?

Danke für die Hilfe ;)

Aber ich bin ein ziemlich großer Depp, jetzt weiß ich warum es nicht 
Funktioniert hat. Ich hab in der main vergessen die µC in eine 
Endlosschleife zu setzten, damit ist das Programm durchgelaufen und er 
hat einfach nie die Möglichkeit bekommen den Interrupt zu erleben. 
Gestern hab ich garantiert eine Stunde drüber gegrübelt warum es nicht 
geht, jetzt poste ich hier und mir fällt es auf :>

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren