Moinsen,
habs endlich geschafft: hatte ein Ausweichprogramm geschrieben und hatte das Linienfolgeprogramm soweit abgeändert, dass der Bot einer Taschenlampe folgen kann. Und jetzt kommts: beide Programme zusammen funktionieren so, dass der Roboter der Lampe folgt und wenn er anstößt ausweicht um dann wieder der Lampe zu folgen. Hier ist der Code:

Code:
/* fahrenlightfeiner 
der Roboter folgt einem Licht über die zwei Phototransistoren oder fährt, bei gleichmäßiger Ausleuchtung gerade aus. 
Stößt er mit den Tastern an wird ein Ausweichmanöver eingeleitet

kai 29.09.2005 */

#include "asuro.h"
#define KNOPF PollSwitch()									//Funktion PollSwitch() wird als KNOPF derfiniert	
#define SPEED 0x8F											//SPEED wird als 248 definiert 

int speedleft, speedright;									//globale Variablen
unsigned int lineDaten[2];								//		"
int ADOffset, i, j, k=0, l;								//		"

void search_left(void);									//Funktionsprototyp
void search_right(void);									//		"

void LineLeft(void){										//Funktion der main Funktion 
															//für die Erhöhung der Geschwindigkeit des linken Motors
	speedleft+= 1;
	
	if(speedleft>0xFE)
		speedleft = 0xFF;
}

void LineRight(void){										//Funktion der main Funktion 
															//für die Erhöhung der Geschwindigkeit des rechten Motors
	speedright += 1;
	
	if(speedright>0xFE)
		speedright = 0xFF;
}		

void back(void){											//Funktion back() der Funktion taster()
															//für zurücksetzen 
	StatusLED(RED);	
	BackLED(ON,ON);
	MotorDir(RWD,RWD);						
	MotorSpeed(254,255);								
	for(i=0;i<=100;i++)				
		Sleep(255);	
}

void pause(void){											//Funktion pause() der Funktion taster()
															//für eine kleine Pause mit Lichteffekten (nicht unbedingt erforderlich)
	MotorSpeed(BREAK,BREAK);
	
	while(k<=4){
		StatusLED(RED);
		BackLED(OFF,OFF);
		FrontLED(ON);
		for(i=0;i<=35;i++)
			Sleep(255);
			
		StatusLED(OFF);
		BackLED(ON,ON);
		FrontLED(OFF);
		for(i=0;i<=35;i++)
			Sleep(255);
		k++;
	}
}

void taster(void){											//Funktion zur Steuerung des Ausweichens		

	KNOPF;													//mehrmaliger Aufruf von PollSwitch, wegen dem bekannten Problem mit 	
	KNOPF;													//dem Kondensator
	KNOPF;
	KNOPF;
	KNOPF;
	KNOPF;
	KNOPF;
	KNOPF;
	KNOPF;
	KNOPF;
	
	if(KNOPF > 0 && KNOPF < 8){							//falls Tasten 1-3 gedrückt wurden, fahre hier fort
		back();
		pause();
		search_left();
		BackLED(ON,OFF);
		MotorDir(RWD,FWD);									//Abdrehen des Roboters in entgegengesetzter Richtung zur gedrückten Taste			
		MotorSpeed(180,180);
		for(j=0;j<=170;j++)	
			Sleep(255);
	}		
	else if(KNOPF > 7 && KNOPF < 60 && KNOPF != 12 && KNOPF != 18 && KNOPF != 30){	//falls Tasten 4-6 gedrückt wurden, fahre hier fort
		back();
		pause();
		search_right();
		BackLED(OFF,ON);
		MotorDir(FWD,RWD);									//Abdrehen des Roboters in entgegengesetzter Richtung zur gedrückten Taste
		MotorSpeed(180,180);
		for(j=0;j<=170;j++)		
			Sleep(255);
	}	
	else if(KNOPF == 12 || KNOPF == 18 || KNOPF == 30){ 	//falls Tasten 2-4 gedrückt wurden, fahre hier fort
		back();
		pause();
		search_left();
		BackLED(ON,ON);
		MotorDir(RWD,FWD);									//Abdrehen des Roboters in entgegengesetzer Richtung zur bisherigen Fahrtrichtung			
		MotorSpeed(180,180);
		for(j=0;j<=240;j++)			
			Sleep(255);
	}	
}	

int main(void){											//Hauptfunktion

	Init();

	StatusLED(GREEN);
				
	for (l = 0; l < 0xFF; l++)
		LineData(lineDaten);								//Überschreiben des Speicherinhalts aus lineDaten[0,1] in die Funktion LineData
			
	LineData(lineDaten);
	ADOffset = lineDaten[0] - lineDaten[1];				//Berechnen von ADOffset
	speedleft = speedright = SPEED;							//Geschwindigkeit links und rechts gleich SPEED
	
	for(;;){												//Endlosschleife		
	
		LineData(lineDaten);								//Auswerten von LineData
		i = (lineDaten[0] - lineDaten[1]) - ADOffset;		//Berechnung von i zur Bestimmung des heller beschienen Transistiors
				
		if(i > 50){										//falls rechter Transistor höhere Helligkeit-->
			BackLED(ON,OFF);
			LineRight();									//Erhöhe links die Geschwindigkeit
			if(KNOPF > 0){									//Bedingung für Ausweichsequenz	
				taster();									//Aufruf der Ausweichfunktion
			}	
		}
		else if(i < -50){									//falls linker Transistor höhere Helligkeit-->
			BackLED(OFF,ON);
			LineLeft();										//Erhöhe rechts die Geschwindigkeit
			if(KNOPF > 0){									//Bedingung für Ausweichsequenz
				taster();									//Aufruf der Ausweichfunktion
			}	
		}
		else{												//bei gleichmäßiger Beleuchtung-->
			BackLED(OFF,OFF);
			speedleft = speedright = SPEED;					//beide Motoren gleiche Geschwindigkeit
			if(KNOPF > 0){									//Bedingung für Ausweichsequenz
				taster();									//Aufruf der Ausweichfunktion
			}	
		}
		MotorDir(FWD,FWD);
		MotorSpeed(speedleft,speedright);					//Einsetzen der Variablen für die Geschwindigkeit der Motoren 								
	}	
	while(1);												//Endlosschleife (ASURO spezifisch)
	return 0;	
}	

void search_left(void){									//Funktion search_left für Funktion taster()
															//für Sucheffekt(nicht unbedingt erforderlich)
	StatusLED(GREEN);
	
	for(k=0;k<=0;k++){
		BackLED(OFF,OFF);
		MotorDir(RWD,FWD);
		MotorSpeed(150,150);
		for(i=0;i<=250;i++)
			Sleep(255);		
		MotorDir(FWD,RWD);
		MotorSpeed(150,150);
		for(i=0;i<=250;i++)
			Sleep(255);
	}
	Sleep(255);
}

void search_right(void){									//Funktion search_right für Funktion taster()
															//für Sucheffekt(nicht unbedingt erforderlich)
	StatusLED(GREEN);
	
	for(k=0;k<=0;k++){
		BackLED(OFF,OFF);
		MotorDir(FWD,RWD);
		MotorSpeed(150,150);
		for(i=0;i<=250;i++)
			Sleep(255);
		MotorDir(RWD,FWD);
		MotorSpeed(150,150);
		for(i=0;i<=250;i++)
			Sleep(255);
	}
	Sleep(255);	
}
So das wärs. Endlich. Aber es gibt noch einiges zutun. Nämlich möchte ich gerne die zeitgesteuerten Elemente durch die Odometriedaten ersetzen und
außerdem muß die Suchfunktion noch einen näheren Sinn bekommen. Ich stelle mir das so vor, dass er solange in der Suchfunktion verbleibt bis ein Helligkeitsunterschied ermittelt wurde und dann wieder der Lichtquelle folgt.
Was haltet ihr davon. Wenns einer ausprobiert hat dann sagt doch mal bescheid.
Kai