Mit dem vorladen funktioniert das prinzipiell, am Beispiel des 8Bit Timers erklärt, so:
12MHz, 8Bit, Prescaler 1024 -> zählt von 0..255 und löst Interrupt aus. Für die 255 Ticks benötigt er insgesamt 21.8453ms. Lädst du nun jedoch bei jedem Interrupt gleich 22 vor, zählt er nur noch 233 Ticks, was 19.968ms dauert.
Vorladen beim 8Bit Timer0:
Code:
ISR(TIMER0_OVF_vect)
{
/* preload counter */
TCNT0 = 22; // toogle breakpoint here to verify correct timings
/* code here */
}
Mit Timer1/2 im Hardware PWM sollte man da ähnliches basteln können. Eventuell gibt es da auch noch eine elegantere Möglichkeit, aber soweit hab ich mich nie mit PWM befasst.
Hat bis jetzt immer ohne irgendwelche Verrenkungen geklappt (Meine Servos laufen auch ganz normal mit einer Periode von 21.7ms, die mir der PWM-Mode ausspuckt).
Was du gerade mit delay() treibst kann ich nicht ganz nachvollziehen. Aber m.E. macht man es doch so, in einer Schleife 12 mal _delay_us(100) aufzurufen, um auf 1.2ms zu kommen. Wenn man denn delays nutzen will...
Lesezeichen