proteusda çalışan hserout uygulaması gerçek uygulamada hatalı veri gönderiyor??

Başlatan forumsad, 19 Mart 2011, 16:50:49

forumsad

arkadaşlar bir süredir seri iletişimle ilğili örnekler yapıyorum proteus üzerinde tüm örneklerim çalıştı

sıra geldi gerçek pic üzerine uygulamaya  devreyi hazırladım ....çalıştırdım bir sorun yok pic normal çalışıyor
seri iletişim örnekleri yapmaya başladığımda bir sorunla karşılaştım

önce hserout uygulaması yapmak istedim proteusda düzgün çalışan aşağıdaki kod
gerçek uygulamada pc'ye hatalı veri gönderiyor...nedenini bir türlü nalayamadım
saygılarımla..
'****************************************************************
'****************************************************************
Device 16F877A ;ENTEGRE TANIMLAMA
Xtal 4 ;KRISTAL FREKANSI 

'------------------------------------------------------------------------
TRISA=%11111111
TRISB=%00001111 'PORTB7 GIRIS DIGERLERI ÇIKIS OLSUN
TRISC=%10000000
TRISD=%00000000
TRISE=%00000000

PORTA=0 
PORTB=0 
PORTC=0 
PORTD=0
PORTE=0

All_Digital=TRUE 'bütün portlari djital (1-0) yap 
PortB_Pullups=FALSE 'portb nin pull up kapat 

'seri rs232...........................................................................
 Hserial_Baud = 9600        ' Set baud rate to 9600
 Hserial_RCSTA = %10010000  ' Enable serial port and continuous receive
 Hserial_TXSTA = %00100100  ' Enable transmit and asynchronous mode 
 Hserial_Clear = On         ' Optionally clear the buffer before receiving
 Hserial_SPBRG= 25







Dim SerGelen[8] As Byte
Dim SerGiden[8] As Byte
Dim SerGidenTest[8] As Byte





BASLA: 
PORTE.2=1  'pic on
PORTE.0=0  'PC veri 
DelayMS 1000
GoTo testGonder
GoTo BASLA ' Loop forever


'/////////////////////////////////////////////////
'/////////////////////////////////////////////////
'/////////////////////////////////////////////////






'***********************************************************************************************************
testGonder:
PORTE.0=1  'PC veri 

'PORTC.5=1           'max485'e veri
'PORTC.4=0           'max485'e veri

Str SerGidenTest="BtestOkS"

                        
HSerOut [Str SerGidenTest\8]  ' Display a 5-byte string.

GoTo BASLA
'***********************************************************************************************************

End





not:

Str SerGidenTest="BA"                       
HSerOut [Str SerGidenTest\2]

bu şekilde gönderdiğimde B sürekli düzgün gidiyor ama A karışık bozularak gidiyor

alayli

Donanım olarak max485 kullandığınızı farzederek yorumda bulunuyorum. Verdiğiniz örnek koddan anladığım kadarıyla max485 kullanıyorsunuz. Eğer max 485 kullanıyorsanız Hserin ile datayı gönderdikten sonra max485'in DE pinini bir süre daha lojik 1 de tutmanız gerekir. Kodla açıklamak gerekirse:

..........................................
Symbol DE_485 = PORTB.3 'max485 data enable pini
Symbol GET    = 0 'data al
Symbol SEND   = 1 ' data gönder
...........................................
............................................
...........................................
..........................................
data_gonder:
DE_485 = SEND
HRSOut SOH,STX,ID,TEMP1,TEMP2,KAPI1,KAPI2,$55,$55,$55,$55,CRC_CAL,ETX   
DelayMs 1
DE_485 = GET
return


Yukarıdaki kodda HRSOut komutunu işlettikten sonra 1 ms lik gecikme olmadan sizin dediğiniz durum meydana gelir. Sondaki bir kaç bayt kırpılır. Gecikmenin süresi toplamda gönderilen datanın kaç bayt olduğuna ve haberleşme hızına göre değişir. Pratik uygulamalarda eğer her gönderimde eşit sayıda bayttan oluşan data katarı kullanılıyorsa çıkışlar (pic ve rs485 çıkışları) osiloskop ile incelenerek bu süre tayin edilebileceği gibi usart send interrupt da kullanılabilir ve daha sağlıklıdır.

Bahsettiğim durum Hardware usart kullanılmayan durumlarda geçerli değildir. HSerout ve HRSout komutları bu gecikmeye ihtiyaç duyar. Siz de kodunuzda HSerout yerine Serout ile bir deneyin. Eğer gecikme eklemeden sorun ortadan kalkıyorsa, teşhisi koymuş olursunuz.
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

forumsad

cevap için teşekkürler söylediklerinizi deneyip tekrar sonucu yazacagım

fakat sorunun rs485 den olabileceğini tahmin ederek uygulamayı rs232 de denedim hata aynen devam etti......

sizce en sağlıklı seri iletişim metodu (proton ile) hangisi??  o metod üzerine araştırma denemeler yapayım...

saygılarımla teşekkürler

My75


high pin2-3 : delayms 20
hserout
low  pin2-3 : delayms 20


Bu şekildede deneyebilirsin..
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

forumsad

'***********************************************************************************************************
testGonder:
PORTE.0=1  'PC veri 

PORTC.5=1           'max485_gidis DE=1
PORTC.4=0           'max485_gelis DE=0
DelayMS 100

Str SerGidenTest="BABABABA"
                        
HSerOut [Str SerGidenTest\8]  
DelayMS 500

PORTC.5=0           'max485_gidis DE=0
PORTC.4=1           'max485_gelis DE=1

GoTo BASLA
'***********************************************************************************************************


bu şekilde değiştirdim sadece BA gönderdiğimde düzgün gitti ama 8 adet kelime göndermek istediğimde bozuldu....



birazdan serout ile bir deneme yapacağım...

forumsad

'***********************************************************************************************************
testGonder:
PORTE.0=1  'PC veri 

PORTC.5=1           'max485_gidis DE=1
PORTC.4=0           'max485_gelis DE=0
DelayMS 100

'Str SerGidenTest="BABABABA"                       
'HSerOut [Str SerGidenTest\8]                      'hatalı gönderiyor

'SEROUT PORTC.6 , 16468 , [ "HELLO WORLD" , 13 ]   'hatalı gönderiyor
'SEROUT PORTC.6 , 16468 , [ DEC 65 ]                'hatalı gönderiyor
'SerOut PORTC.6 , 16468 , [ 65 ]                'hatalı gönderiyor
  
 SerString[0] = "H"            ' Load the first 5 bytes of the array
 SerString[1] = "E"            ' With the word "HELLO"
 SerString[2] = "L"
 SerString[3] = "L"
 SerString[4] = "O"
 SerOut PORTC.6 , 16468 , [ Str SerString\5 ]  ' Send 5-byte string.


DelayMS 500

PORTC.5=0           'max485_gidis DE=0
PORTC.4=1           'max485_gelis DE=1

GoTo BASLA
'***********************************************************************************************************



malesef serout uygulamalarıda hatalı

eski versiyon compialer ile derleyip deneyeceğim....