Ich glaube ich habe gestern den fehler des zuckens gefunden, irgendwie mag es die Berechnung der IK nicht wenn während der berechnung die Interrupts der Servoansteuerung kommen. ich habe jetzt mal die Berechnung in die Pausen gelegt wo die Servoansteurung zeit hat und jetzt gehts.
aber erklären kann ich es mir nicht... schon komisch... eventuell ein Bug von Bascom? vielleicht wird irgendwo eine Speicherzelle überschrieben, was ich mir aber fast nicht vorstellen kann...
Das klingt mir ganz danach als gäbe es da einen Konflikt beim Zugriff auf eine Variable...

Nehmen wir an du hättest irgendeine 16Bit Variable die in einer ISR geschrieben und im Programm irgendwo gelesen wird (oder umgekehrt, völlig egal). Dann musst du beachten, daß bei einem 8-Bit µC in der Regel jeweils 2 Operationen dafür benötigt werden. Tritt jetzt nach der ersten Operation der Interrupt auf, wurde die Variable erst "zur Hälfte" gelesen bzw. geschrieben und das kann Probleme geben.

Ein Beispiel:

Ich habe eine Timer-ISR die einfach nur eine 16-Bit Variable jeweils um 1 inkrementiert, und an verschiedenen Stellen im Programm lese ich diese Variable ein um z.B. irgendwelche Zeiten zu messen.

So, gehen wir mal davon aus daß die Variable aktuell einen Wert von 0x00FF hat und beim Zugriff jeweils immer das untere Byte zuerst kommt. Wir wollen den Wert im Programm also einlesen, und bekommen als erstes das untere Byte mit dem Wert 0xFF, aber dann kommt der Interrupt und inkrementiert die Variable um 1 so daß ihr Inhalt jetzt eigentlich 0x0100 ist. Dummerweise weiß das Programm davon aber nichts und macht nach dem Rücksprung einfach mit dem lesen der zweiten Hälfte der Variable weiter, nämlich 0x01. Das Programm hat also 0x01FF gelesen, ein Wert der natürlich viel zu groß ist.

Solche Probleme können nicht nur auftreten wenn die ISR schreibt und das Programm liest, sondern auch wenn das Programm schreibt und die ISR liest, auch welcher Teil der Variable zuerst gelesen wird ist egal.


Prüfe deinen Code mal auf derartige Konflikte