Den Odo Test hatte ich vorher durchgeführt, meine
http://roboter.net-con.net/asuro/source/ododemo1.html

Hier aber mal der quelltext, fehlt nur die kollisionsabfrage da das ne ewig lange case abfrage ist für die möglichen tast ereignisse und rückwärtsfahren usw.

ps: habs nur schnell wieder zusammen gefriemelt ohne meine eigenen verbesserungen.. aber da eh der selbe fehler auftritt ist das ja egal.. habs jetzt so nochmal getestet und in 90% aller fälle denkt asuro er steht und fährt halt rückwärts.. ganz selten fährt er mal normal gerade aus und reagiert dann auf linienerkennung und taster.



Code:
#include "asuro.h"

#define SPEED_L 110
#define SPEED_R 110

unsigned int lineData[2];

/** Odometrie links/rechts */
unsigned int data[2];
/** flag für aktuellen zustand der farbe */
int Lnow = 0;
int Rnow = 0;
int Rold = 0;
int Lold = 0;
// haben sich die werte geändert
unsigned int fl_Lch = 0;
unsigned int fl_Rch = 0;
/** zähler für farbwechsel */
unsigned int Count1 = 0;
unsigned int Count2 = 0;

int j = 0;
int k = 0;

void Msleep(int dauer) {.....

void drive_back(void) {.....

void drive_back_bit(void) {.....

void drive_left(void) {.....

void drive_right(void) {
	Msleep(30);
	MotorSpeed(150, 0);
	BackLED(ON, OFF);
	Msleep(1000);
	MotorSpeed(0, 0);
	Msleep(10);
}

void kollisions_abfrage(void){
..
..
switch (k) {
	case 1:
		drive_back_bit();
		drive_left(); //K6
		break;
	case 2:
..
..
default:
MotorSpeed(SPEED_L, SPEED_R);
 }
}

void odoabfrage(void){

	for (j = 0; j < 30; j++) {
		OdometrieData(data); //werte stabilisieren
	}
    OdometrieData(data); // 0. links, 1. rechts

    // Schwellwert für schwarz/weiss linke Seite
    if (data[0] > 550)
        Lnow = 1;
    else
        Lnow = 0;

    // Schwellwert für schwarz/weiss rechte Seite
    if (data[1] > 550)
        Rnow = 1;
    else
        Rnow = 0;

    if (Lnow ^ Lold) {
        fl_Lch = 1;
    }
    else {
        fl_Lch = 0;
    }

    if (Rnow ^ Rold) {
        fl_Rch = 1;
    }
    else {
        fl_Rch = 0;
    }

    // hat sich der Asuro bewegt ?
    if (fl_Rch || fl_Lch) {
        // alte werte merken für nächsten schleifendurchlauf
        Lold = Lnow;
        Rold = Rnow;
    }else{  //Asuro hat sich nicht bewegt
    	Lold = Lnow;
    	Rold = Rnow;
    	drive_back();
    	drive_left();
    }
}

int main(void) {
	/*START*/
	Init();
	MotorDir(FWD, FWD);
	StatusLED(YELLOW);
	FrontLED(ON);
	SerPrint("ASURO Bereit!.. ");
	/*WARTEN*/
	while (PollSwitch() != 1) {
		BackLED(ON, OFF);
		Msleep(300);
		BackLED(OFF, ON);
		Msleep(300);
	}
	Msleep(1000); //1 sekunde warten
	BackLED(OFF, OFF);
	StatusLED(GREEN);
	SerPrint("Fahre los.. ");
	MotorSpeed(SPEED_L, SPEED_R);

	while (1) {

		//Kollisionsabfrage
		 kollisions_abfrage();

		//Linienabfrage
		LineData(lineData);
		if (lineData[LEFT] < 20 && lineData[RIGHT] < 20) {
			drive_back();
			drive_left();
		} else if (lineData[RIGHT] < 20) {
			drive_left();
		} else if (lineData[LEFT] < 20) {
			drive_right();
		}


  //bis hier klappt alles, jetzt die neue odo abfrage falls asuro mal hängen bleibt
		//Odometrieabfrage
		odoabfrage();


		MotorSpeed(SPEED_L, SPEED_R);
		BackLED(ON, ON);
	}

	SerPrint(" Fehler! ");
	StatusLED(RED);
	BackLED(OFF, OFF);
	MotorSpeed(0, 0);

	while (1) {	}
	return 0;
}