Hallo Technik_Amateur,
den Ablauf der Timerkonfiguration sehe ich folgendermaßen:
TCCR1A = (1<<COM1A1) | (1<<WGM11); //clear OC1A on compare match, set at bottom (non-inverting)
TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS11); //WGM12,WGM13,WGM11 -> Mode14 -> Fast PWM, ICRn, set OCR1A at Bottom | prescaler = 8
Der Timer läuft durch das CS11 los, ICR1 ist aber noch auf seinem Initialwert 0.
ICR1 = 19999; // ICR1 = 19999 als TOP-Wert, hier werden die 20ms gebildet (8MHz / 8 * (1 + 19999)) = 50Hz
Erst hier wird der richtige TOP-Wert definiert. Keine Ahnung was passiert, wenn der Timer versucht mit TOP Wert 0 loszulaufen. Wird vermutlich keine spürbaren Auswirkungen haben. Logischer wäre, das ICR1 vor Start des Timers zu setzten.
OCR1A = 1499; // OCR1A = 1499, Servomittelstellung, (8MHz / 8 * (1 + 1499)) = 666,6Hz = 1,5ms
1499 für 1500µs Pulsweite stimmt. Hab ich mal mit einem Mega88 getestet; ist zwar ein anderer µC aber die Timerbeschreibung ist sehr ähnlich, wenn nicht gleich. Ist in meinem ersten Post falsch aufgeführt
EDIT: Wenn der Timer läuft und OCR1A auf 0 ist und bleibt, gibt es in diesem Fall 1µs spikes bei jedem Durchlauf am OC1A Pin (alle 20ms).
Man sollte auch noch beachten, wann das OCR1A Register upgedatet wird. Im Mode 14 ist es bei TCNT1=0 (BOTTOM). Wenn der Timer schon läuft, wird beim Schreiben auf OCR1A der wert gepuffert und erst bei Erreichen von TCNT1=BOTTOM dann übernommen und aktiv.
Logischer wäre auch hier, das OCR1A vor Starten des Timers zu initialisieren.
Auch könnte man sich überlegen, ob man das COM1A1 Bit erst zum Schluß setzt und damit PD5 auf die Compare Unit/waveform Generation Unit durchschaltet, wenn der Timer komplett initialisiert ist und läuft.
Das meiste ist für den Betrieb nicht so wichtig, da es nur den ersten Timerzyklus betrifft und man hier Unsauberkeiten am Servo wahrscheinlich nicht erkennen kann. Könnte aber hilfreich bei der Bugsuche sein.
Möchte noch sagen, daß ich auch noch Amateur bei der µC Programmierung bin und nicht alles richtig sein muß, was ich hier geschrieben habe. C verstehe ich auch nur rudimentär und enthalte mich auch erstmal einem Kommentar zu Deinem restlichen Programm.
Gruß
Searcher
Lesezeichen