PIC16F628A alıcı verici uygulaması

Başlatan turandemir98, 10 Aralık 2023, 17:33:38

turandemir98

 Merhaba arkadaşlar, PIC16F628A işlemcide RB3 pinine bağlı olan TX verici sensör, RA4 pinine bağlı olan RX alıcı sensör var. RB3 pinindeki tx verici de 36KHz sinyal üretmek istiyorum ve RA4 pinindeki alıcı sensörün sadece RB3 ten gelen sinyal olduğunda RA7 deki ledi yakmasını istiyorum. Kendim bir şeyler yapmaya çalıştım internetten araştırmalar yaptım ancak güneş ışığı olsun kumanda olsun hepsinde ledi yakıyor. Bunun önüne geçmek istiyorum. Yardımcı olabilecek birisi var mı(C dilinde) ?

ete

RB3 pini aynı zamanda işlemcinin CCP1 yani HPWM çıkışıdır. Yani işlemci geri planda 38Kh sinyal üretebilir ve bu pinden sana çıkış verir. Bu pini 2 girişli bir AND kapısının birisine bağlarsın.
Diğer kapıyada data çıkışını bağladığın zaman otomatikman data bilgisi 38Khz ile modüle edilmiş hale gelir. Bu AND kapısının çıkışını bir infrared lede girersin yada bu çıkışı bir RF vericisine girersin. Ancak RF üzerinden yolladığın sinyali alıcıda demodule etmen çok zor. İmkansız değil ama bir sürü devre yapman lazım. Bu nedenle Infrared verici daha mantıklı gözüküyor. Alıcı /RX) tarafında bir 38Khz lik IR göz olursa gelen sinyali alır 38Khz lik kısmını çıkartıp sana net data sinyalini verir. Gerisi bu gelen bilgiyi kafana göre değerlendirmek olur.
Gün ışığı IR led sinyaline eklenince sinyal seviyesine bir artma olur. Ancak sinyalin demodule edilmesi ile gün ışığı etkisi minimuma indirgenmiş olacaktır.
Burada dikkat edilecek hususlardan biriside Data sinyaklin tek bir bit den oluşmaması gerekir.
Örneğin Ledi yakacağın zaman örnek veriyorum 75 bilgisi yolla. ALıcı bunu 75 olarak alırsa ledi yaksın. Söndürmek için farklı bir rakam kullanırsın.
Bu anlattıklarımı uygula takıldığın yerde yeniden sor.

Ete

turandemir98

 Öncelikle yanıtınız için teşekkür ederim, RB3 pininde 38khz PWM olarak sinyal üretimini yapabiliyorum bunda sorun yok. Ancak bu sinyale data bindirme veya data gönderme işlemiyle birlikte yaparak alıcıya gelen sinyallerde bu datayı görmek veya datayı okumak istiyorum. C dilinde kodlama yaparken data gönderme veya bindirme ve bu datayı okuma için nasıl bir kodlama yapılabilir. Algoritma olarak kafamda çözdüm ancak kodlama kısmına gelince yapamıyorum hocam. C dilinde bilgi sahibiyseniz RB3 teki sinyalden data göndererek RA4 e gelen sinyallerde bu data var mı diye sorgulama kodu yazmanız mümkün müdür acaba?

turandemir98

Bir de verici olarak TSAL6100 LED INFRARED , alıcı olarak BP1A34 Bright Led Fototransistör kullanıyorum hocam.

aRci

Alıntı yapılan: turandemir98 - 11 Aralık 2023, 23:20:57Öncelikle yanıtınız için teşekkür ederim, RB3 pininde 38khz PWM olarak sinyal üretimini yapabiliyorum bunda sorun yok. Ancak bu sinyale data bindirme veya data gönderme işlemiyle birlikte yaparak alıcıya gelen sinyallerde bu datayı görmek veya datayı okumak istiyorum. C dilinde kodlama yaparken data gönderme veya bindirme ve bu datayı okuma için nasıl bir kodlama yapılabilir. Algoritma olarak kafamda çözdüm ancak kodlama kısmına gelince yapamıyorum hocam. C dilinde bilgi sahibiyseniz RB3 teki sinyalden data göndererek RA4 e gelen sinyallerde bu data var mı diye sorgulama kodu yazmanız mümkün müdür acaba?
Merhaba;
Erol bey sorunuzun cevabını aslında verdi. modüle sinyal kaynağınız ile gönderilecek olan veri çıkış pinlerini bir AND kapısı ile birleştirmeniz gerekiyor. RB3 sizin 38khz sinyal kaynağınız bunu AND kapısının girişine bağlayınız. Ardından göndermek istediğiniz veriyide Orneğin portb.4 pininden göndereceğinizi farz edin. RB4 pininide AND kapısının 2. pinine bağladığınızda AND kapısı Çıkışında verinizin 38khz deki halini almış olursunuz.

bunuda IR lede bağlamanız yetecektir.

ete

Bazı konulara açıklık getirmek gerekiyor anlaşılan.
Anlattığım uygulama şeklinde C dili veya Basic dili farketmiyor. Size genel amaçlı yolunu tarif etmiştim.

Öncelikle sinyal bindirme (modulasyon) ne anlama geliyor onu açıklamak gerek tahminim bilmiyorsunuz. 38Khz ile module edilmiş sinyalde bir araya gelmiş bir sürü puls olacaktır.
Bu sinyalin LOW kısmı skop görüntüsü üzerinden konuşuyorum düz bir GND çizgisinden ibaret olacaktır. Burada önemli olan HIGH kısmıdır. Yani bir sürü HIGH pulsinin Yükselmiş kenar süresinden bahsediyorum. İşte bu kısım 38 Khz lik pulslerden oluşur. Çok yakından yada sinyali genişletip bakınca tek bir HIGH çizgisi yerine 38Kh lik pulslerin bir araya getirdiği ve süresi HIGH peryodu kadar olan bir sinyal görürsünüz. İşte işin püf noktası burası. Bu kısım sizin gün ışığından etkilenmenizi önler. Bu sinyal bir şekilde verici tarafından havaya iletilecektir.
Şimdi biraz da bu sinyali nasıl oluşturuyoruz ona bakalım. Elimizde iki girişli bir AND kapısı var. Bir girişe 38Khz lik sinyali verdik. Diğer girişe ise Data vereceğiz. Data girişi LOW olduğunda 38Khz de kesilecek ve AND kapısı çıkışından düz GND alacağız. Çünki (0 AND 0=0) ve (1 AND 0=0) dır. Data girişi HIGH olduğunda ise HIGH peryodu kadar AND çıkışından 38Khz lik sinyali alacağız. Şimdi Data girişine bu bilgiyi nasıl vermeliyiz.
Data bilgimiz diyelimki 150 olsun bunun binary karşılığı %1001 0110 dir. Bu bilgi Data girişine iki şekilde verilir. Birincisi data bilgisinin her bir bit'ine tek tek ulaşıp;
bit0=1 ise Data çıkışı=HIGH değilse Data çıkışı=LOW
Bit1=1 ise Data çıkışı=HIGH değilse Data çıkışı=LOW
...
Şeklinde bütün bitleri bu şekilde test edip data pinine çıkış olarak şekil verirsin. Burada herhangi bir duraklama veya gecikme yaratmadan bütün bitleri sırası ile çıkışa aktarman gerekir.

İkincisi serial SHIFT komutlarını kullanabilirsin. Daha doğrusu shiftout. C dilinde karşılığı varmı bilmiyorum. Yoksada zaten otomatikman birinci alternatif ile yapılıyordur zaten.

İşin bu kısmını geçtikten sonra alıcı tarafına bakmamız gerekiyor. Önceden de dediğim gibi bu gelen sinyali Demodule etmek gerekir. Yoksa ham hali ile bunu işlemciye okutman mümkün olmaz. Demodule işlemini ise 38Khz lik IR gözler otomatikman yaparlar. Göze sinyal ham hali ile gelir çıkışında direk alırsan ters çevrilmiş olarak (1 ler sıfır, sıfırlar 1 olarak) dışarı çıkar.
Çıkışa bir transistör bağlarsan sinyali verdiğin şekli ile alırsın.
Bu durumda işlemcin o sinyalin demodule edilmiş halinin girdiği yer bakar ve gelen sinyalibit bit okur. Burada bir karışıklığa yer vermemek için mutlaka sinyalin başlangıcını belirleyen bir HEADER yani başlık sinyalin olmalı. Bu konuda genellikle IR haberleşmede uzun bir LOW kullanılır. ALıcı taraf öncelikle bu uzun LOW'u yakalar ve ardından gelen sinyali bekler. Yine bir karışıklık olmasın diye genellikle yollanan tek bit iki bit ile ifade edilir. Aksi halde uzun low'u yakaladın diyelim ardın gelen data biti LOW ise nasıl ayıracaksın bunu uzun low mu yoksa data biti midir ayıramazsın. BU nedenle insanlar düşünmüşler her bir biti iki bit ile ifade etmişler. Örnek vereyim (HIGH=uzun HIGH kısa LOW) (LOW=Kısa HIGH Uzun LOW) şeklinde.
Dikkat edersen LOW veya HIGH bitlerinde mutlaka bir HIGH kısım var ama asıl belirleyici kısım bu HIGH dan sonraki LOW kısmı oluyor İşte işlemci önce öndeki biti bakıp atlar ve gelen LOW bitine bakar süresini ölçer (aslında o anda ölçmez yoks gelen bilgiyi kaçırır) süre olarak kayda alır her birini. Bilgi alındıktan sonra süreleri ölçerek o bitlerin LOW mu yoksa HIGH mı olduklarına karar verir.
Bu iş sandığın kadar kolay değil işi bilmiyor isen. Ama anlattıklarımdan bir anlam çıkarırsan ve bunların karşılığını C dilinde bulabilirsen işin zorda değil.

Bana kalırsa önce tek bir data biti yollayarak alışveriş yapmaya çalış.  Böylece 8 bit yerine tek bitle uğraşıp işini kolaylaştırırsın.

C dilinde yazılmış programları örneğin NEC protokolünün nasıl çözüldüğüne bakarsan belki ilham alıp yapabilirsin. Örnek bulacağından eminim.

Ete

turandemir98

 Hocam anlattığınız şeyi mantık olarak algılıyorum ancak kodlamaya gelince başaramıyorum. Verici kısmıyla istediğim gibi oynayabiliyorum ancak alıcı kısmına gelince bu algılama işini veya kod çözme işini yapamıyorum. Alıcı kod örneğiniz var mı acaba veya yazma imkanınız?

turandemir98

#7
Bazı konulara açıklık getirmek gerekiyor anlaşılan.
Anlattığım uygulama şeklinde C dili veya Basic dili farketmiyor. Size genel amaçlı yolunu tarif etmiştim.

Öncelikle sinyal bindirme (modulasyon) ne anlama geliyor onu açıklamak gerek tahminim bilmiyorsunuz. 38Khz ile module edilmiş sinyalde bir araya gelmiş bir sürü puls olacaktır.
Bu sinyalin LOW kısmı skop görüntüsü üzerinden konuşuyorum düz bir GND çizgisinden ibaret olacaktır. Burada önemli olan HIGH kısmıdır. Yani bir sürü HIGH pulsinin Yükselmiş kenar süresinden bahsediyorum. İşte bu kısım 38 Khz lik pulslerden oluşur. Çok yakından yada sinyali genişletip bakınca tek bir HIGH çizgisi yerine 38Kh lik pulslerin bir araya getirdiği ve süresi HIGH peryodu kadar olan bir sinyal görürsünüz. İşte işin püf noktası burası. Bu kısım sizin gün ışığından etkilenmenizi önler. Bu sinyal bir şekilde verici tarafından havaya iletilecektir.
Şimdi biraz da bu sinyali nasıl oluşturuyoruz ona bakalım. Elimizde iki girişli bir AND kapısı var. Bir girişe 38Khz lik sinyali verdik. Diğer girişe ise Data vereceğiz. Data girişi LOW olduğunda 38Khz de kesilecek ve AND kapısı çıkışından düz GND alacağız. Çünki (0 AND 0=0) ve (1 AND 0=0) dır. Data girişi HIGH olduğunda ise HIGH peryodu kadar AND çıkışından 38Khz lik sinyali alacağız. Şimdi Data girişine bu bilgiyi nasıl vermeliyiz.
Data bilgimiz diyelimki 150 olsun bunun binary karşılığı %1001 0110 dir. Bu bilgi Data girişine iki şekilde verilir. Birincisi data bilgisinin her bir bit'ine tek tek ulaşıp;
bit0=1 ise Data çıkışı=HIGH değilse Data çıkışı=LOW
Bit1=1 ise Data çıkışı=HIGH değilse Data çıkışı=LOW
...


BU KISMA KADAR HALLEDEBİLDİM. KALAN ALICI KISMINI NASIL YAPACAĞIMI BİLEMİYORUM.

#include <xc.h>
#include <pic16f628a.h>

#pragma config FOSC = INTOSCIO   
#pragma config WDTE = OFF        // Watchdog timer kapalı
#pragma config PWRTE = OFF       // Güç-up timer kapalı
#pragma config MCLRE = OFF       // MCLR pin'i kapalı
#pragma config BOREN = OFF       // Brown-out reset kapalı
#pragma config LVP = OFF         // Low voltage programming kapalı
#pragma config CPD = OFF         // Data protection off
#pragma config CP = OFF          // Code protection off

#define _XTAL_FREQ 20000000

void main(void) {
    TRISB3 = 0;
    TRISA4 = 1;
    TRISA7=0;
   
    T2CON = 0b00000100;
    PR2 = 25;
    CCP1CON = 0b00001100;
    int Duty = 51;
   
    unsigned char dataInput = 75;
    unsigned char result = 0;

    while (1) {
       
        for (int i = 0; i < 100; i++) {
            CCP1CON = 0;
            CCPR1L = 0;
            __delay_us(20);


        }
        CCP1CON = 0b00001100;
        CCP1CONbits.CCP1Y = (Duty & 0x01);
        CCP1CONbits.CCP1X = ((Duty >> 1) & 0x01);
        CCPR1L = Duty >> 2;
        __delay_ms(5);
       
       
        result = CCPR1L & dataInput;

       
        for (int i = 0; i < 8; i++) {
            if ((result & (1 << i)) != 0) {
               
                RB3=1;
            } else {
               
                RB3= 0;
            }

        }
     
       
       
    }

    return;
}

ete

Maalesef bu yaptığında yanlış.
Bana kalırsa elektronik bilgin bu işiyapmaya yeterli değil.
Ne demiştim RB3 pininden sürekli olarak 38Khz sinyal çıkacak ve bir daha o pine dokunmayacaksın.
RB3 den çıkan sinyal AND kapısının bir girişine bağlanacak. Böyleeece AND kapısının LOJIK çalışma mantığı gereği ikinci kapı girişi HIGH olduğu zaman AND çıkışında 38Khz göreceksin. LOW olduğuda ise çıkış direk LOW gözükecek. Bunu anlattım ama anlamadığın ortada ki RB3 pini bir-sıfır yaparak kontrol sağlamaya çalışmışsın.
And kapısnın diğer ucu başak bir işlemci pinine bağlanmalı ve sen o pini data bilgisinin bitlerine göre HIGH low yapmalısın. Internette her türlü bilgi mevcut aslınnda hiçmi araştırma yapmadın.

İşin alıcı kısmı senin açından en zor kısım. Bir şekilde senkron yakalama sorunun olaccak.
Bu nedenle tavsiyem önce tek bit göndererek karşında aldığı bilgiyi değerlendir. Sonra 2 bite çıkar sonra 8 bite kadar yolu var. Ama bir işaret biti kullanmazsan nasıl sinyal başını bulacaksın
Ne demiştim Siyal başı için usunca bir LOW sinyali yarat vericide. And kapının ikinci bacağını 10ms süre ile LOW da tut ardından data yı ver.

38Kh lik gözlerin 3 bacağı bulunur . Besleme (+5V , GND ve Data Out ucu) data aout ucunu direk kullanırsan yolladığın sinyalin tersini alırsın o bacakttan bunlarıda anlattım nekadar anladığından emin deilim açıkçası. Temel olmayınca bazı şeyler kafaya oturmaz.
Tek söylebileceğim şey Alıcıda data out pinini bağladığın pini sürekli kontrol edip gelen low bitinin 10ms dolayında olduğunu anlaman ve hemen ardından gelen data biti yada bitlerini alıp değerlendirmen gerekiyor.

Ete

turandemir98

#9
alıcı ve verici sensörüm 2 bacaklı

aRci

Merhaba;
altta ki resim anlatılmak istenen yöntemin detayını görebiliriniz


https://diyot.net/infrared-diyot-ir-diyot-kizil-otesi-diyot/


ete

Sürekli olarak işin en zor tarafına doğru yöneliyorsun.
2 bacaklı sensör diyottur yada foto diyottur veya foto transistördür. Bu alıcı infrared sinyali alır ancak 38Khz i demodüle edemez yada etmez demek daha doğru.
Bu durumda ya sen 38Khz kullanmayacaksın direk data yı seri yoldan IR led ile vereceksin ve karşısındaki alıcı da sinyali alıp işlemci ile çözümleyeceksin.
Aklıma başka bir yol gelmiyor maalesef.  38Khz kullanman durumunda kendi demodulatör devreni yapmak zorundasın. Genelde peşpeşe iki opamp ile yapılıyor. Girişe gelen HIGH sinyal bir kondansatörü şarj eder   /\/\/\/\/\/\________/\/\/\/\/\/\________   şeklinde bir yükselen bir alçalan sinyal olan 38 Khz şarj olan kondansatörün boşalmasına zaman bulamadan yeniden şarj olması nedeni ile opamp çıkışında sürekli HIGH görürsün. Demodülatör bu şekilde çalışıyor. Biraz araştır belki uygun bir devede bulabilirsin. Ama hazır HA1738 veya TK19/38Khz gibi hazır alıcılar var iken neden kendini zora sokuyorsun onuda anlmış değilim.
Bu konuya daha fazla destek veremeyeceğim. Yeterince verdiğimi düşünüyorum.
Konu devam edebilir isteyen desteğini de verir.

Ete

Powered by EzPortal