Ich habe mal dein Programm in meinen Asuro geladen und ausprobiert. Also bei mir fährt der schön gleichmäßig und geradeaus. Da vermute ich schon noch die Probleme bei deiner Odometrie. Ich hatte ja bei meinem Asuro auch lange gekämpft, bis es einigermaßen lief.
Meine damaligen Erkenntnisse:
Das axiale Spiel darf nicht größer als 0.1 - 0.2mm sein.
Das Zahnrad darf nicht rattern, sonst gibt es Schwingungen, die die Auswertung stören. Abhilfe ist schmieren. Das Rattern hört man deutlich. Aus dem Grund habe ich auch eine Hysterese bei der Auswertung eingefügt.
Der Schwellwert ist vermutlich bei jedem Asuro unterschiedlich. Bei meinem ist er 600, bei anderen kann er 500 oder 700 sein.
Gegen die Umgebungslichtempfindlichkeit hilft eigentlich nur abdecken.

Ein Beispielprogramm zum "messen, speichern und auslesen" siehe Codefenster:

Waste
Code:
/*******************************************************************************
*
* Description: Aufnahme der Beschleunigung
*
*****************************************************************************/
#include "asuro.h"
#include <stdlib.h>
volatile unsigned char count36kHz;
volatile unsigned long timebase;

int main(void)
{
	unsigned char i, wegr, flagr;
	unsigned int data[2], zeit[99];
   
	Init();
	for (i = 0; i < 90; i++) zeit[i]=0;
	MotorDir(BREAK,BREAK);
	MotorSpeed(255,255);
	OdometrieData(data);
	OdometrieData(data);
	if (data[1] < 600) flagr = FALSE;		// Flag setzen
	else flagr = TRUE;
	MotorDir(FWD,FWD);
	timebase=0;count36kHz=0;
	wegr=0;
	zeit[wegr]=(timebase*256)+count36kHz;
	while(timebase<90){
		OdometrieData(data);			// messe Reflexscheibe
		if ((data[1] < 550) && (flagr == TRUE)) {flagr = FALSE; wegr++; zeit[wegr]=(timebase*256)+count36kHz;}
		if ((data[1] > 650) && (flagr == FALSE)) {flagr = TRUE; wegr++; zeit[wegr]=(timebase*256)+count36kHz;}
		if (timebase==50) MotorSpeed(0,0);
	}
	StatusLED(RED);
	MotorDir(BREAK,BREAK);
	while (!PollSwitch());
	for (i = 0; i < 90; i++)
	{
	PrintInt(i); PrintInt(zeit[i]); SerWrite("\n\r",2);
	}
	while(1);
	return 0;
}