Das hab ich mit OCR1A und B gemacht.Könntest Du mir kurz erklären, wie Du dieses Problem gelöst hast ?
Ich beschreibe das mal für 8 Kanäle und OCR1A - Mit OCR1B funktioniert das genauso.
Zuerst definierst Du eine Zählvariable und ein Array in dem die gewünschten Servoimpuls ausgabelängen abgelegt sind.
Und zwar eine Array mit 9! Werten, da Du ja auch nocn ne Pause zwischen den Impulsen machst.
Der Comparematch Interrupt 1A wird aktiviert.
In diesem Comparematch Interrupt wird der erste Ausgang auf 1 gelegt und der OCR1A mit der TCNT1 + Impulslänge1 ( Impulslänge1 entspricht dem ersten Wert im Array ) vorbelegt.
Das wars dann eigentlich schon.
Tritt der Interrupt dann wieder auf wird Ausgang 1 abgeschaltet und Ausgang 2 aktiviert. TCNT1 + Impulslänge2 in das OCR1A Register und so fort.
Sind nun alle Kanäle übertragen, werden alle Ausgänge abgeschaltet und die Interframe Pause von mindestens 4ms eingefügt.
Die Zählvariable dient dabei zur indizierung des Arrays ( OCR1A=TCNT1 + ARRAY[Zählvariable]; ) und auch gleichzeitig als Switch Variable, welcher Ausgang gerade dran ist.
Die Beschränkung auf 8 Kanäle kommt daher, das ein "normales" Servo einen Refreshzyklus von 20ms hat. Also bei 2ms maximal Pulslänge bleiben Dir 4ms für den Interframe ( Pause ). Wenn du mit längeren Refreshzeiten leben kannst gehen da noch mehr Kanäle.
Da das Ganze Spielchen im Interrupt läuft brauchst Du eigentlich nur das Array mit neuen Werten zu versorgen und das Ganze läuft praktisch im Hintergrund ab.
Das Gleiche kann man dann noch mal für den OCR1B machen und somit 8 weitere Kanäle ansteuern.
Bastel aber nicht zu viel Zeug in diese Impulsauswerte und Senderoutinen mit rein, sonst gibts Jitterprobleme, weil dein Controller ja nicht unbeschränkt schnell arbeiten kann und sich dann die Interrupts überlappen können, was dann zu besagten Problemen führt.
Wenn Du ganz auf Nummer sicher gehen willst, solltest Du die Interrupts bei Schreiben auf das Array unterbinden. Da es sich dabei ja um 2Byte Werte handelt, könnte theoretisch ein Interrupt zwischen dem Ersten und dem zweiten Byte auftreten und dabei eine Störung in der Impulslänge hervorrufen.
Bei mir hat das aber noch nie Probleme gemacht!
Lesezeichen