rc5- vereinfachter code ohne interrupttimer

Gast #2541942
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;
  }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren