Elektronik / Mikrodenetleyici Projeleri/

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

Sponsorlu Bağlantılar

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.

kodlayici-kod-cozucu

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.

darbesuresi-bosluksuresi-data-suresi

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.

baslat-blogu-sure

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.

veri-blogu

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.

sonlandirma-blogu

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.

pic16f628-rf-kodlayici-devresi

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.

verici-alici-baslat-blogu

rf-alici

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.

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

Dosya indirme LINK listesi (TXT formatında) link-6800.zip şifre-pass: 320volt.com

  • cosar

    Ç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.

  • emrecan

    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

  • cosar

    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.