also hier erstmal der quellcode
Code:
ISR(ADC_vect)
{									// ADIF automatisch von HW zurückgesetzt
	static unsigned char ask = 0, max = 0, min = 0, toggle = 1;
	static unsigned char adc_data[2], adc_data_help[2];
	unsigned int counter_help[2];
	
	if (toggle)	
		ADMUX = (1 <<ADLAR) | (1 <<REFS0) | WHEEL_RIGHT; 
	else 
		ADMUX = (1 <<ADLAR) | (1 <<REFS0) | WHEEL_LEFT; 
	
	
	adc_data_help[toggle] = adc_data[toggle];
	adc_data[toggle] = ADCH;
	
	counter_help[toggle] = counter[toggle];
	
	if ((adc_data[toggle] - adc_data_help[toggle] > 40) && (ask == 0))
	{
		adc_data[toggle] = adc_data_help[toggle] + 3;
	}
	else
	{	// Maximum im Schwarzen erkennen
		if (adc_data[toggle] - adc_data_help[toggle] > 0)
		{													
			max = adc_data[toggle];
		}
		else
		{
			if ((max - adc_data[toggle]) > 15)
			{
				ask = 1;
				counter[toggle]++;
				max = 0;
			}
		}
	}
	
	if ((adc_data_help[toggle] - adc_data[toggle] > 40) && (ask == 1))
	{
		adc_data[toggle] = adc_data_help[toggle] - 3;
	}
	else
	{	// Minimum im Weißen erkennen
		if (adc_data_help[toggle] - adc_data[toggle] > 0)	 
		{													
			min = adc_data[toggle];
		}
		else
		{
			if ((adc_data[toggle] - min) > 15)
			{
				ask = 0;
				counter[toggle]++;
				min = 0;
			}
		}
	}
	
	if (counter[toggle] != counter_help[toggle])	// Ausgabe nur bei neuem Zählerstand
		PrintInt(counter[toggle]);
		
	toggle ^= 1;
}

void PrintInt(unsigned int wert)
{  	
	char text[16]="      ";
	itoa(wert,text,10);
	SerWrite(text,strlen(text));
	SerWrite(" ",2);
}

void Odometrie_Set(int a, int b)
{
	counter[LEFT] = a;
	counter[RIGHT] = b;
}


void Odometrie_Init()
{
	cli();
	DDRC &= ~((1 << PC0) | (1 << PC1)); 	// Input -> no break LED
	ADMUX  = (WHEEL_LEFT) | (1 << ADLAR) | (1 << REFS0);
	// Wheel_Right -> ADC0 out
	// ADLAR -> ADCH = Bit2 - Bit9
	//			ADCL = Bit0 - Bit1
	// Refs0 ->	AVCC Voltage with external capacitor at Aref Pin
	ODOMETRIE_LED_ON;
	ADCSRA = (1 << ADEN) | (1 << ADFR) | (1 << ADSC) | (1 << ADIE)  
			| (1 << ADPS2); //| (1 << ADPS1) | (1 << ADPS0);
	// ADEN  ->	AD - Enable
	// ADFR  ->	AD - Free Running
	// ADSC	 ->	AD - Start Conversation
	// ADIE  ->	AD - Interrupt Enable
	// ADPS2 -> 8M/128 = 62.5kHz -> Zykluszeit=13 -> 62.5/13 = 5kHz -> Abtastfrequenz
	sei();
	Odometrie_Set(0,0);
}
also das is ein ausschnitt ... dieser code steht bei mir in der asuro.c ...
im hauptprogramm wird nur Odometrie_Init() aufgerufen ...

das obige programm kann die wechsel von dunkel/hell und umgekehrt dynamisch zählen und ausgeben... nur ist das problem wenn i ein rad anhalte wird trotzdem die seite weiterhochgezählt die angehlaten wird ...
wenn i im proramm seperat die wechsel ausgeben lasse, d. h. toggle is einmal nur 0 und einmal nur 1 dann funktioniert es ...
aber sobald i beide ausgeben, quasi toggle ^= 1; ist vorhanden, will klappt das nicht mehr...und i find einfach den grund net...

bitte euch um hilfe ...

Gruß Jens