Hallo,

hier ist meine Funktion, die die Regelung und auch das Kreuzungserkennen erledigt.

Prinzipiell erkenne ich eine Kreuzung daran, das beide LEDs dunkel werden. Eine beendete Line erkenne ich daran das beide LEDs hell werden.


Code:
/* Schwellwerte für die Linienerkennung
 * Achtung stark Lichtabhängig.
 */
#define LIGHT_HIGH_MID 0x55
#define LIGHT_MID_LOW  0x28

char golinie(int left, int right, unsigned char settings, int speeddif) {
	unsigned char status=0;
	int fehler=0;
	unsigned int speedleft;
	unsigned int speedright;
	if (autoencode 	!= ADC_RUN) RunADC(ADC_RUN);		
	encoder[ODLEFT] = 0;
	encoder[ODRIGHT] = 0;
	MotorDir(left>0?FWD:RWD,right>0?FWD:RWD);
	while (run && (!gotSwitch || !(settings&RETURN_ON_SWITCH)) && encoder[ODLEFT] < abs(left) && encoder[ODRIGHT] < abs(right) && status != GREEN && (status!= RED || !(settings&GO_STOP_ON_CROSS))) {
		if (count72kHz > 18) {  // regelung in definierten Zeitabschnitten ausführen !!! Sleep in dieser Schleife verboten!!!
			count72kHz = 0;
			fehler = line[0] - line[1];
			fehler *= LKP;
			speedleft = BASESPEEDLEFT+speeddif+fehler;
			speedright = BASESPEEDRIGHT+speeddif-fehler;
			if (speedleft > 255) speedleft = 255;
			if (speedleft < 65) speedleft = 65;
			if (speedright > 255) speedright = 255;
			if (speedright < 65) speedright = 65;
			MotorSpeed(speedleft,speedright);
			status = 0;
			if (line[ODLEFT] < LIGHT_MID_LOW && line[ODRIGHT] < LIGHT_MID_LOW)
				status = RED;
			if (line[ODLEFT] > LIGHT_HIGH_MID && line[ODRIGHT] > LIGHT_HIGH_MID)
				status = GREEN;
			if (line[ODLEFT] >= LIGHT_MID_LOW && line[ODRIGHT] >= LIGHT_MID_LOW && line[ODLEFT] <= LIGHT_HIGH_MID && line[ODRIGHT] <= LIGHT_HIGH_MID)
				status = YELLOW;
			StatusLED(status);
		}
	}
	if (settings & GO_STOP) MotorSpeed(0,0);
	if (!run) return STOP_RUN;
	if (gotSwitch && (settings&RETURN_ON_SWITCH)) return STOP_SWITCH;
	if (status == GREEN) return LINE_LOST;
	if (status== RED && (settings&GO_STOP_ON_CROSS)) return LINE_CROSS; 
	return GO_SUCCESS;
}
Hoffe das hilft.

Martin