Es funktioniert immer noch nicht...
Habe mal LED zwischendurch ein- bzw. ausschalten lassen um zu sehn wo mein Programm hängt... joa es hängt nicht, sondern überspringt einfach einen Teil. Haus macht er einwandfrei und springt auch aus dem Unterprogramm raus, soll dann in Dach1 springen, macht es aber nicht. Es überspringt mir einfach Dach1 und Dach2 und schaltet sofort die BackLEDs an.
Habe ich die Unterprogramme in der main falsch eingefügt??
Mögliche Fehler in den Unterprogrammen habe ich ausgeschlossen, da ich sie unabhängig voneinander getestet habe...

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)
{
    //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)
{

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);
		//MotorDir(FWD,FWD);
		Dach1();
		StatusLED(GREEN);
		
		//MotorDir(FWD,FWD);
		Dach2();
		BackLED(ON,ON);
		
		zaehler++;
		}
	return 0;
}