*räusper* *hust* ... bin wieder aus dem Urlaub zurück .
Nein, Spaß bei Seite, ich hatte Abiturtechnisch relativ wenig Zeit für den ASURO.

Also da mein voriges Programm kompletter murks war (müsst ihr euch nicht anschauen), habe ich einen komplett neuen Ansatz gewählt.
Im folgenden werde ich das Prinzip kurz umreißen:

ASURO nimmt drei Odometrie-Messwerte auf. Dabei überprüft er permanent ob bei den Werten ein neues Maximum oder Minimum vorliegt.
Anhand dieser Werte wird dann, um einen Referenzwert für Übergänge zu erhalten, die Hälfte der Amplitude bestimmt ((max+min)/2).
Die Bestimmung ob es einen Übergang von Schwarz nach Weiß oder umgekehrt gegeben hat funktioniert nun so: Wenn alle drei Messwerte auf/absteigend sind, und sich der mittlere Messwert in der Umgebung des Referenzwertes/der Hälfte der Amplitude befindet, wird ein Zähler erhöht.
Unterscheiden sich die beiden Zähler für links und rechts, wird dementsprechend die Geschwindigkeit der Motoren angepasst.
Um Messwerte für die Funktion zu erhalten wird das ganze initialisiert.

Doch, wer hätte es gedacht: Es klappt natürlich nicht ! Und ein weiteres mal ist es mir unerklärlich und ich frage mich warum!

Es wäre klasse wenn ihr mir helfen könntet. n>2 Augen sehen mehr als n=2 Augen!
Vielen Dank im Voraus!

Code:
#include "asuro.h"      // Konfigurationsdateien laden
#define MITTER 145      // Die ca. Hälfte der Amplitude
#define MITTEL 160      // für die ersten Anpassungen

/* Funktionen definieren */

/* Globale Variablen */
unsigned char i;              // Zähler
char alr=0;            // schon (already) gelaufen?
int cntsL=0;	      // Zähler (counts)
int cntsR=0;	      // Zähler
char cnts=0;	      // Zähler
unsigned int odoData[2];      // Array für Odo Werte
unsigned int lrHi[2]={MITTER, MITTER};          // left right highest
unsigned int lrLo[2]={MITTER, MITTER};          // left right lowest
unsigned int spd0=190; // Geschwindigkeit (speed)
unsigned int spd1=190; // Geschwindigkeit
unsigned int odoMemL[3];      // Ododaten zwischenspeichern (ododmetrie memory)
unsigned int odoMemR[3];      // Ododaten zwischenspeichern
unsigned int testErg[2];      // Ergebnisse des Durchlaufes (test ergebnis)
                              // 0=low, 1=hi

void schlafen(int wert){
   for(i=0; i<=wert; i++){
   Sleep(72);}
}

/* Geradeausfahren Initialisieren */

char InitFwd(void){

 schlafen(250);
 StatusLED(RED);
 schlafen(250);
 StatusLED(YELLOW);

   MotorDir(FWD,FWD);   // zunächst gasgeben damit er fährt und Werte sammelt, Vortest
   MotorSpeed(190,190);

   while(cnts<100){       // 20 mal zählen
      OdometrieData(odoData);

      for(i=0; i<3; i++){  // 3 durchläufe für OdoWerte
      OdometrieData(odoData);
      odoData[0]=odoMemL[i];
      odoData[1]=odoMemR[i];

         if(odoMemL[i]>lrHi[0]){       // die Höchstwerte ermitteln LINKS
            lrHi[0]=odoMemL[i];
         }
         else if(odoMemL[i]<lrLo[0]){  // die Tiefstwerte ermitteln
            lrLo[0]=odoMemL[i];
         }

         if(odoMemR[i]>lrHi[1]){       // die Höchstwerte ermitteln RECHTS
            lrHi[1]=odoMemL[i];
         }
         else if(odoMemR[i]<lrLo[1]){  // die Tiefstwerte ermitteln
            lrLo[1]=odoMemL[i];
         }
      }

      /* Hier wird geschaut, ob die Schwelle übertreten wird, falls ja hat Umdrehung stattgefunden */
      /* links */
      if((odoMemL[0]>odoMemL[1] && odoMemL[1]>odoMemL[2]) && ((odoMemL[1]/MITTEL)<1.02 && (odoMemL[1]/MITTEL)>0.98)){
      cntsL++;
      }
      else if((odoMemL[0]<odoMemL[1] && odoMemL[1]<odoMemL[2]) && ((odoMemL[1]/MITTEL<1.02) && (odoMemL[1]/MITTEL)>0.98)){
      cntsL++;
      }

      /* rechts */
      if((odoMemR[0]>odoMemR[1] && odoMemR[1]>odoMemR[2]) && ((odoMemR[1]/MITTER<1.02) && (odoMemR[1]/MITTER>0.98))){
      cntsR++;
      }
      else if((odoMemR[0]<odoMemR[1] && odoMemR[1]<odoMemR[2]) && ((odoMemR[1]/MITTER)<1.02 && (odoMemR[1]/MITTER)>0.98)){
      cntsR++;
      }

      if(cntsL>70 && cntsR>70){
      alr=1;
       StatusLED(RED);
       schlafen(250);
       StatusLED(GREEN);
      }
   cnts++;
      if(cntsR > 2000 || cntsL > 2000){
         cntsL=0;
         cntsR=0;
      }
   }//while cnts

 testErg[0]=(lrHi[0]+lrLo[0])/2; // Test Ergebnisse zuweisen,
 testErg[1]=(lrHi[1]+lrLo[1])/2; // Mitte der Funktion bei Hälfte der Amplitue

 MotorDir(BREAK,BREAK);
 MotorSpeed(0,0);

 schlafen(250);
 StatusLED(GREEN);
 schlafen(250);
 StatusLED(YELLOW);
 schlafen(250);
 StatusLED(GREEN);
 schlafen(250);
 StatusLED(YELLOW);
 schlafen(250);
 StatusLED(GREEN);
 schlafen(250);
 StatusLED(YELLOW);
 schlafen(250);
 StatusLED(GREEN);
 schlafen(250);

return alr;

}

/* Geradeausfahren */

void Forward(void){

 MotorDir(FWD,FWD);
 MotorSpeed(spd0,spd1);

if(alr == 1){    // Falls Vorprüfung stattgefunden hat, ausführen
      for(i=0; i<3; i++){  // 3 durchläufe für OdoWerte
      OdometrieData(odoData);
      odoData[0]=odoMemL[i];
      odoData[1]=odoMemR[i];

         if(odoMemL[i]>lrHi[0]){       // die Höchstwerte ermitteln LINKS
            lrHi[0]=odoMemL[i];
         }
         else if(odoMemL[i]<lrLo[0]){  // die Tiefstwerte ermitteln
            lrLo[0]=odoMemL[i];
         }

         if(odoMemR[i]>lrHi[1]){       // die Höchstwerte ermitteln RECHTS
            lrHi[1]=odoMemL[i];
         }
         else if(odoMemR[i]<lrLo[1]){  // die Tiefstwerte ermitteln
            lrLo[1]=odoMemL[i];
         }
      }

 testErg[0]=(lrHi[0]+lrLo[0])/2; // Test Ergebnisse zuweisen,
 testErg[1]=(lrHi[1]+lrLo[1])/2; // Mitte der Funktion bei Hälfte der Amplitue

      /* Hier wird geschaut, ob die Schwelle übertreten wird, falls ja hat Umdrehung stattgefunden */
      if((odoMemL[0]>odoMemL[1] && odoMemL[1]>odoMemL[2]) && ((odoMemL[1]/testErg[0])<1.02 && (odoMemL[1]/testErg[0])>0.98)){
         cntsL++;
      }
      else if((odoMemL[0]<odoMemL[1] && odoMemL[1]<odoMemL[2]) && ((odoMemL[1]/testErg[0]<1.02) && (odoMemL[1]/testErg[0])>0.98)){
      cntsL++;
      }

      if((odoMemR[0]>odoMemR[1] && odoMemR[1]>odoMemR[2]) && ((odoMemR[1]/testErg[1])<1.02 && (odoMemR[1]/testErg[1])>0.98)){
      cntsR++;
      }
      else if((odoMemR[0]<odoMemR[1] && odoMemR[1]<odoMemR[2]) && ((odoMemR[1]/testErg[1])<1.02 && (odoMemR[1]/testErg[1])>0.98)){
      cntsR++;
      }

if(spd1==255 || spd0==255){
   spd1=spd1-10;
   spd0=spd0-10;
}

if(cntsL>cntsR){
   spd1++;
}

if(cntsL<cntsR){
   spd0++;
}

if(cntsR > 2000 || cntsL > 2000){
   cntsL=0;
   cntsR=0;
}

   MotorDir(FWD,FWD);   // und go!!
   MotorSpeed(spd0,spd1);

}// if alr
}

/* Beginn des Hauptprogramms */

int main (void){

Init();            //Prozessor initialisieren
InitFwd();	   // Odo Initialisieren

while(1)         // Endlosschleife
{
  Forward();
}

/* Schluss ! */

return 0;
}