Seri İletişim Kesmeleri Hakkında

Başlatan elektroacemi, 16 Kasım 2013, 14:39:08

elektroacemi

Merhaba Arkadaşlar
Bir süredir r485 ile seri iletişim üzerinde çalışıyorum. Seri haberleşmeyi tek taraflı olarak yaptım, Birinci devre ikinci devre veri yollayabiliyor, veya ikinci devre birinci devreye yollayabiliyor.

Birinci devre de "HSerOut" komutu ile veri yolluyorum, ikinci devre de Seri iletişim veri alma kesmesini açtım, kesmede dallanacağı yerde "HSerIn" komutu ile de veriyi okutuyorum.

Benim yapmaya çalıştığım birinci devre ikinci devreye veri yollayacak, ikinci devre veriyi alacak, arkasından kendinde olan verileri birinci devreye yollayacak. Bunun için birinci devredeki seri iletişim veri alma kesmesini açıyorum, o zaman hiç iletişim olmuyor. Bu durumla ilgili algoritması fikri verebilir misiniz ?

Seri iletişim veri alma kesmesi , seri iletişim portlarına veri geldiği zaman yapılan kesme.
Peki seri iletişim veri gönderme kesmesi hangi amaçla kullanılıyor ? Zaten veri gönderme zamanına yazılım içerisinde biz karar veriyoruz, kesme olmasının mantığı nedir ?


magnetron

eğer birden fazla byte göndericeksen

veri gönderme kesmesi bufferdaki
byte gittiği zaman bufferin boşaldığını gösterir

ki hemen arkasından gelen byte 'ı gönderebilesin

Tagli

Böylece gönderme işlemi devam ederken işlemci başka işler yapabilir. Gönderme kesmesi olmasaydı, tüm gönderme süresi boyunca sürekli olarak TSR'yi kontrol etmek ve boşaldığı zaman tekrar yükleme yapmak gerekecekti. Ama bu iş kesme kodunda halledilebilir, böylece sürekli kontrole gerek kalmaz.
Gökçe Tağlıoğlu

elektroacemi

Anladım, peki veri alma işlemini doğru yerde (veri alma kesmesinin dalandığı yerde)  mi yapıyorum ?

Devrenin ikisi de aynı anda veri göndermesi nasıl önlenebiliyor ?

Veri alma komutu işlerken veri gelmez ise o komutta bekliyor, bunun için nasıl bir önlem var ?

Tagli

Kullandığın dili bilmediğim için kesin yorum yapmak zor ama alıcı fonksiyonun kesme kodu içinde olması gerekir. Normalde kesme geldiği zaman donanımsal register'da (RCREG) yeni veri var demektir. Ben genelde alıcı kesmesini RCREG'den bir tampon belleğe veri aktarmak için kullanıyorum. Tampon belleği ana program içinde bir yerde işleyerek gerekeni yapıyorum.

Aynı anda veri göndermeyi engellemek işi sana kalmış. Bu iş akış kontrolü (flow control) olarak adlandırılır ve bazen donanımsal olarak yapılır ancak senin sistemde yazılımsal olarak yapılması gerekecek. Anladığım kadarıyla senin sisteminde soru-cevap mantığı var, bu durumda pek sorunla karşılaşmaman gerek. Birinci cihaz ikinciye bir soru soruyor ve ikinci cihaz cevaplıyor. Yani ikinci cihaz durup dururken veri yollamıyor. Bu durumda hatta aynı anda veri basmaya çalışmazlar zaten.

Veri alma kodu kesmenin içinde olacağından, veri olmadığı durumda hiç çalışmayacak zaten.
Gökçe Tağlıoğlu

elektroacemi

Cevaplarınız için teşekkür ederim
Soru cevap şeklinde iletişim için devre ve yazılımı yaptım. RS487 siz (rx ve tx leri çaraz bağlayarak) yaptığım zaman çalışıyor, RS487 entegresini bağladığım zaman olmuyor. Nerede yanlışım olduğu söyleyebilir misiinz ?

http://turbobit.net/0tbc9skxijx2.html

http://we.tl/rlaYMjXxMV      (27 Kasıma kadar bekleme yapmadan indirebilirsiniz, 27 Kasımda silinir)

magnetron

RS485 entegresini bilmiyorum ama
ben şöyle bir durumla karşılaştım

75176 entegresinden veri gönderdiğim zaman
o veri RX pinine de geldiği için

mikroişlemci kendi gönderdiği veriyi alıyordu
öyle bişey yap ki
sen veri göndermen bittiği zaman loopback yapan veriyi sil, Rx bufferi boşalt
ondan sonra gerçek cevabı beklemeye başla

inşallah derdimi anlatabilmişimdir

elektroacemi

Anlattığına göre denemeler yaptım, karşı taraf veri göndermediği halde alma kesmesine giriyor, veri gelmediği için RCREG in değeri 0 oluyor ve daha önce aldığı veriyi sıfırlıyor.

elektroacemi

Veri göndermesi tamamlandıktan sonra RE ve DE nin bağlı olduğu pic çıkışını Lojik 0 yaparak veri almaya hazırladığımda karşı taraf veri almış gibi algılıyor. O satırı kapatıp denedim veri sorunsuz gidiyor ama veri almıyor.

elektroacemi

Arkadaşlar yukarıdaki devreyi kurup aynı yazılımla denedim. Sorunsuz çalıştı. Sorun sadece similasyon da oluyor.
İlginiz için teşekkür ederim.