So da nun endlich mein Quadrat funktioniert, versuche auch ich das Haus vom Nikolaus zu zeichnen.
Leider funktioniert es nicht wie erhofft.
Habe 4 Unterprogramme geschrieben, welche nacheinander ausgeführt werden sollen. Funktioniert auch ein Teil davon.
Das Programm läuft allerdings nur bis zum Quadrat und danach hört er auf zu fahren, springt also nicht in die Unterprogramme Dach1 und Dach2.

Könnte mal jemand drüberschauen und sagen, was ich falsch mache???
Danke

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)
{
	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;
	}
	
	Odometrie();
}	

//---------------------------------------------------------------------------------
//Unterprogramm Dach2 (Diagonale 2, 41cm; Dach Seite 2, 19cm)
//---------------------------------------------------------------------------------
void Dach2(void)
{
	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;
	}
	
	Odometrie();
}

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

	MotorDir(FWD,FWD);
	BackLED(OFF,OFF);
	StatusLED(OFF);

	Haus();
	StatusLED(RED);
	Dach1();
	StatusLED(GREEN);
	Dach2();
	StatusLED(YELLOW);
}