Hallo

Ich glaube nicht, dass PollSwitch() selbst diesen Effekt auslöst. Vielmehr scheint mir eine fehlende Verzögerung in der Hauptschleife in Verbindung mit IR-Störungen durch Fremdlicht (Leuchtstoff, Halogen, LCDs, CRTs..) die Ursache zu sein. Wenn solch ein verirrtes IR-Teilchen den Empfänger irritiert und er seinen Ausgang auf Low setzt, werden die IRx quasi in einem Rutsch eingelesen. Mit PollSwitch() wird das Einlesen der IRx aber durch ein paar zusätzliche Sleep()s verzögert. (ein Sleep() ist ein Takt Trägerfrequenz, der TSOP benötigt ca. 6-10 Takte der Trägerfrequenz für die Erkennung)

Ersetze mal in deinem Progamm sw=PollSwitch(); durch ein schlichtes Sleep(20);

Code:
/* function to read out switches */
unsigned char PollSwitch (void)
{
	unsigned int i;
	int ec_bak=autoencode;
	autoencode=FALSE;
	DDRD |= SWITCHES;				// Switches as Output
	SWITCH_ON;						// Output HIGH for measurement
	ADMUX = (1 << REFS0) | SWITCH;	// AVCC reference with external capacitor
	Sleep(10);
	
	ADCSRA |= (1 << ADSC);			// Start conversion
	while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete
	ADCSRA |= (1 << ADIF);			// clear ADCIF
	i = ADCL + (ADCH << 8);
	
	SWITCH_OFF;
	Sleep(5);
	autoencode=ec_bak;
	//return  ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
	//return ((10240000L/(long)i-10000L)*61L+5000L)/10000;
	return ((10240000L/(long)i-10000L)*63L+5000L)/10000;
}

Und noch die switches-Defines aus asuro.h dazu:

#define SWITCHES   (1 << PD3)
#define SWITCH_ON  PORTD |= SWITCHES
#define SWITCH_OFF PORTD &= ~SWITCHES
Die Funktion PollSwitch() aus der asuro-Library

Gruß

mic