Hi,
etwas verspätet, aber trotzdem. Ihr hattet Recht, es lag am Code und einer fehlenden Veroderung im TIMSK-Register. Jetzt geht's:
Ich habe eine andere Frage, und zwar kann ich den Timer2 ja ebenfalls im CTC Modus laufen lassen. Jetzt ist es so, dass ich Frequenzen im Bereich von 60Hz bis 10kHz rausgeben möchte. Der AVR ist mit einem 16MHz Quarz getaktet. Ich dachte Anfangs, ich könnte das einfach so realisieren:Code://Timer0 so Langsam wie möglich TCCR0 |= (1<<CS02) | (1<<CS00); //Prescaler=1024 TCNT0 = 0; TIMSK |= (1<<TOIE0); //timer 1 auf sekundentakt TCCR1B = ( (1 << CS12) | (1 << CS10)| (1 << WGM12) ); // Prescaler auf 1024 und CTC mode akivieren OCR1A = 15625; // wert für 1s vorladen TIMSK |= (1 << OCIE1A) ; // Output Compare Interrupt aktiveren
Im ISR Vector hatte ich dann vor, den Port immer wenn eine gewisse Periode erreicht wurde zu togglen:Code://setze Timer2 in den CTC Modus und lasse jede µs ISR auslösen. TCCR2 |= (1<<CS20) | (1<<WGM21); // Prescaler von 1 | CTC-Modus OCR2 = 8; // Vergleichswert für 1µs Periode TIMSK |= (1<<OCIE2); // Interrupts aktivieren und damit Timer starten
Nachdem ich das ausprobierte ging das zwar, aber mir fiel auf, dass egal was ich für einen Wert in OCR2 schreibe, ich keinen Einfluss habe. Nach Überlegungen bin ich drauf gekommen, dass es sein kann, dass alles quasi zu schnell läuft, sprich viele ISRs verschluckt werden, da die Ausführung und Einsprung in die ISR ja wieder Zyklen kostet.Code:ISR(TIMER2_COMP_vect) { T2count++; if (T2count == T2period) { MOT_A_PORT ^= (1<<MOT_A_C_PIN); MOT_B_PORT ^= (1<<MOT_B_C_PIN); T2count = 0; } }
Deswegen wollte ich mir diese Form der Realisierung abschminken. Hättet ihr einen klugen Lösungsansatz, mit dem ich quasi ausgehend von der gewünschten Frequenz den passenden Prescaler und Vorladewert quasi "autodetecten" lassen könnte? (Die Formeln zur Berechnung aus dem Datenblatt kenne ich, aber das Ganze kam mir zu unelegant vor...)
Besten Dank,
Simon







Zitieren


Lesezeichen