wegen Problemen mit rc5 habe ich einen vereinfachten code ohne interrupt geschrieben, der gut funktioniert. Mit u8 verbose=1 kann man sich die Zeiten bis zum Flankenwechsel anzeigen lassen und so feststellen, ob es sich um rc5 handelt. Bei rc5 gibt es nur einfache und doppelte Impulslängen. Bei meiner Fernbedienung ca.360 bzw ca.720 Ticks. void rc5signalempfangen(void){ u8 oldBit; u8 bit; u8 adr,cmd; u16 tmp,i ; u16 data[30]; //kurz=F_CPU/1.000.000*889=3277,2096 led_on; // Anschluss IR-Empfänger als tast1 // Länge IR-Signale messen und in data[] abspeichern data[0]=1; for(u8 n=1;n<26;n=n+2){ i=0; while(tast1 && i<40001)i++; data[n]=i;//Speichert Anzahl der Ticks bis Flankenwechsel i=0; while(!tast1 && i<40001)i++; data[n+1]=i; } //IR-Signale aus data[] in Bitfolge tmp umrechnen oldBit=1; u8 n=0; while(n<24){ tmp=(tmp<<1)+oldBit;//kurze Zeitspanne => Bit=oldBit, kein Wechsel //bei 3,68Mhz ~360Ticks je 0,889ms (Wert steht in data[1]) if ((data[n+1]+100)/data[1]==2){tbi(oldBit,0);n=n-1;}//lange Spanne=>Bit!=oldBit,Wechsel //if ((data[n+1]+50)/300==2){tbi(oldBit,0);n=n-1;}//lange Spanne=>Bit!=oldBit,Wechsel n=n+2; } //Ausrichtung auf erstes 1-bit while((tmp&0b1000000000000000)==0){ tmp=tmp<<1; } //adr, cmd adr=(tmp&0b0001111100000000)>>8; cmd=(tmp&0b0000000011111100)>>2; if ((tmp&0b0100000000000000)==0)cmd=cmd+0b0000000100000000;//c6-bit auswerten if(adr==GADR){ lcd_goto(1,1); lcd_bitweise(tmp>>8); lcd_bitweise(tmp); lcd_goto(1,15); lcd_write(" "); lcd_goto(2,1); lcd_int(adr); lcd_write("-"); lcd_int(cmd); lcd_write(" "); }else{lcd_goto(2,1);lcd_write("ERROR ");lcd_int(adr);lcd_write("-");lcd_int(cmd);} if(verbose){ for(n=0;n<20;n=n+8){ lcd_clear(); lcd_goto(1,1); lcd_int(data[n]); lcd_write("-"); lcd_int(data[n+1]); lcd_write("-"); lcd_int(data[n+2]); lcd_write("-"); lcd_int(data[n+3]); lcd_goto(2,1); lcd_int(data[n+4]); lcd_write("-"); lcd_int(data[n+5]); lcd_write("-"); lcd_int(data[n+6]); lcd_write("-"); lcd_int(data[n+7]); wait; wait; wait; wait; } }//verbose // led_off; } void main(void) { init_all(); led_blink; lcd_write("RC5-Tester"); wait; wait; lcd_goto(1,1); lcd_write("verbose=> T2+ T3-"); while(1){ if(tast1){//IR-Signal an Tast1 led_on; rc5signalempfangen(); wait; } if(tast1){verbose=1;lcd_goto(2,1);lcd_write("verbose +");wait;} if(tast2){verbose=0;lcd_goto(2,1);lcd_write("verbose -");wait;} }//end while led_off; }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.