Hi,
ich blick nicht durch, wie Dein Programm funktioniert/funktionieren soll. Deshalb mal ein Alternativvorschlag für die Timereinstellung:
OCR1A mit 1500 initialisieren (Mittelstellung für Servo)
Für Timer1 im Fast PWM Modus mit ICR1 als Top (Mode 14)
Im TCCR1A WGM11 setzen
Im TCCR1B WGM12 und WGM13 setzen
ICR1 auf 19999 setzen UND Prescaler auf 8 (im TCCR1B zusätzlich noch das CS11 setzen)
Mit CS11 läuft der Timer1 los und benötigt für eine "Runde" 20ms und eine Einheit im OCR1A entspricht einer µs.
Für PWM Modus "non inverting" in TCCR1A noch zusätzlich das COM1A1 setzten (clear OC1A on compare match, set at bottom)
Nun brauchst Du nur noch OCR1A entsprechend zu setzen und an PD5 erscheint das benötigte PWM Signal für den Servo wenn der, wie in Deinem Programm, auf OUTPUT geschaltet ist.
zB OCR1A auf 500 = Servopulsweite von 0,5ms
zB OCR1A auf 1500 = Servopulsweite von 1,5ms
Dann wird keine ISR benötigt und in der Haupschleife dann nur ADC auswerten und das OCR1A entsprechend setzten.
Alles nach Datenblatt für ATmega1284P_doc8059 und nicht getestet, soll heißen ohne Gewehr
Gruß
Searcher
Lesezeichen