Seri haberleşme yavaş çalışıyor ?

Başlatan gtekdemir, 17 Eylül 2009, 04:23:52

gtekdemir

Merhaba, bir noktadan uzak bir noktaya birkaç verinin transferi ile uğraşıyorum bunu RF ile yapacağım, göndereceğim veriler sıcaklık(LM35 ile), gerilim bilgisi ve bir motorun döndüğü bilgisi. Göndereceğim veri sayısı aslında çok daha fazla şimdilik bunları gönderiyorum.Programı yazdım fakat proteus'ta yavaş çalıştığını gözledim ve breadboard üstüne devreyi kurdum fakat yine yavaş çalıştı, yavaştan kastım vericiden gönderilen verileri alıcıda görmem yaklaşık 1 saniye sürüyor. Program üzerinde biraz oynamak gerekiyor yardımcı olur musunuz. Ayrıca şu problemim var voltaj değerini ekranda gösterirken "."dan sonra bir basamak olması için kodu şöyle yazdım
Print At 1,10,"V=",DEC1 ger1
ger1 değişkeni float olarak tanımlı. Bu haliyle 300.5 gibi bir değeri 300.5 gösterirken 12.5 değerini 12.52  ,  1.3 değerini ise 1.362 gibi değerler gösteriyor, ben "."dan sonra yalnızca bir basamak olsun istiyorum nasıl yapabilirim ?

Devrenin İsis dosyasını (ver 7.2) ve kodları buradan indirebilirsiniz
Program şu şekilde

Verici Programı;

Device 16F877A
XTAL 4
Declare LCD_DTPIN PORTB.4	'DATA girişi PORTB'nin 4. ucundan başlayacak
Declare LCD_ENPIN PORTB.2	'LCD'nin Enable ucu
Declare LCD_RSPIN PORTB.1	'LCD'nin Register Select ucu
Declare LCD_INTERFACE 4	    'LCD veri yolu 4 bit olacak
Declare LCD_LINES 2		    'LCD 2 satırdan oluşuyor
Cls					        'ekranı temizler ve 30 ms gecikme sağlar

Declare ADIN_RES 10     ' Çözünürlük 10 Bit 
Declare ADIN_TAD FRC   ' 
Declare ADIN_STIME 100 ' Örnekleme zamanı 100us 

ADCON1 = %10000100 '7.bit 1 yapılarak 10 bit okuma sağlanır , AN 0,1,3 analog giriş olarak kuruldu 

TRISA = %00001111   'RA0,1,3 (Analog) giriş , RA2 dijital giriş 
TRISB=0             'TAMAMI çıkış
TRISC=0
TRISD=0
TRISE=0

Dim sicak1 As Float       ' TANIMLAMALAR
Dim ger1 As Float
Dim ham As Word
Dim motor As Word

sicak1=0                 'değerleri sıfırla
ger1=0
motor=0
ham=0

BASLA:
Print At 1,$fe

'Sıcaklık kontrol kısmı
'----------------------------------------------------------------------------------

ham = ADIn 0                   'AN0 dan okunan değeri HAM değişkeni içine ata
BAK: If ADCON0.2=1 Then BAK    'Çevrim bittiğinde alt satırdan devam edecek
sicak1=HAM*5/1023
sicak1=sicak1*100
If sicak1<20 Then
Print At 1,1,"HATA",DEC1 sicak1
SerOut PORTD.0,4800,["q","w","e",sicak1]
Else
Print At 1,1,"'C=",DEC1 sicak1   'Veri değişkeni değerini LCD' de göster

SerOut PORTD.0,4800,["q","w","e",sicak1]  'portd.0'dan 2400 baudrate ile veri gönderir preanbl olarak
                                          'q w ve e karakterleri gönderilir, arkasından veri gönderilir
EndIf
'Gerilim ölçme  kısmı
'------------------------------------------------------------------------------------

ham = ADIn 1                     'AN1 den okunan değeri HAM değişkeni içine ata
BAKK: If ADCON0.2=1 Then BAKK    'Çevrim bittiğinde alt satırdan devam edecek
ger1=HAM*5/1023
ger1=ger1*70.278                ' 310V / 4.411V = 70.278 katsayısı bulunur

Print At 1,10,"V=",DEC1 ger1     'ger1 değişkeni değerini LCD' de göster

SerOut PORTD.0,4800,["a","s","d",ger1]  'portd.0'dan 2400 baudrate ile veri gönderir preanbl olarak
                                        'a s ve d karakterleri gönderilir, arkasından veri gönderilir
'Motor Kontrol Kısmı
'--------------------------------------------------------------------------
If PORTA.2=0 Then 
motor=%0001
Print At 2,1,"motor / on      "
Else
motor=%0000 
Print At 2,1,"motor / ALARM   "
EndIf
SerOut PORTD.0,4800,["z","x","c",motor]

GoTo BASLA

End


Alıcı Programı ;

Device 16F628A
XTAL 4

Declare LCD_DTPIN PORTB.4	'DATA girişi PORTB'nin 4. ucundan başlayacak
Declare LCD_ENPIN PORTB.2	'LCD'nin Enable ucu
Declare LCD_RSPIN PORTB.1	'LCD'nin Register Select ucu
Declare LCD_INTERFACE 4	    'LCD veri yolu 4 bit olacak
Declare LCD_LINES 2		    'LCD 2 satırdan oluşuyor
Cls					        'Ekranı temizler ve 30 ms gecikme sağlar


CMCON =7  ' tüm portlar dijital

TRISA=%00001                        'PORTA.0 GİRİŞ DİĞERLERİ ÇIKIŞ
TRISB=0                             'DİĞER PORTLARIN TAMAMI ÇIKIŞ

                         
Dim gelen As Float    'float CİNSİNDEN TANIMLAMA
Dim sayac As Byte
Dim hata1 As Byte
Dim hata2 As Byte
gelen=0

BASLA:

'Sıcaklık değeri alınıyor
'-----------------------------------------------------------------------------------------------

SerIn PORTA.0,4800,[Wait ("qwe"), gelen]   'q w ve e karakterleri 4800 baud rate ile geldiğinde
                                           'sonrasından gelen veriler gelen değişkeni içine atanır
If gelen<20 Then
Print At 1,1,"HATA",DEC1 gelen             'sıcaklık 20 C nin altındaysa HATA yazsın ve hata ledi yansın
hata1=%1
Else
Print At 1,1,"'C=",DEC1 gelen           'gelen değeri ekranda yazdır
hata1=0
EndIf

'------------------------------------------------------------------------------------------------
'Voltaj değeri alınıyor
'-----------------------------------------------------------------------------------------------
SerIn PORTA.0,4800,[Wait ("asd"), gelen]   'a s ve d karakterleri 4800 baud rate ile geldiğinde
                                           'sonrasından gelen veriler "gelen" değişkeni içine atanır

Print At 1,10,"V=",DEC1 gelen           'gelen değeri ekranda yazdır
'------------------------------------------------------------------------------------------------
'Motor çalışıyor bilgisi
'------------------------------------------------------------------------------------------------
SerIn PORTA.0,4800,[Wait ("zxc"), sayac]
If sayac<1 Then
Print At 2,1,"MOTOR HATASI    "                 'motor çalışmıyor ise 
hata2=%1
Else
Print At 2,1,"Motor = ",DEC2 sayac,"    "
hata2=0
EndIf

GoSub HATA

GoTo BASLA
'------------------------------------------------------------------------------------------------
HATA:                            'Motor çalışmıyorsa veya sıcaklık 20 C nin altındaysa hata led'ini yak
If hata1 + hata2 >0 Then
PORTA.2=1                      'led yak
Else
PORTA.2=0                      'led söndür
EndIf

Return

End

muuzoo

Bu programlama dilinden anlamıyorum ama yanlış yorumlamadıysam iletişim hızınız (baud rate) 4800 bps olarak gözüküyor. Onu yükseltirseniz iletişim hızınız da artacaktır.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

Maxim

4800 rf için çok bile
hatta düşürmek bile gerekebilir belki, sorun çıkarsa .

serout - serin komutlarından vazgeçin ,
bu komutlar yazılım üzerinden seri port kullanmak içindir ,
ve aşırı yavaş çalışırlar ,haliyle döngümüzde yavaşlar .

donanımsal seri port kullanın ,
hserout ve hserin komutlarına bakın ,
bu sayde program hem çok daha hızlı hemde çok daha sağlam çalışacaktır.

16F877A nın donanımsal seri portları portb.6 ve portb.7 dir.
16F628A nın donanımsal seri portları portb.1 ve portb.2 dir.