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
Lesezeichen