Hallo Leute, ich versuche mich mit den Interrupts vertraut zu machen. Will zur Übung eine einfache Funktion am Timer2 in eine ISR packen... Die funktionierende Funktion: //Initialisierung// TCCR2 = (1<<WGM21) | (1<<WGM20) | (1<<CS20) | (1<<COM21) ; //TopValue beschreiben// OCR2 = ADC_value; So kann gebe ich am OC2 ein Signal von 62,49kHz aus und kann den Tastgrad mit einem Poti verstellen. Jetzt versuche ich das ganze per ISR zu realisieren: //Initialisierung// TCCR2 = (1<<WGM21) | (1<<WGM20) | (1<<CS20; TIMSK |= (1<<OCIE2); sei(); //TopValue beschreiben// OCR2 = ADC_value; //ISR// ISR (TIMER2_COMP_vect) { PORTD ^= (1<<PD7); } Bekomme ein Signal mit 31.24kHz. Das beschreiben des OCR2 hat jedoch keinen Einfluss.Das sich die Frequenz halbiert hat leuchtet mir ein. Aber was mache ich falsch, dass OCR2 keinen Einfluss hat? Benutze einen ATmega32.
Zeig dein ganzes Programm. 0 Errors, 0 Warnings. Aus diesen Fetzen ist der Fehler nicht ersichtlich.
Du toggelst beim erreichen des Vergleichswertes, deshalb sieht es aus, also ob die Periodendauer gleich bleibt (d.h. nur der Zeitpunkt des Toggelns verschiebt sich nur). Ich glaub du erwartest eigentlich, dass bei 0 (Overflow Interrupt) eingeschattet wird und beim erreichen des Wertes (Comp Interrupt) wieder ausgeschaltet.
Marcel schrieb: > Aber was mache ich falsch, dass OCR2 keinen Einfluss hat? > Benutze einen ATmega32. Datenblatt S. 125 - Du hast Mode 3 eingestellt, willst aber mit Mode 2 arbeiten.
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.