Hallo
Bei mir funktionieren die Code-Tags normal (siehe oben).
Die ISR wird nur alle ca. 0.5ms bis 1,5ms aufgerufen und nach der If-Abfrage, die ich wegen der ungünstig belegten Ansteuerpins benötige, wird nur einmal geschoben:
if(nr<2) PORTB |= (1<<nr); // Impulsleitung des aktuellen Servos
else PORTC |= (1<<nr); // auf High setzen
Ich schätze mal, das braucht man nicht mehr optimieren.
Da das Thema nun angeschnitten ist habe ich mal nach dem Fehler in der 18er-Variante gesucht. Damals hatte ich von Timern nur den CTC-Modus kapiert und dieser ist hier völlig falsch. Da beim Match das TCNT1-Register zurückgesetzt wird, wird das Timeing in beiden Threads total gestört. Richtig wäre wohl der normale Mode bei dem der Timer endlos mit 16Bit hochzählt. Beim MatchCompare wird dann der Wert des nächsten Impulses zum TCNT1 dazugezählt (plus ein paar Takte fürs Laden ) und das Ergebniss in das OCR1X geschrieben. Die Impulspause darf dann nur in einem Thread ausgeführt werden, diese Funktion setzt nach Ende der Impulspause zusätzlich das Zählregister wieder auf 0 und der Zyklus startet von Vorne. Spannend. Da mein RP6 und die Servos eingemottet sind kann ich das im Moment nicht testen.
Gruß
mic
Lesezeichen