rs485 çoklu seri iletişim problemi

Başlatan turkbowling, 12 Eylül 2007, 19:51:03

turkbowling

2 adet pic 16f877 yi rs485 ile bilgisayara bağladım
tek olarak çalıştırdıgımda bir problem yok
fakat 2inciyi bağladıgımda kesme ile birinden bilgi almaya çalıştıgımda diğerindende bilgi alıyor 2 pic'in bilgisi aynı anda bilgisayara gidiyor





bağlantı benzer şekilde hatayı nerde yapıyorum acaba yardımcı olursanız sevinirim teşekkürler





turkbowling..................

burak_82

Her birine adres verdin mi?RS485 te her alıcıya bir kimlik vermelisin. Veriyi tüm alıcılar alır ancak sadece kimlik bilgisi uyan yanılar

turkbowling

bilgisayardan pic'e göndermeyi henüz denemedim ama gönderirken sorun olacagını sanmam çünkü iki işlemciyede farklı kodlar kullandım

mesela bilgisayardan 0-gelince pic-48 olarak görüp işlem yapıyor

ikinci pic ise 49 yani 1 gelince devreye giriyor dedigim gibi denemedim ama sorun olacagını sanmıyorum..

benim problemim pic'lerden bilgisayara gidişte  2 pic de kesme ile bilgi gönderiyor
birinci pic'e portb.0 kesmesine tıkladıgımda iki picdeki bilgi birden bilgisayar gidiyor ve sürekli göndermeye devam ediyor... gelecek sefere proton kodu da ilave edeyim..

teşekkürler..

mavi

bağlantın doğru ama programlamada kullandığın algoritmayanlış tekrar gözden geçir bu bağlantı half duplex bağlantı aynı anda bir 485 konuşabilir ve konuşanı herkes dinlemek zorundadır.Telsiz gibi düşün....Adı anılan konuşmalıki karışmasın
Telecommander Monster Of Network

turkbowling

kod aşagıdaki gibi portb.0 da bir adet kesme var kesme aktif olunca bilgiyi alıp gönderiyor.
sorun şu porte.0=0 dediğim zaman çıkış tam gnd olmuyor el ile tam gnd yaptıgımda bilgi göndermiyor ne yaptıysan porte.0  ı tam gnd yapamadım
transistörle mi gnd yapmalıyım..bilmiyorum..

DEVICE 16F877 ;ENTEGRE TANIMLAMA
XTAL 4 ;KRISTAL FREKANSI 
'------------------------------------------------------------------------
TRISA=%00000000
TRISB=%00000001  'PORTB7 GIRIS DIGERLERI ÇIKIS OLSUN
TRISC=%10110000
TRISD=%11111111
TRISE=%00000000

porta=0 
portb=0 
PORTC=0 
PORTD=0
PORTE=0


'LCD TANITMA BOLÜMÜ.....................................................................................
DEFINE LCD_DREG		PORTB	    'LCD data bacaklari hangi porta bagli? portb
DEFINE LCD_DBIT		PORTB.4		'LCD data bacaklari hangi bitten basliyor? portb.4 den itibaren
DECLARE LCD_ENPIN   PORTB.3     'LCD "E" pin portb nin hangi bitine baglidir.
DECLARE LCD_RSPIN   PORTB.2     'LCD "RS" pin portb nin hangi bitine baglidir.
DEFINE LCD_BITS			4		'LCD 4 bit  olarak bağlı
'----------------------------------------------------------------------			
INCLUDE "MODEDEFS.BAS"              'serin-serout          
ALL_DIGITAL=TRUE                    'bütün portlari djital (1-0) yap 
PORTB_PULLUPS=FALSE                 'portb nin pull up kapat 

'kesme ayarları------------------------------------------------------
ON_INTERRUPT GOTO KESME
OPTION_REG = %00000000 'INTERRUPT KÖSE DURUMU
INTCON  =%10010000     'global kesme aktif,portb.0 kesmesi aktif
'-----------------------------------------------------------------------

DIM L0 AS WORD
DIM L1 AS WORD
DIM L2 AS WORD
DIM L3 AS WORD
DIM L4 AS WORD
DIM L5 AS WORD
DIM L6 AS WORD
DIM L7 AS WORD
DIM L8 AS WORD
DIM L9 AS WORD
DIM L10 AS WORD
DIM L11 AS WORD
DIM VERI AS WORD


'//////////////////////////////////////////////////////////////////////////
BASLA:
porta.0=1 
ENABLE             'kesme devrede 
INTCON.7=1         'global kesme aktif

cursor 1,1
LCDOUT  "BOWLING PROGRAMI"
'LCDOUT $FE,1,"BOWLING PROGRAMI"  'sil ve ilk satira yaz	
cursor 2,1
LCDOUT "makina devrede"
PAUSE 50

porta.0=0           'picin devrede oldugunu bildirmek içim
portb.1=1           'pic devrede beklemede



porte.0=0           '877 den max485'e veri gönderme izni iptal
porte.1=1           'com dan max485'e veri gönderme izni 




SERIN PORTC.7 ,T9600,[VERI]  
PAUSE 50
if veri=48 then porta.0=1  'mk.devrede
PAUSE 50
if veri=49 then porta.0=0   'mk.kapali
PAUSE 50
if veri=50 then goto kesme   'mk.kapali
PAUSE 50


goto devam
goto basla
'////////////////////////////////////////////////////////////////////////////
KESME:
devam:
DISABLE            'kesmeyi pasif
DELAYMS 20
porte.0=1           '877 den max485'e veri gönderme izni 
porte.1=0           'com dan max485'e veri gönderme izni 

portb.1=1           'veri gidiyor 

'----------------------------------------------------------------------------
L0=65  'a  'önce sifirlayalim  65=a
L1=48    
L2=48
L3=48
L4=48
L5=48
L6=48
L7=48
L8=48
L9=48
L10=48
L11=83  's

'pinler
if portd.7=0 then L1=49   'L leri esitleyelim
if portd.6=0 then L2=49
if portd.5=0 then L3=49
if portd.4=0 then L4=49

if portc.5=0 then L5=49
if portc.4=0 then L6=49

if portd.3=0 then L7=49
if portd.2=0 then L8=49
if portd.1=0 then L9=49
if portd.0=0 then L10=49

'------------------------------------------------------------------------

SEROUT PORTC.6,T9600,[L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11]
delayms 50

'-------------------------------------------------------------------------

INTCON.1=0       	'RB0/INT Bayrağı (flag) silindi.
RESUME
GOTO BASLA
'-------------------------------------------------------------------------

'note:pic yand,:sebebi__portu çikıs olarak ayarlayip sonra halleffecten gnd
'gönderdim
'bir şey baglamadan önce port ölc