Kızılötesi Kumanda Kod Çözme Yardım!!

Başlatan dogukantuncr, 03 Mart 2015, 06:41:56

dogukantuncr

Arkadaşlar öncelikle merhaba uzun bir aradan sonra yine sizlerle beraberim ve uzun süredir uğraşmadığım kızılötesi iletişim ile ilgili bir sorunum var. Şöyleki elimde bir ses sitemi var ve ben buna kızılötesi bir teyp kumandasını uydurarak kontrol etmek istiyorum. CCS C ile geliştirdiğim bir yazılım var, bu yazılımla IR çalışan kumandaların kodlarını çözmeye çalılşıyorum. Yazılımın mantığı şu şekilde;

Kızılötesi kumandalar plasler gönderiyor;
Bu palslerin high ve low sürelerini timer ile ölçüyorum.
Yani ilk yükselen kenar ile ilk düşey kenarın arasındaki süreyi ölçüp bir değişkene atıyorum
Sonra devamındaki düşey kenar ile yükselen kenarın arasındaki süreyi ölçüp başka bir değişkene atıyorum
Böylece elimde high'ta kalma ve low'da kalma süreleri oluşmuş oluyor.
Ancak kumandanın aynı butonunu ölçmeye çalıştığımda her defasında birbirne yakın ancak farklı değerler çıkıyor.
Sorunum bu neden aynı değerler çıkmıyor?
Elimde skop olmadığı için böyle bir yönteme başvurdum tam 3 haftadır uğraşıyorum (skopsuzluk zor bea) :(
Ha bu arada söylemeyi unuttum okuyucu göz olarak tk19 kullanıyorum ve çıkış ucu kesme ucuna bağlı her düşen kenarda kesme oluşuyor.

#include <18f4620.h>
#fuses NOWDT,NOPUT,NOCPD,NOPROTECT,NOMCLR,HS
#use delay (clock=20000000)
#define fast_glcd()
#include <HDM64GS12.c>
#include <GRAPHICS.c>

//Değişken Tanımlamaları
char baslangic_yazisi[]="Dogukan Tuncer";
char baslangic_yazisi1[]="IR Kod Cozucu";
char baslangic_yazisi2[]="Deneme";
//----------
int16 dizi[90];
int8 baslangic_degiskeni=0;
//----------
char dizi1[1];
char dizi2[1];
char dizi3[1];
char dizi4[1];
char dizi5[1];
char dizi6[1];
char dizi7[1];
char dizi8[1];
char dizi9[1];
char dizi10[1];
char dizi11[1];
char dizi12[1];
char dizi13[1];
char dizi14[1];
char dizi15[1];
char dizi16[1];
char dizi17[1];
char dizi18[1];
char dizi19[1];
char dizi20[1];
char dizi21[1];
char dizi22[1];
char dizi23[1];

//-----------
int dongu;

//Dış Kesme Fonksiyonu
#int_ext
void dis_kesme()
{
   if(baslangic_degiskeni==0) //İlk defa kumanda butonuna basıldıysa;
   {
      set_timer1(0); //Timer1'i 0'dan saymaya başla (0,2uSn'de 1 arttır);
      while(input_state(pin_b0)==0) //Düşen kenar kesmesi oluştu ve yükselen kenar tetiklemesei olana kadar tiimer1'i say ve değişkene yaz
      {
      baslangic_degiskeni=1;  //Artık ilk pals'i saydık şimdi diğer palsları dizinin devamındaki elemanlarına yazacağız
      dizi[1]=get_timer1();   //Dizinin ilk elemanına timer1'in değerini yaz
      }
      return;
   }
   if(baslangic_degiskeni==2) //2. Defa Alçalan kenar tetiklemesi oluşunca;
   {
      set_timer1(0); //Timer1'i sıfırla ve saymaya başla
      while(input_state(pin_b0)==0)
      {
      baslangic_degiskeni=3;
      dizi[3]=get_timer1();
      }
      return;
   }
   if(baslangic_degiskeni==4) //4. Defa Alçalan kenar tetiklemesi oluşunca;
   {
      set_timer1(0); //Timer1'i sıfırla ve saymaya başla
      while(input_state(pin_b0)==0)
      {
      baslangic_degiskeni=5;
      dizi[5]=get_timer1();
      }
      return;
   } 
   if(baslangic_degiskeni==6) //6. Defa Alçalan kenar tetiklemesi oluşunca;
   {
      set_timer1(0); //Timer1'i sıfırla ve saymaya başla
      while(input_state(pin_b0)==0)
      {
      baslangic_degiskeni=7;
      dizi[7]=get_timer1();
      }
      return;
   }
   if(baslangic_degiskeni==8) //8. Defa Alçalan kenar tetiklemesi oluşunca;
   {
      set_timer1(0); //Timer1'i sıfırla ve saymaya başla
      while(input_state(pin_b0)==0)
      {
      baslangic_degiskeni=9;
      dizi[9]=get_timer1();
      }
      return;
   }
   if(baslangic_degiskeni==10) //10. Defa Alçalan kenar tetiklemesi oluşunca;
   {
      set_timer1(0); //Timer1'i sıfırla ve saymaya başla
      while(input_state(pin_b0)==0)
      {
      baslangic_degiskeni=11;
      dizi[11]=get_timer1();
      }
      return;
   }
   if(baslangic_degiskeni==12) //12. Defa Alçalan kenar tetiklemesi oluşunca;
   {
      set_timer1(0); //Timer1'i sıfırla ve saymaya başla
      while(input_state(pin_b0)==0)
      {
      baslangic_degiskeni=13;
      dizi[13]=get_timer1();
      }
      return;
   }
   if(baslangic_degiskeni==14) //14. Defa Alçalan kenar tetiklemesi oluşunca;
   {
      set_timer1(0); //Timer1'i sıfırla ve saymaya başla
      while(input_state(pin_b0)==0)
      {
      baslangic_degiskeni=15;
      dizi[15]=get_timer1();
      }
      return;
   }
   if(baslangic_degiskeni==16) //16. Defa Alçalan kenar tetiklemesi oluşunca;
   {
      set_timer1(0); //Timer1'i sıfırla ve saymaya başla
      while(input_state(pin_b0)==0)
      {
      baslangic_degiskeni=17;
      dizi[17]=get_timer1();
      }
      return;
   }
   if(baslangic_degiskeni==18) //18. Defa Alçalan kenar tetiklemesi oluşunca;
   {
      set_timer1(0); //Timer1'i sıfırla ve saymaya başla
      while(input_state(pin_b0)==0)
      {
      baslangic_degiskeni=19;
      dizi[19]=get_timer1();
      }
      return;
   }
   if(baslangic_degiskeni==20) //20. Defa Alçalan kenar tetiklemesi oluşunca;
   {
      set_timer1(0); //Timer1'i sıfırla ve saymaya başla
      while(input_state(pin_b0)==0)
      {
      baslangic_degiskeni=21;
      dizi[21]=get_timer1();
      }
      return;
   }
   if(baslangic_degiskeni==22) //22. Defa Alçalan kenar tetiklemesi oluşunca;
   {
      set_timer1(0); //Timer1'i sıfırla ve saymaya başla
      while(input_state(pin_b0)==0)
      {
      baslangic_degiskeni=23;
      dizi[23]=get_timer1();
      }
      return;
   }
   
   
}

void main()
{

   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   
   //Timer1 Ayarları: Timer1 sayma süresi=0,2uSn
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
   
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
//Giriş-Çıkış Tanımlamaları
   set_tris_a(0x00);
   set_tris_b(0b00000001);
   set_tris_c(0x00);
   set_tris_d(0x00);
   set_tris_e(0x00);
   
//Harici kesme ayarları yapılıyor
   ext_int_edge(H_TO_L);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

//Başlangıç Yazısı Yazılıyor
   glcd_init(on);
   glcd_text57(22,1,baslangic_yazisi,1,on);
   glcd_text57(25,10,baslangic_yazisi1,1,on);
   glcd_text57(46,19,baslangic_yazisi2,1,on);
   glcd_update();
   delay_ms(1000);
   glcd_fillscreen(off);
   glcd_update();
   
//Ana Program Döngüsü
while(1)
{
while(baslangic_degiskeni==23)
   {
      set_timer1(0); 
      sprintf(dizi1,"%lu",dizi[1]);
      glcd_text57(0,0,dizi1,1,on);
      
      sprintf(dizi2,"%lu",dizi[2]);
      glcd_text57(13,0,dizi2,1,on);
      
      sprintf(dizi3,"%lu",dizi[3]);
      glcd_text57(26,0,dizi3,1,on);
      
      sprintf(dizi4,"%lu",dizi[4]);
      glcd_text57(39,0,dizi4,1,on);
      
      sprintf(dizi5,"%lu",dizi[5]);
      glcd_text57(52,0,dizi5,1,on);
      
      sprintf(dizi6,"%lu",dizi[6]);
      glcd_text57(65,0,dizi6,1,on);
      
      sprintf(dizi7,"%lu",dizi[7]);
      glcd_text57(78,0,dizi7,1,on);
      
      sprintf(dizi8,"%lu",dizi[8]);
      glcd_text57(91,0,dizi8,1,on);
      
      sprintf(dizi9,"%lu",dizi[9]);
      glcd_text57(104,0,dizi9,1,on);
      
      sprintf(dizi10,"%lu",dizi[10]);
      glcd_text57(0,9,dizi10,1,on);
      
      sprintf(dizi11,"%lu",dizi[11]);
      glcd_text57(13,9,dizi11,1,on);
      
      sprintf(dizi12,"%lu",dizi[12]);
      glcd_text57(26,9,dizi12,1,on);
      
      sprintf(dizi13,"%lu",dizi[13]);
      glcd_text57(39,9,dizi13,1,on);
      
      sprintf(dizi14,"%lu",dizi[14]);
      glcd_text57(52,9,dizi14,1,on);
      
      sprintf(dizi15,"%lu",dizi[15]);
      glcd_text57(65,9,dizi15,1,on);
      
      sprintf(dizi16,"%lu",dizi[16]);
      glcd_text57(78,9,dizi16,1,on);
      
      sprintf(dizi17,"%lu",dizi[17]);
      glcd_text57(91,9,dizi17,1,on);
      
      sprintf(dizi18,"%lu",dizi[18]);
      glcd_text57(104,9,dizi18,1,on);
      
      sprintf(dizi19,"%lu",dizi[19]);
      glcd_text57(0,18,dizi19,1,on);
      
      sprintf(dizi20,"%lu",dizi[20]);
      glcd_text57(13,18,dizi20,1,on);
      
      sprintf(dizi21,"%lu",dizi[21]);
      glcd_text57(26,18,dizi21,1,on);
      
      sprintf(dizi22,"%lu",dizi[22]);
      glcd_text57(39,18,dizi22,1,on);
      
      sprintf(dizi23,"%lu",dizi[23]);
      glcd_text57(52,18,dizi23,1,on);
      glcd_update();
   }

   if(baslangic_degiskeni==1)
   {
      set_timer1(0);
      while(input_state(pin_b0)==1) //Eğer yükselen kenar tetiklemesi olduysa bu ne kadar high'da devam edecek timer1 sıfırlanıp saymaya başlayacak
      {
      baslangic_degiskeni=2;
      dizi[2]=get_timer1();   //Dizinin 2. elemanına yüksek kenar süresi yazıldı
      }
   }
   if(baslangic_degiskeni==3)
   {
      set_timer1(0);
      while(input_state(pin_b0)==1) //Eğer yükselen kenar tetiklemesi olduysa bu ne kadar high'da devam edecek timer1 sıfırlanıp saymaya başlayacak
      {
      baslangic_degiskeni=4;
      dizi[4]=get_timer1();   //Dizinin 4. elemanına yüksek kenar süresi yazıldı
      }
   }
   if(baslangic_degiskeni==5)
   {
      set_timer1(0);
      while(input_state(pin_b0)==1) //Eğer yükselen kenar tetiklemesi olduysa bu ne kadar high'da devam edecek timer1 sıfırlanıp saymaya başlayacak
      {
      baslangic_degiskeni=6;
      dizi[6]=get_timer1();   //Dizinin 6. elemanına yüksek kenar süresi yazıldı
      }
   }
   if(baslangic_degiskeni==7)
   {
      set_timer1(0);
      while(input_state(pin_b0)==1) //Eğer yükselen kenar tetiklemesi olduysa bu ne kadar high'da devam edecek timer1 sıfırlanıp saymaya başlayacak
      {
      baslangic_degiskeni=8;
      dizi[8]=get_timer1();   //Dizinin 8. elemanına yüksek kenar süresi yazıldı
      }
   }
   if(baslangic_degiskeni==9)
   {
      set_timer1(0);
      while(input_state(pin_b0)==1) //Eğer yükselen kenar tetiklemesi olduysa bu ne kadar high'da devam edecek timer1 sıfırlanıp saymaya başlayacak
      {
      baslangic_degiskeni=10;
      dizi[10]=get_timer1();   //Dizinin 10. elemanına yüksek kenar süresi yazıldı
      }
   }
   if(baslangic_degiskeni==11)
   {
      set_timer1(0);
      while(input_state(pin_b0)==1) //Eğer yükselen kenar tetiklemesi olduysa bu ne kadar high'da devam edecek timer1 sıfırlanıp saymaya başlayacak
      {
      baslangic_degiskeni=12;
      dizi[12]=get_timer1();   //Dizinin 12. elemanına yüksek kenar süresi yazıldı
      }
   }
   if(baslangic_degiskeni==13)
   {
      set_timer1(0);
      while(input_state(pin_b0)==1) //Eğer yükselen kenar tetiklemesi olduysa bu ne kadar high'da devam edecek timer1 sıfırlanıp saymaya başlayacak
      {
      baslangic_degiskeni=14;
      dizi[14]=get_timer1();   //Dizinin 14. elemanına yüksek kenar süresi yazıldı
      }
   }
   if(baslangic_degiskeni==15)
   {
      set_timer1(0);
      while(input_state(pin_b0)==1) //Eğer yükselen kenar tetiklemesi olduysa bu ne kadar high'da devam edecek timer1 sıfırlanıp saymaya başlayacak
      {
      baslangic_degiskeni=16;
      dizi[16]=get_timer1();   //Dizinin 16. elemanına yüksek kenar süresi yazıldı
      }
   }
   if(baslangic_degiskeni==17)
   {
      set_timer1(0);
      while(input_state(pin_b0)==1) //Eğer yükselen kenar tetiklemesi olduysa bu ne kadar high'da devam edecek timer1 sıfırlanıp saymaya başlayacak
      {
      baslangic_degiskeni=18;
      dizi[18]=get_timer1();   //Dizinin 18. elemanına yüksek kenar süresi yazıldı
      }
   }
   if(baslangic_degiskeni==19)
   {
      set_timer1(0);
      while(input_state(pin_b0)==1) //Eğer yükselen kenar tetiklemesi olduysa bu ne kadar high'da devam edecek timer1 sıfırlanıp saymaya başlayacak
      {
      baslangic_degiskeni=20;
      dizi[20]=get_timer1();   //Dizinin 20. elemanına yüksek kenar süresi yazıldı
      }
   }
   if(baslangic_degiskeni==21)
   {
      set_timer1(0);
      while(input_state(pin_b0)==1) //Eğer yükselen kenar tetiklemesi olduysa bu ne kadar high'da devam edecek timer1 sıfırlanıp saymaya başlayacak
      {
      baslangic_degiskeni=22;
      dizi[2]=get_timer1();   //Dizinin 22. elemanına yüksek kenar süresi yazıldı
      }
   }
   
   set_timer1(0);
}
}


elektronart

Bu yazdığınız gayet normal, gönderilen bilgi modulasyon ile gönderiliyor ve alıcınız bunu çözümlüyor. Bu dönüşümler sırasında mikro-mili saniyelik farklar olabilir. Kontrol mekanizmanızı tolerans vererek çalıştırırsanız sorun çözülür sanıyorum. Arduino için bir kızılötesi kütüphane var. O da sizin mantığınızla çalışıyor ve kontrol bölümünde %10-20 gibi tolerans giriyorsunuz.
Açık Elektronik

dogukantuncr

Cevabınız için teşekkür ederim dediğiniz doğru aslında ama mesela 1. Okuduğum değer 300 ise 2. Kere okuduğumda bu değer 5000 olabiliyor. Genelde dediğiniz gibi %10luk bi tolerans koymam gerekiyor ama dediğim gibi bazen tolerans işe yaramıyor

elektronart

Nec protokolünde repeat kodu normal koddan farklıdır, farkı bu yaratmış olabilir mi?
Açık Elektronik

dogukantuncr

Elektronart ben bütün kumandalarda yaşıyorum sorunu ama incelediğim zaman yazılımdada herhangi bir sıkıntı göremedim

hasqn54

Ben olsam saçma gelir belki ama alıcıdan gelen sinyali küçülterek pc nin mikrofon girişine bağlarım ses analiz programı ile sinyali hem ölçer hem belirlerim direk programa yazarım

elektronart

Logic analyzer ile bir kontrol adip yazılımın sonuçlarıyla karşılaştırmanı öneririm. Veya çalışan bir kod ile kendi kodunu karşılaştırabilirsin.
Açık Elektronik

dogukantuncr

Ya bende sorun var yada fototransistör farklı frekansta çalışıyor demiş olduğunuz logic analyzer programını denedim ama ondada bi sonuç alamadım detaylı şema ve yazılım olan lütfen yardım etsin 1 haftadır uğraşıyorum ilk defa ir ile uğraşıyorum