Kablolu NEC protokolü

Başlatan blueboard, 22 Aralık 2018, 19:09:24

blueboard

Ete Hocam , elimde NEC protokolü ile haberleşen bir kontrol sistemi var. Ancak işin ilginç yanı haberleşme infrared iled aracılığı ile değil de kablo üzerinden bağlantı kurularak yapılıyor. Sizin son yazdığınız IR ile NEC haberleşmesi projenizi bu sisteme uydurmaya çalıştım ama bir kaç yerde bilgi eksikliğimin olduğunu düşünüyorum ki başarılı olamadım. Cihazın haberleşmesine Lojik analizör ile baktım. Resimleri aşağıda ekliyorum.Cihaz çıkışında tersleme yapacak transistör vs. hiçbir şey yok.Cihazın çıkışını direkt olarak analizöre girdim. Cihaz NEC protokolü ile çalışıyor. Ancak fark şurada  sizin son olarak yazmış olduğunuz NEC projesinde bilgiler doğal olarak infrared led ile gönderiliyordu. Ancak buradaki sistemde bilgiler kablo üzerinden led kullanmadan gönderiliyor. Bundan dolayı 16F628A'nın girişine TK19 bağlayamıyorum. TK19( TSOP2238)  bağlayabilseydim sizin hazır projenizi kullanacaktım.Fakat ortada kızılötesi sinyal olmadığından mümkün olmadığını düşünüyorum.

Microdenetleyici girişine optokuplör veya başka bir devre elemanı mı girmeliyim? Sizin yazdığınız kodlar üzerinde az çok oynama yaparak denedim ancak sonuç alamıyorum. Benzer bir konuda size daha önce fikir sormuştum.Siz modüle edilmiş sinyalin çözülmesi işini TK19'un yaptığını belirtmiştiniz. Ancak burada modüle edilmiş bir sinyal yok. Yardımlarınızı bekliyorum.

ete

Yapılacak tek bir şey var bence. Bu gelen sinyali bir NPN (BC547) transistöre girip bu transistörün çıkışını (Collector) pic'e girmek. Transistörün Emitteri GND ye bağlı olmalı Base ucuna sinyali girmeli ve Collector ucu (pullup direnci olmalı) ise Pic giriş pinine bağlanmalıdır.
B portunda bir giriş alınırsa ve dahili pullup larıda aktif edersen sistem TK19 dan geliyormuşçasına kodları çözer.
Değilse bütün kodu yeniden yazmak gerekiyorki bu çok zor ve zahmetli bir iş.
Ete

blueboard

Ete Hocam, transistör bağlantısını ekteki resimde çizdim. Kontrol edebilir misiniz doğru mu?

ete

#3
Doğru gözüküyor pullup ı aktif edersen tabiiki.
Burada uyguladığımız işlem bir NOT (değil) kapısı uygulamak oluyor. Gelen sinyali ters çevirmeyi amaçlıyoruz bu şekilde.

Değil kapısı HIGH girişte çıkışı LOW , LOW girişte çıkışı HIGH yapan elemandır. Bahsini ettiğim sistemde, HIGH geldiğinde transistör tetiklenip çıkışı LOW yapar. LOW geldiğinde ise cevap vermez ama çıkıştaki pullup bu seferde orayı HIGH yapar. Böylece istediğimiz yerine gelmiş olur.

Ete

blueboard

Ete hocam, malesef çalışmadı. Yardımınız için teşekkür ederim.

ete

#5
Hemen pes etme. Çalışmamasının bir sebebi vardır mutlaka.
Öncelikle bütün sinyali kapsayacak bir Lojik analizör görüntüsüne ihtiyaç var.
İkincisi hangi kodları uyguladın birde onlara bakalım. Sonunda bir iki düzeltme yaparak belkide çalıştırırız.

Yollamış olduğun PDF dosyasında iki sinyalin birleşme noktası bana enteresan geldi. Sanki araya ufak bir puls sıkışmış sinyal devam etmiş gibi bunu algılamak zor olabilir. Mantık değiştirmek gerekebilir.
Ete

Not: ilk mesajına eklediğin programa baktım. Program kesme ile Header devamına (4,5ms lik ek sinyal) bakıyor baktığı sinyal HIGH (sende bu LOW oluyor) . Diğer taraftan LOW ve HIGH formatlarına bakınca aralarındaki farkı LOW süreleri oluşturuyor. O halde kayıt altına alınacak sinyal şeklide LOW olması gerekir. Programda ise HIGH ları kayıt altına almışız. Bu demektirki uyumsuluk var.
Bu durumda programı transistör kullanmadan direk PORTB.0 dan girmek gerekir. Burada dikkat edeceğimiz diğer bir husus da sinyal seviyesidir Sinyal seviyesi 5V tu aşmamalıdır. Aşıyor ise tedbir almak gerekir. En azından porta bir 5,1V zener diyot bağlamak çözüm olabilir.
Programı düzenleyip yeniden buraya koyacağım.

ete

#6
Bütün programı koymaktansa sadece değişen Kesme kısmını koymaya karar verdim.
İlişikteki program parçasını kendi programındaki ile yer değiştir ve transistörsüz olarak yeniden dene.
Tabiiki burada diğer önemli nokta tuş kodları. O program hangi tuş kodunu kullanmış onada bakmak gerek. Lojik analizörden de bu çıkartılabilir.

Ete

DISABLE     
KESME: 
         PULSIN PORTB.0,0,TAMAM
         IF TAMAM >400 AND TAMAM<500 THEN       
         for I=0 to 31
           pulsin IR_Goz,0,IR_AL(I)   'YALNZCA low BİTLERİNİ ALIP SÜRESİNİ KAYIT EDİYORUZ
         next
         ALDIM=1
         ENDIF
         
GECGIT: SAY=0     
        INTCON.1=0   
        Resume       
    Enable       
End


Senin programda OPTION registerden dahili pullup lar aktif edilmiş gözüküyor. Halbuki bu sistemde pasif olmalılar diye düşünüyorum. Port giriş pininin pullup ile HIGH edilmesi yerine karşıdan gelen sinyalin zaten HIGH yada LOW olması gerekiyor. Bence pullup lara gerek yok bu işte. Onları OPTION_REG=%10000000 vererek iptal et bence.



blueboard

Ete hocam, ilginiz için teşekkür ederim.2 gün şehir dışındayım. Döndüğümde deneyeceğim.

blueboard

Ete Hocam, biraz önce döndüm.İlk işim açıklamalarınıza göre değişiklikleri yaparak denemek oldu. Ama maalesef yine çalışmadı. Yol yorgunuyum, yarın denemeye devam edeceğim.

blueboard

#9
Ete Hocam, lojik analizörde header kodunu inceledim. Kontrol cihazından sürekli olarak lojik1 geliyor. Daha sonra alıcıya header sinyalini göndermeye başladığını anlatmak için lojik 1 seviyesini 50 mikrosaniye civarı lojik 0'a çekiyor. Bu sürenin sonunda da header sinyal süresini lojik1 seviyesinde 9 ms süresince gönderiyor. Tabi bunun arkasından da diğer bilgiler gönderiliyor.Bunun ekran görüntüsünün yakınlaştırılmış şekliyle gönderiyorum.

Açıklamalarınıza göre kodların tekrar düzenlenmiş şeklini de ekliyorum. Burada sorun header sinyalin alınmaya başlanmasıyla ilgisi olabilir mi? Acaba 50 mikrosaniye low sinyali gördükten sonra 9 ms lojik1 mi beklememiz gerekiyor. Tuş koduna gelince ilk tuştan 16. bitten sonra 00101000 yani  28 geliyor. Header sinyali alma konusunda yanlış düşünüyor da olabilirim. Sizce nasıl olmalı?['****************************************************************
'*  Name    : KESME-RB0.BAS                                      *
'*  Author  : [Erol Tahir Erdal]                                *
'*  Notice  : Copyright (c) 2005 [ETE]                          *
'*          : All Rights Reserved                               *
'*  Date    : 23.04.2005                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F628
@ DEVICE PIC16F628, WDT_Off
@ DEVICE PIC16F628, LVP_Off
@ DEVICE PIC16F628, PWRT_ON             'Power on timer açık
@ DEVICE PIC16F628, MCLR_Off
@ DEVICE PIC16F628, PROTECT_ON         'Kod Protek kapalı
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
'@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _DATA_CP_ON & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
DEFINE OSC 4
DEFINE PULSIN_MAX 11500 'Maximum counts allowed before pulsin times out
CMCON = 7

PORTA=0
TRISB=%00000001   'PortB.0 giriş diğerleri çıkış yapıldı.
TRISA=%00000000   'A portu tamamı çıkış yapıldı.

OPTION_REG=%10000000    'dahili Pull up dirençleri iptal edildi.
'-----------------------------------------------------------------
SYMBOL IR_Goz=PORTB.0

Paket var word 56
TAMAM VAR WORD 58
Tus   Var Byte 60
Cihaz Var Byte 61
IR_AL var BYTE(32)62

I     var Byte 100
Z     var BYTE 101
SAY   VAR WORD 102

ALDIM VAR BIT
ILK   var bit

INTCON=%10010000  'Kesmeler aktif ve RB0/INT kesmesi aktif
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
portb=0
PAUSE 200
'-------------------------------------------------------------------
'Tus Kodları:
'1. tuş: 28
BASLA:
      SAY=0
      while ALDIM=0
        SAY=SAY+1
        IF SAY=700 THEN PORTB=0
      WEND
       ALDIM=0
       TUS=0
       for I=0 to 7
         IF IR_AL(16+I)>70 then TUS.0[I]=1 '16 bit den itibaren gelen 8 bit ise komut bitleri oluyor
       next
             
       IF TUS= 28  THEN  'BURADA  BAŞLANGIÇTA  TUS=%00101000   YERİNE  28 YAZDIM OLMADI
        PORTB.3=1
        pause 2000       
        GOTO BASLA
       endif
     
     
             
       PORTB=0
     
       GOTO BASLA           
   
DISABLE     
KESME: 
         PULSIN PORTB.0,0,TAMAM
         IF TAMAM >400 AND TAMAM<500 THEN       
         for I=0 to 31
           pulsin IR_Goz,0,IR_AL(I)   'YALNZCA low BİTLERİNİ ALIP SÜRESİNİ KAYIT EDİYORUZ
         next
         ALDIM=1
         ENDIF
         
GECGIT: SAY=0     
        INTCON.1=0   
        Resume       
    Enable       
End ]

blueboard

Ete hocam, 16f628a'nın girişine TK19 bağlanamaması nedeniyle gelen lojik seviye sinyallerini okuyamıyor olabilir miyim? Doğru düşünüyorsam komparatör kullanarak gelen bilgileri 16f628'e lojik 0 veya lojik 1 olarak algılattırabilir miyiz?

Powered by EzPortal