@Willa
Ich würde da nichts synchronisieren sondern alles im Interrupt erledigen. Wenn ich dich richtig verstanden habe, werden deine PWM Signale mit 500 Hz (alle 2ms) in Hardware erzeugt. Da wird sich doch wohl ein Interrupt erzeugen lassen, entweder mit dem Überlauf des PWM-Timers oder mit einem der Matches. In diesem Interrupt wird alles erledigt, was mit der Motorsteuerung zu tun hat. Es ist damit immer synchron zu den Motoren. In deiner Main-Loop kannst du dann machen, was du willst. Das kann dann auch beliebig lange dauern.
Ich mach das nicht im Simulator, ich setze einen Pin für die Dauer des Interrupthandlers und messe mit Scope oder LA die Zeit. Da kann man dann auch ganz schnell sehen, was einzelne Operationen für Zeit kosten.
Alles, was nicht ganz so schnell aber trotzdem synchron sein muß, verteile ich auf mehrere Interrupte. Dazu zähle ich im Interrupt eine Variable hoch. Bei jedem Zählerstand wird eine bestimmte Funktion ausgeführt, sind alle durch, wird der Zähler auf Null gesetzt.
Bei einem solchen System kann es sein, daß mehr Zeit im Interrupthandler als in der Mainloop verbracht wird. Das ist auch OK, dort wird ja auch die meiste Arbeit geleistet. Insgesamt braucht man in einem solchen System nur einen Timer, der wird bei dir durch die HW-PWM schon da sein, und einen Interrupthandler. Das macht alles recht übersichtlich, konkurierende Interrupte kommen nicht vor. Man muß in der Mainloop auch nicht aufpassen, daß man irgendein gesetztes Flag verpasst, weil man mal zu langsam ist.
MfG Klebwax
Lesezeichen