Er fährt mir nun mein Haus vom Nikolaus.. manchmal bleibt er stehn, dann muss man ihn einfach nochmal starten...

Hab das nun garnicht mit dem distance >363 gemacht... geht auch so, wenn man distance wieder auf null setzt.

Mein code sieht also so aus:
Code:
//----------------------------------------------------------------------------------
//Projekt: HAUS VOM NIKOLAUS
//----------------------------------------------------------------------------------
#include "asuro.h"
#define TRIGGERLEVEL 680
#define HYSTERESIS 30
#define LOW 0
#define HIGH 1

//----------------------------------------------------------------------------------
//Variablen deklarieren
//----------------------------------------------------------------------------------
unsigned int data [2];
signed int status [2]={0,0};
unsigned int speed=255;
//Startwert für halbe Motorgeschwindigkeit
signed int difference=0;
unsigned int distance=0;
int i;
int zaehler=0;

//----------------------------------------------------------------------------------
//Unterprogramm Odometrie
//----------------------------------------------------------------------------------
void Odometrie (void)
{
		//Helligkeitswerte der Lichtschranken auslesen
        OdometrieData(data);
     
        //Wechsel linker Sensor von niedrig auf hoch?
        if((status[0]==LOW)&&(data[0]>TRIGGERLEVEL+HYSTERESIS)) {
        status[0]=HIGH;
        difference++;
        distance++; }

        //Wechsel linker Sensor von hoch auf niedrig?
        if((status[0]==HIGH)&&(data[0]<TRIGGERLEVEL-HYSTERESIS)) {
        status[0]=LOW;
        difference++;
        distance++; }
         
        //Wechsel rechter Sensor von niedrig auf hoch?
        if((status[1]==LOW)&&(data[1]>TRIGGERLEVEL+HYSTERESIS)) {
        status[1]=HIGH;
        difference--; }
         
        //Wechsel rechter Sensor von hoch auf niedrig?
        if((status[1]==HIGH)&&(data[1]<TRIGGERLEVEL-HYSTERESIS)) {
        status[1]=LOW;
        difference--; }
         
         
        //zur Sicherheit: verhindern, dass der Differenzzähler den erlaubten
        //Wertebereich verlässt
        if(difference<-155) difference=-155;
        if(difference>155) difference=155;
         
        //StatusLED noch entsprechend der erkannten Segmente aufleuchten
        //lassen, grün für links, rot für rechts
        StatusLED(status[0]+status[1]*2);
     
        //Zähldifferenz passemd auf die Motoren verteilen
        if(difference>0) MotorSpeed(155-difference,155);
        else MotorSpeed(155,155+difference);
}

//----------------------------------------------------------------------------------
//Unterprogramm Haus (Quadrat, Kantenlänge 29cm)
//----------------------------------------------------------------------------------
void Haus (void)
{

distance=0;
zaehler=0;

    //Schleife (wird 4mal ausgeführt), da 4 Seiten
    while (zaehler<4)
    {
         
    switch(distance) 
		{
        //Hausseite
        case 0:		MotorDir(FWD,FWD);
					MotorSpeed(speed,speed);
					break;
        case 110:	speed=200;
					break;
        case 120:	speed=150;
					break;
        //Drehung nach links, 90°
        case 145:	MotorDir(BREAK,BREAK);
						for (i=0; i<100; i++)
							{
							Sleep(255); 
							}
					MotorDir(RWD,FWD);
					speed=255;
					distance=146;
					break;
        case 176: 	speed=200;
					break;
	    case 182: 	speed=150;
					break;
		//stehen bleiben und kurz warten
	    case 186: 	MotorDir(BREAK,BREAK);
						for (i=0; i<100; i++)
							{
							Sleep(255); 
							}
					MotorDir(FWD,FWD);
					speed=255;
					//zurück zum Anfang
					distance=0;
					
					//Schleifenzähler
					zaehler++; 
					break;
        }
		
		Odometrie();
                              
    }   
	//stehen bleiben, nachdem ASURO ein Quadrat gefahren ist
	MotorDir(BREAK,BREAK);

} 

//--------------------------------------------------------------------------------
//Unterprogramm Dach1 (Diagonale 1, 41cm; Dach Seite 1, 19cm)
//--------------------------------------------------------------------------------
void Dach1 (void)
{

distance=0;
zaehler=0;

while(zaehler<1)
	{
		
	switch(distance) 
		{
		//Drehung nach links, 45°
		case 0: 	MotorDir(RWD,FWD);
					MotorSpeed(speed,speed);
					distance=1;
					break;						
		case 10: 	speed=200;
					break;
		case 15: 	speed=150;
					break;
		//Diagonale 1
		case 21: 	MotorDir(BREAK,BREAK);
						for (i=0; i<100; i++)
							{
							Sleep(255); 
							}
					MotorDir(FWD,FWD);
					MotorSpeed(speed,speed);
					break;
		case 190:	speed=200;
					break;
		case 200:	speed=150;
					break;
		//Drehung nach rechts, 95°
		case 227:	MotorDir(BREAK,BREAK);
						for (i=0; i<100; i++)
							{
							Sleep(255); 
							}
					MotorDir(FWD,RWD);
					speed=255;
					distance=228;
					break;
		case 248:	speed=200;
					break;
		case 258:	speed=150;
					break;
		//Dach Seite 1, linke Seite
		case 268:	MotorDir(BREAK,BREAK);
						for (i=0; i<100; i++)
							{
							Sleep(255); 
							}
					MotorDir(FWD,FWD);
					speed=255;
					distance=269;
					break;
		case 340:	speed=200;
					break;
		case 350:	speed=150;
					break;
		case 363:	MotorDir(BREAK,BREAK);
						for (i=0; i<100; i++)
							{
							Sleep(255); 
							}
					break;
		zaehler++;
		}
	
	Odometrie();
	
	}
	
	MotorDir(BREAK,BREAK);
	
}	

//---------------------------------------------------------------------------------
//Unterprogramm Dach2 (Diagonale 2, 41cm; Dach Seite 2, 19cm)
//---------------------------------------------------------------------------------
void Dach2 (void)
{

while(zaehler<1)
	{
		
	switch(distance) 
		{
		//Drehung nach rechts, 80°
		case 0: 	MotorDir(RWD,FWD);
					MotorSpeed(speed,speed);
					distance=1;
					break;					
		case 25: 	speed=200;
					break;
		case 30: 	speed=150;
					break;
		//Dach Seite 2, rechte Seite 
		case 37: 	MotorDir(BREAK,BREAK);
						for (i=0; i<100; i++)
							{
							Sleep(255); 
							}
					MotorDir(FWD,FWD);
					MotorSpeed(speed,speed);
					break;
		case 110:	speed=200;
					break;
		case 120:	speed=150;
					break;
		//Drehung nach rechts, 95°
		case 131:	MotorDir(BREAK,BREAK);
						for (i=0; i<100; i++)
							{
							Sleep(255); 
							}
					MotorDir(FWD,RWD);
					speed=255;
					distance=132;
					break;
		case 150:	speed=200;
					break;
		case 160:	speed=150;
					break;
		//Diagonale 2
		case 171:	MotorDir(BREAK,BREAK);
						for (i=0; i<100; i++)
							{
							Sleep(255); 
							}
						MotorDir(FWD,FWD);
						speed=255;
					distance=172;
					break;
		case 340:	speed=200;
					break;
		case 350:	speed=150;
					break;
		case 377:	MotorDir(BREAK,BREAK);
						for (i=0; i<100; i++)
							{
							Sleep(255); 
							}
					break;
		zaehler++;
		}
	
	Odometrie();
	
	}
	
	MotorDir(BREAK,BREAK);
}

//-----------------------------------------------------------------------------------
//Hauptprogramm
//-----------------------------------------------------------------------------------
int main (void)
{
Init();

   while(zaehler<1)
      {
      BackLED(OFF,OFF);
      StatusLED(OFF);
     
      FrontLED(ON);
      Haus();
      FrontLED(OFF);
      StatusLED(RED);
      Dach1();
	  StatusLED(OFF);
	  
      StatusLED(GREEN);
      Dach2();
	  
      BackLED(ON,ON);
     
      zaehler++;
      }
   return 0;
}
Werde nun meine Winkel noch ein wenig verfeinern und dann mal mein Ergebnis dem Wettbewerb präsentieren.