PIC16F628 rf kodlayıcı kod çözücü tasarımı

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.
Yazar: gevv
Yazarımızın 320volt.com Blog üzerinde şu an okuduğunuz yazı dahil 1893 yazısı bulunmaktadır. Yazarımız hakkında bilgileri ve diğer yazılarını görmek için bakınız; gevv











Yazılar e-postanıza gönderilsin
Ç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.