avatar_ete

IR_HABERLEŞME PROJESİ

Başlatan ete, 21 Haziran 2015, 18:44:10

ete

Yapacak bir şey yok uzaktan ancak bu kadar olaya müdahale edilebilir.
Bi ryerde hata vardır ama nerede? Önce OSCCAL meselesi ardından GOSUB TUSGIR eksikliği ardından MCLR_ON yapılmış olması. Bunlar hata değilde hatalar zinciri olarak nitelenebilir. Devamı var demekki onuda sen bulacaksın artık.
Eline çalışan programı al ve sağı ile solu ile oynamadan aynen yeniden aktar ve deneme yap.

RETURN komutu altında yer alan GOTO BASLA komutunun hiç bir işlevi olmaz. Neden bunlar ilave edilir anlamıyorum. Bilmeyen öğrensin en azından bilmeden anlamadan komut satırları eklenmesin .
Ete


ete

#91
Programda ufak tefek kusurlar var hala. Bunları düzeltip yeniden veriyorum. Dene bakalım bu sefer olacakmı.
Elimde 1628 ile çalışanı var dediğin için programın geri kalanına pek insan dikkat edesi gelmiyor. Ama hala çalışmadı deyince yeniden baktım ve dediğim kusurları buldum.
Çalışması gereken hali aşağıdadır.

@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT ' DAHİLİ OSİLATOR
@ DEVICE pic12F675, WDT_OFF
@ DEVICE pic12F675, PWRT_ON
@ DEVICE pic12F675, MCLR_Off
@ DEVICE pic12F675, BOD_OFF
@ DEVICE pic12F675, CPD_OFF
@ DEVICE pic12F675, PROTECT_OFF

Define OSCCAL_1K 1 ' Set OSCCAL for 1K device


ANSEL = 0                'Portlar çıkış
TRISIO=%00001100          '2. BIT GIRIS DİĞERLERİ ÇIKIŞ

CMCON=7                  'Komparator kapalı

SYMBOL LED1= GPIO.4      ' GPIO.4 pinine sembol ismi olarak LED1 adı verildi.
SYMBOL LED2= GPIO.5      ' GPIO.5 pinine sembol ismi olarak LED2 adı verildi.
symbol IR_Goz= GPIO.2
POZ  VAR  BIT

Paket var word 56
IR_AL var word(12) '58

Tus   Var Byte 82
Cihaz Var Byte 83
I     var Byte
Z     var BYTE
Led   var bit
           
BASLA:     
      GOSUB TUSGIR           
      IF TUS=18 THEN   
        HIGH LED1
      ELSE
        LOW LED1   
      ENDIF             
           
      IF TUS=19 THEN   
        HIGH LED2
      ELSE
        LOW LED2
      ENDIF   
      pause 150
      GOTO BASLA

TUSGIR:
       TUS=0:CIHAZ=0
       PuLSIN IR_Goz,0,PAKET
       if PAKET<200 OR PAKET>270 then  RETURN

       FOR I=0 TO 11
         PULSIN IR_Goz,0,IR_AL[I]
       NEXT   
       
       Tus=127
AYIKLA:
       FOR I=0 TO 6
         IF IR_AL[I]<80 THEN Tus.bit0[I]=0
       NEXT

       Tus = Tus + 1
        IF Tus=10 THEN Tus=0
       
       Cihaz=%00011111
       
       FOR I=0 TO 4
         IF IR_AL[7+I]<80 THEN Cihaz.Bit0[I]=0
       NEXT
       RETURN
       
END

coco

#92
GOSUB TUS_GIR  Hatası verdi düzeltim derledi
TRISIO=%00001100  Mcrl pinide giriş gözüküyor


Evet Tebrik ediyorum hocam programın alt bölümündeki değişiklerle gp5 Led butona bas bırak çalışıyor!!!
Gp4 led Başarısız.Tuş kodunu değiştirdim çalıştı

ete

MCLR pini daima giriştir başka alternatifi yok zaten. DOlayısıyla o komutta sorun yok.
TUSGIR yerine TUS_GIR yazmışım oda düzeltilecek bir şeydi olabilir. Sonuçta çalıştığına sevindim. Demekki neymiş,
aklına estiği gibi programdan kod çıkarmak veya anlamını bilmeden kod eklemek doğru değilmiş.

Ete

coco

#94
Evet haklısınız
Daha önce Sizin düzeltmelerinize uyarılarınız rağmen çalışmamasının sebebi

Düzeltmelerimi yaparken internet sayfasında Kopyala yapıştır ile devam ettim

Forum üzerinde Code sayfası nasıl açıldığını bilmediğim için bu şekilde devam ettim sayfa direk yazınca kodlarda bazı kayıplar oluyormuş
Benim yaptığım hata aşağıda düzgün yazmama rağmen kaydet deyince hatalı kaydediyor
if IR_AL(I)<80 then Tus.bit0[I]=0

 if IR_AL(I)<80 then Tus.bit0[I]=0


Forumdan eksik kopyalamışım evet şimdi onuda öğrenmiş oldum
Belki ben göremedim ama....Forum ana  sayfasına Kod sayfası nasıl açılır? resimli anlatılırsa çok eğitici olur

Teşşekürler


:))

ete

RF olsun IR olsun kod çözme işinden zevk aldığımı söylemek istiyorum.
Boş kaldıkça daha başka neler yapılabilir diye sürekli kafa yorarım bu konu üzerinde.
NEC Protokolü konusunda bazı çalışmalar yaptım. Daha doğrusu özel projeler üzerinde uğraştım ve kendimede evdeki lambaları kontrol edebileceğim bir sistem yapayım deyip oturdum PC başına.
Derken konu NEC protokol çözme algoritmasını daha nasıl geliştirebileceğim meselesine geldi ve bazı denemeler yaptım.
Genelde ufak (8 bacaklı işlemciler) kullanıyoruz bu iş için ve 4Mhz üzerinde yüksek hızlarda çalışırken programda kullandığımız 32 elemanlı dizi değişkeninin Byte değil WORD tipinde olması gerektiğini keşfettim. Önce bu zorunluluğun nerden kaynaklandığını açıklayayım.
Kod çözmenin temeli header sinyalini bulmak ve ardından data bitlerinin sürelerini ölçerek kayda almaya dayanıyor.
Süre ölçümünde PULSIN komutunu kullanıyoruz. PULSIN komutu ölçtüğü süreyi bize OSC frekansına bağlı olarak değişik şekillerde veriyor.
Örneğin 4 Mhz OSC frekansında çalışırsak, 1/4=1 ve 1/1=1us olduğundan bunun 10 katı olarak süre hesabını veriyor. Örneğin 4500us lik header puls süresini bu mantık ile 450 olarak bize vermesi gerekiyor.
Peki OSC frekansımız 8Mhz olurse ne olacak? ona bakılım. 8/4=2 ve 1/2=0,5 ve 0,5x10=5us ve katları şeklinde bize süre değerini verecektir. Örneğimizde yer alan 4500us lik süre bize 4500/5=900 olarak gelecektir.
Bir örnek daha verelim 20 Mhz de ne olacak dersek, 20/4=5 ve 1/5=0,2 ve 0,2x10=2us ve katları şeklinde ölçülecek demektir. 4500/2=2250 olarak ölçülecektir.

Benzer mantık ile sayı bitleri süreleri ne olacak birazda ona bakalım.
Biliyorsun "0" biti=562us HIGH + 562us LOW biti şeklinde ifade ediliyor ve biz LOW tarafını ölçüyoruz. "1" biti ise 562us HIGH + 1687 us LOW bitinden oluşuyor. Buradada sinyalin LOW tarafını ölçüp alıyoruz.
4 mhz de LOW biti 562/10=56 olarak PULSIN ile ölçülecektir. AYnı süre 8 Mhzde 112 olarak ölçülecek, 20 Mhz de ise 281 olarak ölçülecektir. 281 sayısının hemen Byte limitini aştığını görebilirsiniz.
İşte 4 Mhz den yüksek frekanslarda işlemci çalıştırarak bu kod okuma işini nasıl byte değişkenleri ile yapabilirim diye düşündüm. Ayrıca okumalar arasında nede olsa ufak tefek farklılıklarda çıkıyor bunlardan da kurtulmak isterim diye düşünerek şöyle bir yol buldum.
Basic Komutu "NCD DEGISKEN" Değişkenin en yüksek değerlikli bitini size veriyor. Bu durumda PULSIN ile ölçülen süre ne olursa olsun bunu NCD ile en yüksek değerlikli bit değerine çevirir isem süre kaydı için kullanacağım değişken daima byte olur dedim ve bir deneme yaptım. Sonuç son derece olumlu çıkıyor. Hem küsüratlardan kurtuluyorsunuz hemde işlemciyi daha hızlı çalıştırıp byte cinsinden dizi değişkeni kullanarak bu işi halletmiş oluyorsunuz.
Amacım değişik varyasyonları her zaman araştırıp bulmanızı sağlamak bu nedenle bütün kodu burada verecek değilim. Ama herzamanki gibi detaylı yol göstermeye çalışacağım.
Programda kullanılan işlemci frekansı ne olursa olsun dizi değişkenimiz Byte cinsinden olacak.
Benim kullandığım IR_AL var BYTE[32] şeklinde idi.

Header sinyali iki kısımdan oluşuyor. 9ms lik HIGH ve ardından 4,5ms lik LOW sinyali şeklinde Biz kod başını yakalamak için 4,5ms lik LOW sinyalini aşağıdaki şekilde yakalamaya çalışıyoruz;
PULSIN Giris,0,SURE:TEMP=NCD SURE şeklinde alıyoruz ve hemen altına,
IF TEMP=9 THEN yazıyoruz. 9 sayısı 450 rakamının NCD değeridir. 9.cu biti 1 demektir bu 450 sayısının. Dolayısıyla ölçüm değeri 450 den biraz farklı da olsa NCD değeri daima 9 olacaktır.
IF TEMP=9 THEN karşılaştırma komutu doğru ise sinyalin başını yakalamış oluyorsunuz demektir.
Ardından 32 adtlik bir döngü kurup,
FOR I=0 to 31
  PULSIN GIRIS,0,TEMP:IR_AL[I]=NCD TEMP
NEXT
Şeklinde 32 adet data bitinin süresini NCD olarak kayıt ediyoruz.
Şayet gelen süre LOW biti ise 562us lik süre 4 Mhz de 56 olarak ölçülecek ve bunun NCD karşılığı ise 6 olacaktır. Şayet gelen HIGH biti ise 1687us lik süre bize 168 olarak gelecek ve bununda NCD değeri 8 olarak alınacaktır.
Süreler kayıt edilip Tuş kodu bulunurken (TUS_BAK isimli alt programda) bizim tuş kodumuz aslında 16 cı bitten 24 cü bite kadar olan bitler olduğundan,
 for I=0 to 7
   IF IR_AL[16+I]>7 then 
     TUS.0[I]=1 '1 biti ncd değeri 8 olduğundan NCD değeri 7 den büyük ise o bit 1 dir
   ELSE
     TUS.0[I]=0 '0 biti ncd değeri 6 olduğundan 7den küçük ise o bit 0 dır diyoruz.
   ENDIF  
 next
şeklinde ayıklayıp tuş kodunu bulmuş oluyoruz.
Bu sistemi denedim ve güzel çalışıyor. İlgilenenlere bilgi vereyim dedim.
Aynı mantığı RF haberleşmede örneğin PT serisi entegrelerin şifrelerini çözerkende kullanabilirsiniz.

Ete



blueboard

Ete hocam, öncelikle bizlere sürekli olarak yol gösterdiğiniz için teşekkür ediyorum. Nacizane olarak bir fikrim var.IR derslerinize ilave yapabilir misiniz? Piyasada herhangi bir RF vericinin gönderdiği kodu okuyarak okuduğu kodu kendine kopyalayan ve artık kopyaladığı kodları gönderen   RF vericiler var.
Örneğin  https://tr.aliexpress.com/item/4000329424649.html?spm=a2g0o.productlist.0.0.59212d4dA7oOFB&algo_pvid=481db271-c453-4c38-b385-26f39a6e1fbf&algo_expid=481db271-c453-4c38-b385-26f39a6e1fbf-0&btsid=706fae79-9130-4d5e-8008-1d17765d89bc&ws_ab_test=searchweb0_0,searchweb201602_6,searchweb201603_55


 Benzer şekilde IR vericinin gönderdiği kodları önce okuyup daha sonra okuduğu kodları pil sökülse bile unutmadan ir kodları gönderen ir verici projesi nasıl olur? Bu tür bir çalışma ile IR dersleriniz daha geniş bir anlatıma kavuşur.

ete

Böyle bir şey yapmayı önceden de düşünmüştüm.
Ancak benim açımdan böyle bir şey yapmanın pek anlamı yok. Sebeplerini aşağıda açıklayacağım.
Öncelikle böyle bir sistem yapmanın yolu orijinal kumandadan gelen bütün pulsların alınıp kayda geçirilmesinin gerekmesi. Hemen bunu nesi zorki diyebilirsin. Ancak biz mevcut yaptıklarımızda her bir kod bitinin IR yada RF tarafında iki bitle ifade edilmesinden yararlanarak iki bitten birini bırakıp diğerine konsantre olarak bu bitleri yakalayıp kod çözüyoruz. Burada ise ne geliyor ise hepsini almak zorundasın. Bu okadarda kolay bir iş değil. Zorluk kullandığımız işlemci OSC frekanslarının bu işi yapmaya yeterli olmayacağındandır.
Komut gecikmeleri nedeni ile kayda aldığın bit sürelerinde şaşmalar olacağı kesindir.
Bana kalırsa bu iş başka şekilde yapılıyor. Tahminim piyasadaki aletler önce protokolü tespit ediyor ve ona bir numara veriyor. Sonra tuş ve cihaz kodlarını okuyor onuda kayıt ediyor. Böylece aynı sinyali oluştururken protokol numarasından hangi protokol olduğunu anlayıp o protokol üzerinden cihaz ve tuş kodunu yolluyor.
Pals sürelerini mi kayda alıyor yoksa protokol tespitimi yapıyor anlamak veya hangisinin tutarlı şekilde çalışabileceğini tespit etmek uzun bir çalışma maratonu gerektiriyor. Karşılığında elde edeceğimiz fayda bu kadar zahmete değmez diye düşünüyorum.

Diğer önemli bir faktör de, bu iş için elde yapılmış bir alıcı verici yerine bildiğin üniversal IR kumanda olması gerekir. Zira tuş cinsleri yada isimleri ile tuş adedtleri bu aletten alacağın faydayı etkileycektir. Bu durumda böyle bir çalışmanın elde yapılması yine çok anlamlı olmayacak.

Başka da sebep aramaya gerek yok sanırım. İlla bir başka sebep de aranacak ise hazır aletlerin fiyatlarının çok cazip olmasını dile getirebiliriz. Biz yapacak olsak hem alet güzel olmayacak hem kaba olacak hemde fiyat olarak orjinalinden daha pahalı olma ihtimali olacaktır.
İşte bu nedenlerden dolayı bu sistemin yapılmasına bence gerek yok maalesef.

Ete

fero

hocam iyi günler. 16f84 ile eklediğim IR kumandayı röle on/off için nasıl kullanabilirim??


kalite 18 yz com

ete

O kumanda NEC protokolü ile çalışıyor.
Siteyi araştır kumanda kodlarını okuyabilen bir program vermiştim.
Bana kalırsa önce kumanda butonlarının tuş karşılıklarını okuyacak bir şey yaz sonra o tuşlara yada tuşlardan birine Toggle çalışacak şekilde on/off fonksiyonu atayıver.

Ete

fero

Alıntı yapılan: fero - 20 Nisan 2020, 13:09:10hocam iyi günler. 16f84 ile eklediğim IR kumandayı röle on/off için nasıl kullanabilirim??


kalite 18 yz com


hocam iyi geceler. kumandadan okuduğum kod=0x4EA240AE bu. bu şekilde yazdığımda hata veriyor??

ete

#101
O kumanda NEC protokolü ile çalışıyor ve çalıştığında 32 bitlik bir sayı üretir. Bu 32 bitin 16-24 arası olanları ise basılan tuş numarası yada kodu dur. Bu hesaba göre senin okuduğun kod da $40 tuş kodu olması gerekir ama bu değer çok yüksek bir değer bana kalırsa. Bir hata var.

İşin temelinde yaklaşık 9ms süren başlangıç (header) sinyalini yakalamak yatıyor. Sonra peşinden gelen4,5ms lik header sonlandırma sinyali yakalanıp (yada direk bu sinyali yakalamak daha uygun olur)ve ardından gelen 32 bit süre olarak kayda alınıyor ama alınırken yanlızca LOW süreleri kayda alınır. Zira bir sayı biti iki bitten oluşuyor Sabit bir High (560us) biti ve ardından 1690us lik bir LOW var ise bu bit HIGH 560us lik bir LOW var ise bu bit LOW kabul ediliyor. HIGH süreleri aynı olduğu için ayırt edici özellik olarak sadece LOW sürelerine bakıyoruz. 32 adet LOW kayıt edip sonra bunları sürelerine göre değerlendirip bitleri belirliyor ve ardından şu sıralamaya göre kodları tespit etmiş oluyoruz. 2 adet 8 bitlik cihaz kodu (16 bit ediyor) + 8 bitlik 2 adet Tuş kodu) toplamda 32 bit ediyor. Bu arada her bir kodu 2 defa veriyor gibi gözüksede birer tanesi kosun ters çevrilmiş hali oluyor. Ters çevirmekden bitlerin ters çevrilmiş halini kast ediyorum. Biri %11110000 ise diğeri %00001111 oluyor anlayacağın.

Bence hatalı okuma yapıyorsun ve bir şey eklemediğin için hata nerede diye yorum yapamıyorum.

Ete

fero




HOCAM İYİ GÜNLER. BU KUMANDA KODUNU VERDİĞİNİZ NOTLARLA OKUYAMADIM.NASIL OKUYABİLİRİM BU KUMANDAYI???

ete

O kumandayı açacaksın. İçinde o tuşa basınca vericiyi herekete geçiren bir transistör olmalı. O transistörün base ucunu bulacaksın ve o uca bir skop bağlayarak çıkan data sinyalinin şekline bakacaksın.
Ayrıca sisteme bakıp bu bir RF kumandamı yoksa IR kumandamı anlayıp ona göre işlem yapacaksın.
Kısaca önce nasılbir kod veriliyor onu skopta yakalayıp benzer sistemler ile mukayese edip protokolü anlayacak ona görede işlem yapacaksın.

Bu soruyu sormadan önce zahmet edip içine bakacaktın ve içinde de şunlar .... var deyip soruyu peşine ekleyecektin. Hiç tanımadığım bir adamı bana gösterip bunun adı ne demekten farklı bir soru değil bu soru.

Ete



fero

#104


hocam iyi geceler . IRPROJE dosyanızdaki alıcı kodu "overwriting previous address contents" şöle bi hata veriyor. önceki adres yazma hatası çevrimi. nasıl düzeltebilirim aacaba??

Powered by EzPortal