IR alıcı verici kristal sorunu

Başlatan efor, 16 Ocak 2013, 15:22:17

efor

ete hocam merhaba,

16f877A ile ır alıcı bir devre yaptım işlemci 4 mhzde sorunsuz çalısıyor fakat ır bilgi okuma yaptrdıgım zaman biraz geçikme yaşıyorum kesme kullanmadan yapmaya çalısıyorum . işlemci kristalini 20 mhz yada 10 mhz taktıgım zaman  devre çalısıyor fakat kumandadan bilgi almıyor.  ır alıcı diyot frekansındanmı dır yoksa ır okuma programındanmıdır sorun ?

sony kumanda kodlarını kullanıyorum projede.

İlyas KAYA

Merhabalar.

ETE hocam geldiğinde cevap verecektir ancak ondan önce sormak istedim.

Kristali her değiştirdiğinizde yazılımda osilatör ayarını yapıyormusunuz ?

4 mhz ile çalışan bir PIC'e başka bir osilatör takarsanız  Pic Basic 'de DEFINE OSC frekans olacak şekilde değiştirmelisiniz.

Örneğin 10 Mhz için program başında  ; DEFINE OSC 10
yazmalısınız.

Saygılarımla.

Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ete

Kayatech cevaplamış. Kristal değiştirdiğin zaman programın OSC ayarınıda değiştirmen hatta sigorta nayarınıda değiştirmen gerekir.
Örnek vereyim,
6Mhz kristale kadar XT_OSC
Üzerinde HS_OSC kullanılmalıdır.
Buna ilave olarak DEFINE OSC tanımlamasınıda eklemen gerekiyor.
Programlarda bir komut süresi (ASM Komutları) kristal frekansına bağlıdır. 4 Mhzde bu 1us dir. 20 Mhz de ise 0,2us dir. Arasında epeyce fark var. Şayet OSC tanımlamasını doğru yapmaz isen program süreleri yanlış hesaplar ve gerekli bilgileri doğru alamaz.

Yeri gelmiş iken IR-Göz nasıl çalışıyor onuda açıklayayım. Bu sistemde bir taşıyıcı sinyal birde kontrol sinyali vardır.
Örnek verecek olur isek SOny kumanda vericisi sen 1 tuşuna bastığın zaman 38 Khz lik bir kare dalga oluşturur ve bu dalganın üzerine 1 tuşuna ait kod bilgisi ile Cihaz kod bilgisini bindirir.
Bu sinyale Skop ile bakacak olursan Hıgh konumunda 38 Khz lik kare dalga sinyalinin HIGH süresi kadar devam ettiğini LOW olduğunda ise sinyalin sıfıra düşüp low süresi kadar buna devam ettiğini görürsün.
Alıcı göz bu sinyali alır ve sinyalin bindirildiği 38 Khz lik sinyali süzerek çıkartır ve asıl sinyal bilgisini (Cihaz kodu ile Tuş kodu) elde ederek Out bacağından verir. Bu aşamada kullandığın denetleyici gelen sinyalin sürelerine bakarak bu bilginin bitlerinin high mi yoksa low mu olduklarına karar vererek gereken işlemleri yapar.
Gördüğün gibi sistem zaman kullanıyor. Diyelimki komut olarak PULSIN kullandın. 4 Mhzde bu komut 10us nin katları şeklinde sinyal süresi okur. Ama 20 Mhz de 2 us ninkatları şeklinde okur. Böylece şayet Define OSC komutu kullanmadı isen bu süreleri değerlendiremez.
Umarım anlaşılmıştır.

Ete

efor

HOCAM DEFINE OSC  ayarlıyorum tabıkı ve ayrıca programı yuklerken HS bölümünü seciyorum.

sony kodlardamı degısıklık yapılması gerekıyor hocam ? kodklar şu şekilde alıntıdır ;

IRIN:   IR_But=255
   Pulsin IR_Sensor,0,Header         ' Measure the header length.
     If Header < 200 then Return         ' Verify a good header         
     If Header > 270 then Return          ' If not valid then exit

   For I=0 to 11         ' Do 12-bits
   Pulsin IR_Sensor,0,P_Val         ' Receive the IR bit pulse
   If P_Val >= 90 then          ' If it's >= 90 then we've received a 1
   Packet.0=1         ' So set the appropriate bit of PACKET
   Else                ' Else
   Packet.0[I]=0         ' Clear the appropriate bit of PACKET
   Endif
   Next                ' Close the loop

' Split the 7-bit BUTTON code, and the 5-bit DEVICE code
   IR_But=Packet & %01111111      ' Mask the 7 BUTTON bits
    IR_BUT=IR_BUT+1
     

    Return

ete

Dediklerimi pek anlamamışsın anlaşılan.
Verdiğin kod üzerindenkonuşayım bari.

   Pulsin IR_Sensor,0,Header         ' Measure the header length.
     If Header < 200 then Return         ' Verify a good header         
     If Header > 270 then Return          ' If not valid then exit
Burada IR_Sensör girişinden LOW sinyal süreesine bakılıyor.
Amaç veri paketi içinde paketinbaşını oluşturan Header sinyalini yakalamak.
Sony protokolünde Header sinyali uzunluğu 2400us lik bir HIGH sinyalidir. Ancak IR gözde bu tersine çıkar ve sen 2400us lik bir LOW sinyali yakalamak durumunda kalırsın. Senin programın gelen sinyalin uzunluğuna bakıyor. Bu yazılan kod 4 Mhz lik kristal için geçerli olup okunan değer Header değişkenine atılır ve 10us ninkatları şeklinde çalışır.
Yani 2400 us lik bir sinyal süresi 240 olarak okunur Senin komutlarda 200 den büyük (2000us) ve 270 den küçük (2700us) olan süreleri header kabul ediyorki bu doğrudur.

Şimdi aynı satırları 20 Mhz lik kristal ile çalıştırırsak komut o azamn şöyle yazılmalıdır.
IF Header<1000 then return
IF Header >1400 then return

Çünki 20 Mhz de PULSINkomutu 2 nin katları şeklinde çalışır. Değişken Byte cinsinden Word cinsine döner. Görüyorsun ne kadar fark ediyor. Toparlarsak yalnızca sigorta ayarı değil komutlarda da süre bazında değişiklikler yapmak gerekiyor.
Ama bence senin asıl sorunun komutların yanlış olması.
Programın geri kısmında kod ayıklama kısmında biraz fazla zaman harcanıyor gibime geliyor. Tek satırda yapılacak işler iki satırda yapılmış Program orada vakit harcıyor olabilir.
Örnek vermek gerekir ise;
Header doğru ise 12 adet puls süre olarak kayıt edilir. Senin program hem okuyor hemde bit değerlendirmesi yapıyor.
Burada puls kaçırma ihtimali yüksek olur. Bu nedenle değerlendirme yapmadan 12 adet biti süre olarak okumak sonrada onuları değerlendirmek daha doğru olur.
Yani kod;
For I=0 to 11         ' Do 12-bits
   Pulsin IR_Sensor,0,P_Val :IR_VAL[I]=P_VAL        ' Receive the IR bit pulse
next
TUS=127 'Bu komut ile tus bitlerinin hepsini 1 yapıyoruz.
For I=0 to 6
   P_VAL=IR_VAL[I]
   If P_Val < 80 then  TUS.0[I]=0         'okunan süre 80 den küçükise bit değeri 0 demektir
  next
       Tus = Tus + 1
       If Tus=10 then Tus=0

Şimdi cihaz kodunu ayıklayalım.
       Cihaz=%00011111
       for I=0 to 4
         IF IR_VAL(7+I)<80 then Cihaz.Bit0[I]=0
       next
       RETURN
Bu şekilde yaparsan program hem daha kısa sürede okuma yapar hemde daha stabil çalışır.

Ete

efor

hocam cevaplar için teşekkür ederim  20 mhz de şu degişiklikleri yaptım çalıstı

IF Header<1000 then return
IF Header >1400 then return

fakat vermıs oldugunuz diger kodlarıda ekleyınce derleme hatası aldım hata aldıgım kodlar şu şekilde ;


IRIN:   
'IR_But=255
   Pulsin IR_Sensor,0,Header         ' Measure the header length.
    IF Header<1000 then return
    IF Header >1400 then return

For I=0 to 11         ' Do 12-bits
   Pulsin IR_Sensor,0,P_Val :IR_VAL=P_VAL        ' Receive the IR bit pulse
next
TUS=127 'Bu komut ile tus bitlerinin hepsini 1 yapıyoruz.
For I=0 to 6
   P_VAL=IR_VAL
   If P_Val < 80 then  TUS.0=0         'okunan süre 80 den küçükise bit değeri 0 demektir
  next
       Tus = Tus + 1
       If Tus=10 then Tus=0


       Cihaz=%00011111
       for I=0 to 4
         IF IR_VAL(7+I)<80 then Cihaz.Bit0=0
       next
       RETURN


bunu derlerken ilk olarak
  şu kodu hata olarak işaretliyor ve devamı şeklinde

  Pulsin IR_Sensor,0,P_Val :IR_VAL=P_VAL        ' Receive the IR bit pulse

ete

Orada senin programında olmayan değişken isimleri var. Onları kendi değişkenlerin ile değiştirmen gerek.
Yada o satırda yazım hatası vardır. Mesela sıfır yerine O yazılmış olabilir. Onları kontrol et yada aynı satırı kendi programından kopyalayıp oraya yapıştır.

Ete

efor

HOCAM CİHAZ VAR BYTE    VE    TUS VAR  BYTE  KODLARINIDA EKLEDIM. SİZİN YAZIMINIZI KOPYALAYIP DİREK YAPISTIRDIM

ete

Şu yazıları büyük harfle yazmayın lütfen.
Kodları buraya koy bakayım.
Ete

efor

hocam program yazarken açık kalıyor büyük harfler kusura bakmayın.

denedıgım kodları yukardaki mesajda göndermıstim hocam


bu kısım ır okuma kısmı sadece


IRIN:   
'IR_But=255
   Pulsin IR_Sensor,0,Header         ' Measure the header length.
    IF Header<1000 then return
    IF Header >1400 then return

For I=0 to 11         ' Do 12-bits
   Pulsin IR_Sensor,0,P_Val :IR_VAL=P_VAL        ' Receive the IR bit pulse
next
TUS=127 'Bu komut ile tus bitlerinin hepsini 1 yapıyoruz.
For I=0 to 6
   P_VAL=IR_VAL
   If P_Val < 80 then  TUS.0=0         'okunan süre 80 den küçükise bit değeri 0 demektir
  next
       Tus = Tus + 1
       If Tus=10 then Tus=0


       Cihaz=%00011111
       for I=0 to 4
         IF IR_VAL(7+I)<80 then Cihaz.Bit0=0
       next
       RETURN

ete

Değişken tanımlamalarını görmeden senin hata yapıp yapmadığını nasıl anlayacağım.
Programını bana mesaj atıp yolla bende derleyeyim bakayım nerede ne hatası veriyor.

Ete

efor


ete

Yolladığını direk derledim sorunsuz derledi.
Ete

Powered by EzPortal