IR Alıcı-Verici (yardım)...

Başlatan LhNSvM, 01 Mayıs 2009, 14:43:00

LhNSvM

Arkadaşlar merhaba

Bir proje için PIC ile 5 kanal IR alıcı verici yapıyorum, alıcının ve vericinin programını MikroC'de yazdım, yaptığım devre çalışıyor ama tutarsızlıklar var, bazen 2 farklı çıkışı aktif yapabiliyor ya da bazen farklı çıkışları aktif yapabiliyor. Normalde IR protokoller var ama ben bunlar hakkında fazla bilgi sahibi olmadığımdan kendim bir mantık yürütüp devreyi tasarladım.
Mantık şu, PIC16F84 kullandım ve PortA'yı giriş olarak ayarladım, 5 farklı girişi kontrol ettirdim ve her butona basıldığında öncelikle bir start biti yolladım ve ardından belli süre sonra bir sinyal daha yolladım, alıcıda ise vericiden 2. yolladığım sinyalin zamanına göre belli bir çıkışı aktif yaptım.

Vericiden yolladığım sinyal ve zamanları şu şekilde...




Yazdığım programlarda şu şekilde...

Vericinin Programı...
void main()
{
 int a,b,c,d,e,f,g,h,i,j;
 TRISA=0x1F;
 TRISB=0x00;
 PORTB=0x00;
 {
  while(1)
  {
   if(PORTA.F0==1)
   {
   for(a=0; a<400; a++)
            {
              PORTB=0x00;
              Delay_us(10);
              PORTB=0xFF;
              Delay_us(10);
            }
              PORTB=0x00;
              Delay_ms(45);
   for(f=0; f<1000; f++)
            {
              PORTB=0x00;
              Delay_us(10);
              PORTB=0xFF;
              Delay_us(10);
            }
              PORTB=0x00;
              Delay_ms(445);
   }
   else if(PORTA.F1==1)
   {
   for(b=0; b<400; b++)
            {
              PORTB=0x00;
              Delay_us(10);
              PORTB=0xFF;
              Delay_us(10);
            }
              PORTB=0x00;
              Delay_ms(145);
   for(g=0; g<1000; g++)
            {
              PORTB=0x00;
              Delay_us(10);
              PORTB=0xFF;
              Delay_us(10);
            }
              PORTB=0x00;
              Delay_ms(345);
   }
   else if(PORTA.F2==1)
   {
   for(c=0; c<400; c++)
            {
              PORTB=0x00;
              Delay_us(10);
              PORTB=0xFF;
              Delay_us(10);
            }
              PORTB=0x00;
              Delay_ms(245);
   for(h=0; h<1000; h++)
            {
              PORTB=0x00;
              Delay_us(10);
              PORTB=0xFF;
              Delay_us(10);
            }
              PORTB=0x00;
              Delay_ms(245);
   }
   else if(PORTA.F3==1)
   {
   for(d=0; d<400; d++)
            {
              PORTB=0x00;
              Delay_us(10);
              PORTB=0xFF;
              Delay_us(10);
            }
              PORTB=0x00;
              Delay_ms(345);
   for(i=0; i<1000; i++)
            {
              PORTB=0x00;
              Delay_us(10);
              PORTB=0xFF;
              Delay_us(10);
            }
              PORTB=0x00;
              Delay_ms(145);
   }
   else if(PORTA.F4==1)
   {
   for(e=0; e<400; e++)
            {
              PORTB=0x00;
              Delay_us(10);
              PORTB=0xFF;
              Delay_us(10);
            }
              PORTB=0x00;
              Delay_ms(445);
   for(j=0; j<1000; j++)
            {
              PORTB=0x00;
              Delay_us(10);
              PORTB=0xFF;
              Delay_us(10);
            }
              PORTB=0x00;
              Delay_ms(45);
   }
   else
              PORTB=0x00;
  }
 }
}



Burada alıcıda TSOP1330 kullandığımdan, vericide çalışma frekansını for döngüleriyle sağladım, aslında yolladığım sinyallerin zamanlarının karışmasına neden bu gibi görünüyor, komut satırlarının zamanlarından dolayı veriyi istediğim zamanda yollayamıyorum...

Alıcının Programı...
void main()
{
TRISA=0x1F;
TRISB=0x00;
PORTB=0x00;
while(1)
  {
     if(PORTA.F0==0)
    {
      Delay_ms(63);
      if(PORTA.F0==0)
        {
         PORTB.F0=1;
         Delay_ms(50);
        }
      else
        {
         Delay_ms(102);
      if(PORTA.F0==0)
        {
         PORTB.F1=1;
         Delay_ms(50);
        }
      else
        {
         Delay_ms(102);
      if(PORTA.F0==0)
        {
         PORTB.F2=1;
         Delay_ms(50);
        }
      else
        {
         Delay_ms(102);
      if(PORTA.F0==0)
        {
         PORTB.F3=1;
         Delay_ms(50);
        }
      else
        {
         Delay_ms(102);
      if(PORTA.F0==0)
        {
         PORTB.F4=1;
         Delay_ms(50);
        }
      else
         PORTB=0x00;
        }
        }
        }
        }
        
    }
  }
}


Bana bu konuda yardımcı olabilirmisiniz, neler yapabilirim? Ya da protokoller hakkında bilgi verebilirmisiniz, protokol kullanarak programı nasıl yazabilirim? Ya da elinizde hazır çok kanallı IR alıcı verici devresi ya da programı varsa paylaşırmısınız?

Yardımlarınızı bekliyorum, şimdiden teşekkür ederim.

erhanzeynel

tutarsızlık yaşaman gayet normal.

IR alıcılar normal ışık kaynaklarından da etkilenebilmekte. Bu yüzden gönderilen sinyal vericide bir and kapısı ile dijital olarak modüle edilir.
Modülasyon frekansını tam hatırlamıyorum ama forumda vardı IR ile ilgili konuları forumdan iyice araştır bence.

LhNSvM

İlgine teşekkürler ama molülasyon işlemini PIC'in içerisinde for döngüleriyle sağladım zaten, yaklaşık 50Khz'de modüle ediyorum, alıcıda TSOP 1330 kullandım, o da demodüle işlemini gerçekleştiriyor zaten, benim sorunum kodların işlenmesi sırasında oluşan zaman kayıplarından kaynaklanıyor, bu kayıpları nasıl en aza indirebilirim.

Aranızda hiç IR alıcı verici devresi yapan yok mu acaba?

Sony SIRC ya da Philips CR-5 protollerini PIC'te nasıl uygulayabilirim ya da başka şekilde bu devreyi nasıl sağlıklı çalışır hale getirebilirim?

LhNSvM

Sorun zamanlama hesaplamalarından kaynaklanıyormuş, programda bazı değişiklikler yapıp sorunu hallettim, 5 kanal IR alıcı-verici devresi sorunsuz çalışmaktadır.

Yine de telşekkürler  ;)

8088

Bu çalışmanızın devre şeması elinizde bulunmaktamıdır? Paylaşırsanız sevinirim...