ha, das diese Gedanken zum Arduino-Timer erst jetzt kommen...
dann verrate ich mal alle meine Geheimnisse... (womit euer Code in wesentlichen Punkten meinem sehr ähnlich werden wird, naja LOL)
Zunächst nur als Einschub, die Motor PWM Counter Updates werden durch die Umschichtung der If kein bischen mehr oder weniger asynchron als wie mit der If in der ISR!!!!!! Das ist gehupft wie gesprungen. Warum: in jedem Fall wird erst reagiert wenn die Haupt-Loop zur entsprechenden Abfrage kommt...
Und tatsächlich hat das gar nichts mit der "alten" micros-Zeitvergleichs-Methode in den älteren BrugiVersionen, ala Wii, zu tun! (warum kommt gleich). Es war - IMHO - ein richtiger zu der Semaphoren-Method mit motorUpdate - wie das im übrigen eigentliche jeder machen würde - überzugehen
Zum Problem bei/mit Arduino...
1. Arduino benutzt einen Timer und entsprechende ISR zum Zählen
2. es rechnet in der ISR eine ganze Menge, z.B. mit so Sachen wie long etc. pp
3. weil wir alle 6 PWM brachen bleibt keiner für den Arduino Counter übrig
4. wir wollen auf keinen Fall 8kHz haben, sodnern unbedingt 32 kHz haben
und jetzt die Katastrophe: um die 32kHz zu realiseren stellen wir die Timer auf fast-PWM, aber der übliche und damit auch Arduino Zeitmess-Code geht davon aus dass der Timer immer nur in EINE Richtung zählt....
durchdenke das mal kurz was da gerade gesagt wurde...
=> für die Hauptloop-Steuerung geht das mit der ISR völlig i.O. aber das mit der Zeitmessung über z.B. micros ist VÖLLIG für die Tonne!!!!
=> bei der "alten" Brugi Methode konnte das nicht gut klappen da ja der Timer selber schon unsauber zählt => die Standard Semaphoren-Metode, wie du es jetzt auch hast, ist quasi ein muss
=> die Konsequenzen für die RC-Zeitmessung sollten klar sein...
Was tun? Tja, die Zählroutine so schreiben dass sie mit hoch und runter Zählen klappt (nicht ganz einfach, meiner Meinung nach DER Grund warum es bei AlexMos etwas dauerte bis er mehr als 8kHz konnte... er wollte wohl den Timer nicht auf fast-PWM stellen)
hoffe ich habe in dem ganzen Wust auch deine Frage
beantwortet
EDIT: auch wenn ich's glaube ich schon 2mal sagte, will ich, weil wir gerade dabei sind, nochmals draufstossen... bei mir dauert das I2C einlesen ALLER Werte (gyro+adc) 250ms... und keine 350ms oder was es ist nur für'n Gyro (und ich mache nichts besonderes!)...
EDITII: sorry, gerade gemerkt, ich meine oben natürlich phase-correct PWM Modi und nicht fast PWM... mea culpa