Kumanda devresi için yardım edermisiniz?

Başlatan veli dayı, 10 Şubat 2015, 15:33:49

veli dayı

Arkadaşlar sitenin birinden aşağıdaki kodları buldum.Kodlarda 9600 baund hızında gönderim yapıyor fakat benim 2400 baund hızında gönderim yapmam gerekiyor.Yada daha düşük bir hızda.DEFINE HSER_SPBRG 25  ' 9600 baud @ 4mhz bu kodu nasıl değiştirmem gerekir ki 2400 baund hızını yakalarım.Yada bunun hesabı kitabı nasıl oluyor.Yardımcı olursanız sevinirim.Projeyi de buradan paylaşırım başarılı olursam böylecene herkes yararlanır.



verici kodları


@ DEVICE pic16F628A 'islemci 16F628A
@ DEVICE pic16F628A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F628A, PWRT_ON 'Power on timer acik
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic16F628A, MCLR_ON 'MCLR pini kullaniliyor.
@ DEVICE pic16F628A, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, 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
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

SYMBOL GIE  =INTCON.7   'genel interruptlarý açýyor
SYMBOL PEIE =INTCON.6   'peripheral interruptlarý açiyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit
 
RCIE=1:PEIE=1:GIE=1

CMCON=7           '16F628 de komparatör pinleri iptal hepsi giriþ çýkýþ
OPTION_REG.7=0    'Dahili pull-up lar AKTÝF yapýldý
TRISA=%00000000
PORTA=0
TRISB=%11111011
PORTB=0                   
VER   VAR BYTE
DURUM VAR BYTE

START:'PORTA.2=0 
    IF  PORTB.6=0 THEN ' motorun ileri hareketi-normal
        PORTA.2=1                                                                                       
        VER=10
        GOSUB GONDER                 
    IF  PORTB.6=0 AND PORTB.4=0 THEN ' motorun ileri sol hareketi-normal
        PORTA.2=1
        VER=125
        GOSUB GONDER
    endif
    IF PORTB.6=0 and PORTB.3=0 THEN ' motorun ileri sag hareketi-normal
       PORTA.2=1
       VER=143
       GOSUB GONDER
    endif
    ENDIF
    IF PORTB.5=0 THEN  'motorun ileriye hareketi-hizli
       PORTA.2=1
       VER=20
       GOSUB GONDER     
    IF PORTB.5=0 and PORTB.4=0 THEN  'motorun ileriye sol hareketi-hizli
       PORTA.2=1
       VER=150
       GOSUB GONDER
    endif
    IF PORTB.5=0 AND PORTB.3=0 THEN  'motorun ileriye sag  hareketi-hizli
       PORTA.2=1
       VER=173
       GOSUB GONDER
    ENDIF
    ENDIF
    IF PORTB.7=0 THEN  'motorun geriye hareketi
       PORTA.2=1
       VER=30
       GOSUB GONDER
    IF PORTB.7=0 AND PORTB.4=0 THEN  'motorun geriye sol hareketi
       PORTA.2=1
       VER=200
       GOSUB GONDER
    ENDIF
    IF PORTB.7=0 AND PORTB.3=0  THEN  'motorun geriye sag hareketi
       PORTA.2=1
       VER=213
       GOSUB GONDER     
    endif
    ENDIF
    IF PORTB.3=0 THEN    'motorun saga hareketi
       PORTA.2=1
       VER=163
       GOSUB GONDER
    IF PORTB.3=0 AND PORTB.6=0 THEN 'sag ileri normal
       PORTA.2=1
       VER=143
       GOSUB GONDER
    ENDIF
    IF PORTB.3=0 AND PORTB.5=0 THEN  'Sag ileri hizli
       PORTA.2=1
       VER=173
       GOSUB GONDER
    ENDIF
    IF PORTB.3=0 AND PORTB.7=0 THEN  'Sag geri
       PORTA.2=1
       VER=213
       GOSUB GONDER
    ENDIF
    ENDIF
    IF PORTB.4=0 THEN   'motorun sola hareketi
       PORTA.2=1
       VER=135
       GOSUB GONDER       
    IF PORTB.4=0 AND PORTB.6=0 THEN 'sola ileri normal
       PORTA.2=1
       VER=125
       GOSUB GONDER
    ENDIF
    IF PORTB.4=0 AND PORTB.5=0 THEN 'sola ileri hizli
       PORTA.2=1
       VER=150
       GOSUB GONDER
    ENDIF
    IF PORTB.4=0 AND PORTB.7=0 THEN 'sola geri
       PORTA.2=1
       VER=200
       GOSUB GONDER
    ENDIF
    ENDIF   
    'IF PORTB.0=0 and PORTB.1=0 THEN    'roleyi cektirmek 'yanlis yazilmis
     '  PORTA.2=1             
      ' VER=60
       'GOSUB GONDER
   ' ENDIF
   IF  PORTB.3=1 AND PORTB.4=1 AND PORTB.5=1 AND PORTB.6=1 AND PORTB.7=1  THEN   'durdur
       PORTA.2=1
       VER=70           
       GOSUB GONDER
'BAK:PORTA.2=0
    'IF PORTB.0=1  AND PORTB.3=1 AND PORTB.4=1 AND PORTB.5=1 AND PORTB.6=1 AND PORTB.7=1 THEN  BAK   
  ENDIF
       GOTO START
GONDER:
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
HSEROUT ["A","R","A",VER] 
HSEROUT ["A","R","A",VER]
HSEROUT ["A","R","A",VER]
HSEROUT ["A","R","A",VER]     
RETURN
   END

ALICI KODLARI
@ DEVICE pic16F628A 'islemci 16F628A
@ DEVICE pic16F628A, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F628A, PWRT_ON 'Power on timer acik
@ DEVICE pic16F628A, PROTECT_OFF 'Code Protec kapali
@ DEVICE pic16F628A, MCLR_ON 'MCLR pini kullaniliyor.
@ DEVICE pic16F628A, XT_OSC 'Dahili osilatör kullanilmayacak
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, 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
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

SYMBOL GIE  =INTCON.7   'genel interruptlarý açiyor
SYMBOL PEIE =INTCON.6   'peripheral interruptlarý açiyor
SYMBOL RCIE =PIE1.5     'UASART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

RCIE=1: PEIE=1:GIE=1

CMCON=7           '16F628 de komparatör pinleri iptal hepsi giriþ çýkýþ
OPTION_REG.7=1    'Dahili pull-up lar pasif yapýldý
TRISA=%00000000
PORTA=0
TRISB=%00000010
PORTB=0
AL   VAR BYTE
TEMP VAR BYTE
US   VAR BIT
CLEAR
ON INTERRUPT GOTO KESME
PULSOUT PORTB.3,150
PORTB.3=0:PAUSE 15
START:
    IF AL=10 THEN  'ileri
       PORTB.4=0:PORTB.6=0:PAUSE 20:PORTB.5=1
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSE 15   
    ENDIF
    IF AL=20 THEN   'ileri hizli
       PORTB.5=0:PORTB.6=0:PAUSE 20:PORTB.4=1
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSE 15
    ENDIF
    IF AL=30 THEN  'geri
       PORTB.4=0:PORTB.5=0:PAUSE 20:PORTB.6=1
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=135 THEN   'sol
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSE 15
    ENDIF
    IF AL=163 THEN  'sag
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSE 15
    ENDIF 
    IF AL=70 THEN    'durdur
       PORTB.4=0:PORTB.5=0:PORTB.6=0
       PULSOUT PORTB.3,150
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=125 THEN 'ileri sol normal
       PORTB.4=0:PORTB.6=0:PAUSE 20:PORTB.5=1
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=143 THEN  'ileri sag normal
       PORTB.4=0:PORTB.6=0:PAUSE 20:PORTB.5=1
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=150 THEN  'ileri sol hizli
       PORTB.5=0:PORTB.6=0:PAUSE 20:PORTB.4=1
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=173 THEN  'ileri sag hizli
       PORTB.5=0:PORTB.6=0:PAUSE 20:PORTB.4=1
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=200 THEN 'geri sol
       PORTB.4=0:PORTB.5=0:PAUSE 20:PORTB.6=1
       PULSOUT PORTB.3,200
       PORTB.3=0:PAUSE 15
    ENDIF   
    IF AL=213 THEN 'geri sag
       PORTB.4=0:PORTB.5=0:PAUSE 20:PORTB.6=1
       PULSOUT PORTB.3,120
       PORTB.3=0:PAUSE 15
    ENDIF   
    goto START
DISABLE
KESME:
GIE=0 'tüm interruptlari kapat yani INTCON.7=0
HSERIN  [WAIT("ARA"),AL]
TEMP=RCREG
'CIK:
RCIF=0 
GIE=1     'Yani INTCON.7=1 kesmeleri açtik.
RESUME                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
ENABLE
    END
                                                 

Burak

#1
Kaç mhz osilatör frekansında çalışıcaksınız ?

Burak
Ω Gens Una Sumus Ω

Burak

RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $20 ' Enable transmit, BRGH = 0
SPBRG = 25  ' 2400 Baud @ 4MHz, 0.17%


4 MHZ ise şu şekilde olacak ...

Yada ;

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0.17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically


şeklinde de verebililirsiniz ...

Burak

Ω Gens Una Sumus Ω

veli dayı

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0    24h YAPARSAK BRGH = 1 OLUYOR
DEFINE HSER_SPBRG 51  ' 1200 baud @ 4mhz  25 YAPARSAK 2400
Şeklinde yapsam olacak sanırım.
Burak bey İlaç gibi adamsınız ufkumu açtınız sizin verdiğiniz cevap gözlüğüyle inceledim datasheeti yardımlarınız için teşekkür ederim .inşallah yukarıdaki kodlarda bir hatam yoktur.

Burak

Bu define ifadelerindeki hex ifadeler 8 bitlik USART kayıtçılarının binary karşılığı aslında karışık değil ...
Bir önceki mesajımda verdiğim , "yada" ifadesiyle ayırdığım ifadelerden ilkini kullanmanız durumda OERR oluşursa yani overrun error oluşursa

CREN=0
CREN=1


yaparak usart alıcısını aşırı yüklenme durumu çıkmaz döngüsünden yukarıdaki iki parça komutu kullanarak çıkarabilirsiniz ancak ... ikinci kodda OERR oluşumunu picbasic otomatik kendisi farkedip temizlesin diyerek kullanmakta mümkün ..

Overrun nedir diye merak edenler olursa diye  ? 2 byte'lık usart buffer'ındaki veriler seri olarak RCREG kayıtçısına kaydırılır . Eğer 3. bir byte gelirken RCREG verisini okumazsak , (veya bunun komut karşılığı olan HSERIN ile okuma yapmazsak) buffer'da taşma meydana gelir ve sürekli alım transistörleri ve kaydırmalı kaydediciler mosfetlerle kilitlenir yani latch yapılır ... Alıcı devre dışı kalır .... Siz veri gönderdiğinizi sanırsınız ama o kilitlenmiştir artık ... USART bloğunu tekrar aktifleştirmek için CREN yani Continuous receive Enable bitini (Sürekli alıcıların açık hale getirildiği kontrol biti) toggle yaparak bu sıkıntıdan kurtulabilirsiniz ...

Burak
Ω Gens Una Sumus Ω

Powered by EzPortal