Im Mode 2 läuft der Timer immer von 0 nach OCR0A. Bei OCR0A setzt er das OCF0A Flag und toggelt, falls eingestellt, den OC0A Pin. Für die Frequenz an OC0A beginnt eine Periode. Timer0 springt nach 0 und läuft wieder nach OCR0A. Bei Erreichen OCR0A wird OCF0A Flag wieder neu gesetzt, wenn es zwischendurch gelöscht wurde und OC0A getoggelt. Frequenz: 1/2 Priode ist um und zweite Halbperiode beginnt. Timer -> 0 -> OCR0A. Nun ist eine Periode der Frequenz um, das OCF0A Flag wurde zweimal gesetzt. Also für eine Periodendauer von 1µs durch Toggeln gibt es zwei Compare A Interrupts. -> Läuft Timer halb so schnell, dann Compare A Interrupt Abstand 1µs.
Ja, die 2 muß raus. Siehe Erklärung oben. Für eine Frequenzperiode durch Toggeln gibt es zwei Compare A Interrupts. (Ist anders als im Fast PWM Modus, wenn dort die Frequenz nicht durch Toggeln erzeugt wird. Ist aber weiteres Thema)Ich habe im CTC Modus nur eine Formel gefunden. Im Datenblatt steht nur, dass wenn keine prescaler oder ein niedriger verwendet wird, der CTC Modus keine double buffering funktion mehr hat. Heisst das das die 2 in der Formel raus muss und man nur noch den fclk/(N*(1+OCR0A)) benutzt? Ich kann es mir nicht so richtig erklären.
Sacken lassen...
Na ja, vermutlich meinst Du das Richtige. Statt des TIMSK0 = (1<<TOIE0); muß es TIMSK0 = (1<<OCIE0A); sein. Das OCF0A Flag wird ja von der HW gesetzt. Man kann es durch setzen nur löschen.Ok das mit dem Interrupt leutet mir ein, allerdings muss ich dann zusätzlich noch das OCF0A im TIFR0-Register setzen?
Ja. (Wenn das der korrekte Name in C für den Timer0 Compare Interrupt A ist - ich kann nicht wirklich C)Und die ISR heißt dann so?: ISR TIMER0_COMPA_vect
PS. ...und das "sei;" zum globalen Interrupt Enable nicht vergessen ...
Gruß
Searcher
Lesezeichen