Sevgili dostlar.RS485 haberleşmesi ile başım belada. Bir yere sıramatik
benzeri bir sistem kurdum. 1 master,27 adet slave cihaz var. slavelerin
12 adeti el terminali, 12 adet kapı üzerindeki displayler ve 12
göstergeli ( herbir gösterge 0-99 rakamlarını gösteriyor)iki büyük iki
küçük pano.Sorun şu. slaveler masterden gelen verileri tam alamıyor.
Bazen alıyor bazen alamıyor. Veri alamadığında belirli bir süre sonra
kapatma özelliği var. Dolayısıyla veri alamadığında displayler
sönüyor.Sistemin çalışma mantığı ise şöyle, Master el terminallerine
kendi adreslerini yolluyor ve onlardan üzerindeki bilgileri
topluyor.Tüm veri toplama işlemi bittikten sonra yine RS485 hattından
slavelere bu bilgileri gönderiyor. Sistemi kurmadan önce kendi
atölyemizde sorunsuz çalıştı , lakin yerine kurduğumuzda sorunlarla
uğraşıyoruz. Kullandığım RS485 entegresi max485.Kullanılan hat ise
telefon kablosu.Birde Master ve slavelerden birine toplam ikisine bias
dirençleri taktım. Yani +5V tan 560 ohm direnci A ucuna, GND den 560
ohm direncide B ucuna taktım. Sanırım bu dirençler gürültüyü azaltmak
için kullanılıyor.Tabi 120 ohm luk sonlandırıcı dirençleride taktım.Ben
taktığım 560 ohm luk bias dirençlerinden şüpheleniyorum nasip olursa bu
gün onları deneyeceğim. Sizlerden bu soruna önerilerinizi bekliyorum.
Birde RS232 donanım kesmesi kullanarak sıralı veri almayı yapan
arkadaşlar varsa ( örneğin adres gönderip arkasından o adresle ilgili
verileri toplayan)yardımcı olursanız sevinirim. Kullandığım dil pic basic pro ve serin serout komutları ile haberleşme sağlanıyor.İyi çalışmalar.
Merhaba,
Bende bu mantığa benzer bir sistem yapmıştım. Ama sistem Rf ile haberleşiyordu. Ama haberleşme tek yönlü calışıyordu. kumandanın 64 bit seri nosu ve 8 bit data gönderme özeliği vardı. Alıcıyı istediğin kadar artırabiliyordun. Ancak Seri nosu vericiyle aynı olan alıcılar cıkış veriyordu.
Sende bu böyle bir sistem ekleye bilirsin. Displayler tek yönlü calışacağı için bilgi göndermeyi rf ile daha iyi yaparsın. Hem bu sayede kablo derdinden kurtulmuş olursun. Çünkü bu sistemin en zahmetli yani kablo hattını döşemektir. El terminalleri Ana üniteye yakın olduğu için fazla sorun cıkartmaz. Onları Rs485 ile haberleştirebilirsin.
Calışmalarında Başarılar,
Hasan ARSLAN
Kullandiginiz hiza yakin iletisim saglayabilen bir RS485 entegresi kullanip deneseniz sonuc alabilirsiniz. 115 -250 ve 500 kBps lik entegreler var.
Mbit lik entegreler le anlasamiyor olabilirsiniz- ki oyle birseye benziyor.
rs485 iletiminde kullanılan kablolar 220 volt taşıyan kablolardan çok etkileniyor kendim böyle bir durum yaşadım.. mümkünse 220 kablolarıyla paralel döşeme eğer döşersen haberleşme kablonu ekranla.. bir noktadan veya birkaç noktadan toprağa ve şasiye bağla..
Cevap yazanlara çok teşekkür ediyorum. Öncelikle haberleşme hızı 250 bps değil sadece 2400 bps, Yani sorun çıkmasın diye bu kadar düşürdüm. Diğer bir husus el terminalleri 16f628 ile yapılmış ve internal osc kullandım.( 4 Mhz. ) master ve diğer küçük slave panolar, 16f877 ve 20 Mhz( Kristal ile ) . Dün 8 test için 8 adet el terminalini yan yana koyup hattın değişik noktalarından testlerimizi yaptık. Gayet güzel çalıştı. Bugün el terminalllerini yerlerine taktık ve olan oldu. Sistem sapıtmaya başladı. Saç baş yolduracak düzeye geldi. Sorunun nereden kaynaklandığını bulmak o kadar zorki bu konuda yardımcı olacak arkadaşlar varsa sevineceğim ve hayır duaları edeceğim :) Sorunları yazayım isterseniz; Pic basic pro kullanıyorum. her bir el terminaline bir adres verdim. Örneğin 1.el terminali 181 ikinci 182 vs gibi. Master ilk önce 181 verisini RS485 hattına gönderiyor. sonra bekliyor.( Sadece seri haberleşme alma donanım kesmesi kullandım, göndermeyi yapamadım lakin gönderirken RS485 entegresi enable ucunun aktif olması gerekli.) el terminali kendisine gelen adres doğruysa üzerindeki veriyi hatta gönderiyor. Bu arada diğer küçük slave panolar , master'ın gönderdiği adresi ve sonra el terminalinin verisini birleştirip ilgili satıra yazıyor. Sistem çalıştı lakin el terminallerini devreye soktuğumuzda sapıtmaya başladı. Dün sağlam olarak denediğimiz el terminallerinin bilgilerini master panoda göremediğimiz gibi bilgilerde kaybolmalar. Gidip gelmeler ve hatta farklı aptal aptal değerler gördük. Sorunun ne olduğu konusunda kafam allak bullak oldu. Bu arada slavler bilgiyi alamadığında , üzerindeki bilgiler siliniyor ve bir daha görünmüyor. Mesela kapı üstüne yaptığım bir uygulamada ( 16f628 ile yapılmış ve internal 4 mhz osc kullanılmış ) enerjisini kesip yeniden verdiğimizde doğru bilgilyi gösteriyor. Yani bir yerde kilitlenip kalıyor. Bana MAX 485 entegre kullanarak donanım haberleşmesini ve protokolün nasıl olacağı konusunda yada ilgili hat ile neler yapabileceğim konusunda yardımcı olabilirseniz çok sevienceğim. Bu arada yaptığım projenin tüm programlarını aşağıya yazıyorum. Uzun yazdığım için kusura bakmayın. Lakin bu durum beni üzdü. Şimdiden yardımcı olacak arkadaşlara teşekkür ederim.
'EL TERMİNALİ PROGRAMI
'işlemci 16F628
@ device pwrt_on & MCLR_OFF
@ device INTRC_OSC_NOCLKOUT
@ device WDT_OFF
@ device protect_on & cpd_on
'PCON=%00000000
cmcon=7
TRISA = %11100000
TRISB = %00000010
porta=0
portb=0
DEFINE HSER_CLROERR 1
'******** GİRİŞ ÇIKIŞ TANIMLAMALARI ********
'******** GİRİŞLER **********
TXDATA var portb.2
RXDATA var portb.1
RE var portb.0
DE var portb.3
butarti var porta.5
buteksi var porta.6
butrst var porta.7
'******** ÇIKIŞLAR ***********
disp10 var portb
disp1 var porta
'************** Değişken tanımlamaları **********
dispdeg1 var byte
dispdeg10 var byte
dvm01 var byte
dvm02 var byte
verial var byte
verigonder var byte
adres1 var byte
'******** DEĞİŞKEN İLK DEĞERLER ************
dispdeg1=0:dispdeg10=0
verial=0
verigonder=0
RE=0
DE=0
adres1=181
'****************** İNTERRUPT TANIMI **********************
PIR1 = %00100000 ' Set PORTA analog and right justify result
PIE1 = %00100000 ' Set PORTA analog and right justify result
SPBRG= 25 ' Set baud rate to 2400 for 4 MHZ osc
TXSTA= %00000000 ' Enable transmit and asynchronous mode BRGH=0 yavaş
RCSTA= %10010000 ' Enable serial port and continuous receive
INTCON=%11000000
'option_reg=0
on interrupt goto kesme
'///////////////// ANA PROGRAM \\\\\\\\\\\\\\\\\
'///////////////// ANA PROGRAM \\\\\\\\\\\\\\\\\
basla:
verigonder=dispdeg10*10+dispdeg1
if dvm01=1 then gecdvm01
if butarti=0 then artirma
gecdvm01:
if butarti=1 then dvm01=0
if dvm02=1 then gecdvm02
if buteksi=0 then azaltma
gecdvm02:
if buteksi=1 then dvm02=0
if butrst=0 then resetle
goto basla
'*********** ARTIRMA ALT PROGRAMI ***********
artirma:
dvm01=1
dispdeg1=dispdeg1+1
if dispdeg1>9 then dispdeg10=dispdeg10+1:dispdeg1=0
if dispdeg10>9 then dispdeg10=0:dispdeg1=0
gosub displaygoster
goto basla
'*********** AZALTMA ALT PROGRAMI ***********
azaltma:
dvm02=1
dispdeg1=dispdeg1-1
if dispdeg1>9 then dispdeg10=dispdeg10-1:dispdeg1=9
if dispdeg10>9 then dispdeg10=0:dispdeg1=0
gosub displaygoster
goto basla
'*********** RESETLEME ALT PROGRAMI ***********
resetle:
dispdeg1=0:dispdeg10=0
gosub displaygoster
goto basla
'**********************************************************
'***************** KESME ALT PROGRAMI *********************
disable
kesme:
verial=RCREG
if verial=adres1 then
pause 5
RCSTA=0:RE=1 : DE=1
serout2 TXDATA,396,[verigonder]
RE = 0: DE=0: RCSTA=%10010000
endif
verial=0
resume
'*********** Buton kontrol alt programı ********
'************ DİSPLAY GÖSTERİM ALT PROGRAMI ********
displaygoster:
dispdeg10=dispdeg10<<4
disp10=dispdeg10
disp1=dispdeg1
dispdeg10=dispdeg10>>4
return
End
'KAPI GÖSTERGE PROGRAMI
'İşlemci 16F628
@ device pwrt_on & MCLR_OFF
@ device INTRC_OSC
@ device WDT_OFF
@ device protect_on & cpd_on
DEFINE HSER_CLROERR 1
cmcon=7
TRISA =%11110000 ' PORTA çıkış
TRISB =%00001110 ' PORTB giriş
'************* GİRİŞ ÇIKIŞ TANIMLAMALARI ************
'******** GİRİŞLER **********
RXDATA var portb.1
'******** ÇIKIŞLAR ***********
dispA var porta.0
dispB var porta.1
dispC var porta.2
dispD var porta.3
dispE var portb.4
dispF var portb.5
dispG var portb.6
chip1 var portb.7
chip2 var portb.0
gosub sifir
'********************* Değişken tanımlamaları **********
dispdeg1 var byte
dispdeg10 var byte
verial var byte
veri var byte
sayi var byte
timeout var byte
RSverial var byte
gecik var byte
verisira var byte
adres1 var byte
'******** DEĞİŞKEN İLK DEĞERLER ************
dispdeg1=0:dispdeg10=0
verial=0
veri=0
sayi=0
chip1=0
chip2=0
timeout=0
rsverial=0
verisira=0
adres1=181
'****************** İNTERRUPT TANIMI **********************
PIR1 = %00100000 ' Set PORTA analog and right justify result
PIE1 = %00100000 ' Set PORTA analog and right justify result
SPBRG= 25 ' Set baud rate to 2400 for 4 MHZ osc
TXSTA= %00000000 ' Enable transmit and asynchronous mode BRGH=0 yavaş
RCSTA= %10010000 ' Enable serial port and continuous receive
INTCON=%11000000
on interrupt goto kesme
'///////////////// ANA PROGRAM \\\\\\\\\\\\\\\\\
'///////////////// ANA PROGRAM \\\\\\\\\\\\\\\\\
basla:
timeout=timeout+1
if timeout>200 then timeout=0:verial=0
gosub gecikme
dispdeg1=verial dig 0
dispdeg10=verial dig 1
if verial=0 then gosub sifir:goto basla
veri=dispdeg1:gosub kodcoz:chip1=1:chip1=0
veri=dispdeg10:gosub kodcoz:chip2=1:chip2=0
goto basla
'**********************************************************
'***************** KESME ALT PROGRAMI *********************
disable
kesme:
RSverial=RCREG
if verisira=1 then
verial=RSverial:verisira=0
if verial>99 then verial=0:goto gecal
timeout=0
endif
if RSverial=adres1 then verisira=1
gecal:
RSverial=0
resume
'************ KOD CÖZME ALT PROGRAMI ***********
kodcoz:
if veri=0 then
dispA=1:dispB=1:dispC=1
dispD=1:dispE=1:dispF=1:dispG=0
endif
if veri=1 then
dispA=0:dispB=1:dispC=1
dispD=0:dispE=0:dispF=0:dispG=0
endif
if veri=2 then
dispA=1:dispB=1:dispC=0
dispD=1:dispE=1:dispF=0:dispG=1
endif
if veri=3 then
dispA=1:dispB=1:dispC=1
dispD=1:dispE=0:dispF=0:dispG=1
endif
if veri=4 then
dispA=0:dispB=1:dispC=1
dispD=0:dispE=0:dispF=1:dispG=1
endif
if veri=5 then
dispA=1:dispB=0:dispC=1
dispD=1:dispE=0:dispF=1:dispG=1
endif
if veri=6 then
dispA=1:dispB=0:dispC=1
dispD=1:dispE=1:dispF=1:dispG=1
endif
if veri=7 then
dispA=1:dispB=1:dispC=1
dispD=0:dispE=0:dispF=1:dispG=0
endif
if veri=8 then
dispA=1:dispB=1:dispC=1
dispD=1:dispE=1:dispF=1:dispG=1
endif
if veri=9 then
dispA=1:dispB=1:dispC=1
dispD=1:dispE=0:dispF=1:dispG=1
endif
return
'**********************************************
gecikme:
for gecik=0 to 20
pause 1
next
return
'**********************************************
sifir:
dispA=0:dispB=0:dispC=0:dispD=0:dispE=0:dispF=0:dispG=0
chip1=1:chip2=1
chip1=0:chip2=0
return
End
'MAİN PROGRAMI
' İşlemci 16F877 20 Mhz kristal
define osc 20
@ device HS_OSC
@ device WDT_OFF & protect_on & cpd_on & pwrt_off & bod_off
PCON=%00000000
TRISA = %00000000 ' Set PORTA to all input
TRISB = %00000000 ' PORTB nin tüm bitlerini giriş ve çıkış olarak ayarla
TRISC = %10000000 ' PORTC nin tüm bitlerini çıkış olarak ayarla
TRISD = %00000000 ' PORTC nin tüm bitlerini çıkış olarak ayarla
TRISE =0 ' PORTC nin tüm bitlerini çıkış olarak ayarla
ADCON1 =7 '%10000100 ' Set PORTA analog and right justify result
porta=0:portb=0:portc=%00001000:portd=0:porte=0
DEFINE HSER_CLROERR 1
pause 5000
'*************** PORT TANIMLAMALARI *****************
TXDATA var portc.6
RXDATA var portc.7
RE var portc.4
DE var portc.5
chip154 var porte.2
chipsec var portb
datagos var portd
gong var portc.3
'************* DEĞİŞKEN TANIMLAMALARI I *************
veri var byte
sayi var byte
RSverial var byte
verial var byte[12]
adresal var byte[12]
slave var byte[12]
blinkbitti var byte[12]
blinkzam var byte[12]
blink var byte[12]
timeout var byte[12]
dispveri var byte[12]
yeniveri var byte[12]
blinksin var byte
verigonder var byte
x var byte
verisira var byte
gecik var byte
index var byte
adres1 var byte
'zaman var byte
sayac var byte[12]
DE=0
RE=0
gong=1
'************* DEĞİŞKEN İLK DEĞERLERİ **************
chip154=1
chipsec=0
veri=0
sayi=0
adresal=0
verisira=0
verigonder=0
adres1=0
sayac=0
'yeniveri=0
for x=0 to 12
verial
- =0:adresal
- =0:slave
- =0:blinkbitti
- =1
blinkzam - =0:blink
- =0:timeout
- =0:dispveri
- =0
yeniveri - =0:sayac
- =0
next
pause 200
chip154=0
chipsec=15
gosub blinkgoster
chip154=0
chipsec=15
'****************** İNTERRUPT TANIMI **********************
PIR1 = %00100000 ' Set PORTA analog and right justify result
PIE1 = %00100000 ' Set PORTA analog and right justify result
SPBRG= 129 ' Set baud rate to 2400 for 20 MHZ osc
TXSTA= %00000000 ' Enable transmit and asynchronous mode BRGH=0 yavaş
RCSTA= %10010000 ' Enable serial port and continuous receive
INTCON=%11000000
on interrupt goto kesme
'///////////////// ANA PROGRAM \\\\\\\\\\\\\\\\\
'///////////////// ANA PROGRAM \\\\\\\\\\\\\\\\\
basla:
for index=0 to 11
RCSTA=0:RE=1 : DE=1
adres1=index+181
serout2 TXDATA,396,[adres1]
RE=0 : DE=0
RCSTA=%10010000
gosub gecikme
if adresal[index]=adres1 then
if verial[index]>yeniveri[index] then blink[index]=1:blinkbitti[index]=0:blinkzam[index]=0:gong=0
yeniveri[index]=verial[index]
veri=yeniveri[index]':verial[index]=0
gosub kodcoz
dispveri[index]=sayi
if blink[index]=1 then datagos=%11111111:goto dvm01
datagos=255:datagos=dispveri[index]
dvm01:
chipsec=index:pauseus 1000:chipsec=15:pauseus 1000
if blinkbitti[index]=1 then bit01
blinkzam[index]=blinkzam[index]+1
sayac[index]=sayac[index]+1
if sayac[index]=1 then blink[index]=1
if sayac[index]=>2 then blink[index]=0:sayac[index]=0
if blinkzam[index]=>20 then blink[index]=0:blinkzam[index]=0:blinkbitti[index]=1
bit01:
endif
timeout[index]=timeout[index]+1
if timeout[index]>20 then verial[index]=0:timeout[index]=0:dispveri[index]=0:datagos=255':yeniveri=0
' zaman=zaman+1:if zaman>11 then zaman=0
next
gong=1
chipsec=15
goto basla
'**********************************************************
'***************** KESME ALT PROGRAMI *********************
disable
kesme:
datagos=255
chipsec=15
RSverial=RCREG
verial[index]=RSverial:adresal[index]=adres1
timeout[index]=0
RSverial=0
'RCSTA.4=0
'RCSTA.4=1
resume
'************** BCD KOD ÇÖZME ALT PROGRAMI ***********
kodcoz:
'************ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
LOOKUP veri,[255,16,32,48,64,80,96,112,128,144,1,17,33,49,65,81,97,113,129,145,2,18,34,50,66,82,98,114,130,146,3,19,35,51,67,83,99,115,131,147,4,20,36,52,68,84,100,116,132,148,5,21,37,53,69,85,101,117,133,149,6,22,38,54,70,86,102,118,134,150,7,23,39,55,71,87,103,119,135,151,8,24,40,56,72,88,104,120,136,152,9,25,41,57,73,89,105,121,137,153],sayi
if veri>99 then veri=0:sayi=255
return
'*********** BLİNK YAPMA ALT PROGRAMI ********
blinkgoster:
for chipsec=0 to 12
datagos=%11111111
pause 30
next
for chipsec=0 to 12
datagos=%10001000:pause 300
next
for chipsec=0 to 12
datagos=%11111111:pause 300
next
return
'********* GECİKME ALT PROGRAMI **************
gecikme:
for gecik=0 to 50
pause 1
next
return
End
'SLAVE KÜÇÜK PANOLAR
' İşlemci 16F877 20 Mhz kristal
define osc 20
@ device HS_OSC
@ device WDT_OFF & protect_on & cpd_on & pwrt_off & bod_off
PCON=%00000000
TRISA = %00000000 ' Set PORTA to all input
TRISB = %00000000 ' PORTB nin tüm bitlerini giriş ve çıkış olarak ayarla
TRISC = %10000000 ' PORTC nin tüm bitlerini çıkış olarak ayarla
TRISD = %00000000 ' PORTC nin tüm bitlerini çıkış olarak ayarla
TRISE =0 ' PORTC nin tüm bitlerini çıkış olarak ayarla
ADCON1 =7 '%10000100 ' Set PORTA analog and right justify result
porta=0:portb=0:portc=%00001000:portd=0:porte=0
DEFINE HSER_CLROERR 1
pause 5000
'*************** PORT TANIMLAMALARI *****************
TXDATA var portc.6
RXDATA var portc.7
DE var portc.5
chip154 var porte.2
chipsec var portb
datagos var portd
gong var portc.3
'************* DEĞİŞKEN TANIMLAMALARI I *************
veri var byte
sayi var byte
RSverial var byte
verial var byte[12]
adresal var byte[12]
slave var byte[12]
blinkbitti var byte[12]
blinkzam var byte[12]
blink var byte[12]
timeout var byte[12]
dispveri var byte[12]
yeniveri var byte[12]
blinksin var byte
verigonder var byte
x var byte
verisira var byte
gecik var byte
index var byte
adres1 var byte
'zaman var byte
sayac var byte[12]
verialyed var byte[12]
indexal var byte
adrestara var byte
deger var byte
DE=0
gong=1
'************* DEĞİŞKEN İLK DEĞERLERİ **************
chip154=1
chipsec=0
veri=0
sayi=0
adresal=0
verisira=0
verigonder=0
adres1=0
sayac=0
indexal=0
deger=0
for x=0 to 12
verial
- =0:adresal
- =0:slave
- =0:blinkbitti
- =1
blinkzam - =0:blink
- =0:timeout
- =0:dispveri
- =0
yeniveri - =0:sayac
- =0:verialyed
- =0
next
pause 200
chip154=0
chipsec=15
gosub blinkgoster
chip154=0
chipsec=15
'****************** İNTERRUPT TANIMI **********************
kesmeayarla:
PIR1 = %00100000 ' Set PORTA analog and right justify result
PIE1 = %00100000 ' Set PORTA analog and right justify result
SPBRG= 129 ' Set baud rate to 2400 for 20 MHZ osc
TXSTA= %00000000 ' Enable transmit and asynchronous mode BRGH=0 yavaş
RCSTA= %10010000 ' Enable serial port and continuous receive
INTCON=%11000000
on interrupt goto kesme
'///////////////// ANA PROGRAM \\\\\\\\\\\\\\\\\
'///////////////// ANA PROGRAM \\\\\\\\\\\\\\\\\
basla:
for index=0 to 11
adres1=index+181
gosub gecikme
' if adresal[index]=adres1 then
if verial[index]>yeniveri[index] then blink[index]=1:blinkbitti[index]=0:blinkzam[index]=0:gong=0
yeniveri[index]=verial[index]
veri=yeniveri[index]
gosub kodcoz
dispveri[index]=sayi
if blink[index]=1 then datagos=%11111111:goto dvm01
datagos=255:datagos=dispveri[index]
dvm01:
chipsec=index:pauseus 1000:chipsec=15:pauseus 1000
if blinkbitti[index]=1 then bit01
blinkzam[index]=blinkzam[index]+1
sayac[index]=sayac[index]+1
if sayac[index]=1 then blink[index]=1
if sayac[index]=>2 then blink[index]=0:sayac[index]=0
if blinkzam[index]=>20 then blink[index]=0:blinkzam[index]=0:blinkbitti[index]=1
bit01:
' endif
timeout[index]=timeout[index]+1
if timeout[index]>20 then
verial[index]=0:timeout[index]=0:dispveri[index]=0:datagos=255
endif
' zaman=zaman+1:if zaman>11 then zaman=0
next
gong=1
chipsec=15
goto basla
'goto kesmeayarla
'**********************************************************
'***************** KESME ALT PROGRAMI *********************
disable
kesme:
datagos=255
chipsec=15
RSverial=RCREG
if verisira=1 then verial[0]=RSverial:timeout[0]=0:verisira=0
if verisira=2 then verial[1]=RSverial:timeout[1]=0:verisira=0
if verisira=3 then verial[2]=RSverial:timeout[2]=0:verisira=0
if verisira=4 then verial[3]=RSverial:timeout[3]=0:verisira=0
if verisira=5 then verial[4]=RSverial:timeout[4]=0:verisira=0
if verisira=6 then verial[5]=RSverial:timeout[5]=0:verisira=0
if verisira=7 then verial[6]=RSverial:timeout[6]=0:verisira=0
if verisira=8 then verial[7]=RSverial:timeout[7]=0:verisira=0
if verisira=9 then verial[8]=RSverial:timeout[8]=0:verisira=0
if verisira=10 then verial[9]=RSverial:timeout[9]=0:verisira=0
if verisira=11 then verial[10]=RSverial:timeout[10]=0:verisira=0
if verisira=12 then verial[11]=RSverial:timeout[11]=0:verisira=0
verisira=0
if RSverial=181 then verisira=1
if RSverial=182 then verisira=2
if RSverial=183 then verisira=3
if RSverial=184 then verisira=4
if RSverial=185 then verisira=5
if RSverial=186 then verisira=6
if RSverial=187 then verisira=7
if RSverial=188 then verisira=8
if RSverial=189 then verisira=9
if RSverial=190 then verisira=10
if RSverial=191 then verisira=11
if RSverial=192 then verisira=12
'RSverial=0
'RCSTA.4=0
'RCSTA.4=1
resume
'************** BCD KOD ÇÖZME ALT PROGRAMI ***********
kodcoz:
'************ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
LOOKUP veri,[255,16,32,48,64,80,96,112,128,144,1,17,33,49,65,81,97,113,129,145,2,18,34,50,66,82,98,114,130,146,3,19,35,51,67,83,99,115,131,147,4,20,36,52,68,84,100,116,132,148,5,21,37,53,69,85,101,117,133,149,6,22,38,54,70,86,102,118,134,150,7,23,39,55,71,87,103,119,135,151,8,24,40,56,72,88,104,120,136,152,9,25,41,57,73,89,105,121,137,153],sayi
if veri>99 then veri=0:sayi=255
return
'*********** BLİNK YAPMA ALT PROGRAMI ********
blinkgoster:
for chipsec=0 to 12
datagos=%11111111
pause 30
next
for chipsec=0 to 12
datagos=%10001000:pause 300
next
for chipsec=0 to 12
datagos=%11111111:pause 300
next
return
'********* GECİKME ALT PROGRAMI **************
gecikme:
for gecik=0 to 50
pause 1
next
return
End
Sevgili arkadaşlar. Çok uzun olduğunu biliyorum kusura bakmayın burada DE ve RE tanımlamaları MAX 485 kontrol uçları.Diğerleri bağlı olan lojik entegrelerin kontrol uçları vs. Hepinize iyi çalışmalar.
Bu arada el terminalleri ve kapı üst göstergeleri 16F628 ler internal osc ile çalışıyor. Diğerleri 16F877 20 Mhz osc ile. Bu bir sorun teşkil edermi Bilmiyorum lakin dışarıda denediğimizde çalıştı.
Merhaba mhk,
Ben daha önceleri bu işin kurulmunda calışıyordum. Bir cok Ziraat Bankası'nın SıraMatik sistemerini kurdum. Ziraat bankasının sistemleri Nemoq diye bir isvec firmasından geliyordu. Adamlar bu sıra verme işini ilk yapan kişiler, Q-Matic şirketinde Nemo-Q şirektinden ayrılan personelin kurduğu bir şirkettir. Yani adamlar bu işte bir numarlar.
Sözün özüne gelirsem, sistemin elektronik devre şemasını incelediğimde RS485 ile haberleştirmemişler. TLP ile başlayan lojik çıkış veren optokupler kullanmışlar. Entegrenin tam numarası şimdi aklımda değil. El terminalleri ve göstergeler için iki ayrı cıkış var. bu cıkışları içinde TLP seri entegrelerin olduğu hup tarzındaki karta bağlaniyordu. El panellerinide bu karta bağlıyorduk. Göstergelerde ayrı bir cıkıştan böyle hup ile bağlanıyordu. RS485 sadece printer ile haberleşmede kullanılıyordu.
Sistem gayet güzel ve sorunsuz calışıyordu.
Sende haberleşme sistemini lojik yada normal optokopler ile yaparsan daha sağlıklı ve sorunsuz haberleştirebilirsin.
Calışmalarında başarılar,
Hasan ARSLAN
Hızı 250 bps ye dusurdum diyorsun ya. benim aklıma PIC in parazit almasi geliyor. Yani senden bagımsız sinyal almasi sonucu yanlış sayılar üretebilir.
RS485 in bir tarafından sürekli olarak 10101010 gönder mesela.
Alıcı taraftan da incele sinyali duzgun geliyor mu gelmiyor mu diye...
problemi sıkıştırman lazım :)
Kolay Gelsin...
Merhabalar,
Sunlara dikkat et derim:
--> Hat kablolarının saglamlıgı cok onemli.Kopukluk,eziklik vs cok onemli. (Bence buyuk ihtimal sorun bundan). Ve kabloların devre ye baglantısı onemli.Bence klasik yontem olan lehim kullan.Saglam olsun.Cunku hatta en ufak bir empedans farklılıgı digerlerini de etkiliyor..Ve mümkünse kablo topolojisi,Ring olsun,yani master ve slave hat baglantısı ard arda baglansın.
Yine olmazsa şu sonlandırma direnclerini kaldır! (Mantıksız ama bizde calıstı!)
Birde,max 485 entegrelerinin RE ve DE enable uclarını gonderirken ,alırken duruma gore aktif veya pasif yapmayı heralde biliyosundur demeye gerek yok sanırım...
Umarım faydası olur yazdıklarımın, Ve sorunu cozersin.Ozellikle atolyede calısıp ta sahada calısmıyorsa demekki sahanın yapısından ve kablolarından kaynaklanıyor demekki...!
Elektronik böyle işte naparsın. Sac bas yoldurur adama ama guzel meslektir...
Allah yardımcın olsun...............................
rs485 için twisted pair kablo kullanman gerekir. Bildiğim kadarıyla telefon kabloları birbirine dolanmamış paralel giden kablolar. Twisted pairde kablo üzerine gelen gürültü her iki bakır uca eşit dağıldığı için sinyal kaybını azaltır.
628in dahili osilatörleri çok hassas olmadığı için ve masterin hızı çok yüksek olmadığı için belki sorun oluşturabilir. Master bilgi gönderirken iki gönderme arasına delay koy. Garanti olması açısından pina5 (MCLR) yi Vcc ye dirençle çek. Zaten sadece input olabiliyor. Sorun teşkil etmez.
Son olarak mikrokontrolorlerin Vcc ve toprağı arasına 100nF lık kondansatör koyduğundan emin ol. (aslında bunu ilk sırada yazmam gerekirdi) Dahili eeprom ve seri haberleşmelerde derde devadır.
Birisi Max485 ile bağlanmış 2 pic örneği gösterebilir mi? RE nin neden kullanıldığını anlayamadım. Örnek olursa daha iyi fikir verebilir. Datasheet inde den anladığım kadarıyla A ve B uçları birbirlerine bağlanıyor bu hat üzerinden data iletiliyor ancak data MAX485 e nereden giriyor anlayamadım...
(http://img57.echo.cx/img57/1690/rs4859lz.th.gif) (http://img57.echo.cx/my.php?image=rs4859lz.gif)
Arkadaşlar hepinize teşekkür ederim. Sorunu RS485 haberleşmesini terk ederek çözdüm. Oldukça basit olan bu çözümü mantığını sevgili Arslan74 arkadaşın verdiği ipucu olan optocupler mantığı ile çözdüm.Sizede tavsiye ederim. Bunu nasıl çözdüğümü yine bu forumdaki https://www.picproje.org/index.php/topic,5462 linkte yazmıştım. Okuyup yorumlarsanız hepimize faydalı olacağı kanaatindeyim. İyi çalışmalar dilerim.
Merhaba;
Bizde şirkette buna benzer bir uygulama kullanyoruz.
kalite kontrol makinalarından gelen veri bir pc de toplanıyor.
Fakat Terminaller bazen kilitleniyor, bazen veri göndermiyor.
Bunun üzerine terminallere gelen elektrik hatlarındaki topraklama yeniden yapıldı. Topraklama probleminden sonra cihazlarda tekrar bir arıza çıkmadı. Ayrıca kullandığımız kablo ekranlı kablo.
Bir deTerminallerin beslemesine parelel olarak 100nf lık bir kondansötör bağlarsan bu parazitleride gidermende yardımcı olabilir. Bunu her terminalde ayrı ayrı yapmalısın.