baud rate

Başlatan selvi, 24 Kasım 2008, 17:55:46

selvi

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
yukardaki tanimlamayi 4800 baud yapmak icin nasil bir tanimlama yapmak gerekiyor.asagidaki gibi yaptim simulasyonda bile calismadi.
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_BAUD 4800       ' 9600 Baud @ 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
Yaşam anlamlandırıldıkça kutsaldır....

Tagli

DEFINE HSER_BAUD 4800
yerine
DEFINE HSER_SPBRG 50
yazmayı dene. Belki işe yarar. Diğer ayarların doğru mu bilmiyorum. Bu dil sanırım PicBasic Pro, uzun zamandır kullanmadım (hatta donanımsal seri iletişim modülünü hiç kullanmadım). 50 yerine 51'i de deneyebilirsin. Datasheet'te 9600 için 25, 2400 için 103 yazmış çünkü. 4800 de yaklaşık olarak ikisinin ortasında olsa gerek.
Gökçe Tağlıoğlu

selvi

DEFINE HSER_SPBRG 25 sadece bu degerde calisiyor.2400 ve 4800 icin verdiginiz degerleri denedim.calismadi.
Yaşam anlamlandırıldıkça kutsaldır....

mustafa_cmbz

pic kaç mhz'lik_? birde pic'e bağladığın kristal 4mhz ise 2400'ten sonrasında sapmalar olur piz bazen data verir bazen vermez verdiği datalarında %99 yanlıştır %1'i şüphelidir :D yani anlıcan ya kullandığın pic 4mhz lik ise ve sorun yaşayabilirsin...aynı şey kullandığın kristal içinde geçerli....kolay gelsin...

selvi

4MHz kullandim.9600 de calisiyor.fakat bazen vericinin gonderdigi datalari almiyor.yada bir kac kez butona basildiginda alici datalari aliyor.bazen alicida  roleyi cekmesi icin gonderdigim data roleyi cekmiyor.tabi sorun aliciya ya farkli data gidiyor.yada roleye bir sey oluyor.alicidaki beslemeyi kesip tekrar besleme verdigimde yine ayni durum devam ediyor.sonra pici yeniden programladigimda bu sefer roleyi cekiyor.ama tek tuk alicida yukarda bahsettigim sorun cikiyor.sorun cikinca(roleyi cekmeyince)pici yeniden yukledigimde sorun ortadan kalkiyor.
 sorunun sebebini cozemedim.hizi yuksek olabilir diye 4800 indirmek istedim.oda sorun cikardi.yani simulasyonda bile calismadi.anten mesafesi etkilebilir mi?
Yaşam anlamlandırıldıkça kutsaldır....

mustafa_cmbz

anten dediğine göre rf modüller ile data taşımak istiyorsun anlaşılan...sana tavsiye eğer röle vs. kontrol edeceksen baud rate'yi düşük tut mesela 2400 senin işini görür..

eğer yüksek hızda data taşımak istiyorsan ve bunu elde edemiyorsan bu rf modüllerden de kaynaklanabilir...

bunun dışında dediğim gibi pic'in kaç mhz lik onu kontrol et....sorun tespiti için ise rf modülleri aradan çıkartıp bir max 232 aracılığı ile devreni pc ye bağla ve herhangi bir terminal programı ile dataların sağlıklı bir şekilde gelip gelmediğini kontrol et...eğer gönderdiğin datayı pc den aynı şekilde göremiyorsan sorun sorun pic veya yazılımdadır...ama datalar hiç eksiksiz geliyorsa senin sorunun rf modüller ile alakalı...ya antendir yada modüldendir...bişey diyemem...sakin kafayla otur yaptıklarını tekrardan gözden geçir...en önemlisi ise 4mhz ile çalııyorsan da baud rate'yi 2400 ve daha da aşağıya çek...kolay gelsin...

selvi

biraz arastirdim.4mhz de; DEFINE HSER_SPBRG 25 tanimlamada BRGH=0 icin 2400 ;BRGH = 1 icin 9600 bauda karsilik geliyormus.
 data iletiminde bahsettigim sorun surekli yasanmiyor.cogu zaman data iletiminde sorun cikmiyor.tek tuk sorun cikiyor.ve ben pic tekrardan programladigimda sorun ortadan kalkiyor.
 sorun yasandiginda devrenin beslemesini kesip tekrar bagliyorum.vericiden butonlarla aliciya data iletimi yapinca ilgili ledler yanmasina ragmen roleyi cekmesi gereken data gonderildigi halde roleyi cekmemesi nerden kaynakli olabilir.program asagidadir.portb.3 role ayagidir.
@ DEVICE pic16F628 'islemci 16F628A
@ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F628, PWRT_ON 'Power on timer acik
@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628, MCLR_ON 'MCLR pini kullaniliyor.
@ DEVICE pic16F628, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628, LVP_OFF
@ DEVICE pic16F628, BOD_OFF

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

SYMBOL GIE  =INTCON.7   'genel interruptlarý açýyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptlarý açýyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit
SYMBOL INTE=INTCON.4    'RB0  interrupt enable bit
SYMBOL INTF=INTCON.1    'RB0  interrupt flag bit

ON INTERRUPT GOTO KESME
RCIE=1
PEIE=1
INTE=1
GIE=1

OPTION_REG=%01000000
 
CMCON=7
TRISB=%00000011
TRISA=%00000000
PORTB=0
PORTA=0

AL     VAR  BYTE  
SAYI   VAR  BYTE
TEMP   VAR  BYTE  
SAYAC  VAR  BYTE  
I      VAR  BYTE  
M      VAR  BYTE  
K      VAR  BYTE  
RB     VAR  BYTE  
US     VAR  BYTE

al=0
sayi=0
temp=0
sayac=0
i=0
m=0
k=0
rb=0
us=0
LOOP:
IF RB=1 THEN
PAUSE 9
IF PORTB.0=1 THEN
SAYI=SAYI+1
IF SAYAC=SAYI  THEN
PORTB.3=1
PAUSE 500
PORTB.3=0
SAYI=0
ENDIF
PORTB.6=1
PAUSE 400
PORTB.6=0
ENDIF
RB=0
ENDIF
IF US=1 THEN
US=0
TEMP=0
      IF i=0 AND AL=73 THEN
       I=I+1
       PORTB.4=1
       PAUSE 500
       PORTB.4=0
      ENDIF
KAPAT:  
       IF M=0 AND AL=233 THEN
      PORTB.6=1
      PAUSE 500
      PORTB.6=0
      I=0
      M=0      
      ENDIF
      if i=1 AND AL<>0 AND M=0 then
      SAYAC=AL
      FOR K=0 TO 6
        PORTB.6=1
        PAUSE 100
        PORTB.6=0
        PAUSE 100
        NEXT K  
      ENDIF
      ENDIF
GOTO LOOP
;---------USART KESME-----------
DISABLE
KESME:
GIE=0 'tüm interruptlar? kapat yani INTCON.7=0
IF INTF=1 THEN
RB=1
INTF=0 'kesme bayrag(? s?f?rlanacak)
GOTO CIK
ENDIF
AL=0
HSERIN 1,BIR,[WAIT("ARA"),DEC AL]
TEMP=RCREG
TEMP=0    
RCREG=0
US=1
GOTO CIK
BIR:US=0
CIK:
GIE=1 'Yani INTCON.7=1 kesmeleri açt?k.
RESUME
ENABLE
END
Yaşam anlamlandırıldıkça kutsaldır....

hatmeto

pic uyandırma sistemini ve data göndermeni en az 3 kez yap. Bazı hocalarım tavsiyesi bu yöndedir.
Örmnek :
HSERIN 1,BIR,[WAIT("ARA"),DEC AL]
HSERIN 1,BIR,[WAIT("ARA"),DEC AL]
HSERIN 1,BIR,[WAIT("ARA"),DEC AL]


veya Hserin Komutu yerine HSERIN2 kullanabilirsin 8)
Bir admin ataasözü derki: "biliyorsan paylaş mod yapsınlar. bilmiyorsan sus banlamasınlar"

Mustafa48

Bunun birde verici tarafı olması lazım Hata orada olabilirmi
Ben yaklaşık 2 km mesafeden kablsuz çift taraflı haberleşiyorum .
Örnek proğram
https://www.picproje.org/index.php/topic,22273

sayfanın sonunda belki faydası olur Hserin ve Hserout kumoutlarından
sonra belli bir zaman vermek gerekebiliyor. Tabii bunu for next döngüsü içinde PAUSEUS ile yapmak lazım.

selvi

verici asagidadir.
@ DEVICE pic16F628 'islemci 16F628A
@ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F628, PWRT_ON 'Power on timer acik
@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628, MCLR_OFF 'MCLR pini kullaniliyor.
@ DEVICE pic16F628, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628, LVP_OFF
@ DEVICE pic16F628, BOD_OFF

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2

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

CMCON=7           '16F628 de komparatör pinleri iptal hepsi giriþ çýkýþ
OPTION_REG.7=0    'Dahili pull-up lar AKTÝF yapýldý
TRISB=%00001011
TRISA=%00110010
PORTB=0
PORTA=0
PORTA.0=0
'------------------------------------------------------------------------------
VER     var  BYTE
SAYI    VAR  BYTE
I       VAR  BYTE
m       VAR  BYTE
'------------------------------------------------------------------------------
LCDOUT $FE,1,"HEY"
LCDOUT $FE,$C0,"DUNYA"
PAUSE 500
SAYI=0
I=0
m=0
'------------------------------------------------------------------------------
START: PORTA.0=0
      VER=0
      I=0
      m=0
      IF PORTB.0=0 THEN
      VER=73  
       LCDOUT $FE,1,"AC"
            PORTA.0=1          
       LCDOUT $FE,$C0,"VER=",#VER
            GOSUB GONDER
           ENDIF
       IF PORTA.4=0 THEN            
       LCDOUT $FE,1,"SAYI"
           SAYI=SAYI+1
           PAUSE 200
       LCDOUT $FE,$C0,"SAYI=",#SAYI
       ENDIF
       IF PORTA.5=0 THEN            
       LCDOUT $FE,1,"HEDEF"
           SAYI=SAYI-1
           PAUSE 200
       LCDOUT $FE,$C0,"SAYI=",#SAYI
       ENDIF
       IF PORTB.3=0 THEN
           PORTA.0=1
      LCDOUT $FE,1,"GONDER"
           VER=SAYI
      LCDOUT $FE,$C0,"VER=",#VER
           GOSUB GONDER
           WHILE PORTB.3=0
           GOSUB GONDER1
           WEND
       ENDIF
        IF PORTA.1=0 THEN
               VER=233
      LCDOUT $FE,$C0,"VER=",#VER
               GOSUB GONDER
               ENDIF
           PAUSE 100
            GOTO START
           
'-------------------------ALT PROGRAMLAR---------------------------------------
GONDER:
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
GONDER1:
HSEROUT ["A","R","A",DEC VER,123]
RETURN
END
Yaşam anlamlandırıldıkça kutsaldır....

selvi

data iletimi icin serin komut pbp de daha saglikli calisiyor.fakat rb0 kesmesini de kullaniyorum. serin komutuyla rb0 kesmesi bir arada kullanilamiyor. tek yontem mevcut durumda usart kesmesi ve rb0 kesmesini kullanmak zorundayim. onceki mesajlarimda  verici-alici programi verdim.ve bu programlarda birden fazla sorun cikiyor.programlari inceliyorum bir sorun goremiyorum.kapat diyorum roleyi cekiyor.roleyi cekmesi gereken datayi yolluyorum ama roleyi bazen cekmiyor.tekrardan entegreyi  programliyorum.roleyi cekiyor.bir kac deneme sonra yine rleyi cekmeme sorunu ve role cektiginde kapat dedigimde bile roleyi cekiyor.
forumda usart kesmesine iliskin bayagi ornek var.fakat ben programi bunlara gore duzenledigim halde sorunlar cikiyor.
Yaşam anlamlandırıldıkça kutsaldır....

Mustafa48

isis projesi varsa eklermisiniz.

selvi

2400baud a gore programi yeniden duzenledim fakat 9600 bauda benzer sorunlar devam etti.aliciyabesleme verdigimde led kendi kendine yaniyor.bazen kapat islemi yaptigimda role cekiyor.olmamasi gereken hersey oluyor,bu programda.inceliyorum bir sorunda gormuyorum.isisteki sema ve programlar:
http://rapidshare.com/files/167999908/verici-alici_ve_sema.rar.html
Yaşam anlamlandırıldıkça kutsaldır....

mustafa_cmbz

Alıntı yapılan: "selvi"2400baud a gore programi yeniden duzenledim fakat 9600 bauda benzer sorunlar devam etti.aliciyabesleme verdigimde led kendi kendine yaniyor.bazen kapat islemi yaptigimda role cekiyor.olmamasi gereken hersey oluyor,bu programda.inceliyorum bir sorunda gormuyorum.isisteki sema ve programlar:
http://rapidshare.com/files/167999908/verici-alici_ve_sema.rar.html

en başından bu yana söylüyorum 4mhz ile 9600 baud'ta haberleşme sağlıklı olmaz...hatta olamaz...

eğer data iletimini 9600 baud ile yapacaksanız:

* 20mhz kristal kullanın...pic ancak ozaman doğru ve tam data çıkışı yapar...
* kullanılacak olan pic 20mhz de çalışabilmeli.pic'i alırken 16f628a-20 yazanından almalısınız ki işinizi görsün.... (-04) max. 4mhz ile çalışır...
* sakın ha 4.433 mhz gibi vs. buçuklu kristal kullanmayınız...



@ DEVICE pic16F628, XT_OSC 'Dahili osilatör kullanilmayacak


* eğer 9600 baud ile çalışılacaksa 20mhz krıstal kullanılacak aynı çekilde pic'te bu çalışma hızına uyumlu olacak ve son olarak ta osilatör kısmından da pic 20mhz ile çalışacağı için  osilatör configlerinden "HS" seçilecek....

kolay gelsin...

selvi

2400 baud da denedim ayni sorunlar cikti.
Yaşam anlamlandırıldıkça kutsaldır....