Makale http://www.diyot.com/ sitesinde yayımlanmış siteyi inceleme fırsatım olmadı ne yazık ki kapanmış fakat çalışmaları bir çok forumda paylaşılıyor tabiki dosyalara ulaşamanız için belli kısıtlamaları aşmanız gerekli iki farklı siteden zar zor kaynak yazı ve kod dosyalarını toparladım (25 yorum,3 puan) sadece devre ve kod için bu kadar uğraşmazdım fakat bilgiler çok önemli programlama konusunda yeni başlayan ya da rf konusunda Türkçe bilgi sıkıntısı çeken kişiler için uğraşa değer diyot.com sitesi açılana kadar bu faydalı bilgi dolu makale burada rf iletişim konusunda çok işinize yarayacak değerli bilgiler var. Hazırlayan,emeği geçen kişilere teşekkürler
Bu dizaynımızda hazır RF modülleri ile DATA aktarımı için temel bir alıcı ve verici devresi tasarlanmıştır. Hazır RF modülleri genellikle 433.92Mhz civarında çalışırlar. Eğer bilgi iletmek istenmiyorsa alıcıyı aktif yapmak için vericiyi sadece aktif yapmak yetelidir. Ancak DATA iletmek için IR sinyallerinde olduğu gibi bilginin diğer gürültü sinyalleri ile karşmaması için kodlanması gerekir. IR modunda çalışan TV, VCD, müzik seti kumandalarında IR bandında ışık veren bir verici led kullanılır.
Bu led’in ışığı alıcıya bilginin doğru iletilmesi için 36-54Khz arasında bir taşıyıcı frekansı ile modüle edilir. Bilgi taşıyıcı ile modüle edilmeden önce kodlanır. Alıcı bu modüleli sinyali gördüğü an gelen bilgiyi kabul eder ve decode işlemine tabi tutar. Böylelikle diğer IR sinyallerden bilgi korunmuş olur. RF devrelerinde taşıyıcı frekansı piyasadan hazır aldığımız modül içinde oluşturulur. RF verici modülü 433.92 MHZ ile serbest salınırken girişine gelen kodlanmış veriyi modüle eder ve anteninden uzaya yayımlar.
Bu modülasyon işlemini genlik, frekans vb. gibi modülasyon türlerinden biri ile yapar. İstediğimiz bilgiyi taşıyıcı frekansı ile modüle etmeden önce kodlamamız gerekir. Kodlanmış bilgimiz RF modülüne verilir ve taşıyıcı ile modüle edilmiş kodlanmış bilgimiz uzaya salınır. Kodlama işlemine ne gerek var diye sorabilirsiniz. Kodlama işlemi verici ile alıcıyı senkronize etmek, aynı frekansta yayın yapan bir çok vericiyi adreslemek, ilgili adresteki gerekli veriyi almak gibi faydalar sağlar.
Alıcıya ulaşan bilgiler tekrar RF modülü ile demodüle edilir taşıyıcı süzülür ve saf kare dalga şeklinde gönderdiğimiz bilgiler çıkıştan alınır. Kod Çözücü (Decoder) ile gelen bilgimiz değerlendirilir. Alttaki şekilde bir kodlayıcı ve kodçözücünün de yer aldığı DATA aktarımında kullanılacak devrenin blok diagramı verilmiştir.
RF KODLAYICI
8 bitlik bir veriyi RF modül üzerinden yollamak için bu verinin yukarıda da bahsettiğim gibi kodlanması gerekir. 8 bitlik datayı yollamak için BAŞLAT, VERİ ve SONLANDIRMA bloğundan oluşan bir çerçeve kullanmak mantıklı olacaktır.
Kodlayıcıya enerji verildiği an BAŞLAT,VERİ ve SONLANDIRMA‘dan oluşan çerçeveyi sürekli yollar. 8 Bitlik verinin yollanması için gerekli çerçeve aşağıdaki gibidir. Bir çerçeve süresi 37 ms dir . Burada kullanılan temel süre 1ms seçilmiştir. Kullanılan RF modülünün hızına göre bu süre değiştirilebilir. Burada kullanılan 1ms temel zaman için:
Data Hızı=8 x 1000ms / 37 ms = 216 bit per second olmaktadır.
Saniyede 216 bit yollanabilir. Bu da saniyede 27 byte demektir. Yukarda da dediğim gibi RF modülünüzün hızına göre bu hız değiştirilebilir.
BAŞLAT Bloğu
Veri yollanmaz iken RF sinyali alıcıya gönderilmemektedir. BAŞLAT bloğu ile verici alıcıya veriyi göndermeye hazırlandığını on/off sinyali ile söyler. Art arda gönderilen bu on/off sinyalleri (burada 3 kez yollanmıştır) ile alıcı, vericinin veri yollamaya hazırlandığını kabul eder ve buna göre hazırlığına başlar.
Başlat sayesinde RF alıcı modülünde bulunun AGC (Otomatik kazanç kontrolü) ünitesi ile alıcı kazanç ayarlaması yaparak kendini kararlı hale getirmeye çalışır. RF Alıcı modülleri içerdikleri AGC ünitesi ile RF verici modülünün kendilerine olan uzaklığa göre kazançlarını otomatik ayarlarlar. Yani verici uzaktaysa modüldeki Rf kuvvetlendiricinin kazncı artırırlar yakındaysa azaltırlar. Aynı olay IR modüllerde vardır. TV kumandanızı TV’ye yaklaştırdıkça alıcının IR kuvvetlendiricisinin kazancı otomatik olarak azaltılırken mesafe artıkkça kazancı artar.
Buradaki kazanç alıcı ve verici arasındaki mesafe artıkkça daha iyi algılar manasında yanlış anlaşılmamalıdır. Tabiki doğal olarak mesafe artıkkça algılama hassasiyeti azalır. AGC sadece alıcı devresinin belli bir aralıkta RF alıcıya gelen sinyalleri incelemek için değişken kazanç kuvvetlendiricisi ile kuvvetlendirilmesine yardımcı olarak alıcının doyuma gitmesi engellenmiş olur.
BAŞLAT bloğu ayrıca verici ile alıcının senkronize olmasını sağlar. Verici bu bloğu yollamaya başlayonca alıcı kendini gelen BAŞLAT sinyaline göre vericiye senkronize etmeye çalışır. BAŞLAT bloğundan sonra gelecek olan verileri doğru zamanda yakalaması için verici BAŞLAT bloğu ile alıcıya zamanlamanı bana göre ayarla demek ister. Alıcı da bu sayede kendine çeki düzen vererek verileri doğru zamanda almak için timer’ını ayarlar. Kısaca BAŞLAT sinyali ile, alıcı gelecek bitlerin zaman pozisyonunu ayarlar.
Böylece her çerçeve başında yollanan BAŞLAT sinyali ile senkronizasyon sağlanarak alıcı ve vericide oluşan frekans kaymalarından kaynaklanacak hatalar asgariye indirilmeye çalışılır. BAŞLAT Bloğunun bir diğer avantajı da 8 bit data yollamak için aynı frkansta yayın yapan birden fazla vericinin ayırt edilmesini sağlar. Bu BAŞLAT bloğunun data biçimi değiştirilerek sağlanabilir. Böylece alıcı BAŞLAT bloğunun biçimine bakarak verinin hangi vericiden geldiğini tespit edebilir.
Buradaki tasarımımızda BAŞLAT bloğu 9ms süreli 3 adet on/off sinyali ve bunu takip eden iki adet on sinyali ve bir adet off sinyalinden oluşmaktadır. Darbe ve boşluk süreleri eşit olup süreleri 1ms dir.
VERI Bloğu
Veri bloğu 8 bitlik verinin yollanması için kullanılır. BAŞLAT ve SONLANDIRMA Bloklarında olduğu gibi temel süre 1ms’dir. VERI Bloğunun toplam süresi 24ms dir. Herbir bit bir sinyali ile başlayıp sıfır sinyali ile biter. Yani her bit bir ve sıfır sinyalini içerir. Bu şekilde yapılmasının nedeni; her bitin hem sıfır hem bir sinyalini içermesini sağlamaktır.
Böylelikle 8 bitlik verinin tamamının bir olması durumunda bile sıfır sinyali, tamamının sıfır olmasında bile bir sinyali gönderilmiş olur. Bu da vericinin veriyi yollarken VERI Bloğunda ne tamamen susmasını ne de sürekli enerji yollamasını engeller. Bu sayade daha güvenli bir veri iletişimi sağlanmış olur.
SONLANDIRMA Bloğu
Veri bloğu gönderildikten hemen sonra art arda 3 kez on siyali ve bunu takip eden 1 adet off yollanır. Art arda 3 kez on siyalinin oldğu tek blok burasıdır. Böylece Başlat, veri ve sonlandır bloklarından oluşan veri çerçevesinin transferi tamamlanmış olur. Vericiye enerji verildiği sürece bu üç blok sürekli yollanır.
RF Kodlayıcı Devresi
RF kodlayıcı devremiz, PORTB’nin girişlerine bağlanmış olan 8 adet anahtarın durumuna göre bilginin alıcıya iletilmesini içermektedir. Alıcıda PORTB’ye bağlanmış olan 8 adet anahtarın durumu vericideki ile aynı olduğu zaman çıkış ON yapılacak şekilde ayarlanmıştır. Böylelikle 256 adet kombinasyon yapılabilmektedir. RF kodlayıcı devremiz aşağıdaki gibidir.
PortB’nin içinde bulunan pul-up dirençleri sayesinde girişlere sadece anahtar bağlamak yeterlidir. Pul-up direçleri sayesinde PortB’nin girişleri hep bir seviyesinde tutulmaktadır. Bu sayede harici direnç ile girişleri bir seviyesinde tutmaya gerek kalmayacaktır. Böylece hiç bir anahtar bağlı değilken verici, veri olarak 11111111 bilgisini yollar. Farzedelimki 11110000 bilgisini yollayacağız: Anahtarlardan RB7, RB6, RB5, RB4 Açık bırakılır, RB3, RB2, RB1, RB0 Anahtarlarını kapatılarak bu bilginin iletilmesini sağlanır.
Vericiye enerji verildiği sürece PORTB’den okuduğu bilgiyi sürekli olarak alıcıya gönderir. Burada temel bir devre verilmiştir. Bu verici devresi PIC12F629, PIC12C508 yada PIC12C509 ile gerçekleştirilerek verici kısmı minyatürleştirilebilir. Bu tür bir uygulamada verici de yollanacak kod yazılım ile sabitlenir. Böylece verici modülü elde taşınabilir hale getirilebilir. Ayrıca bu devrede seri port uygulaması da kullanılarak bilgisayardan veya başka bir kaynaktan alınan veri RF yolu ile alıcıya iletilebilir.
Artık bu temel yaklaşım çerçevesinde diğer uygulamalar tasarımcının hayal gücüne bırakılmıştır. Ekte ASM kodu ve HEX dosyası verilen PIC16F628 programı temel zaman olan 1ms’yiyi elde ettiğimiz ve mikrodenetleyicinin sayıcısı ile oluşturulmuş zamanlama işlemi temelinde yürümektedir. Sayıcı 1ms’de bir kesme üretir ve her kesmede ilgili altprogram ile; sayıcı tekrar 1ms’de kesme üretecek şekilde ayarlanır, Başlat, Veri ve sonlandır bilgileri sıra ile yollanır. Her sonlandır bilgisi yollandıktan sonra PORTB tekrar okunur ve değişen anahtar durumlarına göre yeni veriyi göndermek üzere hafızaya alır. Verinin en ağırlıksız biti LSB ilk önce yollanır.
RF Kod Çözücü Devresi
RF kod çözücü devremiz vericide olduğu gibi PORTB’ye bağlanmış olan anahtarların konumuna göre davranmaktadır. Her alınan doğru sonlandırma bilgisinden sonra PORTB’ye bağlanmış anahtarların konumu gelen veri ile aynı ise PORTA’nın bir nolu çıkışı on yapılır. Çıkış yaklaşık 1 sn’ye kadar on durumunda tutulur. Vericiden her doğru veri alındığında bu 1 sn süresi tekrarlanır. Alıcı her gelen yeni çerçeveye başlat sinyali ile senronize olur.
RS232 bağlantısında olduğu gibi alıcıda veriler verinin yaklaşık tam ortasında kontrol edilir. Böylece verici ve alıcının frekans kaymalarında oluşacak küçük hatalar tolere edilir. Alıcı vericinin gönderdiği bilginin başlat sinyalinin ilk yükselen kenarında senkronizasyonu sağlamak için zamanlayıcısını 500 mikrosaniyeye ayarlar. Bu sayede gelen verinin tam ortasında veri alıcı tarafından alınır. Bundan sonra 1ms’lik gecikmeler oluşturularak her gelen verinin tam ortasında veri doğrulanır.
Yani alıcı vericiye göre 500 mikrosaniye ötelenmiş bir şekilde verileri kontrol eder. Alıcı gelen her verinin başlat, verinin arasında bulunduğu bir ve sıfır sinyalleri ile sonlandır bilgisini bit bit kontrol eder. Eğer bunların birinde hata varsa tekrar başa dönüp ilk yükselen kenarda senkronizasyon yeniden sağlanır. Gelen verinin doğruluğu ise sonlandırma bilgisi doğru bir şekilde alınınca yapılır. Eğer gelen veri doğru ise çıkış on yapılır. Gelen veri doğru olduğu sürece çıkış aktiftir.
Vericide olduğu gibi alıcıda da PortB’nin içinde bulunan pul-up dirençleri sayesinde girişlere sadece anahtar bağlamak yeterlidir. Pul-up direçleri sayesinde PortB’nin girişleri hep bir seviyesinde tutulmaktadır. Bu sayede harici direnç ile girişleri bir seviyesinde tutmaya gerek kalmayacaktır. Böylece hiç bir anahtar bağlı değilken alıcı, veri olarak 11111111 bilgisini kabul eder. Ekte ASM kodu ve HEX dosyası verilen PIC16F628 programı temel zaman olan 1ms’yiyi elde ettiğimiz ve mikrodenetleyicinin sayıcısı ile oluşturulmuş zamanlama işlemi temelinde yürümektedir.
Sayıcı 1ms’de bir kesme üretir ve her kesmede ilgili altprogram ile; sayıcı tekrar 1ms’de kesme üretecek şekilde ayarlanır, Başlat, Veri ve sonlandır bilgileri sıra ile alınır. Her sonlandır bilgisi alındıktan sonra PORTB tekrar okunur ve değişen anahtar durumlarına göre yeni veriyi kabul etmek üzere hafızaya alır.
Verinin en ağırlıksız biti LSB ilk önce alınır. İlk başlat sinyalinde 500 mikrosaniye gecikme yapılırken diğer zamanlarda 1ms lik gecikme yapılır. Her hatalı başlat, sonlandır ve bilgiyi yollamada kullanılan bir ve sıfır bloğu hatalı olduğunda senkronizasyon tekrar başlar. Ayrıca her çerçeve sonunda (başlat, veri ve sonlandır bloğu) tekrar senkronizasyon başlatılır. Böylelikle alıcıdan ya da vericiden kaynaklanan küçük frekans kaymaları tolere edilir.
Aşağıda PIC16F628 ile gerçekleştirilmiş alıcı ve verici için ASM ve HEX dosyaları verilmiştir. Programlar 4MHz kristal frekansına göre yazılmış. MCLR dahili pulup kullanılarak off yapılmış ve Watchdog timer (yazılım kilitlenme izleyicisi) off yapılmıştır.
Kod cozucu asm yazılımı
;PREAMBLE:101010110 ;8 BİT DATA:1D01D01D01D01D01D01D01D0 ;SONLANDIRMA:1110 ;TÜM DATA:101010110 1D01D01D01D01D01D01D01D0 1110 ;HERBİR 1 VE 0 SÜRESİ 10MS #INCLUDE P16F628.INC BITSAYAC EQU H'20' FLAG EQU H'21' CIKIS_ZAMANLAYICI EQU H'22' FLAG2 EQU H'23' IN_RECEIVE EQU 0 ;VERI ALINMAYA BAŞLAYINCA SET OLUR FLAG2'NIN BIT0 ;FLAG ;76543210 ; 00 ----PREAMBLE \ ; 01 ----KOD \MOD ; 10 ----SONLANDIRMA / ; 00 ------BİR \ ; 01 ------DATA \ALTMOD (KOD BÖLÜMÜ İÇİN) ; 10 ------SIFIR / LAST_LOOK EQU 7 ;FLAG BIT7 verinin yükselen kenarında set olur HATA EQU 6 ;FLAG BIT6 verı alınırken hata oluştuğu an set olur, ;senkronizasyonu sağlamak için veri doğru olunca da set olur IN_OUTPUT EQU 5 ;FLAG BIT5 çıkış set olunca set olur KOD_PATTERN EQU H'24' CIKIS_ZAMANLAYICI1 EQU H'25' CIKIS EQU 0 ;PORTA BIT0 VERI EQU 1 ;PORTA BIT1 ; GELEN_KOD EQU B'10100011' GELEN_KOD EQU H'26' ORG 000 GOTO MAIN ORG 004 GOTO INTERRUPT ORG H'10' MAIN MOVLW 0x07 ;Turn comparators off and MOVWF CMCON ;enable pins for I/O ;functions clrf ccp1con ;CCP MODÜLÜ KAPATILDI BCF STATUS, RP1 BSF STATUS, RP0 ;Select Bank1 MOVLW B'11111110' ;Value used to initialize MOVWF TRISA;data direction MOVLW H'FF' MOVWF TRISB MOVLW B'00000101' ;64 MİKROSANİYEDE BİR ARTAR, PUL-UP ENABLE MOVWF OPTION_REG BCF STATUS,RP0 CLRF PORTA CLRF FLAG2 CLRF CIKIS_ZAMANLAYICI CLRF CIKIS_ZAMANLAYICI CLRF FLAG MOVLW D'9' MOVWF BITSAYAC ;PREAMBLE SINYALİ İÇİN SAYAÇ AYARLA ; MOVLW D'100' ;TMR0'I 10MS'YE AYARLA ; MOVLW D'225' ;2MS'YEYE AYARLA MOVLW D'240' ;1MS'YEYE AYARLA ; MOVLW D'248' ;500 MİKOSANİYE MOVWF TMR0 MOVLW H'A0' MOVWF INTCON ;GIE:1 TMR0:1 EDGE_CHECK BTFSS PORTA,VERI GOTO CHECK BTFSC FLAG,LAST_LOOK GOTO EDGE_CHECK BCF INTCON,GIE BSF FLAG,LAST_LOOK BSF FLAG2,IN_RECEIVE movlw b'11111100' andwf flag,1 MOVLW D'9' ;HATA OLUNCA MOVWF BITSAYAC ;PREAMBLE SINYALİ İÇİN SAYAÇ AYARLA ;MOVLW D'178' ;TMR0:5ms AYARLA ; MOVLW D'240' ;1MS'YEYE AYARLA MOVLW D'248' ;500 MİKROSANİYE ; MOVLW D'252' ;256 MİKROSANİYE MOVWF TMR0 BSF INTCON,GIE MOVF PORTB,0 MOVWF GELEN_KOD ;************************HATA OLMADIĞI SÜRECE BURADA LOOP YAPAR********** LOOP BTFSS FLAG,HATA GOTO LOOP ;************************************************************************** MOVF PORTB,0 MOVWF GELEN_KOD BCF FLAG,HATA BCF FLAG2,IN_RECEIVE GOTO EDGE_CHECK CHECK BCF FLAG,LAST_LOOK GOTO EDGE_CHECK ;*******************İNTERRUPT RUTİNİ (10MS)********************** ORG H'50' INTERRUPT BCF INTCON,T0IF BTFSS FLAG,IN_OUTPUT GOTO SDEVAM DECFSZ CIKIS_ZAMANLAYICI GOTO SDEVAM DECFSZ CIKIS_ZAMANLAYICI1 GOTO SDEVAM BCF FLAG,IN_OUTPUT BCF PORTA,CIKIS SDEVAM BTFSS FLAG2,IN_RECEIVE GOTO TIMERAYARLA MOVF FLAG,0 ANDLW B'00000011' ;EĞER PREAMBLE MODDA İSE DEVAM ET BTFSS STATUS,Z ;DEĞİLSE KOD MODUNA BAK GOTO KOD ;********************PREAMBLE KONTROL************ MOVLW D'2' XORWF BITSAYAC,0 BTFSS STATUS,Z GOTO PREDEVAM GOTO ON PREDEVAM MOVLW D'1' XORWF BITSAYAC,0 BTFSC STATUS,Z GOTO SAYACKONTROL BTFSC BITSAYAC,0 GOTO ON GOTO OFF ;************************************************* ON BTFSS PORTA,VERI GOTO HATALI GOTO SAYACKONTROL OFF BTFSC PORTA,VERI GOTO HATALI GOTO SAYACKONTROL ;******************KOD KONTROL********************* KOD BTFSS FLAG,0 ;KOD MODUNDA İSE DEAM ET GOTO SONLANDIR ;DEĞİLSE SONLANDIRMA MODUNA GEÇ MOVF FLAG,0 ANDLW B'00001100' BTFSS STATUS,Z ;BIR ALTMODUNDA İSE BIRI AL GOTO KOD1 ;DEĞİSE DATAYA GİT BSF FLAG,2 ;DATA ALTMODUNA GEÇ GOTO ON KOD1 BTFSS FLAG,2 GOTO ZERO ;DATA ALTMODUNDA İSE DATAYI AL BSF STATUS,C ;DEĞİLSE SIFIRI ALMAYA GİT BTFSC PORTA,VERI GOTO GEC BCF STATUS,C GEC RRF KOD_PATTERN BCF FLAG,2 ;SIFIR ALTMODUNA GEÇ BSF FLAG,3 GOTO SAYACKONTROL ZERO BCF FLAG,3 ;BİR ALTMODUNA GEÇ GOTO OFF ;************************************************************ SONLANDIR MOVF BITSAYAC,0 XORLW D'1' BTFSS STATUS,Z GOTO ON GOTO OFF ;************************************************************ SAYACKONTROL DECFSZ BITSAYAC GOTO TIMERAYARLA BTFSC PORTA,VERI ;EN SON BITIN SIFIR OLMASI GEREKIR GOTO HATALI ;DEĞİLSE HATALIDIR MOVF FLAG,0 ANDLW B'00000011' ;MOD KONTROL BTFSS STATUS,Z ;EĞER PREAMLE MODUNDA İSE GOTO KODMODU MOVLW D'24' MOVWF BITSAYAC BSF FLAG,0 ;KOD MODUNA GEÇ GOTO TIMERAYARLA KODMODU BTFSS FLAG,0 GOTO SONLANDIRMODU ;EĞER KOD MODUNDA İSE MOVLW D'4' MOVWF BITSAYAC BCF FLAG,0 ;SONLANDIR MODUNA GEÇ BSF FLAG,1 GOTO TIMERAYARLA SONLANDIRMODU MOVLW D'9' ;EĞER SONLANDIR MODUNDA İSE MOVWF BITSAYAC BCF FLAG,1 ;PREAMBLE MODUNA GEC MOVF KOD_PATTERN,0 XORWF GELEN_KOD,0 BTFSS STATUS,Z GOTO HATALI ;VERİ DOĞRU İSE ÇIKIŞI SET ET VE 1 SN AKTİF KALMASINI SAĞLA VE YENİ GELEN VERİ İÇİN BSF FLAG,IN_OUTPUT ;TEKRAR SENKRONİZASYONU BAŞLATMAK İÇİN HATA BİTİNİ SET ET (HATA BİTİ SET OLUNCA ; MOVLW D'100' ;VERİNİN İLK YÜKSELEN KENARINDA TIMER 5MS'YEYE AYARLANIR ; MOVLW D'255' MOVLW D'250' MOVWF CIKIS_ZAMANLAYICI MOVLW D'4' MOVWF CIKIS_ZAMANLAYICI1 BSF PORTA,CIKIS GOTO HATALI TIMERAYARLA ; MOVLW D'100' ;10 ms AYARLA ; MOVLW D'225' ;2MS'YEYE AYARLA MOVLW D'240' ;1MS'YEYE AYARLA ; MOVLW D'248' ;500 MİKOSANİYE MOVWF TMR0 RETFIE HATALI BSF FLAG,HATA ;GELEN BILGININ HERHANGİ BİR BÖLÜMÜ HATALI İSE YADA ALINAN VERI PAKETİ DOĞRU İSE GOTO TIMERAYARLA ;TIMER 5ms'YEYE AYARLANIR VE İLK YÜKSELEN KENARDA ;TEKRAR KONTROL BAŞLAR END
Kodlayıcı asm yazılımı
;PREAMBLE:101010110 ;8 BİT DATA:1D01D01D01D01D01D01D01D0 ;SONLANDIRMA:1110 ;TÜM DATA:101010110 1D01D01D01D01D01D01D01D0 1110 ;HERBİR 1 VE 0 SÜRESİ 10MS #INCLUDE P16F628.INC BITSAYAC EQU H'20' FLAG EQU H'21' CIKIS_ZAMANLAYICI EQU H'22' FLAG2 EQU H'23' IN_RECEIVE EQU 0 ;VERI ALINMAYA BAŞLAYINCA SET OLUR FLAG2'NIN BIT0 ;FLAG ;76543210 ; 00 ----PREAMBLE \ ; 01 ----KOD \MOD ; 10 ----SONLANDIRMA / ; 00 ------BİR \ ; 01 ------DATA \ALTMOD (KOD BÖLÜMÜ İÇİN) ; 10 ------SIFIR / LAST_LOOK EQU 7 ;FLAG BIT7 verinin yükselen kenarında set olur HATA EQU 6 ;FLAG BIT6 verı alınırken hata oluştuğu an set olur, ;senkronizasyonu sağlamak için veri doğru olunca da set olur IN_OUTPUT EQU 5 ;FLAG BIT5 çıkış set olunca set olur KOD_PATTERN EQU H'24' CIKIS_ZAMANLAYICI1 EQU H'25' VERI EQU 0 ;PORTA BIT0 CIKIS EQU 1 ;PORTA BIT1 ; GELEN_KOD EQU B'10100011' GELEN_KOD EQU H'26' ORG 000 GOTO MAIN ORG 004 GOTO INTERRUPT ORG H'10' MAIN MOVLW 0x07 ;Turn comparators off and MOVWF CMCON ;enable pins for I/O ;functions clrf ccp1con ;CCP MODÜLÜ KAPATILDI BCF STATUS, RP1 BSF STATUS, RP0 ;Select Bank1 MOVLW B'11111101' ;Value used to initialize MOVWF TRISA;data direction MOVLW H'FF' MOVWF TRISB MOVLW B'00000101' ;64 MİKROSANİYEDE BİR ARTAR, PUL-UP ENABLE MOVWF OPTION_REG BCF STATUS,RP0 CLRF PORTA CLRF FLAG2 CLRF CIKIS_ZAMANLAYICI CLRF CIKIS_ZAMANLAYICI CLRF FLAG MOVLW D'9' MOVWF BITSAYAC ;PREAMBLE SINYALİ İÇİN SAYAÇ AYARLA ; MOVLW D'100' ;TMR0'I 10MS'YE AYARLA ; MOVLW D'225' ;2MS'YEYE AYARLA MOVLW D'240' ;1MS'YEYE AYARLA ; MOVLW D'248' ;500 MİKOSANİYE MOVWF TMR0 MOVLW H'A0' MOVWF INTCON ;GIE:1 TMR0:1 EDGE_CHECK BTFSS PORTA,VERI GOTO CHECK BTFSC FLAG,LAST_LOOK GOTO EDGE_CHECK BCF INTCON,GIE BSF FLAG,LAST_LOOK BSF FLAG2,IN_RECEIVE movlw b'11111100' andwf flag,1 MOVLW D'9' ;HATA OLUNCA MOVWF BITSAYAC ;PREAMBLE SINYALİ İÇİN SAYAÇ AYARLA ;MOVLW D'178' ;TMR0:5ms AYARLA ; MOVLW D'240' ;1MS'YEYE AYARLA MOVLW D'248' ;500 MİKROSANİYE ; MOVLW D'252' ;256 MİKROSANİYE MOVWF TMR0 BSF INTCON,GIE MOVF PORTB,0 MOVWF GELEN_KOD ;************************HATA OLMADIĞI SÜRECE BURADA LOOP YAPAR********** LOOP BTFSS FLAG,HATA GOTO LOOP ;************************************************************************** MOVF PORTB,0 MOVWF GELEN_KOD BCF FLAG,HATA BCF FLAG2,IN_RECEIVE GOTO EDGE_CHECK CHECK BCF FLAG,LAST_LOOK GOTO EDGE_CHECK ;*******************İNTERRUPT RUTİNİ (10MS)********************** ORG H'50' INTERRUPT BCF INTCON,T0IF BTFSS FLAG,IN_OUTPUT GOTO SDEVAM DECFSZ CIKIS_ZAMANLAYICI GOTO SDEVAM DECFSZ CIKIS_ZAMANLAYICI1 GOTO SDEVAM BCF FLAG,IN_OUTPUT BCF PORTA,CIKIS SDEVAM BTFSS FLAG2,IN_RECEIVE GOTO TIMERAYARLA MOVF FLAG,0 ANDLW B'00000011' ;EĞER PREAMBLE MODDA İSE DEVAM ET BTFSS STATUS,Z ;DEĞİLSE KOD MODUNA BAK GOTO KOD ;********************PREAMBLE KONTROL************ MOVLW D'2' XORWF BITSAYAC,0 BTFSS STATUS,Z GOTO PREDEVAM GOTO ON PREDEVAM MOVLW D'1' XORWF BITSAYAC,0 BTFSC STATUS,Z GOTO SAYACKONTROL BTFSC BITSAYAC,0 GOTO ON GOTO OFF ;************************************************* ON BTFSS PORTA,VERI GOTO HATALI GOTO SAYACKONTROL OFF BTFSC PORTA,VERI GOTO HATALI GOTO SAYACKONTROL ;******************KOD KONTROL********************* KOD BTFSS FLAG,0 ;KOD MODUNDA İSE DEAM ET GOTO SONLANDIR ;DEĞİLSE SONLANDIRMA MODUNA GEÇ MOVF FLAG,0 ANDLW B'00001100' BTFSS STATUS,Z ;BIR ALTMODUNDA İSE BIRI AL GOTO KOD1 ;DEĞİSE DATAYA GİT BSF FLAG,2 ;DATA ALTMODUNA GEÇ GOTO ON KOD1 BTFSS FLAG,2 GOTO ZERO ;DATA ALTMODUNDA İSE DATAYI AL BSF STATUS,C ;DEĞİLSE SIFIRI ALMAYA GİT BTFSC PORTA,VERI GOTO GEC BCF STATUS,C GEC RRF KOD_PATTERN BCF FLAG,2 ;SIFIR ALTMODUNA GEÇ BSF FLAG,3 GOTO SAYACKONTROL ZERO BCF FLAG,3 ;BİR ALTMODUNA GEÇ GOTO OFF ;************************************************************ SONLANDIR MOVF BITSAYAC,0 XORLW D'1' BTFSS STATUS,Z GOTO ON GOTO OFF ;************************************************************ SAYACKONTROL DECFSZ BITSAYAC GOTO TIMERAYARLA BTFSC PORTA,VERI ;EN SON BITIN SIFIR OLMASI GEREKIR GOTO HATALI ;DEĞİLSE HATALIDIR MOVF FLAG,0 ANDLW B'00000011' ;MOD KONTROL BTFSS STATUS,Z ;EĞER PREAMLE MODUNDA İSE GOTO KODMODU MOVLW D'24' MOVWF BITSAYAC BSF FLAG,0 ;KOD MODUNA GEÇ GOTO TIMERAYARLA KODMODU BTFSS FLAG,0 GOTO SONLANDIRMODU ;EĞER KOD MODUNDA İSE MOVLW D'4' MOVWF BITSAYAC BCF FLAG,0 ;SONLANDIR MODUNA GEÇ BSF FLAG,1 GOTO TIMERAYARLA SONLANDIRMODU MOVLW D'9' ;EĞER SONLANDIR MODUNDA İSE MOVWF BITSAYAC BCF FLAG,1 ;PREAMBLE MODUNA GEC MOVF KOD_PATTERN,0 XORWF GELEN_KOD,0 BTFSS STATUS,Z GOTO HATALI ;VERİ DOĞRU İSE ÇIKIŞI SET ET VE 1 SN AKTİF KALMASINI SAĞLA VE YENİ GELEN VERİ İÇİN BSF FLAG,IN_OUTPUT ;TEKRAR SENKRONİZASYONU BAŞLATMAK İÇİN HATA BİTİNİ SET ET (HATA BİTİ SET OLUNCA ; MOVLW D'100' ;VERİNİN İLK YÜKSELEN KENARINDA TIMER 5MS'YEYE AYARLANIR ; MOVLW D'255' MOVLW D'250' MOVWF CIKIS_ZAMANLAYICI MOVLW D'4' MOVWF CIKIS_ZAMANLAYICI1 BSF PORTA,CIKIS GOTO HATALI TIMERAYARLA ; MOVLW D'100' ;10 ms AYARLA ; MOVLW D'225' ;2MS'YEYE AYARLA MOVLW D'240' ;1MS'YEYE AYARLA ; MOVLW D'248' ;500 MİKOSANİYE MOVWF TMR0 RETFIE HATALI BSF FLAG,HATA ;GELEN BILGININ HERHANGİ BİR BÖLÜMÜ HATALI İSE YADA ALINAN VERI PAKETİ DOĞRU İSE GOTO TIMERAYARLA ;TIMER 5ms'YEYE AYARLANIR VE İLK YÜKSELEN KENARDA ;TEKRAR KONTROL BAŞLAR END
www.circuitcellar.com
http://www.interq.or.jp/japan/se-inoue/e_menu.htm
Yazarın ilave notları:
Yukarıdaki temel tasarımı 2004 yılında bu konuda çalışmalar yapmak isteyen arkadaşlara yol göstermesi amacı ile hazırlamıştım. Site istatistiklerinden gördüğüm kadarı ile en çok talep gören sayfalardan biri olmuştur. Yukarıdaki verilen örnek tasarım sorunsuz çalışmaktadır.
Ancak hazır modüller ile tasarım yapan arkadaşların daha fazla RF gürültüsünün olduğu, yada birden fazla vericin olduğu durumlarda yukarıdaki anlatılanlara ilava olarak aşağıdaki husularıda dikkate almaları faydalı olacaktır. :
Bu tür modüller ile iletisim kurmak için
1. Preamble (baslangiç)+Senkron+Bilgi+sonlandirma+CRC seklinde bir veri yollanabilir. (Dikkat edilirse yukarıdaki protokole sadece senkron ve CRC ilave edilmiştir)
PREAMBLE (BAŞLAT) Aliciyi kararli bir düzeye getirmek için yapilir. Arka arkaya 3-4 adet h’AA’ yada h’55 ya da bunlarin karsiligi olan B’10101010′ seklindedir. Verici bir bilgi yollayacagi zaman preamble gönderir. Alici bu bu bilginin dogru gelip gelmedigini kontrol etmez. Bu preamble bilgisinin aliciya kaç tanesinin ulasacagi meçhuldür, çünkü alici kendini kararli hale getirmeye çalismaktadir. Preamble sayesinde RF alıcı modülünde bulunun AGC (Otomatik kazanç kontrolü) ünitesi ile alıcı kazanç ayarlaması yaparak kendini kararlı hale getirmeye çalışır.
RF Alıcı modülleri içerdikleri AGC ünitesi ile RF verici modülünün kendilerine olan uzaklığa göre kazançlarını otomatik ayarlarlar. Yani verici uzaktaysa modüldeki Rf kuvvetlendiricinin kazncı artırırlar yakındaysa azaltırlar. Aynı olay IR modüllerde vardır. TV kumandanızı TV’ye yaklaştırdıkça alıcının IR kuvvetlendiricisinin kazancı otomatik olarak azaltılırken mesafe artıkkça kazancı artar.
Buradaki kazanç alıcı ve verici arasındaki mesafe artıkkça daha iyi algılar manasında yanlış anlaşılmamalıdır. Tabiki doğal olarak mesafe artıkkça algılama hassasiyeti azalır. AGC sadece alıcı devresinin belli bir aralıkta RF alıcıya gelen sinyalleri incelemek için değişken kazanç kuvvetlendiricisi ile kuvvetlendirilmesine yardımcı olarak alıcının doyuma gitmesi engellenmiş olur.
SENKRON Alicinin vericiden gelen bilgiye göre bit süresine kendini ayarlamasi içindir. Bir tür start pulsi olarak düsünülebilir. Alici sürekli alma modunda vericinin senkron bilgisini gönderip göndermedigini kontrol eder. Senkron bilgiside 3-4 tane H’0F’ gibi bir bilgi olabilir. Senkron ayni zamanda farkli vericileri birbirinden ayirmak içinde kullanilabilir.
BİLGİ: Gönderilmek istenen bilgidir. Ancak gönderilecek bilginin tamamen sifir ya da tamamen bir olmasina karsin tedbir olarak her bite bir ve sifir bilgisi eklenmesi faydali olacaktir. Böylece bilginin tamamen sifir olmasi durumunda verici ne tamamen susacak, nede verinin tamamen bir olmasi durumunda tamamen enerji yayacaktir.
SONLANDIRMA: herhengi bir biçimde bir bilgi olabilir. verinin gönderiminin tamamllandigini belirtmek için
CRC: Gönderilen bitlerin doğruluğunu kontrol etmek için bir kontrol kodu olabilir.
2. Bazı hazır RF modüllerinin üzerinde çalışabileceği hız bilgisi verilmiştir. Örneğin basit modüllerin çoğunda Daata hizi bilgisi 2.4 Kbps olarak verilmektedir. Bu şu demektir saniyede 2400 bit gönderebilir demektir. Burdan bir biti yollamak için gereken süre :bit süresi minimum=1/2400=416 mikrosaniye olabilir demektir. Buna güvenlik faktörüde eklersek bit süresi 600-700 mikro saniye seçilebilir. Bunun altinda seçilecek bit sürelerinde vericinin doyuma gitme olayi ortaya çikabilir (yanlis bir kelime kullanmis olabilirim). Bu nedenle seçilecek darbe ve boşluk sürelerinde verici ve alıcının çalışabileceği hız bilgisine göre hesaplama yapmak doğru olacaktır.
Şifre-Pass: 320volt.com
Yayım tarihi: 2009/05/04 Etiketler: microchip pic projeleri, pic16f628 rf, rf iletişim, rf kod çözücü, rf kodlayıcı
Çok faydalı bir yazı olmuş gerçekten. Özellikle rf modül kullanımında internetteki assembly kod örneği eksiğini önemli ölçüde kapatmış.
Üzerinde çalıştığım bir rf modül projesi var. Projede tek bir alıcı ve 2 adet verici var. Vericiler tek tek çalıştığında bir sorun olmuyor; veriyi alıp alıcı tarafında hangi vericinin gönderdiğine göre ayıklayabiliyorum. Ama herhangi bir anda vericilerin ikisi birden çalıştığında alıcı tarafında çok manasız veriler alıyorum ve vericiler iletim yapmağı kestiklerinden sonra bile sistemin tekrar eski kararlı durumuna dönmesi en az 5-6 saniye alıyor, bu da ciddi bir problem oluşturuyor proje için.
Aynı anda iki vericinin de veri gönderdiği durumda veri alımındaki bu karmaşayı nasıl önleyebilirim. 1. verici çalışırken ve alıcı tarafında onun gönderdiği veriler yorumlanırken 2. verici de çalışmaya başlarsa, sistem kararsız duruma geçmeden 2. vericinin gönderdiği bilgileri elimine ederek alıcı tarafında sadece daha önce çalışmaya başlamış olan 1. vericinin gönderdiği verileri alıp yorumlama imkanım var mıdır? Ya da bu mümkün değilse en azından herhangi bir zamanda iki vericinin de aynı anda çalışması durumunda alıcı tarfında oluşan kararsızlık durumunu en kısa sürede nasıl aşabilirim.
Projemde 433 MhZ lik hazır alıcı ve verici modüller kullanıyorum. Alıcı ve vericiler açık alanda ve aralarında en fazla 10 mt mesafe olacak şekilde çalışacaklar. İletişimde rs232 protokolü ile 1000 lik baud rate kullanıyorum. Yardımcı olursanız sevinirim.
merhaba cosar arkadaşım, bende rf ile ilgili bir proje yapmak istiyorum, assembly dilini yeni öğreniyorum, onca araştırma yaptım ama assembly dilinde 433 Mhz lik ATX alıcı – verici çiftiyle nasıl data iletimi yapabiliceğim konusunda acıklayıcı bir bilgi bulamadım doğru dürüst, bu konuda bana yardımcı olma şansın varmı? zor durumda kaldım çok, yardım edersen oldukca memnun olurum teşekükür ederim
RF iletişimi için assembly pek tercih edilmeyen bir dildir. Çünkü bu iletişimde alıcı ile vericinin senkronize olması, gönderilen verinin kodlanması, gelen verinin kodunun çözümlemesi işlemleri falan biraz karışık olduğu için assembly kullanılacaksa kuvvetli bir assembly kodlama bilgisi gerektiriyor. Benim tavsiyem bu konu hakkında proje yapacaksan CCS C ya da MikroC gibi dilleri kullanman. İlla assembly ile programlama yapmak istiyorsan bu sayfadaki asm kodları yeterlidir bence diye düşünüyorum.
Kolay gelsin.