IR Alici Gözun Cikis ucuna RC5 Komut gönderme

Başlatan M_B, 24 Ağustos 2014, 15:57:26

M_B

Merhaba arkadaşlar;
Lcd  TV ye  baglı olan bilgisayar arıza yaptıgında TV yi kapatmak icin TV nin alıcı gozun cıkış ucuna  pic12f675 baglayıp  kumandanın göndermiş olduğu kapat sinyalini göndermek istiyorum.
Nette arastırmalarım sonucu RC5 protokolun yapısını ogrendim. 
Toplam 14 bitten olusuyor 2 si Start bir tane Toggle biti 5 bit Address ten  6 bit ise command olusmaktadır.
Sinyalin Lojik 0 ve 1 seviyesi zamanlaması ise
Lojik 0 da  889us High 889us Low
Lojik 1 da  889us Low 889us High

Bu verilere gore de aşağıdaki kodu yazdım ama sonuc alamadım.
Nerde yanlıslık var anlamadım.

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "delay.h"

#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)


#define RC5_Out GPIO0

unsigned int rc5code;

void send_one();
void send_zero();
void Send_RC5();
void InitMain();





void main()
{
    unsigned char t;
    InitMain();
  DelayMs(1000);
              for(t=0; t<2;t++)
              {
                       DelayMs(1000);
              }

       while(1)
              {

            Send_RC5();
            for(t=0; t<12;t++)
                     {
                       DelayUs(1000);
                      }
            

               }   // end while
}    //end main





void InitMain()
{    
    CMCON = 0x07;
    ANSEL = 0x00;
    TRISIO = 0x00;
    OPTION_REG = 0b00000000;
    RC5_Out=1;
}


void send_one()
{
    RC5_Out=0;
    DelayUs(889);
    RC5_Out=1;
   DelayUs(889);
  
}

void send_zero()
{
   RC5_Out=1;
   DelayUs(889);
   RC5_Out=0;
   DelayUs(889);
}


void Send_RC5()
{
      rc5code = 0b11001000001100;
      for (int i = 13; i >= 0; i--)
      {
         if (rc5code & (1<<i))
                {
                    send_one();
                } else
                    {
                    send_zero();
                    }
      }
        DelayMs(1000);
}


İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Kabil ATICI

    for (int i = 13; i >= 0; i--)
      {
         if (rc5code & (1<<i))
sanırım sıkıntı burada. i değerin sürekli değişiyor. Ama sen bit bit bakmaya çalışıyorsun.
senin
10000000000000 şeklinde başlayıp.
01000000000000
00100000000000
şeklinde gidiyor olman gerekir. Onun için örnegin incele şeklinde bir değişkene 0b10000000000000 şeklinde yükleyip her seferinde 1 sağa kaydırarak kontrol ettirmen daha uygun olur.
Birde veriyi 16 bit olarak tamamlayıp incelemek gerekebilir. (bu kısımdan emin değilim)
ambar7

M_B

@ambar7 Hocam;
Evet bit bit kontrol ediyorum.
rc5code = 0b11001000001100; sabit verim. Gonderilmesi gereken veri

13. bitten başlayıp 0. bite kadar ordaki bitler 1 mi 0 mi diye kontrol ediyorum.
bu sekilde sağıklı olmaz mı diye dusunuyorsunuz. 
Dediginiz sekılde de denerim.  Ama testi yarına kalacak iş yerinde.

Not: IR alıcı sinyali dısarı verirken acaba icinde ters cevirıyor olabilir mi ?
Lojik analezirim olmadığı için inceliyemiyorum.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Kabil ATICI

anlatamamışım sanırım. Siz sayma işini ve bit kontrol işini aynı değişken üzerinden yapıyorsunuz. Sayma ve bit kontrol değişkenlerinizi ayırın.

Veri gönderme sırasını tam olarak bilmiyorum. Sizin uyguladığınızın tersi olabilir.
ambar7

elektronart

iyi güzel öğrenmişsiniz ama ufak bir notayı kaçırmışsınız. 889usec açık olduğu durumda sürekli açık değil 36KHz ve %25-%33 duty cyclela module edilmiş şekilde gönderiliyor.
Şu sayfaya bir bakın derim.
http://en.wikipedia.org/wiki/RC-5
Açık Elektronik

M_B

Alıntı yapılan: elektronart - 24 Ağustos 2014, 22:25:56
iyi güzel öğrenmişsiniz ama ufak bir notayı kaçırmışsınız. 889usec açık olduğu durumda sürekli açık değil 36KHz ve %25-%33 duty cyclela module edilmiş şekilde gönderiliyor.
Şu sayfaya bir bakın derim.
http://en.wikipedia.org/wiki/RC-5
Benim 36KHz taşıyıcı sinyaline ihtiyacım yok ki ( IR alıcının out kısmına veriyi gonderiyorum Ordan cıkan veri yukardaki grafikteki gibi )
Şu an ufak tefek değişiklikler yaptım yarın cıhaz üzerinde test edecem %90 calısacak. Sonucu  bildirecem.
Sistem test edip yaptıgım değişiklikleri bildirecem.

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

CLR

@M_B

Ben olsam senin gibi yapmazdım birkere internal osc asla kullanmazdım. İşlemcinin RC osilatörünü kullanarak hassas sinyaller üretmeye çalışıyorsun. Gönderme safhandaki işlemler oldukça uzun görünüyor, muhtemelen zamanlamalar değişiyor olabilir. Logic analyzer ile bu zamanları düzeltebilirsin ama RC osc'den dolayı sıcaklık,nem ve zamanla vs durumlarda tekrar çalışmayabilir. 

ben olsam Xtal kullanıp veri gönderceğim zaman 889-890us'de timer interrupt'ına sokar sırasıyla bitleri gönderirdim.
Verileride bir array'a yazar arrayin sonuna arrayın bittiğini bildirecek bir sayı eklerdim, aşağıdaki basit örneği incele

veya gönderme kısmını asm yazabilirdim.

u8 Rc5data[]={11001000001100F};  // ben kısaca yazdım sen düzelt

//==== timer interupt=====
static u8 *ptr8=Rc5data;
if(*ptr8 !=0xF){            // her defasında bir bit gönderir
    sendRc5(*ptr8++);
}else{
   ptr8=Rc5data;          // sonraki gönderim için point et
   // buraya flag ekleyebilirsin, tekrar data göndermek istiyorsan 
}
//=========
Knowledge and Experience are Power

M_B

Testi yaptım normal olarak çalıstı.
Kodda yaptıgım değişiklikler
1-) RC5 Verisini yanlış hesaplamısım.
2-) Veriyi gönderirken tersi ni aldım.    ( Onemli olan nokta burasıymıs )

@CLR Hocam Haklısınız
RC5 zamanlama tablosuna baktıgımda  time lar arası geniş.

Yardım ve bilgi icin tesekkurler

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet