Zwischenbericht: Überarbeitet, klappt immer noch nicht. : (
Soll ich vielleicht einfach nochmal alles schön ordentlich kurz und präzise hinschreiben und einen neuen Thread eröffnen? Wirkt vielleicht nicht so abschreckend und es würde evtl. mal jemand antworten ; )
Code:
/* ####################################################### */
/* ############# FUNKTIONEN DEFINIEREN ################### */
/* ####################################################### */

#include "asuro.h"	// Konfigurationsdateien laden

#define MITTER 155	// ca. die Hälfte der Amplitude
#define MITTEL 140	// der Odometriewerte. Benötigt für
			// Initialisierung

/* ####################################################### */
/* ############# FUNKTIONEN DEFINIEREN ################### */
/* ####################################################### */

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

/* --- Verbesserte Sleep Funktion --- */
void schlafen(unsigned 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
   MotorSpeed(190,190);
   schlafen(250);	// Zeit zum Beschleunigen geben

   /* Messung beginnen */
   while(cnts<500){	// 500 Durchläufe zur Bestimmung der Hälfte
   			// der Amplitude
   			
      /* Neuer Algorithmus: "Durchlaufende Werte" */
      OdometrieData(odoData);
      
      odoMemL[0]=odoMemL[1];
      odoMemL[1]=odoMemL[2];
      odoMemL[2]=odoData[0];
      
      odoMemR[0]=odoMemR[1];
      odoMemR[1]=odoMemR[2];
      odoMemR[2]=odoData[1];

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

      if(odoData[1]>lrHi[1]){       // die Höchstwerte ermitteln RECHTS
         lrHi[1]=odoData[1];}
      else if(odoData[1]<lrLo[1]){  // die Tiefstwerte ermitteln
         lrLo[1]=odoData[1];}
           
      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 */
      /* links */
      if((odoMemL[0]>odoMemL[1] && odoMemL[1]>odoMemL[2]) && (((odoMemL[1]/MITTEL)<1.05) && ((odoMemL[1]/MITTEL)>0.95)))
      {
         cntsL++;
      }
      else if(((odoMemL[0]<odoMemL[1]) && odoMemL[1]<odoMemL[2]) && (((odoMemL[1]/MITTEL)<1.05) && ((odoMemL[1]/MITTEL)>0.95)))
      {
         cntsL++;
      }

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

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

   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;
}


void Forward(void){

if(!alr2){		// Beschleunigen damit er in Fahrt Werte sammelt
   MotorDir(FWD,FWD);   
   MotorSpeed(spd0,spd1);
   schlafen(250);	// Zeit zum Beschleunigen
   alr2 = 1;
}


if(alr)
{    // Falls Vorprüfung stattgefunden hat, ausführen
      
   /* Dieser Programmteil ist weitestgehend identisch mit InitFwd(); */
   /* Neuer Algorithmus: "Durchlaufende Werte" */      
   OdometrieData(odoData);
      
   odoMemL[0]=odoMemL[1];
   odoMemL[1]=odoMemL[2];
   odoMemL[2]=odoData[0];
      
   odoMemR[0]=odoMemR[1];
   odoMemR[1]=odoMemR[2];
   odoMemR[2]=odoData[1];

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

   if(odoData[1]>lrHi[1]){		// die Höchstwerte ermitteln RECHTS
      lrHi[1]=odoData[1];}
   else if(odoData[1]<lrLo[1]){		// die Tiefstwerte ermitteln
      lrLo[1]=odoData[1];}
      
   testErg[0]=((lrHi[0]+lrLo[0])/2);	// Testergebnisse zuweisen,
   testErg[1]=((lrHi[1]+lrLo[1])/2);	// Mitte der Odometriewertekurve

      /* 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]/testErg[0])<1.05) && ((odoMemL[1]/testErg[0])>0.95)))
   {
      cntsL++;
   }
   else if((odoMemL[0]<odoMemL[1] && odoMemL[1]<odoMemL[2]) && (((odoMemL[1]/testErg[0])<1.05) && ((odoMemL[1]/testErg[0])>0.95)))
   {
      cntsL++;
   }

   /* rechts */
   if((odoMemR[0]>odoMemR[1] && odoMemR[1]>odoMemR[2]) && (((odoMemR[1]/testErg[1])<1.05) && ((odoMemR[1]/testErg[1])>0.95)))
   {
      cntsR++;
   }
   else if((odoMemR[0]<odoMemR[1] && odoMemR[1]<odoMemR[2]) && (((odoMemR[1]/testErg[1])<1.05) && ((odoMemR[1]/testErg[1])>0.95)))
   {
      cntsR++;
   }

   /* Dies ist ein neuer Programmteil. */
   if(spd1==255 || spd0==255)	// Falls Maximalspd erreicht Spielraum schaffen
   { 
      spd1=spd1-10;
      spd0=spd0-10;
   }

   /* Hier wird die Geschwindigkeit angepasst. */
   if (cntsL>cntsR)     spd1++;
   else if(cntsL<cntsR) spd0++;

   /* Variable darf nicht überlaufen */
   if((cntsR>5000 || cntsL>5000) && (cntsR>3000 && cntsL>3000))
   {
      cntsL=cntsL-2000;
      cntsR=cntsR-2000;
   }

   /* Und losfahren! */
   MotorDir(FWD,FWD);
   MotorSpeed(spd0,spd1);

}
}

/* ####################################################### */
/* ############ BEGINN DES HAUPTPROGRAMMS ################ */
/* ####################################################### */

int main (void){

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

while(1)
{
   Forward();
}

return 0;
}

/* ####################################################### */
/* ############### ENDE DES PROGRAMMS #################### */
/* ####################################################### */