rs232 iletiminde kitlenme

Başlatan skara1214, 03 Ocak 2012, 20:32:56

skara1214

2 tane pici aynı rs232 hattı üzerine bağladım bilgisayarla iletişimi ftdi ile sağlıyorum, piclerin tx lerini yalıtmak içinde diyot koydum.Eğer komut yollayıp bir picin işini bitirmesini beklersem daha sonra diğer pice komut yollarsam sıkıntı yok ama bir pice komut yollayıp iş yaptırırken aynı yol üstünden diğer picede komut yollarsam iş yapan pic işi yaptıktan sonra kitleniyor.heralde iş yaparken tx e veri gelince sıkıntı çıkıyor sizce bu problemi nasıl aşarım.Komut almayı rda kesmesiyle yapıp iş yaparken bu kesmeyi disable yapsam rx bufferı hiçbirşey almaz sonrada enable yapsam düzelirmi? problem çözülürmü? yada başka önerebileceğiniz bir yöntem varmı?
Herkes ölür ama herkes gerçekten yaşamaz

FEHMİ_ASM

  Hocam bunu tek başına Usart'la nasıl çözersiniz bilmiyorum. Ama tahmin ettiğim, her iki pic'e de bilgisayardan benzer ya da aynı bilgileri gönderme ihtimaliniz var. Ve Usart modülü, adreslemeyi desteklemeyen bir protokol kullanıyor. (Eusart'lardan bilgim yok).

  Eğer iki pic için de benzer veriler gidebilecekse, bence Bilgisayardan çıktıktan sonra Usart'ın taa sonuna bir I2C tampon yerleştirin ve verileri burada paylaştırın.  Bunun ayrı bir donanım yükü getirmesinin yanında, net bir çözüm olduğunu biliniz.

  Belirtmeliyim ki, her iki pic için göndereceğiniz 8 byte'lık paketlerin hiçbirisi aynı değil ise, yukarıdaki yolu denemeyiniz, çünkü problem muhtemelen veri alma algoritmanızda ya da bayrak kontrolünüzdedir.

  Bir de 'rda kesmesi' diye bir tabir kullanmışsınız. Bu nedir?

skara1214

ilk olarak aynı yol üstünden iki pikede aynı komutlar gidiyor picler kendi içinde if algoritması ile kendilerini ilgilendirip ilgilendirmediklerine bakıyor.yani mesele iş yaparken rx i ne veri gelmesi.iş yaparken rxe veri gelince işi bitirip kitleniyor.Ve ayrıca kendi iş yaparken diğer pic birşey tx ile yollamak istersede yollayamayor iş yapan picin işi bitince tx den bilgisayara veri geliyor.Eğer kitlenen picin elektriğini kesip yeniden verirsem o zaman düzeliyor.Bende yazılımsal reset attım işini bitirdikten sonra  ama buda işe yaramadı.Sizin sorduğunuz rda kesmeside rx 'e veri gelince oluşan kesme
Herkes ölür ama herkes gerçekten yaşamaz

iyildirim

Sorun yazılımsal görünüyor.  Büyük ihtimalle de RX kesmesi veya gelen komutu değerlendirdiğiniz yerde.  Diyot konusunu hatırlıyorum.  Her iki pic de aynı anda veri gönderseler bile en fazla veri bilgisayara bozuk gelir.  Kilitlenme Pic komutu alıp iş yaparken gelen veriden kaynaklanıyor olması lazım.  Rx kesmesini disable belki çözüm olabilir ama rx bufferinda okunmadan kalan veri kalması ihtimalini de değerlendirmeli. Kodu eklerseniz bir şey söylemek daha kolay.

skara1214

hocam kısmen hallettim ama hep çalışmıyor.ilk gelen komutu normal mainin içinde aldım ve göreve başlamadan önce rda interruptını açıyorum birşey gelirse z diye bir stringe atıyorum iş bitince interruptı kapatıyorum main içinde alıyorum.Bazen çalışıyor bazen çalışmıyor ilginç bir durum
 
Herkes ölür ama herkes gerçekten yaşamaz

Kabil ATICI

Bu gibi durumlar için uart kesmesinde ben işe yaptırmayıp olabildiğince kısa tutar gelen veriyi alması için bir tampon ve veri geldiğini belirten bir bayrak kullanırım. Yada tamponu doğrudan kullanırım. Kontrol işlemini sadece ana döngü içinde yaptırırım. Tampondaki veri kontrol edildikten sonra tampon sıfırlanır.

kısaca
Kesmede sadece gelen veri tampona konur.

ana döngü içinde
tampondaki veri kontrol edilir ve işlem sonunda sıfırlanır.

Ama sıkı zamanlama gerektiren işlemlerde kesmelerin geçici olarak durdurulması gerekiyor. 1 telli bağlantı gibi donanım ile gerçekleştirilmeyip yazlımla gerçekleştirilen ama zamanlama büyük önem taşıyan sistemlerde kesinlikle kesme sorun oluyor.

Gerçi pic'ler tüm kesmeler için aynı kesmeyi kullanıyor ama bu hatayı yaptığınızı zannetmiyorum. Gerekli kontrol ve önlemleri aldığınızı düşünüyrum.
ambar7

skara1214

hocam benim istediğim iş yaparken rx'i disable etmek.registerlerle oynayarak bunu yapabilirmiyim?İkinci olarak iş yaparken tx ide durduruyor yani diğer pic birşey yollamak isterken yollayamıyor işin bitmesini bekliyor
Herkes ölür ama herkes gerçekten yaşamaz

Kabil ATICI

İşlemcinin veri kağıtlarına bakarak olup olmayacağını veya nasıl olabileceğini söylemek istedim ama siz işlemci adını belirtmemişsiniz.
ambar7

skara1214

haklısınız hocam belirtmemişim,işlemci 16f886
Herkes ölür ama herkes gerçekten yaşamaz

Kabil ATICI

PIE1: (çevre birim kesme izin resgisteri 1-PERIPHERAL INTERRUPT ENABLE REGISTER 1)
PIE1 registerinin RCEIE biti (5. bit)  (EUSART alma kesme izin biti- EUSART Receive Interrupt Enable bit)

1 yapılarak alma kesme izni veriliyor,
0 yapılarak alma kesme izni yasaklanıyor.
ambar7

iyildirim

Alıntı yapılan: skara1214 - 04 Ocak 2012, 15:55:57
hocam benim istediğim iş yaparken rx'i disable etmek.registerlerle oynayarak bunu yapabilirmiyim?İkinci olarak iş yaparken tx ide durduruyor yani diğer pic birşey yollamak isterken yollayamıyor işin bitmesini bekliyor

Disable ettiğinizde sanırım UART modülünü durduruyorsunuz. Böyleyse diğerinin gönderme yapamamasının nedeni iş yaparken durdurulan PIC 'in  TX pininin bağlı olduğu port low olması. Modülü disable ettiğiniz veya durdurduğunuzda TX pinini  HIGH yapmayı deneyin.

skara1214

benim istediğim rx kesmesini engellemek değil gelen veriyi  rx bufferına almayı engellemek ,kesmeyi engellemek için disable interrupts demek yetiyor.
@iyi yıldırım hocam ben daha rx bufferını engelleyemedim ,ondan sonra dediğiniz gibi high yapabilirim tx i,ama ilk önceliğim iş yaparken gelen veriyi almamak bunun çözümünü arıyorum
Herkes ölür ama herkes gerçekten yaşamaz

iyildirim

Modül çalıştığı sürece gelen veri alınır. Veri alınması bittikten sonra kesme flag'ı set edilir. Kesme oluşur vs. 16F leri fazla tanımıyorum. Eğer almayı ve/veya göndermeyi anlık olarak engelleyecek bir register varsa bu iş görebilir.  Yoksa modülü disable etmeniz gerekir.  Disable ettiğiniz durumda da ilgili tx pininin kontrolü GPIO ya geçecek. Yani modülü çalıştırmadan önce pini bir kereliğine HIGH  yapmanız da iş görebilir.


Program yapınız nasıl bilmiyorum ama, modülü disable etmek pek de doğru bir çözüm değil. Bunun yerine gelen komutları bufferlayıp sırayla işleyecek bir yapı kurmanız daha doğru.  Kesmede gelen komutları bir ring buffer'a okuyup ana döngünüzde sırayla komutları çalıştırmak gibi. 


skara1214

Alıntı yapılan: iyildirim - 04 Ocak 2012, 17:41:00
Bunun yerine gelen komutları bufferlayıp sırayla işleyecek bir yapı kurmanız daha doğru.  Kesmede gelen komutları bir ring buffer'a okuyup ana döngünüzde sırayla komutları çalıştırmak gibi.
hocam zaten ilk komutu alıp işe başlıyorum o arada diğer komut geliyor yani 2 komutun gelme süreleri bir değil. Tx i high yapmak mantıklı gibi ama ilkönce rx problemini halletmeye çalışacağım.Modülü disable etmeyi deneyeceğim.Baskada yapacak birsey kalmıyor
Herkes ölür ama herkes gerçekten yaşamaz

SpeedyX

Overrun olusuyor.

CCS kullaniyorsan #USE kismina ERRORS ekle yada oerun bitini kontrol edip usart i resetle.

Bir datasheet acip baksan bunu burada sormayacaksin bile.

Ayrica bu metod o is icin hic uygun degil, eger bu bir urunse;
Forumlarda ezbere ogrenilen cozumlerle ve onun bunun kod kutuphanesini kullanarak yapilan urunlere biz kullanicilar nasil guvenecegiz? Kisisel almayin, genelleme yapiyorum.