ınfrared verici

Başlatan hasanb, 01 Kasım 2011, 21:55:58

hasanb

Hazır modül kullanmadan yapa bileceğim bir devre varsa lütfen paylaşın bana ır alıcı verici lasım pıc ile işlemci önemli 38 khz de çalışan birdevre varsa paylaşa bilirmisiniz. Benim devre çalışmadıda sorunne anlamadım  :-\

ete

Daha öncede vermiştim tekrar veriyorum. Aşağıdaki linkte yer alan çalışma bir arkadaşımız tarafndan yapılmış.
İçinde İnfrared konusunda her türlü bili mevcut. Üstelik aradığın alıcı ve verici şemasıda var. Verici kısmı 555 kullanılarak yapılmış . Bütün yapman gereken data ucunu bilgi yollayacağın zaman HIGH da tutman. Alıcı şemasıda benzer şekilde bir transistör ile çıkış terslenerek alınmış. Dediğim gibi TK19 çıkışı terleyerek veriyor. Senin düzeltmen gerekir yada önceki programında kullandığın data yı tersleyerek yllaman gerekirki alıcı düz alsın.
Ete

http://dl.dropbox.com/u/25364674/Ak%C4%B1l%20Defterimv2.pdf

hasanb

Hocam bu kaynaktaki bütün yazıları okudum. Devreyi kurdum ama çalışmadı acaba benim yazdığım pbp damı hata var :S anlayamadım. Serin ve seriout komutlarını kullanıyorum ama  bunlardan kaynaklana bilir mi ? acaba sorun komutlarda olabilirim ? komut örnekleri vermemiş kaynak ona bakarak ben yapa bilirdim belki mantığını çözerdim ama elimde hazır devre olmadığı için yapamıyorum :S bu kadar zor mu ınfrared kullanmak anlayamadım. Ne yaptım sa olmadı. Kayseri deyim kaynaklar kısıtlı burada pbp bilen çok yok varsa da ben tanımıyorum. Nasıl yaparız bir çıkış yolu nerede hata yapıyorum anlayamadım her yolu denedim çıldıracağım yadım lütfen...

ete

Bir yerde hata yapıyorsun ama bulamadın nerede yaptığını. Normal şartlarda Infrared sistemle seri data yollanmaz. Daha öncede açıkladım. Her bir bilgi paketinin başını sonunu belirlemen lazımki alana yardımcı olasın.
Olayı baştan ele alalım.
Kullanıdığın komut SEROUT pin,0...
Burada yer alan sıfır parametresi bilginin 2400 Baud True yani ters çevrilmeden yollandığını gösteriyor.
Bunun karşılığında kullandığın komut ise alıcıda;
Serin2 pin,386....
Bu ne demek alınan bilgi ters çevrilmeden 2400 baud ile alınacak demektir. Hep söylüyorum. TK19 aldığı bilgiyi ters çevirerek alıyor diye. O halde ne yapmak lazım ya yollarken yada alırken bilgiyi bir kere ters çevirmek lazımki alırken düz alasın.
O halde yukarıda açıklanan alma şekillerin yanlış demektir.
Bilgi Serout2 komutu ile yollanmış ise Serin2 komutu ila alınmalı.  Sana daha ziyade SEROUT komutu daha uygun. Mode parametreleri direk verilmiş durumda diğerinde kendin hesaplaman lazım. Neyse Serout komutuna bakalım.
2400 Baud için gönderme komutun; SEROUT Pin, 0,.... olsun. Bu bilgiyi alırken kullanman gereken komut;
SERIN Pin,4 ..... şeklinde olmalıdır Burada 4 parametresi 2400 Baud ve inverted bilgiye karşılık gelmektedir.

Her şey TK19 çıkışının nasıl kullanıldığın bağlı. Şayet direk çıkışı kullanıyorsan alıcıda inverted kullanman gerekli yok TK19 çıkışını br transistörle sen ters çeviriyor isen o zaman komut SERIN Pin, 0 ..... şeklinde kullanılmalıdır.

İşin bu kısmını anlamışsındır umarım. Gelelim komut şekline, Her bir data paketinin başına bir işaretçi koyulması uygun olur.
Bilgi yollanırken SEROUT pin,0,["E","T","E",DAT] şeklinde yollanırsa işlemci alırken önce ETE işaretini araştırıp bulduktan sonra gerisini alırsa sorunlar epeyce azalacaktır. O halde Alıcıda SERIN Pin,0(veya4),[Wait("ETE"),DAT] şeklinde komut uygun olacaktır. Dediğim gibi her şey TK19 un nasıl kullanıldığına bağlı.

SERIN2 ve SEROUT2 komutlarını kullanırsan biraz hesap yapman gerekecek. Bilgiyi yollarken 2400 baud için;
SEROUT2 Pin,396,.... şeklinde kullanacaksın bu True yani ters çevrilmemiş data yı yollar.
ALırken SERIN2 Pin,396 ,... dersen ters çevrilmemiş data alırsın. Ters çevrilmiş yapmak için 396 bilgisinin 14. bitini 1 yapman gerekiyor. Bu durumda oraya yazılacak bilgi 16780 olacaktır yani komut Serin2, pin, 16780,.... şeklinde kullanılacaktır.
Baud hesaplama yöntemi (1.000.000/Baud)-20 şeklindedir. Bu ters çevirlmemiş data için geçerlidir. Bulduğun sonucun 14. bitini 1 yaparsan ters çevrilmiş data için Baud hesaplamış olursun.


İşin bu kısmınıda aştığımız varsayalım. Geriye sistemin çalışmaması için bir ihtimal daha kalacaktır. Oda Baud rate yani yollama hızı. 2400 birim zamanda yllanan bit saysını gösteriyor. IR ledler bu hıza yetişemeyebilir. Bu nedenle yukarıda açıklanan sistemi birde daha düşük hızlarda mesela 300 Baud ile denemende yarar görüyorum.

Daha basit bir sistem ile deneme yaparsan senin için yol alma açısından daha uygun olur sanırım.
Seri data yollama yerine yalnızca HIGH ve LOW yollarsan sonucu görmek açısından faydalı olacaktır.
Sistem sürekli LOW yollasın ve bir tusa basılınca HIGH yollasın. Karşıda TK 19 ter çevirerek alıyor ise HIG geldiği sürece bir iş yapmasın. LOW gelince ledi yaksın . Bilgi düz geliyor ise LOW geldiği müddetçe bir iş yapmasın HIGH gelince led i yaksın.

Bu kadar bilgi ilede yapamıyorsan bu işi bırak başka sistemlerle uğraş derim artık.

Ete

hasanb

Hocam sonunda çalıştı.Verdiğiniz bilgiler için çok teşekkür ederim.Hayırlı çalışmalar.



hsnb

ete

Çok şükür. Çalıştığına sevindim. Birde nasıl çalıştığına dair buraya bilgi koyarsan memnun olurum.
Ete

hasanb

hocam şu komutları kullandım

vericide:
    SerOUT2 GIRIS,396,["H","B",VERI]

alıcıda:

SerIn2 GIRIS,396,[WAIT ("H","B"),AL]

bunları kullandım. Veri olarak ta 100 gönderdim ilk başta karşıdan da al=100 olur ise led yak dedim.Veri gönderince led yandı göndermeyince sönük kaldı.
101 102 103 104 ...........320 ye kadar veri gönderdim tek tek test ettim hepsini algıladı. 101 gönderdim alıcıya 102 gelince yak dedim almadı. Yani tam istediğim gibi çalıştı. Emeği geçen arkadaşlara ve bilhassa ete hocama çok teşekkür ederim. Devre aynı hiçbir değişiklik yok sadece serın ve serout komutları farklı yapmak isteyen arkadaşlar farklı projelerde kullanabilir.

hasanb

#22
Hocam sizden tekrar yardım istemek zorunda kaldım.Çok uğraştım ama yapamadım

Alıcı verici devresi çok mükemmel çalışıyor ancak 1. tuşa 1 defa basıp çekince veri =100 gönderiyorum karşıdan ise al=100 ise role-yi çek diyorum,çekiyor. Aynı tuşla aynı role-yi kapamaya çalıştım olmadı. Acaba nerede yanlış yaptım.Gene :) anlayamadım. Proteusta çalışıyor devrede çalışmıyor. Yardımcı olursanız.

yazdığım komut:


alıcı:

@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_on              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Koruma kapalı
@ DEVICE pic16F628A, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
    PORTA=0
    PORTB=0
    TRISA=%00000001   'A portu A.0 giriş diğerleri çıkış yapıldı.
    TRISB=%00000000   'B portu tamamı çıkış yapıldı.
    AL     VAR  BYTE
    J var byte
    GIRIS  VAR  PORTA.0
    LED   VAR  PORTA.1
   
    CMCON=7
    CLEAR     
    PORTB=0
    AL=0     
BASLA:

       GIRIS=0
       GOSUB ALICI
     
       IF AL=100 THEN
          TOGGLE LED
         
       ENDIF
           
       PAUSE 100   

GOTO BASLA
       
ALICI:
   SerIn2 GIRIS,396,[WAIT ("H","B"),AL]
   RETURN
       
'----------------------------------------------------------------------------------------------------------------
verici:

PORTA=0
PORTB=0
TRISA=%00000110
TRISB=%00000000   
'-----------------------------------------------------------------
@ DEVICE pic16F628                      'işlemci 16F628A                               
@ DEVICE pic16F628, WDT_on              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Koruma kapalı
@ DEVICE pic16F628, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'---------------------------değişkenler------------------------------
VERI     VAR BYTE
GIRIS    VAR PORTA.0
TUSA VAR PORTB.0
TUSREG VAR BYTE
'-----------------------------B A S L A N G I Ç -------------------------------------------
PAUSE 50
PORTB=0 
OPTION_REG.7=0
'------------------------------------------------------------------------------- 
TRISB.3 = 0  ' CCP1 (PortB.3 = Output)
PR2 = 25     ' Set PWM Period for
'approximately 38KHz
CCPR1L = 13  ' Set PWM Duty-Cycle to 50%
CCP1CON = %00001100  ' Select PWM Mode
T2CON = %00000100    ' Timer2 = ON + 1:1
prescale
CMCON=7
PORTB.0=1
TUSREG=0
BASLA: VERI=0
       IF TUSA=0 THEN
          VERI=100
          gosub gonder
          WHILE TUSA=0
          WEND
       endIF
       PAUSE 100
GOTO BASLA
gonder:
    SerOUT2 GIRIS,396,["H","B",VERI]
    SerOUT2 GIRIS,396,["H","B",VERI]
    PAUSE 1
return
END


Şema ektedir.


ete

#23
AL değerine bağlı olarak TOGGLE LED komutunu verdikten sonra AL=0 demen gerekir. AKsi halde yeni bir bilgi gelinceye kadar sürekli olarak LED toggle yapılacaktır.

Verici kısmındaki Ver yollamadan sonra her hangi bir pause koyma. Ayrıca tuş kontrolünden sonra koyduğun Pause 100 değerini 20 olarak değiştir. Hatta çalışırsa daha aza düşür. Zaten tuşun sürekli basılı olduğunu kontrol ediyorsun.
Uzun beklemeler programın çalışmasını etkiler.

Ete

Not: Sonradan fark ettim. Verici kısımda bir sürü buton var ancak onlara ait tris registerlerinden yalnızca PortA.1 ve PortA.2 giriş olarak ayarlanmış. Halbuki sen PortB.0 pinini programda kullanmışsın. Bu durumda hangi pin de buton bağlı ise ona ait tris biti "1" yapılmalıdır.

hasanb

#24
HOCAM DEDİKLERİNİZİ YAPTIM AMA GENE OLMADI.

ALICI:

BASLA:
       GOSUB ALICI
       PAUSE 200
       IF AL=100 THEN
          TOGGLE LED 
       ENDIF
       PAUSE 1000
       GOSUB ALICI
       IF AL=50 THEN
          TOGGLE LED1 
       ENDIF
       
       AL=0
       GIRIS=0

GOTO BASLA
       
ALICI:
   SerIn2 GIRIS,396,[WAIT ("H","B"),AL]
   RETURN




VERICI:
BASLA:
         
VERI=100
GOSUB GONDER
PAUSE 4000
VERI=50
GOSUB GONDER
PAUSE 4000
       
GOTO BASLA
Gonder:
    SerOUT2 GIRIS,396,["H","B",VERI]
    SerOUT2 GIRIS,396,["H","B",VERI]

return


YAZDIM AMA GENE OLMADI

Edit: Lütfen program satırları için Kod Tag ("#" işaretli buton) kullan. Program satırları arasında büyük boşluklar bırakma!!!!!

ete

Seri haberleşmede , haberleşmenin sağlıklı olabilmesi için senkron denilen olayın gerçekleşmesi gerekir.
Dikkat edersen ALıcı programında , GOSUB ALICI diye bir satırın var. Bu satır ile seri yoldan bilgi alma komutlarının icra edildiği alt programa yolluyorsun programı. Şayet oraya yollamaz isen kesinlikle haberleşme yapamazsın.
Peki şimdi yavaş yavaş düşünelim. Sen Gosub ALıcı dedin ve program oraya ulaştı peki vericiden yollanan bilgi o anda orada hazırmı ?. Ya program oraya gelmeden veri gelmeye başlamış ve ve sen verinin ortasından almaya başlamış isen yada veriyollama işi tam bitmiş iken senoraya ulaşmış isen!. Bu dediğim senaryoların hiç birinde senkron yakalayamazsın. Dolayısıyla hiç bir veri alman mümkün olmaz.  Peki ne yapmak lazım. Yapılacak iş şu veri yi mümkün olan en kısa aralıklı sıklık ile yollamak ve alıcıyıda gecikmesiz olarak alma satırlarında tutmak lazımki senkron denilen şeyi yakalayabilesin.
Sen ne yapmışsın. Bir veri yollamışsın 4000 ms lik gecikme koymuşsun. Gecikmeleri kaldır diyorum sen artırıyorsun.

Gecikmeleri kaldırarak denemeler yap. Yollanan veri ile ilgili yollama komut satırlarınının sayısını artır. Verici deki gecikmeleri kaldır. Yada en aza indir.
Yinede haberleşme sağlayamaz isen bu sefer USART kesmesi kullanman gerekecek.

Ete

hasanb

Tamam hocam sizi de yordum kusura bakmayın güç kaynağı ile ilgili bir sıkıntı oluştu onu giderir gidermez projeye devam edeceğim iyi çalışmalar.


hsnb

hasanb

kumandanın az güç harcaması için pıc-i uyutmamız lazım nasıl yapılıyor bilenler açıklaya bilir mi acaba ?

ete

Pic iki şekilde uykuya sokulur.
Birincisi SLEEP komutu ile. SLEEP bir Basic komutudur. parametreleri şöyledir.
SLEEP  Sure   
Burada Sure isimli değişken işlemcinin uykuda tutulacağı süreyi belirlemektedir. Değer 16 bitlik saniye cinsindendir. Yani pic'i 65535 sn uykuda tutabilirsiniz demektir.

İkinci metod Assembly kullanarak pic'i uykuya sokmaktır. Bunu komutu ise;
@ Sleep
şeklindedir. İkisi arasındaki fark, basicde verilen süre bittiğinde pic otomatik olarak uyanır. Asm de verilen komut da ise süre yoktur ve pic' bir harici kaynaktan uyandırılır. Harici kaynaklar olarak PortB.0 kesmesi, (Bir butonun PortB.0 pinine bağlanarak oradan kesme oluşturulması gibi) , PortB.4-7 değişiklik kesmesi. Bunlar pic'i uykudan uyandıarcak etkenlerdir.

Ete

hasanb

@ Sleep komutunu nasıl kullana bilirim acaba hocam tusa basınca çalışacak ve aradan 1 dk geçinceye kadar çalışmaya devam edecek 1 dk sonra otomatik kapanacak ve ben tuşa basınca çalışmaya başlıcan derken döngü aynı devam edecek. birde ben şöyle birşey yaptım resimde var tusa basınca pıc çalışıyor çekince duruyor. ama burada gönderdiğim konutu algılamıyor. sorun nerde ola bilir :S anlayamadım

Powered by EzPortal