Hallo teHIngo
Würde mich freuen wenn ihr mal drüber guckt ... Gute Nacht!
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:
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];
}
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.
ASURO fährt jetzt immer 8en
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.
Gruß
mic
Lesezeichen