baud rate

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

Lütfi AYYILDIZ

DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
işte sorun burada kullandığın formül yanlış.
Baud Rate = FOSC/(16(X+1))
Birde bu formüle göre  dene. Datasheette mevcut.Birçok uygulamada bu formülü kullandım şu ana kadar hiç sorun çıkarmadı.DEFINE HSER_SPBRG 25, 25 yerine X için bulduğun değeri yaz.
Örnek: 2400 baud için
2400=4000000/(16(X+1))
2400=4000000/(16.104)
yaklaşık 2403 baud
X=103   ; Küsüratlı olduğu için tam sonuç çıkmayacaktır.

selvi

DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1  bu  9600 baud icin.enson verdigim program 2400 icin:
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0  bu  2400 baud icin.
iki durumu da denedim.sonuclar ayni.hizdan kaynakli gozukmuyor.mclr ile kaynakli bir durum olabilir mi?ben vericide mclr_off yapip buton bagladim.alicida roleyi cekmesini etkileyen bir durum var.aliciyi inceledim.ben farkli bir durum goremiyorum.tabi gozden kacan yada eksik tanimlanan bir durum var mi?
Yaşam anlamlandırıldıkça kutsaldır....

mustafa_cmbz

sorun çıkartacağına inandığın kısımları bir daha gözden geçir ve normalde olması gerektiği gibi birdaha dene :D en basit çözüm yolu bu bence...birde devrende parazit yapacak tarzda bir eleman varsa mesela röleden bahsediyorsun onun uçlarına bir tane ters diyot bağla ama büyük ihtimal pic enerjiyi aldığında reset atıp duruyor...yada bir yerde kısa devre var iş senin ölçü aletini kullanma yeteneğine kalmış gibi duruyor...

selvi

@ 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 'roleyi ceken uc
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
alici program yukardaki gibidir.programin diger kisimlari ayni.sadece test icin programa su ekleme yapip roleyi denedim.
if i=1 AND AL<>0 AND M=0 then
SAYAC=AL
if sayac=2 then
portb.3=1  'roleyi ceken uc
pause 500
portb.3=0
endif
FOR K=0 TO 6
PORTB.6=1
PAUSE 100
PORTB.6=0
PAUSE 100
NEXT K
ENDIF
  vericiden al=2 datasini yolladigimda role cekiyor.burda sorun yok.fakat rb0 kesmesi 2 kez(if sayac=sayi then) olustugunda bir sure role cekiyor.bir kac denemeden sonra role cekmiyor.fakat ayni durumda if sayac=2 then kisminda role istikrarli bir sekilde cekiyor.
bu testi sayac=al olup olmdigina baktim.al degeerini sayac degerine attigini gordum.fakat sorun sayac=sayi kosulunda cikiyor.bu test direk devre uzerinde yaptim.zaten simulasyonda bir sorun yok.
Yaşam anlamlandırıldıkça kutsaldır....

Lütfi AYYILDIZ

Röleye bir yük bağlı ise oluşturduğu parazit PIC i etkiliyordur. Ben çok çektim bu yüzden. Şebeke fitresi veya smps bir güç kaynağı sorunu kökten çözüyor.  
Portb3=1 yerine high portb.3 veya low portb.3 birde böyle dene.

selvi

roleye yuk bagli değil.dediginiz degisikligi yaptim bir sey degismedi.besleme olarak 9v pil kullaniyorum.kismi degisikler yaptim.sorunu tespit edemedim.bazi denemelerde kapat butonunu fazla basili tuttugumda baktim role cekmiyor; kisa sureli bastigim zaman roleyi cekmede sorun cikmadigini fark ettim.  roledeki sorun ortadan kalkti.kapat butonuda  roleyi cekiyor.ornegin: SAYAC=AL  sayaca 2 degerini atadim.bu sefer 2 kez kapat butonuna bastigimda yine role cekiyor.sayaca 3 degerini yukledigimizde 3 kez kapat butonuna basildiginda role cekiyor.yani sayac degerine gore kapat butonuna basma degeri esit olunca yine de role cekiyor.programda oyle bir durum yok.
Yaşam anlamlandırıldıkça kutsaldır....