Forum: Projekte & Code rc5- vereinfachter code ohne interrupttimer


von leluno (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.