Hallo teHIngo
Na, du machst es dir einfach. Stellst deinen voll komplizierten Code rein und gehst ins Bett. Und wir können uns nun quälen. Da brauche ich etwas länger, bis ich da durchblicke. Meine Lösung zur Prüfung der aufsteigenden/abfallenden Wertefolgen sah mal so aus:Würde mich freuen wenn ihr mal drüber guckt ... Gute Nacht!
count_l/r sind die Zähler, odo_bit_l/r der letze Status, ox_l/r die Werte der letzten Daten. Das ist sicher auch nicht das Ei des Kolumbus, funktioniert aber halbwegs zuverlässig. Im Stillstand ohne drehende Motoren kann man am Rad drehen und die Segmentwechsel an der StatusLED erkennen.Code:unsigned int data[2], count_l, count_r; void count(void){ static unsigned int o1_l, o2_l,o3_l,o4_l, o1_r, o2_r, o3_r, o4_r; static unsigned char odo_bit_l, odo_bit_r; OdometrieData(data); if ((data[0]<o1_l) && (o1_l<o2_l) && (o2_l<o3_l) && (o3_l<o4_l)) { if (!odo_bit_l) { count_l ++; odo_bit_l=(1==1); StatusLED(YELLOW); } } if ((data[0]>o1_l) && (o1_l>o2_l) && (o2_l>o3_l) && (o3_l>o4_l)) { if (odo_bit_l) { count_l ++; odo_bit_l=(1==0); StatusLED(OFF); } } if ((data[1]<o1_r) && (o1_r<o2_r) && (o2_r<o3_r)) { if (!odo_bit_r) { count_r ++; odo_bit_r=(1==1); StatusLED(RED); } } if ((data[1]>o1_r) && (o1_r>o2_r) && (o2_r>o3_r)) { if (odo_bit_r) { count_r ++; odo_bit_r=(1==0); StatusLED(OFF); } } o4_l=o3_l; o3_l=o2_l; o2_l=o1_l; o1_l=data[0]; o3_r=o2_r; o2_r=o1_r; o1_r=data[1]; }
Das liegt wohl daran, dass immer noch ein Überlauf der Werte stattfindet. Nun eben im Wechsel einmal links und einmal rechts. Ich schau mir morgen mal deinen Code genauer an. Ebenfalls gute Nacht.ASURO fährt jetzt immer 8en
Gruß
mic







Zitieren

Lesezeichen