usart haberleşme hakkında örnek kod

Başlatan tmr01, 14 Ocak 2007, 23:46:57

tmr01

merhaba.
usart haberleşmenin nasıl kullanılacağı ve örnek bir prgrama ihtiyacım var.
yardımcı olabilecek arkdaşlar var mı acaba.

kullandığım picler.
veri gönderecek olan:16f877
alacak olan:16f628
gönderilecek bilgi: 3 adet değişken:

1:yuzde :sayısal bir değer 1 ile 99 arasında
2:zaman sayısal bir değer 1 ile 200 arasında
3:basla : baslama butonuna basıldığında "butona basıldı" bilgisi.
  bunun nasıl olacağını tam kestiremedim.

teşekkürler.

alieren

alici ve verici kodlar ve ikiside f628 uzerinen yazilmis. tam olarak istedigin se değil ama degistirerek kulanabilirsin.
4mhz kristal, 9600bps hizda iletisim yapiyor. verici alici uniteye B'01001011' bilgisini gonderiyor. eger bu gonderilen bilgi alici unuteye dogru ulasmissa alici porta,0 pinine bagli ledi yakiyor.değilse yeniden almayi bekliyor.



;VERICI.ASM
   

   LIST   P=16F628
   #INCLUDE   <P16F628.INC>
   __CONFIG   B'11110101101001'

SAYAC   EQU   0X20

   ORG   0X0000

   MOVLW   0X07
   MOVWF   CMCON

   CLRF   PORTA
   CLRF   PORTB
   BSF   STATUS,5
   MOVLW   B'00100001'
   MOVWF   TRISA
   MOVLW   B'00000010'
   MOVWF   TRISB

   MOVLW   D'25'
   MOVWF   SPBRG
   MOVLW   B'00100100'
   MOVWF   TXSTA
   BCF   STATUS,5
   BSF   RCSTA,7
   
   CLRF   SAYAC
DON   DECFSZ   SAYAC,F
   GOTO   DON
BAS   BTFSS   PORTA,0
   CALL   SIFRE
   GOTO   BAS

GONDER
   MOVWF   TXREG
   BSF   STATUS,5

KONTROL
   BTFSS   TXSTA.TRMT
   GOTO   KONTROL
   BCF   STATUS,5
   RETURN

SIFRE
   BSF   PORTB,2
   MOVLW   B'01001011'
   CALL   GONDER
   RETURN
   END


;ALICI.ASM
   

   LIST   P=16F628
   #INCLUDE   <P16F628.INC>
   __CONFIG   B'11110101101001'


   ORG   0X0000

   MOVLW   0X07
   MOVWF   CMCON

   CLRF   PORTA
   CLRF   PORTB
   BSF   STATUS,5
   CLRF   TRISA
   MOVLW   B'00000010'
   MOVWF   TRISB

   MOVLW   D'25'
   MOVWF   SPBRG
   BSF   TXSTA,2
   BCF   STATUS,5
   MOVLW   B'10010000'
   MOVWF   RCSTA
   
BAS   CALL   AL
   XORLW   B'01001011'
   BTFSC   STATUS,2
   BSF   PORTA,0
   GOTO   BAS
AL
   BTFSS   PIR1,RCIF
   GOTO   AL
   MOVF   RCREG,W
   RETURN
   END

ete

Gerek Basic de ve gerekse Asm de USAR haberleşme paremetrelerinin ayarlanması en büyük sorunu teşkil etmektedir.
BU işi çok kolay hale getiren bir program yapılmış. Linki aşağıda veriyorum.

http://www.mister-e.org/pages/utilitiespag.html

BU programda her iki pic için veya haberleşilecek diğer araç için paremetreleri yani Osilatör frekansını ve haberleşmek istediğiniz hızı belirleyip hesap yaptırıyor ve bu hesaba göre elde edilen parametreleri clipboarda kopyalatabiliyorsunuz. Geriye prigramınızın başına gelip Paste yapmak kalıyor. Ben programı yeni gördüm ve hemen bir deneme yaptım.
İki  pic'i haberleştirdim oradan elde ettiğim parametreler ile gayet güzel haberleşiyorlar.
Üstelik seçtiğiniz hızların uygun olup olmadıklarını hata yüzdesi olarak görebiliyorsunuz. Her kese tavsiye ederim.

Şimdi bu parametreleri aldıktan sonra alıcıda yalnızca tek satır olarak;


hSerIn ,[WAIT("TMR"), YUZDE, ZAMAN.BASLA]

şeklinde bir satır yazmak yeterli olacaktır.
Verici kısmında ise biraz daha detay vermek gerekiyor. Şöyle;
    HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandırma sinyali preambl
     HSEROUT [("T"),("M"),("R"), YUZDE,ZAMAN,BASLA]
     HSEROUT [("T"),("M"),("R"), YUZDE,ZAMAN,BASLA]
     HSEROUT [("T"),("M"),("R"), YUZDE,ZAMAN,BASLA]
     HSEROUT [("T"),("M"),("R"), YUZDE,ZAMAN,BASLA]
     HSEROUT [("T"),("M"),("R"), YUZDE,ZAMAN,BASLA]

şeklinde bir kaç defa kodu emniyet açısından tekrarlamak gerekmektedir.
Dediğim gibi diğer parametreler yukarıda bahsini ettiğim programdan gelecektir.
Daha kolay anlayabilmen için 4 Mhz kristal frekansı ve 9600 Baud haberleşme hızına göre tespit edilen parametreleri buraya veriyorum. Bunlar programın baş kısmında yer alacaktır.

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically


Burada kritik konu haberleşme hızıdır. Keyfi olarak seçilmemesi gerekir. Kristal frekansına en uygun haberleşme hızı seçilip işlem ona göre yapılmalıdır.

KOlay Gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

mytap

USART kesmelerini kullanmak daha mantıklı geliyor.İşlemci bir işi tekrarlarken gelen veriyi kaçırma olasılığı çok fazla. Bu iş için en güzel metot kesme kullanmaktır.

INTCON=%11000000 ; ile intconun 6.ve 7. bitlerini 1'e set ediyoruz. 7.bit global interrupları acar. 6.bit ise USART interruptlarını açar.

PIR1.5 ;registeri RX alıcı modunun bayrağıdır. PIR1.4 TX verici modunun bayrağıdır. Herhangi bir bilgi geldiğinde yada gittiğinde bu bayrak 1 e set edilir. RCREG registeri SİLİNENE & OKUNANA kadar bu bayrak 0 olmaz!


Şimdi bir örnek verelim;

DEĞİŞKENLER : VERI, AL_1, AL_2, AL_3 ve RC_VERI OLSUN


INTCON=%11000000
ON INTERRUPT GOTO Usart_Kesme

Basla:
      
         Hserout [Dec VERI]
         PAUSE 10
Goto Basla

Disable
Usart_Kesme:

         RC_VERI=RCREG ; Burda RCREG okundu ve PIR1.5 registeri silindi
         IF RC_VERI = "A" THEN HSERIN [DEC AL_1] 
         IF RC_VERI = "B" THEN HSERIN [DEC AL_2]
         IF RC_VERI = "C" THEN HSERIN [DEC AL_3]
RESUME
ENABLE
END


877 için 20mhz xtal ile 9600 baund da sorunsuz veri transferi yapılabilir. Proton kullandığım için genel bir açıklama yapmaya çalıştım. Fakat mantık yine aynı olması gerek.
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

tmr01

çok teşekkürler sabahı zor ettim cevap gelirmi diye.

gelmiş bile.
hemen denemelere başlıyorum
denemeler hakkında bilgi paylaşacağım

teşekkürler

climax

Yardımcı olan arkadaşlara teşekkürler.Usart konusunda gerçekten arkadaşa çok farklı yönlerden yardımcı olmuşlar.Tabi arkadaşın sayesinde bizlerede.Paylaşımınız için tekrar teşekkürler.:)
Paylaşmak düsturumuzdur.

tmr01

Ete hocam
isis te sizin verdiğiniz bilgiler doğrultusunda yazılımı yaptım ancak şöyle bir sorun var gibi.

gönderici kısımdan bilgi gelmediği sürece takılı kalıp bekliyor. başka bi işlem yapamıyorum. burda beklemeden programın akışına devamettirme imkanımız olurmu. devam ettirdiğimizde ise senkron yakalamak güçleşir mi?


bunun için usart kesmesi kullanmak daha mantıklı geldi. ama onunda parametreleri var sanırım.

deneme yanılma ile bişeyler yapmaya çalıştım usart kesmesi ile ilgili ama beceremedim.

mytap arkadaşımızın verdiği kodlarda takıldığım yerler var.


1. gönderici pic'e ne gibi tanımlama yapmalıyım.
2. gönderilecek veri: zaman,guc diyelim.
3. alıcı pic'e nasıl bi tanımlama yapmalı
4 alıcı bilgide gelen zaman ve guc bilgilerini nasıl degiskenlere aktarıyorum

sadece picbasic pro (oda henüz çok çok başındayım) biliyorum.

teşekkürler.

Veli B.

BURADA kesme ile ilgili bilgiler verilmiş. Bir inceleyin isterseniz.

tmr01

yazdığım prgramı derlerken pbp alt kısımda şu hata mesajı çıkıyor.
ne anlama geliyor acaba?

warn:pro5.asm 664:[102] code crosses boundary @800h

sitenindelisi

hata mesajı değil uyarı mesajı. Asm kod bloğu gömecek olursanız bankları ihmal etmemeniz için. Çalışmasına engel teşkil etmez. Üretilen hex kodu yükleyip çalıştırabilirsiniz.

mytap

Alıntı yapılan: "katana"BURADA kesme ile ilgili bilgiler verilmiş. Bir inceleyin isterseniz.

yukardaki bölümde geniş bir bilgi var daha önce benim başımada böyle bir problem gelmişti. Yine anlamadığın takıldığın bişey olursa sorabilirsin
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

tmr01

ne yazıkki belki 30 kez okumama rağmen ve her türlü varyasyonları denememe rağmen yetersiz kaldım.

usart kesmesini halledemedim.

kodları versem hatanın nerede olduğu konusunda bana yardımcı olurmusunuz?
' gönderici program 16f877
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'****************************************************************
adcon1=7
' -------------- haberlesme define
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive 
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1 
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 0,16% 
DEFINE HSER_CLROERR 1 ' Clear overflow automatically 

'---------------------lcd define

DEFINE LCD_DREG PORTb 	'LCD data bacaklari hangi porta bagli ?  
DEFINE LCD_DBIT 0 		'LCD data bacaklari hangi bitten basliyor ? 
 
DEFINE LCD_EREG PORTd 	'LCD Enable Bacagi Hangi Porta bagli ? 
DEFINE LCD_EBIT 6		'LCD Enable Bacagi Hangi bite bagli ? 

DEFINE LCD RWREG PORTd  'LCD R/W Bacagi Hangi Porta bagli ? 
DEFINE LCD_RWBIT 5 	 'LCD R/W Bacagi Hangi bite bagli ? 

DEFINE LCD_RSREG PORTd 	'LCD RS Bacagi Hangi Porta bagli ?
DEFINE LCD_RSBIT 4 		'LCD RS bacagi Hangi Bite bagli ? 

DEFINE LCD_BITS 4 		'LCD 4 bit mi yoksa 8 bit olarak ba?ly ?
DEFINE LCD_LINES 4 		'LCD Kaç syra yazabiliyor ?

 
GUC var byte
ZAMAN VAR BYTE

a var word  ' FORNEXT ICIN
B VAR WORD   ' FORNEXT ICIN

lcdout $fe,1
pause 300
 pause 1000
GUC=50
ZAMAN=90

' veri gönder 

for a=1 to 40
gosub gonder
lcdout 254,1,dec a," kez bilgi gitti"
lcdout 254,192,"guc:",dec guc," zaman:",dec zaman
next a

gonder:
 HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl 
     HSEROUT ["t",ZAMAN,guc] 
     HSEROUT ["t",ZAMAN,guc] 
     HSEROUT ["t",ZAMAN,guc] 
     HSEROUT ["t",ZAMAN,guc] 
     
     'HSEROUT [("T"),("M"),("R"), STARTBIT,ZAMAN,GUC] 
     'HSEROUT [("T"),("M"),("R"), STARTBIT,ZAMAN,GUC] 
     'HSEROUT [("T"),("M"),("R"), STARTBIT,ZAMAN,GUC] 
     'HSEROUT [("T"),("M"),("R"), STARTBIT,ZAMAN,GUC] 
     'HSEROUT [("T"),("M"),("R"), STARTBIT,ZAMAN,GUC] 
resume    

alıcı kısım
'alıcı pic 16f628
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'****************************************************************
' -------------- haberlesme define
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive 
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1 
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 0,16% 
DEFINE HSER_CLROERR 1 ' Clear overflow automatically 

INTCON=%11010000

ON INTERRUPT GOTO INT 

SYMBOL GIE  =INTCON.7 
SYMBOL PEIE =INTCON.6 
SYMBOL RCIE =PIE1.5 
SYMBOL RCIF =PIR1.5 


temp var word
a var word          ' for next döngü için
kesme var byte
ZAMAN VAR BYTE
guc var byte

RCIE=1 
PEIE=1 
GIE=1

' *********************** lcd defines
DEFINE LCD_DREG PORTA 	'LCD data bacaklari hangi porta bagli ?  
DEFINE LCD_DBIT 0		'LCD data bacaklari hangi bitten basliyor ? 
DEFINE LCD_EREG PORTB 	'LCD Enable Bacagi Hangi Porta bagli ? 
DEFINE LCD_EBIT 7		'LCD Enable Bacagi Hangi bite bagli ? 
'DEFINE LCD RWREG PORTB  'LCD R/W Bacagi Hangi Porta bagli ? 
'DEFINE LCD_RWBIT 2 	 'LCD R/W Bacagi Hangi bite bagli ? 
DEFINE LCD_RSREG PORTB 	'LCD RS Bacagi Hangi Porta bagli ?
DEFINE LCD_RSBIT 6 		'LCD RS bacagi Hangi Bite bagli ? 
DEFINE LCD_BITS 4 		'LCD 4 bit mi yoksa 8 bit olarak ba?ly ?
DEFINE LCD_LINES 2 		'LCD Kaç syra yazabiliyor ?

CMCON=7

TRISB=%00000010   'PortB.2 giri? di?erleri çyky? yapyldy.

lcdout 254,1
pause 300

basla:
for a=1 to 5000
lcdout 254,2,dec a,"  ",dec ZAMAN," kesme ",dec kesme
next a

son:
lcdout 254,1,"data gelmedi"
end

INT:
lcdout 254,2,"kesme var"
kesme=kesme+1 
ZAMAN=RCREG
hSerIn , [zaman,guc]                               
'hSerIn , [WAIT("TMR"), STARTBIT, zaman, GUC]

Resume

ete

@Tmr01,

Yazdığın programlarda bazı kusurlar gördüm.
Öncelikle belirteyim. Usart kesmesini daha önce kullanmadım ve nu yüzden çok iyi incelemediğim bir konu.
Ancak programını inceledim ve aşağıdaki kusurları buldum;

1. Gönderici Programında;
 Gönder: etiketli alt programın sonuna Resume yazmışsın. Bu geçerkli bir geri dönüş komutu değildir. Bunu RETURN ile değiştir. GOSUB ile gidilen alt programdan RETURN ile dönülür.

2. Alıcı programında INT adını verdiğin kesme alt programında yeniden kesme oluşumunu önlemek için INT etiketinden önce DISABLE komutunu ve RESUME komutundan sonrada ENABLE komutunu koyman gerek.
Bu eksiklikleri tamamla tekrar dene bakalım.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

ete

@tmr01,

Biraz deneme yaptım ve usart int'i çalıştırdım.
Aşağıdaki linkte hem verici hemde alıcı programlarını bulabilirsin.
Ayrıca  simulasyon dosyalarını da ekledim. Versiyon belki tutmaz diye sec uzantılı dosyayıda ekledim. Isis de Versiyon uyuşmazlığı olur ise files menüsünden import section seçeneği ile sec uzantılı dosyayı yükle ve sonra çalıştır.

http://rapidshare.com/files/12375907/USART-INT.rar.html

Kolay Gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

tmr01

Ete hoca.
bu pic basic pro programlama işine senin derslerin sayesinde başladım.

her soruma cevap yazarak benim bişeyler öğrenmeme çok yardımcı oldun.

başta size
ve
mytap, katana gibi;
öğrenmeye çalışanlara yardım eden herbir arkadaşa
çok teşekkür ederim.