Hallo!
So brauch mal wieder eure Hilfe.
Hab ein Programm geschrieben, bei dem mein ASURO ein Quadrat fahren soll. Macht er auch... er führt es nur ständig aus. Ich möchte aber, dass er nur ein Quadrat fährt.
Hab schon alle möglichen Schleifen ausprobiert... er ignoriert die Anweisungen aber und fährt mehrere Quadrate..
Kann mir jemand helfen und sagen, wie ich mein Programm abändern muss, damit er nur ein Quadrat fährt?

Mein Programm:
Code:
#include "asuro.h"
//Schwellwert für die Hell/Dunkel-Unterscheidung
//Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 680
#define HYSTERESIS 30
#define LOW 0
#define HIGH 1
int main(void)
{
	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;
	Init();
	MotorDir(FWD,FWD);
	while (1) {
	
		switch(distance) {
			
			//Am Anfang der Strecke Vollgas
			case 0:MotorDir(FWD,FWD); 
			MotorSpeed(speed,speed); 
			break;
			//Am Ende langsamer werden...
			case 215:speed=200; 
			break;
			case 230:speed=150; 
			break;
			//...und stehen bleiben
			case 251:MotorDir(BREAK,BREAK); 
				//etwas warten, bis der Roboter wirklich steht
				for (i=0; i<100; i++)
				{
				Sleep(255); }
				//auf der Stelle nach links drehen
				MotorDir(RWD,FWD);
				speed=255;
				//und noch vermeiden, dass die Verzögerung
				//mehrmals aufgerufen wird
				distance=252;
				break;
			case 282: speed=200;
			break;
			case 288: speed=150;
			break;
			case 292: MotorDir(BREAK,BREAK);
				for (i=0; i<100; i++)
				{
				Sleep(255); }
				
				MotorDir(FWD,FWD);
				speed=255;
				distance=0;
				//und noch vermeiden, dass die Verzögerung
				//mehrmals aufgerufen wird
				
				break;
				}
								
			//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);
			
		}	
}
Im Switch sage ich ihm was er fahren soll und unten werte ich die Odometrie aus. Da er die Odometrie ja auch ständig ausführen soll, dachte ich, dass ich eine Schleife direkt nach dem while einfügen muss, da ich nicht weiß wie ich die while abändere, dass sie das ganze nur 4mal ausführt.
Habe es z.B. mit einer if else versucht.

Code:
#include "asuro.h"
//Schwellwert für die Hell/Dunkel-Unterscheidung
//Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 680
#define HYSTERESIS 30
#define LOW 0
#define HIGH 1
int main(void)
{
	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 x;
	signed int x=0;
	Init();
	MotorDir(FWD,FWD);
	while (1) {

	if (x==4)   {
        x++;
		switch(distance) {
			
			//Am Anfang der Strecke Vollgas
			case 0:MotorDir(FWD,FWD); 
			MotorSpeed(speed,speed); 
			break;
			//Am Ende langsamer werden...
			case 215:speed=200; 
			break;
			case 230:speed=150; 
			break;
			//...und stehen bleiben
			case 251:MotorDir(BREAK,BREAK); 
				//etwas warten, bis der Roboter wirklich steht
				for (i=0; i<100; i++)
				{
				Sleep(255); }
				//auf der Stelle nach links drehen
				MotorDir(RWD,FWD);
				speed=255;
				//und noch vermeiden, dass die Verzögerung
				//mehrmals aufgerufen wird
				distance=252;
				break;
			case 282: speed=200;
			break;
			case 288: speed=150;
			break;
			case 292: MotorDir(BREAK,BREAK);
				for (i=0; i<100; i++)
				{
				Sleep(255); }
				
				MotorDir(FWD,FWD);
				speed=255;
				distance=0;
				//und noch vermeiden, dass die Verzögerung
				//mehrmals aufgerufen wird
				
				break;
				}
								
			//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);
			
                }
                else MotorDir(BREAK,BREAK);
		}	
}