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.
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
Ok, aber dann verwende ich doch Mode 12 CTC, wobei TOP durch ICR1 definiert wird und in TIMSK aktiviere ich keinen Interrupt ????
Matthias W. schrieb: > TIMSK aktiviere ich keinen Interrupt??? haste recht, habe ich vergessen. TIMSK = (1<<TOIE1); // enable TCNT1 overflow fehlt noch
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 :>
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.