RS485 İletişim Problemi

Başlatan mstylmz, 24 Kasım 2017, 18:15:53

mstylmz

Merhaba Arkadaşlar

Master cihazına 4 adet slave cihazı bağlıyorum. Slave cihazları ve master farklı güç kaynaklarından besleniyor. Master ilk başta slave cihazları ile haberleşmeyi sorunsuz bir şekilde sağlıyor.Master çalışmaya devam ederken slave cihazlarının güç kaynağını kapatıyorum.Bir süre sonra  güç kaynağını  tekrar açtığımda slave cihazları normal çalışma moduna devam ediyor fakat bazı slave cihazları seri port kesmesi almıyor.(Bazen sadece 1. slave haberleşmiyor, bazende 3. ve 4. slaveler gibi) Dolayısıyla master'ın sorgusuna geri cevap veremiyor. Bu sorunu seri haberleşme kesmesi belirli bir süre gelmediğinde slave cihazlarına  yazılımsal reset attırarak çözüyorum.Böylece master ile haberleşmeye devam ediyor.

Yazılımsal reset kullanmadan bu haberleşme sorununu nasıl çözebilirim?

Master(PIC18F46K22)
Slave(PIC18F24K22)




tunayk

Üstad sizin sorun sanki izolasyon sorunu gibi.  Eğer cihazlarda farklı gnd seviyeleri oluşuyor ise 485 hattı voltajı Slave deki gnd ye göre yeterli seviyeye kadar yükselmiyordur.  Öncelikle 485 hattında gnd leri birleştirip deneyin. Sonuca göre yorum yaparız

Klein

Muhtemelen  daha port ve alıcı ayarlarını bitirmeden , master cihazdan veri geliyor.  Tüm ayarlar bittikten sonra seri portu açarsanız muhtemelen düzelir.

mstylmz

Güç kaynaklarının gnd lerini birleştirdiğimizde maalesef sorun düzelmiyor. Zaten bütün başlangıç ayarlarını yaptıktan sonra GLOBAL İnterruptları açıyoruz.

Her bir slave ve master cihazının RS485 kısmında şekildeki gibi koruma devresi var. Kablo olarak da örgülü ve alüminyum folyosu olan RS485 kablosu kullanıyoruz.



tunayk

Hocam işin en güzeli, master Tx bacağından Slave Rx bacağına kadar hattı osiloskop ile incelemek.  Rx bacağına sinyal girdiği halde mi kesme oluşmuyor yoksa pice bişey gelmiyor mu.


Sorun yazılımsal da olabilir.

mstylmz

Hocam bu dediğinizi defalarca osiloskop ile yaptım. Rx  pinini kontrol ettiğimde  verinin düzgün bir şekilde geldiğini görebiliyorum.Veri geldiği halde kesme almıyor

exmachine

Hangi derleyiciyi kullanıyorsun? XC8, CCS C, Vs.
Ne tür bir kesme mantığı kullanıyorsun?

OptimusPrime

Başlangıç ayarları yapıldıktan sonra global kesmeleri acman kesme kapalıyken gelen isteği aktif etmeyebilir. Dolayısıyla UART modülü bir sonraki data geldiğinde aşırı sürülmüş olur kendini kitler. Reset den ziyade hatadan kurtarma eklemek daha mantıklı olur.bunun için ilgili modülün registerlarini kontrol edip buna göre modülü resetlemeli veya gelen veriyi komple atmalisin ki modül kullanılabilir hale gelsin.


Bu sadece bir tahmin ama olasılığını fazla gibi
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

yas

#8
@OptimusPrime 'ın dediği gibi çok çok yüksek ihtimalle donanım hataya düşüyor.  "RCSTA.1" biti kontrol edersen göreceksin.
Eğer hata bundansa ana döngünün içerisinde aşağıdaki gibi kontrol edersen sorun düzelecektir. Hangi dili kullandığını bilmediğim için basic ile örnek veriyorum.

If RCSTA.1=1 Then
        RCSTA.4 = 0 
        RCSTA.4 = 1
EndIf

mstylmz

Kusura bakmayın arkadaşlar geç yazım.

Derleyici olarak CSS C kullanıyorum.Clear_interrupt fonksiyonu kullanmıştım. İlgili portun kesme bayrağını temizliyordum. Sorun maalesef düzelmemişti. Acaba UART' ın RX bufferını silmek işe yarar mı ? Bunu denedikten sonraki durumu tekrar yazacağım.

yasin_arsln

Alıntı yapılan: mstylmz - 24 Kasım 2017, 18:15:53
Merhaba Arkadaşlar

Master cihazına 4 adet slave cihazı bağlıyorum. Slave cihazları ve master farklı güç kaynaklarından besleniyor. Master ilk başta slave cihazları ile haberleşmeyi sorunsuz bir şekilde sağlıyor.Master çalışmaya devam ederken slave cihazlarının güç kaynağını kapatıyorum.Bir süre sonra  güç kaynağını  tekrar açtığımda slave cihazları normal çalışma moduna devam ediyor fakat bazı slave cihazları seri port kesmesi almıyor.(Bazen sadece 1. slave haberleşmiyor, bazende 3. ve 4. slaveler gibi) Dolayısıyla master'ın sorgusuna geri cevap veremiyor. Bu sorunu seri haberleşme kesmesi belirli bir süre gelmediğinde slave cihazlarına  yazılımsal reset attırarak çözüyorum.Böylece master ile haberleşmeye devam ediyor.

Yazılımsal reset kullanmadan bu haberleşme sorununu nasıl çözebilirim?

Master(PIC18F46K22)
Slave(PIC18F24K22)

Merhaba,
Sorun donanımsal da olabilir.
RS485 'in A ve B uçları arasında gerilim seviyesini kontrol edebilirmisin. RS485 Diferensiyel fark ile çalışan bir yapıya sahip. Eğer A ve B arasındaki gerilim 0.3V'nin altına düşüyorsa doğru bir iletişim göremezsin.Mcu'da bunu algılayamaz. MikroE'nin mikro bus adında ürettikleri kitlerin schematiclerindeki gibi bir gerilim destekleyici işini görebilirim. Resimde görebilirsin. Umarım sorunun çözülür iyi çalışmalar.



OptimusPrime

@mstylmz
cihaz data alamaz hale geldiginde uart modulunun hata bitlerini kontrol et. modul kitlenmis ise kesme bayragi temizleyerek veya bellegini bosaltarak kurtaramazsin.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

dumansiz

Çalışmadığını söylediğin "slave" lerin sadece "UART"ları mı çalışmıyor?
Slave ünite üzerinde led,lcd gibi bir şey var mı?
Slave ünitedeki yazılımın UART haricinde çalıştığını ispat eden bir delil var mı?

Maaşallah korumayı bayağı abartmışsınız.(MOV, TVS)
Diğer arkadaşların söyledikleri bir çözüm olmazsa, bu korumaları çıkarıp deneyin derim.

mstylmz

#use rs232(baud=19200, xmit=RS485_TX, rcv=RS485_RX, enable=RS485_ENABLE, bits=9, long_data, parity=n, stop=1, stream=MASTER, ERRORS, DISABLE_INTS)

@OptimusPrime Yukarıda görüldüğü üzere  RS232 önişlemci yönergesinde bulunan ayarlarda ERRORS kullandım. ERRORS  uartdaki hataları kontrol ediyor.Eğer bir hata varsa sıfırlıyor.

@dumansiz   Evet bu durumda çalışmayan tek şey Uart modülü oluyor. Slave üzerinde durum ledleri mevcut. Slave cihazları normal çalışmasına devam ediyor. ESD ortamlarına uygun bir cihaz tasarımı yapmak için bu komponentleri kullanmak zorundayız.Bu korumalar sahip olmayan bir cihazımız daha var. Bu cihaz çok kolay bir şekilde ortamdan etkilenip reset alıyor.Abartmış sayılmayız :)

@yasin_arsln Diferansiyel fark ile bir sorun yok. A ve B arası 0,3 volt civarı


OptimusPrime

@mstylmz
ERRORS kullandiginda muhtemelen derleyici ekstra kesme rutini ureterek modul kilitlendiginde buraya dallaniyor. fakat yine ayni noktaya geliyoruz. boyle bir kesme rutini olsa bile modul kilitlendikten sonra global kesmeleri aciyorsan (veya boyle bir duruma denk geliyorsan) program bu kesme rutinine hic ugramayabilir!

kesmeler genellikle yuksen veya dusen kenarda olusturulurlar. yani hali hazirda bir bit set edilmisse sen global kesmeleri actiginda, islemci aaa bunu kacirmisiz dur ilgili kesme programini bi calistiralim sonra kaldigimiz yerden devam ederiz demeyebilir.

bundan emin ol derim. en basit yolu ya modulun kilitlendiginde bitleri kontrol edeceksin yada modulu kullanima sokmadan once global kesmeleri aktif edeceksin.

bu arada data alamiyorum derken umarim islemcinin geri kalan gorevleri yaptigindan yani biryerlerde takilip kalmadigindan eminsindir.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||