pbp ile pic pc seri port iletişimi nasıl yapılır

Başlatan erkan614, 11 Mart 2009, 13:41:10

erkan614

iyi günler
bu konuda birçok yazı yazıldı soru soruldu hemen hemen hepsini okumuştum ama pek birşey anlayamadım :oops:

hangi komutlar ile haberleşme yapılır rs232'de T1in T2in ve R1out R2out uçlarına hangi pic pinlerini bağlamalıyım?

mesela serout komutu ile tek bir pinden seri haberleşme çıkışı yapıyor bunu t1in e bağlasam t2inden ne yollıycam

elinde yapılmış basitbir programı olan varsa ekleyebilirmi
veya bir isis şeması

Maxim

T1in - T2out falan max232 entegresinin uçları ?

fiziksel bağlantı şöyle olacak :

PIC(TX PIN) ->T1IN MAX232 T1OUT ->PC DB9 PIN2
PIC(RX PIN) <-R1OUT MAX232 R1IN <-PC DB9 PIN3  

seri komutlarda serout ,serin ,hserout ,hserin diye ,
h ile başlayanlar eğer varsa pic`in donanım usartını kullanmak için .

Maxim


erkan614

rts ve cts pinleri ne işe yarıyor?

compimden alıcağım sinyalleri neden görebilirim

erkan614


resimde virtual terminal compime bağlanmış com3 olarak ayarlanmış

şimdi ben advantec vitrual terminal programıdan com3 e yazı gönderip isisteki virtual terminalden gönderdiğim yazıyı görmak istiyorum nasıl yapabilirim?

Tagli

Kesin konuşmayayım ama bildiğim kadarıyla bilgisayardaki bir COM portuna aynı anda iki program erişemez. Isis ve Advantec Virtual Terminal (bu arada bu ismi ilk kez duyuyorum) aynı anda porta sahip olamayacakları için bu iki program arasında bu şekilde iletişim kuramazsın. Gerçi bilmiyorum, belki aralarında sanal bir port oluşturmanın yolu vardır, araştırmak gerek...
Gökçe Tağlıoğlu

Maxim

Alıntı yapılan: "erkan614"
resimde virtual terminal compime bağlanmış com3 olarak ayarlanmış

şimdi ben advantec vitrual terminal programıdan com3 e yazı gönderip isisteki virtual terminalden gönderdiğim yazıyı görmak istiyorum nasıl yapabilirim?

yapabilirsiniz ..

eltima software
"virtual serial port driver" programını kuruyorsunuz ve seri port yaratıyorsunuz , sonra o dediğiniz işlem yapılıyor , hatta bu konu daha önce forumda görüşüldü .

erkan614

1) bir pic ten diğerine serout2 pin,396,["x","x","x","x"]
şeklinde bir komut gönreriyorum var sayalım burdaki x ile belirtilen harfler değişken harflerdir
bu harfkleri diğer picten alıp 2x16 ekrana nasıl yazdırırım?

2) kendinden ekranı ve klavyesi olan bir modulum var bu modulu seri porttan pc ye bağladığımda modulden yazdığım harfleri advantec serial port yazılımından okuyorum ama gönderdiğim harfler moduldeki ekranda çıkmıyor? acaba sebebi nedir?

erkan614

2. sorunu hallettim

1. soru hala gizemini koruyor benim için

Tagli

Alıntı yapılan: "erkan614"1) bir pic ten diğerine serout2 pin,396,["x","x","x","x"]
şeklinde bir komut gönreriyorum var sayalım burdaki x ile belirtilen harfler değişken harflerdir
bu harfkleri diğer picten alıp 2x16 ekrana nasıl yazdırırım?
Emin değilim ama belki gelen her bir harf bir byte olacağından bunlar alıcı tarafında gelen harf sayısı kadar değişkene atılır (tabi gelen harf sayısı biliniyorsa), sonra da LCDOUT komutuyla ekrana yazdırılabilir bence. LCDOUT da yanlış hatırlamıyorsam ekrana 1 byte'lık kodlar yolluyor, zaten gelen veri de ASCII kodu olacağından çalışır bence. Gerçi hatırlamadığım bölüm bu 1 byte'lık şeyin veri mi komut mu olduğunun PicBasic Pro'da nasıl ifade edildiği. Mesela LCDOUT $00 yazsak bu her zaman komut olarak mı algılanır? Eğer $00 yerine değişken yazabiliyorsak bence bu şekilde çalışabilir, ama PicBasic Pro bilgim kısıtlı olduğu için pek yardımcı olamıyorum malesef.
Gökçe Tağlıoğlu

erkan614

arkadaşlar hserin komutunu çalıştıramadım :(

acaba yanlışmı veya eksik birşeymi var?

verici programı;
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_ON
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 

INCLUDE "modedefs.bas"

CMCON=7 
dEFINE OSC 4 
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 2400
TRISA=0
TRISB=%11110000
OPTION_REG.7=0
VERI VAR BYTE 
M VAR PORTA.0
Y VAR PORTA.1
K VAR PORTA.2
PORTB=0
porta=$ff
B1 var PORTB.5
B2 var PORTB.6
B3 var PORTB.7
B1E var bit
B1Y var bit
B2E var bit
B2Y var bit
B3E var bit
B3Y var bit
b1e=1
b2e=1
b3e=1

basla:
if b1 xor b1e = 1 then
    if b1=0 then 
        hSerOut ["a","a","a",dec 11]
        b1e=0
            else
        hSerOut ["a","a","a",dec 10]
        b1e=1
    endif
endif

if b2=0 then hSerOut ["a","a","a",dec 22]
if b3=0 then hSerOut ["a","a","a",dec 33]
if b1 or b2 or b3 = 0 then low k 
if b1 and b2 and b3 = 1 then high k
high portb.2
pause 20
goto basla
end


çalışmayan hserin komutlu alıcı programı;
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_ON
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 

INCLUDE "modedefs.bas"

CMCON=7 
INTCON=%00000000
DEFINE OSC 4 
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 00h
DEFINE HSER_BAUD 2400
TRISA=0
TRISB=%11111111
OPTION_REG.7=0

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 
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT 


M VAR PORTA.0
Y VAR PORTA.1
K VAR PORTA.2
PORTB=0
B1 var PORTB.5
B2 var PORTB.6
B3 var PORTB.7
veri1 var byte

basla:
if veri1=11 then 
    low M 
 else
    high m 
endif
if veri1=22 then 
    low y 
 else
    high y 
endif
if veri1=33 then 
    low k
 else
    high k 
endif
pause 100
goto basla

DISABLE
INT:
    GIE=0
    hSerIn , [WAIT("aaa"),dec veri1] 
    GIE=1
    Resume
enable 
end


çalışan serin2 komutlu program
@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_ON
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 
CMCON=7 
DEFINE OSC 4 
TRISA=0
TRISB=%11111111
OPTION_REG.7=1
M VAR PORTA.0
Y VAR PORTA.1
K VAR PORTA.2
PORTB=0
B1 var PORTB.5
B2 var PORTB.6
B3 var PORTB.7
veri1 var byte
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 00h
DEFINE HSER_BAUD 2400
define HSERIAL_SPBRG 25 

basla:
if veri1=11 then 
    low M 
 else
    high m 
endif
if veri1=22 then 
    low y 
 else
    high y 
endif
if veri1=33 then 
    low k
 else
    high k 
endif
pause 100
hSerIn [WAIT("aaa"),dec veri1] 
goto basla
end

erkan614

DEFINE HSER_CLROERR 1

bunu ekleyince çalıştı

Tagli

Bu overflow error ile ilgili. Daha önce çalışmamasının sebebi overflow error olabilir. Bu da 2 byte alındıktan sonra RCREG'in okunmamış olması ve bu arada gelen 3. byte için yer olmamasından kaynaklanır. Yani o DEFINE'ı yazmak her ne kadar programın hatasını çözmüş gibi görünse de aslında sorun devam ediyor, sadece maskelenmiş. Bu durumda veri kaybına uğrayabilirsin.

Alıntı yapılan: "[url=http://www.melabs.com/resources/pbpmanual/PicBasic Pro Manual[/url]"]As the hardware serial port only has a 2 byte input buffer, it can easily overflow if characters are not read from it often enough. When this happens, the USART stops accepting new characters and needs to be reset. This overflow error can be reset by toggling the CREN bit in the RCSTA register. A DEFINE can be used to automatically clear this error. However, you will not know that an error has occurred and characters may have been lost.

DEFINE HSER_ CLROERR    1

Ki senin beklediğin "aaa" 3 byte. Senin alıcı tarafındaki kod HSERIN bölümüne gelmese bile verici yollayınca donanım 3 byte'ı almaya çalışacak ve taşma olacak. Bu yüzden genelde seri iletişimde kesmeler kullanılır.
Gökçe Tağlıoğlu

erkan614

DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_ON
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, MCLR_ON
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 

INCLUDE "modedefs.bas"

CMCON=7 
INTCON=%11000000
DEFINE OSC 4 
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 00h
DEFINE HSER_BAUD 2400
DEFINE HSER_CLROERR 1
TRISA=0
TRISB=%00000010
OPTION_REG.7=1

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 
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT 


M VAR PORTA.0
Y VAR PORTA.1
K VAR PORTA.2
PORTB=0
B1 var PORTB.5
B2 var PORTB.6
B3 var PORTB.7
veri1 var byte

basla:
if veri1=11 then 
    low M 
 else
    high m 
endif
if veri1=22 then 
    low y 
 else
    high y 
endif
if veri1=33 then 
    low k
 else
    high k 
endif
pause 100
goto basla

DISABLE
INT:
    GIE=0
    hSerIn [WAIT("aaa"),dec veri1] 
    
    GIE=1
    Resume
enable 
end


alıcıdaki kod bu interrupt ile hserin bölümüne gidiyor şimdi veri kaybolmaması için önce bi preamble dedikleri olayı yapsam
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
satırı ile taşma işlemini bu satırda yapıp sonra veri yollasam
mesela
if b1 xor b1e = 1 then
    random veri
    if b1=0 then 
        HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
        hSerOut ["a","a","a",dec veri]
        hSerOut ["a","a","a",dec veri]
        hSerOut ["a","a","a",dec veri]
        b1e=0
            else    
        HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]      
        hSerOut ["a","a","a",dec veri]      
        hSerOut ["a","a","a",dec veri]      
        hSerOut ["a","a","a",dec veri]
        b1e=1
    endif
endif

böyle bir data gönderme işleminde yine veri kaybı yaşarmıyım?

erkan614

usart ile veri gönderirken pic'in hserin komutunda veri kaybetmemesi için nasıl bir yol izlemeliyim?

hserin ile birden fazla değişkeni nasıl alabilirim?