Hallo
Mit dem Prescaler erzeugt man den heruntergeteilten Takt für den Timer aus dem Takt des Kontrollers. Der Takt des Timers ist um der Faktor des Vorteilers geringer als der Kontrollertakt. Ein 8MHz-Mega8 zählt mit Prescaler /8 in 20ms bis 8000000/8*0,020=20000. In einer Millisekunde zählt er bis 1000.
Weil es so einfach ist, wählt man den Mode 14 "Fast-PWM mit ICR1 als TOP" und begrenzt den Zählbereich mit dem IRC1-Register auf 20000. Das Zählregister TCNT1 zählt dann von 0 (Bottom) nach 20000 (Top) und wird beim Erreichen von Top wieder auf Bottom gesetzt. Ein Zyklus dauert nun 20ms.
Das Vergleichsregister OCR1A (A für Kanal A) wird mit 1000 geladen und der Ausgang OC1A wird so eingestellt, dass der Ausgang (beim Mega8 ist OC1A der Pin PB1) bei TCNT1==Bottom auf High und bei TCNT1==OCR1A wieder auf Low gesetzt wird. Wenn dann noch das Datenrichtungsregister auf Ausgang konfiguriert ist, wird am Pin PB1 ein Impuls ausgegeben,der 1ms dauert. Wenn man nun den Wert in OC1A ändert, ändert sich auch die Impulsdauer.
In den Registern TCCR1A und TCCR1B (hier bezeichen A und B die zwei Register und nicht die zwei Kanäle!) werden der Prescaler (CS), der Modus (WGM) und die Ansteuerung des Ausgang (COM1A0 und COM1A1, A ist hier wieder der Kanal) durch setzen der entsprechenden Bits ausgewählt.
Ich habe die Datenblätter nur überflogen, aber ich denke, die Register vom Mega8 und vom Mega256 stimmen in etwa überein. Bis auf das Setup des Pins kannst du deshalb die Konfiguration von oben übernehmen.
Mit OCR1A beeinflußt man die Impulsdauer an OC1A (PB1). Mit OCR1B funktioniert das dann auch mit OC1B an PB2, wenn du COM1B0 und COM1B1 und das DDR für Pin PB2 auch konfiguriert hast. Der Prescaler, der Mode, das Zählregister und die Einstellung für Top gilt für beide Kanäle.Was müsste ich wie manipulieren um den einen oder anderen Servo anzusteuern?
Übrigends läuft das alles automatisch im Hintergrund ohne dein Programm zu beeinflussen oder gar zu bremsen.
Gruß
mic
Lesezeichen