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)
Ü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
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.
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.
(https://s2.postimg.cc/us34m4oid/Screenshot_3.jpg) (https://postimg.cc/image/us34m4oid/)
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.
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
Hangi derleyiciyi kullanıyorsun? XC8, CCS C, Vs.
Ne tür bir kesme mantığı kullanıyorsun?
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
@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
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.
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.
(https://s33.postimg.cc/7idnnd3bf/485_mikroe-1024x422.png) (https://postimg.cc/image/7idnnd3bf/)
@mstylmz cihaz data alamaz hale geldiginde uart modulunun hata bitlerini kontrol et. modul kitlenmis ise kesme bayragi temizleyerek veya bellegini bosaltarak kurtaramazsin.
Ç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.
#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ı
@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.
@OptimusPrime Kesme fonksiyonlarını normalde init() fonksiyonu içerisine yazarak kullanıyordum.Fakat bu fonksiyonları main fonksiyonun başında kullandıktan sonra sorun düzeldi. Sanırım bu şekilde modulu kullanima sokmadan once global kesmeleri aktif ediliyor. Açıkçası hala tam anlamıyla anlamış değilim.
(https://s2.postimg.cc/aqlikxcxx/Screenshot_3.jpg) (https://postimg.cc/image/aqlikxcxx/)
Attık tuttu desene. Geçmiş olsun. Datasheetinde bariz bir açıklama bulamadım ama genelde kesme işleri mcu larda aynı mantık üzeredir. Bir sinyalin yükselen veya düşen kenari kesme oluşturur ona ait bir bit set edilir. Fakat global kesme kapalıyken geldiyse bu kenar tetiklemesi islemciye ulaşmaz. Sadece ilgili bit set edilir böyle bir durum oldu sen yokken diye. Bu noktadan sonra global kesmeyi acman sonucu değiştirmez çünki kesme kaynağı çoktan kacirilmistir.
@OptimusPrime Çok faydalı bilgiler verdiniz. Cevaplarınız için teşekkür ederim :)