SERİ HABERLEŞMEDE BAUD DEĞİŞTİRME

Başlatan levo_levent, 04 Ağustos 2014, 14:41:00

levo_levent

ETE hocam selamlar bir sorum olacaktı
örneğin iki cihaz var  pıc ile kesmeler kullanarak a dan b ye veri göndermek istiyorum ama verici olan  a cihazının baund hızı (115200)  alıcı olan b cihazının baund hızı (9600) ve bunları hızlar değiştirilemiyor.
a cihazından cıkan datayı (baud 115200) pıcte değerlendırıp  değiştirip çıkış yapabiliyorum ama pıcten cıkarken (baund 9600) olması gerekiyor bu yapılabilirmi yada başka bir yolu varmıdır  örneğin iki pıc entegre yada başka portlardan çıkış alınarak  araştırdım ama böylebir örnekte bulamadım.

kolay gelsin şimdiden  teşekkürler.

ete

Haberleşme hızını (USART için) SPBRG registeri ayarlamaktadır.
Başlangıçta ayarı 115200 e uygun olarak verip bilgi yollarken aynı registere 9600 e uygun değer vererek bu sorunu aşabilirsin. Bu söyediklerimi teorik olarak söylüyorum. Daha önce denemesini yapmadım.Ama bir sorun olacağını sanmıyorum.

Ete

levo_levent

HOCAM DEDİĞİNİZ GİBİ YAPTIM İŞLEM BİRKEREY MAHSUS ÇALIŞIYOR AMA DEVAMLI ÇALIŞMIYOR SİSTEM AÇILDIĞINDA  İLK DATAYI 115200 LE ALIYOR DOĞRU OLARAK DEĞERLENDİRİLİP 9600 HIZLA ÇIKIŞ YAPIYOR  DAHA SONRA İŞLEM YAPMIYOR NERDE HATAM VAR ACABA RESETLEDİĞİNDE 1 KEREYE MAHSUS ÇALIŞIYOR

@ DEVICE pic16F876A                                               
@ DEVICE pic16F876A, WDT_ON             
@ DEVICE pic16F876A, PWRT_ON             
@ DEVICE pic16F876A, PROTECT_OFF         
@ DEVICE PIC16F876A, LVP_OFF
@ DEVICE PIC16F876A, CPD_OFF
@ DEVICE pic16F876A, HS_OSC

PORTC=0:TRISC=%10000000 

DEFINE OSC 20           
DEFINE HSER_RCSTA 90h   
DEFINE HSER_TXSTA 24h   
DEFINE HSER_SPBRG 10

Cnt       VAR BYTE 50   
inputData var Byte 51   
TEMP      var BYTE 52
W VAR BYTE
SYMBOL GIE  =INTCON.7   
SYMBOL PEIE =INTCON.6   
SYMBOL RCIE =PIE1.5     
SYMBOL RCIF =PIR1.5     

RCIE=1                 
PEIE=1                 
GIE=1                   
INTCON=%11000000
ON INTERRUPT GOTO INT
     
       PAUSE 2000
       HSEROUT [$FE,$00,$4A,$03,$49]
       PAUSE 100
       GOTO START
                   
START:                   
      IF Cnt=$14 then   
        SPBRG = 129
        HSEROUT [$1C]
        GOSUB BEKLE
        SPBRG = 10
        cnt=0
        endif   

      if CNT=$1A then 
        SPBRG = 129 
        HSEROUT [$1D]
        GOSUB BEKLE
        SPBRG = 10
        cnt=0
        endif

      IF Cnt=$08 then   
        HSEROUT [$1E]
        SPBRG = 129
        GOSUB BEKLE
        SPBRG = 10
        cnt=0
        endif
        goto START       
     
BEKLE:
  FOR W=0 TO 15:NEXT
  RETRUN     
  DISABLE

INT:
    GIE=0                 
    hSerIn , [WAIT ($01,$02,$00,$00),INPUTDATA]
    Cnt=inputdata
    TEMP=RCREG         
    GIE=1
    Resume
enable

END

ete

Mesajları büyük harfle yazma yanlış anlam yüklüyor mesaja. Forum dilinde bu bağırıp çağırma anlamına gelmektedir.

programda hata göremedim.
hserout ile yollama yapmadan SPBRG ye yeni değeri set etmek ve göndermeden hemen sonra ise eski değeri yeniden spbrg ye vermek gerekir Her ne kadar kısa bir bekleme programın var ise de beklemeden önce bu değeri vermen daha doğru olurdu.
mümkünse bu sisteme uygun bir simulasyon devresi hazırlamak sorunları görmek açısından daha iyi olabilirdi.
burada mutlaka spbrg değeri değişemiyor ama hangisinde kalıyor onu merak ediyorum doğrusu.

ete

levo_levent

Hocam öncelikle harfler için özür o anlama geldiğini bilmiyordum  :)

bekleme işleminden öncede sonrada spbrg  değişimini zamanı bile uzattım  denedim olmadı  similasyon yapamdım ama birdaha denerim.

yazılımları dırek pıce yükleyip deniyorum her  denediğim yazılımdada  durum aynı oluyor örneğin kesmelerın sadece birine spbrg değişimi koysam o kesmeye gelene kadar diğer kesmelerde normal çalışıyor spbrg koyduğum kesmeye geldiğinde o işlemi yapıyor fakat orda donup kalıyor resetleyene kadar hiçbir işlem yapmıyor. sanırım pıc kitlenip kalıyor yada  9600 de kalıyorki gelen datayı işleyemeyip hiçbir çıkış yapmıyor bende kitlenip kalıyor zannediyorum.

İlyas KAYA

BEKLE:
  FOR W=0 TO 15:NEXT
  RETRUN     
  DISABLE

Burada kilitleniyor büyük ihtimalle. Çünkü RETURN yerine RETRUN yazmışsın.
Alt programa gidip RETURN komutunu bekliyor büyük ihtimal ve taşma yapıp kilitleniyor.

İşin kötü tarafı denedim, RETRUN yazınca derleme sorunsuz oluyor.
RETRUN'u RETURN olarak değiştirip denermisin.


Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ete

Bu yazım hatasını gördüm ama derleyici mutlaka hata vermiştir diye düşünüyordum. Demek hata vermeden derleyebildi. Onu ne olarak nitelendirdi acaba çok enteresan.
Muhtemelen hata budur.

Birde genellikle değişken adresleri bizim derleyicide 56 dan başlar. Değişkenlerin yanına yazılqn hafıza adresleride 50 den başlatılmış. Onları ya sil yada 56 dan başlat bana kalırsa.
Başkada bir hata gözükmüyor. Hata derken bazı gereksiz komutlar var onlarıda belirtmeden geçemeyeceğim.
Birincisi, Intcon registerinin 6 ve 7 ci bitlerine isim verilmiş ve ismler set edilerek intcon registeri kurulmuş iken birde Intcon=%11000000 yazılmış ki bu gereksiz ve anlamsız.
Basic satır takip eden programdır. Bir sonraki satıra programı goto ile yollamakda anlamsız ve gereksizdir.
Programda,
Pause 100
Goto start
Denilmiş hemen altında da start etiketi var. Sen oraya goto start yazmasan da program satır takip ettiği için start etiketine atlayacak zaten. Böylece Goto Start komutunorada gereksiz olmuş.
Ete

levo_levent

ete hocam selamlar  yazdıklarınızdan buyana denemediğim şekil kalmadı dediklerinizi uyguladım programın son hali bu

@ DEVICE pic16F876A
                                               
@ DEVICE pic16F876A, WDT_ON             
@ DEVICE pic16F876A, PWRT_ON             
@ DEVICE pic16F876A, PROTECT_OFF         
@ DEVICE PIC16F876A, LVP_OFF
@ DEVICE PIC16F876A, CPD_OFF
@ DEVICE pic16F876A, HS_OSC

PORTC=0:TRISC=%10000000 

DEFINE OSC 20           
DEFINE HSER_RCSTA 90h 
DEFINE HSER_TXSTA 24h 
DEFINE HSER_SPBRG 10
DEFINE HSER_CLROERR 1

Cnt       VAR BYTE 56   
inputData var Byte 57
TEMP      var BYTE 58
W VAR BYTE
SYMBOL GIE  =INTCON.7   
SYMBOL PEIE =INTCON.6   
SYMBOL RCIE =PIE1.5     
SYMBOL RCIF =PIR1.5       

RCIE=1     
PEIE=1     
GIE=1                       
ON INTERRUPT GOTO INT     

       PAUSE 2000
       HSEROUT [$FE,$00,$4A,$03,$49]
       PAUSE 100 
         
START:           
    IF Cnt=$1A then
        SPBRG = 129
        HSEROUT [$33]
        SPBRG = 10
        GOSUB BEKLE
        CNT=0
        endif           
        goto START
           
BEKLE:
  FOR W=0 TO 50:NEXT
  RETURN     
  DISABLE
INT:         
    GIE=0           
    hSerIn , [WAIT ($01,$02,$00,$00),INPUTDATA]
    Cnt=inputdata
    TEMP=RCREG         
    GIE=1   
    Resume
    enable
END


örneğin bu şekilde 9600 geçmiyor 115200 le çalışıyor
    IF Cnt=$1A then
        SPBRG =129
        HSEROUT [$33]
        SPBRG= 10
        GOSUB BEKLE
        CNT=0

bu şekilde  115200 le çalışyor yanlız çıkan data doğru değil ne 115000 le nede 9600 le doğru okunmuyor fe-ff gibi çıkıyor
IF Cnt=$1A then
        SPBRG =129
        HSEROUT [$33]
        GOSUB BEKLE
        SPBRG= 10
        CNT=0      
        endif

bu şekilde ise SPBRG = 10 olmadığı için gelen data 115200 iken 1 kereye mahsus  [$33]  9600 le doğru data çıkıyor, ama sonraki gelen datalar 9600 olduğu sürece çalışıyor,
    IF Cnt=$1A then
        SPBRG =129
        HSEROUT [$33]
        GOSUB BEKLE
        CNT=0      
        endif

aklıma gelen herşeyi kontrol ettim bekleme süresisni 15 ile 2000ne kadar kademe kademe denedim  donanımla ilgili herşeye baktım benim anladığım kadarıyla SPBRG =129 gayet güzel geçiriyoruz ama tekrar SPBRG =10 dönemiyoruz yada dönerken yetişemiyor bilmediğimiz bir hızada kalıyor. kırıstal 20mhz bundan olabilirmi yada sigortalarda yada bu baund  değişikliği için ayrıbir alt program gerekirmi   

ete

Bu konu öyle düşünerek halledilebilecek bir mesele olarak gözükmüyor.
Mutlaka simulasyon dosyaları olmalı ve ne olup bittiğine ekranda bakabilmeliyiz.
Alınan data 115200 ile yollanan data 9600 ile yollandığına göre programda da bir aksaklık var gibi.
Zira define komutlarını 115200 için ayarlıyorsun;
DEFINE HSER_RCSTA 90h  
DEFINE HSER_TXSTA 24h 
DEFINE HSER_SPBRG 10 '115200 baud değeri
DEFINE HSER_CLROERR 1

Ama start satırından evvel bir yollama işlemiyapıyorsunki bu 115200 le yollanmış oluyor. Bu yanlış değilmi sence?????
       HSEROUT [$FE,$00,$4A,$03,$49]
       PAUSE 100

Bu bakımdan define komutlarındaki ;
DEFINE HSER_SPBRG 10  satırı
DEFINE HSER_SPBRG 129 'şeklinde düzeltilmeli ve
Pause 100 satırından sonra hemen
SPBRG=10 verilerek sistem 115200'e döndürülmelidir.
Birde define ile SPBRG ye değer verme yerine onu iptal edip direk,
SPBRG=10 veya SPBRG=129 şeklinde komut vermek gerekebilir.
Define komutları kullanılan hızı sabit olarak ayarlıyor olabilir.
Başkada aklıma bir şey gelmiyor maalesef.

Ete


levo_levent


(Define komutları kullanılan hızı sabit olarak ayarlıyor olabilir.
Başkada aklıma bir şey gelmiyor maalesef.)

:) hocam şimşekler çaktırdın bu sözlerinle

bende defineyi sildim şu şekilde yaptım istediğim gibi oldu program işlem tamadır
:) :) :) :)

@ DEVICE pic16F876A                                               
@ DEVICE pic16F876A, WDT_ON             
@ DEVICE pic16F876A, PWRT_ON             
@ DEVICE pic16F876A, PROTECT_OFF         
@ DEVICE PIC16F876A, LVP_OFF
@ DEVICE PIC16F876A, CPD_OFF
@ DEVICE pic16F876A, HS_OSC

PORTC=0:TRISC=%10000000 
DEFINE OSC 20           


Cnt       VAR BYTE 56   
inputData var Byte 57
TEMP      var BYTE 58
W VAR WORD

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

RCIE=1     
PEIE=1     
GIE=1                       
ON INTERRUPT GOTO INT

       TXSTA=$24
       RCSTA=$90
       SPBRG=10
       PAUSE 2000
       HSEROUT [$FE,$00,$4A,$03,$49]
       PAUSE 100 
         
START:
               
    IF Cnt=$14 then
        TXSTA=$24
        RCSTA=$90
        SPBRG=129
        HSEROUT [$33]       
        cnt=0
        GOSUB BEKLE
        endif
       
    IF Cnt=$1A then
        TXSTA=$24
        RCSTA=$90
        SPBRG=129
        HSEROUT [$34]       
        cnt=0
        GOSUB BEKLE
        endif     
        goto START

BEKLE:
  FOR W=0 TO 100:NEXT
  RETURN     
  DISABLE

INT:
    TXSTA=$24
    RCSTA=$90
    SPBRG=10           
    GIE=0           
    hSerIn , [WAIT ($01,$02,$00,$00),INPUTDATA]
    Cnt=inputdata         
    GIE=1   
    Resume
    enable
END


levo_levent

teşekür etmeyi unuttum
teşekkürler ETE hocam

okuyanlara yardımcı olsun program içersinde baund değişikliği yapılacaksa define ye TXSTA RCSTA SPBRG ayarlar ilgili bir satır yazmasınlar
nerde ne kullanılacaksa  TXSTA RCSTA SPBRG bilgilerini girsinler

Powered by EzPortal