hi allerseits,

ich habe noch ein bischen mit den 22er rädern experimentiert, unter umgehung der turn-funktion, sprich mit etwas abgewandelten code aus dem band II-asuro (aufgrund des fast rechteckigen verlaufes des odo-signales kann ich die hysterese vergrößern und den wert für triggerlevel auf 300 legen) lässt sich ein ziemlich genaues quadrat fahren . Durch die vergrößerung des abstandes zwischen den dunkel/hell werten ist die justage der doch relativ weich aufgehängten lichtschranken auch nicht mehr so difizil und störungsanfällig...

Was kann es mit der turn funktion sein? Das einzige was mir bei dem code aus dem Buch auffiel, ist folgendes:
am anfang: unsigned int distance=0;
wenn es dann komplizierter wird: unsigned long int distance=0;

distance ist dort die variable (switch) wo die ticks gezählt werden...

Code:
*im quadrat - 22er räder*/

#include "asuro.h"
#include "inka.h"

//schwellwert für die hell/dunkel unterscheidung
//evtl. muss damit etwas variiert werden

#define TRIGGERLEVEL 300
#define HYSTERESIS 50

#define LOW 0
#define HIGH 1

int main (void)
{
	unsigned int data[2];
	signed int status[2]={0,0};
	signed int difference=0;
	unsigned long int distance=0;
	signed int speed=0;
//	int i;

	Init();
	WaitforStart();

	while(1)
{
	switch (distance)
	{
	//am anfang der strecke langsam anfahren
	case 0: MotorDir (FWD,FWD); speed=150; break;
	case 50: MotorDir (FWD,FWD); speed=200; break;
	case 100: MotorDir (FWD,FWD); speed=255; break;
	//am ende langsamer werden
	case 750: speed=200; break;
	case 800: speed=150; break;
	//und stehebleiben
	case 860: MotorDir(BREAK,BREAK);
	//distance=861;
	//etwas warten bis der asuro wirklich steht
	Msleep(200);

	MotorDir(RWD, FWD);speed=150;
	distance=861;
	case 900: speed=255; break;
	case 950: speed=200; break;
	case 980: speed=150; break;
	case 1019: MotorDir(BREAK,BREAK);
	//etwas warten bis der asuro wirklich steht
	Msleep(200);
	MotorDir (FWD,FWD); speed=150;
	//und von vorne
	distance=0;

	 break;
	}

		//helligkeitswerte der lichschranke auslesen
		OdometrieData(data);

		//wechsel linker sensor von weiss (low) auf schwarz(high)?
		if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL + HYSTERESIS))
		{
		status[0]=HIGH;
		difference++;
		distance++;
		}

		//wechsel linker sensor von schwarz (high) auf weiss(low)?
		if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL - HYSTERESIS))
		{
		status[0]=LOW;
		difference++;
		distance++;
		}

		//wechsel rechter sensor von weiss (low) auf schwarz(high)?
		if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL + HYSTERESIS))
		{
		status[1]=HIGH;
		difference--;
		}

		//wechsel rechter sensor von schwarz (high) auf weiss(low)?
		if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL - HYSTERESIS))
		{
		status[1]=LOW;
		difference--;
}

//zur sichreit: verhindern, dass der differenzzähler
//den erlaubten wertebereich verlässt
if (difference<-speed) difference=-speed;
if (difference>speed) difference=speed;

//status LED entsprechend der erkannten segmente aufleuchten lassen
//grün für links, rot für rechts
StatusLED(status[0]+status[1]*2);

//Zählerdifferenz passend auf die motoren verteilen
if (difference>0) MotorSpeed(speed-difference,speed);
else MotorSpeed(speed,speed+difference);
}
return 0;
}