Die Strecke wird mittels Odometrie gemessen.
Hier der gesamte Code vom 1.Teilwettbewerb. Ich denke, es ist soweit dokumentiert, dass man es versteht.
Code:
/*******************************************************************************
*
* Description: Asuro Wettbewerb 1.2
*
*****************************************************************************/
#include "asuro.h"
#include <stdlib.h>

unsigned char speed;
int speedLeft,speedRight;
unsigned int lineData[2];
int i, i1, ADOffset;

void FollowLine (void)
{
	LineData(lineData);
	i = (lineData[0] - lineData[1]) - ADOffset;
	if ( i > 4) {				//Line is left
		StatusLED(GREEN);
		speedRight = speed - 2 * i;
		if (speedRight < 0x01) speedRight = 0x00;
	}
	else if ( i < -4) {		//Line is right
		StatusLED(RED);
		speedLeft = speed + 2 * i;
		if (speedLeft < 0x01) speedLeft = 0x00;
	}
	else {
		StatusLED(OFF);
		speedLeft = speedRight = speed;
	}
	MotorSpeed(speedLeft,speedRight);
}

int main(void)
{
unsigned char weiter, flag=FALSE;
unsigned int data[2];
int weg, weg1;

	Init();
	DDRD |= (1 << DDD1);			//initialisiert IR-Detektor
	PORTD &= ~(1 << PD1);
	OCR2  = 0xFE;					//Pulsbreite 1

	while(1){
		MotorDir(FWD,FWD);
		StatusLED(GREEN);
		speed = 160;
		switched=1;
		while(switched){				// warte bis Schatz entwendet wird
			Msleep(100);
			StartSwitch();				// INT1 auf Eingang, Spannung geht hoch 
			Msleep(5);					// wartet wegen der Zeitkonstante R23*C7
			switched=0;StartSwitch();	// macht Interrupt endgültig scharf
		}
		StatusLED(RED);					// Schatz ist fort (rotwerde)
		Msleep(1000);					// warte noch 1 sec, dann Suche
		
		FrontLED(ON);
		LineData(lineData);
		ADOffset = 0;
		speedLeft = speedRight = speed;
		weg=0;
		while((PIND & (1 << PD0))){		// fahre solange auf Linie bis IR-Det. was findet
			FollowLine();
			OdometrieData(data);			// bestimme Weglänge
			if ((data[0] < 560) && (flag == TRUE)) {flag = FALSE; weg++;}
			if ((data[0] > 640) && (flag == FALSE)) {flag = TRUE; weg++;}
		}
		weg1=weg+10;						// merke Wegstrecke
		StatusLED(OFF);
		MotorDir(BREAK,BREAK);
		MotorDir(BREAK,RWD);		// rechts drehen
		MotorSpeed(160,160);
		Msleep(900);
		MotorDir(BREAK,BREAK); Msleep(200);
		MotorDir(FWD,FWD);
		MotorSpeed(160,160);
		Msleep(300);
		MotorDir(FWD,FWD);			// fahre Halbkreis um Schatz
		MotorSpeed(120,190);
		Msleep(2800);
		MotorDir(BREAK,BREAK); Msleep(200);
		MotorDir(BREAK,FWD);		// links drehen
		MotorSpeed(160,160);
		weiter=1;
		while(weiter){				// solange bis Linie entdeckt wird
			FrontLED(OFF);
			LineData(lineData);
			i = (lineData[1] - lineData[0]);
			FrontLED(ON);
			LineData(lineData);
			i1 = (lineData[1] - lineData[0]);
			if ( (i1-i) > 30) weiter=0;			//Linie in Sicht
		}
		Msleep(40);								//Nachlauf für Linienmitte
		MotorDir(BREAK,BREAK); Msleep(100);
		MotorDir(FWD,FWD);
		speedLeft = speedRight = speed;
		while((PIND & (1 << PD0))){			// fahre auf Linie bis IR-Det. was findet
			FollowLine();
		}
		speed=100;								// reduziere Geschwindigkeit zum Andocken
		while(!switched){						// fahre bis angedockt ist
			FollowLine();
		}
		StatusLED(GREEN);
		speed=180;
		MotorSpeed(speed,speed);				// gib Gas zum Schieben des Schatzes
		weg=0;
		while(weg<weg1){						// schiebe gemerkte Strecke zurück
			FollowLine();
			OdometrieData(data);
			if ((data[0] < 560) && (flag == TRUE)) {flag = FALSE; weg++;}
			if ((data[0] > 640) && (flag == FALSE)) {flag = TRUE; weg++;}
		}
		MotorDir(BREAK,BREAK);
		Msleep(100);
		MotorDir(RWD,RWD);
		MotorSpeed(160,160);
		Msleep(100);
		MotorDir(BREAK,BREAK);Msleep(200);
		MotorDir(BREAK,RWD);		// rechts drehen
		MotorSpeed(160,160);
		Msleep(850);
		MotorDir(BREAK,BREAK); Msleep(200);
		MotorDir(FWD,FWD);
		MotorSpeed(160,160);
		Msleep(300);
		MotorDir(FWD,FWD);			// Halbkreis
		MotorSpeed(120,190);
		Msleep(2800);
		MotorDir(BREAK,BREAK); Msleep(200);
		MotorDir(BREAK,FWD);		// links drehen
		MotorSpeed(160,160);
		weiter=1;
		while(weiter){				// solange bis Linie entdeckt wird
			FrontLED(OFF);
			LineData(lineData);
			i = (lineData[1] - lineData[0]);
			FrontLED(ON);
			LineData(lineData);
			i1 = (lineData[1] - lineData[0]);
			if ( (i1-i) > 30) weiter=0;			//Linie in Sicht
		}
		Msleep(40);								//Nachlauf für Mitte
		StatusLED(GREEN);
		MotorDir(BREAK,BREAK); Msleep(100);
		MotorDir(FWD,FWD);
		speed=150;
		speedLeft = speedRight = speed;
		while((PIND & (1 << PD0))){			// fahre auf Linie bis IR-Det. was findet
			FollowLine();
		}
		speed=100;								// reduziere Geschwindigkeit zum Andocken
		StartSwitch();				// INT1 auf Eingang, Spannung geht hoch 
		Msleep(5);					// wartet wegen der Zeitkonstante R23*C7
		switched=0;StartSwitch();	// macht Interrupt endgültig scharf
		while(!switched){						// fahre bis angedockt ist
			FollowLine();
		}
		MotorSpeed(0,0);						// angedockt, bleib stehen
	}
    return 0;
}
Viel Spass beim Studieren!
Waste