Einfaches Gedankenspiel dazu:
Betreibt man den Tiny25/45/85 mit 1 MHz, so dauert bei Timer-Vorteiler
1:1 der Umlauf eines 8-Bit-Timers 256 µs, denn 1 Timer-Schritt dauert ja
1 µs. Das reicht uns nicht, um 1000 bis 2000 µs darin abzubilden.
Bei Vorteiler 1:8 dauert 1 Timer-Schritt schon 8 µs, ein Umlauf mit 256
Schritten demnach 2048 µs. Das passt schonmal, um die Dauer von
Servoimpulsen darin abzubilden. Das Raster beträgt 8 µs, 1,0 ms
entspricht also 125 Timerschritte, 2,0 ms 250 Timerschritte. Damit ist
der Servo-Weg auf 125 Schritte gerastert. Wenn Du nicht gerade
Präzisions-Kunstflug betreiben willst, sollte das ausreichen.
Die Gesamtperiode von etwa 20 ms würde ich mit einem Zähler realisieren,
der vom Überlauf des Timers getaktet wird.
Um betreffs Pins flexibel zu bleiben und um mehrere Servos ansteuern zu
können, würde ich auf eine Hardware-PWM verzichten und die Servo-Pins
per Software setzen und löschen.
Die Programmstruktur sähe dann so aus:
Reset_Routine:
Einrichten von Ports,
ADC (Free-Run mit Vorteiler 1:8, 125 kHz)
Timer0 mit Vorteiler 1:8, Overflov-Interrupt und Compare0A-Interrupt
Pausenzähler auf Startwert (9 oder 10)
ISR_Ovf0:
Pausenzähler runterzählen
Wenn 0 erreicht, dann
Pausenzähler auf Startwert setzen
Impuls einschalten
ADC auslesen, daraus Impulsdauer besrechnen (/2 und etwas Offset)
Impulsdauer in OCR0A schreiben
Sollten mehrere Servos bedient werden, dann:
Servonummer auf 1 setzen und
ADMUX auf nächsten Eingang umschalten
fertig...
ISR_Timer0CompA:
Impuls ausschalten (bei mehreren Servos alle ausschalten)
Sollten mehrere Servos bedient werden, dann:
Servonummer auf Gültigkeit (Überlauf) prüfen
Wenn Servonummer noch gültig, dann:
ADC auslesen,
Impulsdauer berechnen
Impulsdauer auf OCR0A aufaddieren
nächsten Servopin auf H setzen
oder:
ADMUX auf Eingang für erstes Servo
fertig...
In C notieren musst du es selbst, C ist mir zu kryptisch. In Assembler
oder Basic werde ich es nicht notieren, da ich keinen Wert auf die
darauf folgenden Kommentare der C-Verfechter lege.
...