Forum: Mikrocontroller und Digitale Elektronik Atmega32 16-bit Timer als Interruptquelle


von Matthias W. (Gast)


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.

von Düsendieb (Gast)


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

von Matthias W. (Gast)


Lesenswert?

Ok, aber dann verwende ich doch Mode 12 CTC, wobei TOP durch ICR1 
definiert wird und in TIMSK aktiviere ich keinen Interrupt ????

von Düsendieb (Gast)


Lesenswert?

Matthias W. schrieb:
> TIMSK aktiviere ich keinen Interrupt???

haste recht, habe ich vergessen.

TIMSK = (1<<TOIE1);   // enable TCNT1 overflow

fehlt noch

von Matthias W. (Gast)


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 :>

von Düsendieb (Gast)


Lesenswert?

so funktioniert die Gesprächspsychotherapie

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.