Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Bir RTOS problemi......

Başlatan piedos, 17 Eylül 2005, 21:44:59

piedos

Arkadaslar PIC16 ile iki cihazı haberlestirmek istiyorum. Genel çalışma aşagıdaki gibi olacak.
       ___________>        _____________>
PC  <----------------  PIC  <------------------- Cihaz
     
yukarıda görüldüğü gibi PIC iki cihazla iki ayrı RS232 yolu ile haberleşecek.
ama yollar FULL duplex. Yani PIC PC den veri alirken aynı anda Cihaza ve PC ye veri aktarabilecek. Hatta en kötü ihtimalle PIC aynı anda 2 Rx ve 2 Tx
işlemi yapabilir.
Hız önemli değil (2400 baud bile olur).

Bu kodu CCS te yazmayı düşünüyorum, ama şimdiden gözüm korktu  :cry:
Algoritma konusunda yardımlarınızı bekliyorum. :P
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

Erol YILMAZ

Isteklerinizi biraz daha keskin cizgilerle belirtmeniz iyi olurdu.
2 TX veya 2RX olarak algiliyorum.

diyelim ki 2 TX yapacaksiniz,

Her pinden yazilimsal RS232 baglantisi saglayabilirsiniz. Fakat iki is ayni anda olmaz. Donanimda da 1 tane Rs232 modulu var.
O zaman 1 donanim ve 1 yazilim RS232 baglantisi kullanacagiz. Donanim olarak her seyi ayarlar ve gonder dersiniz. ardindan da yazilimsal olarak ne gonderecekseniz gonderirsiniz. Ayni anda 2 adet TX yapmis olursunuz. RX icin de ayni seyler gecerli.

engin_

Bu işin en basit yolu bir portu okuyup diğer porta yazmak

Yani pc tarafına PA1,PA2  bağlarsan Diğer devreye de PB1,PB2 bağlarsın porta yı okur port b ye yazarsın portb yi okur porta ya yazarsın , tabi giriş çıkışları ona göre ayarla

Ama bu işin bir amacı olmalı neden ara da pic var.

piedos

sanırım bu is biraz daha zor olacak. PIC cihazdandan aldıgı veriyi direk PCye aktarmayacak yada PC den aldığını cihaza.
PIC kendine gelen veriye göre baska cıktılar uretecek yani haberleşme koşullu olacak. Burada önemli olan PIC in kendisine cihaz ya da PC den gelen hicbir veriyi kaçırmaması. Hız öbemli değil 1200 baud da olur. Ama PIC bir veriyi kacırırsa bunu tekrar isteme sansı yok.
2 Tx 2 Rx dedigim ise PIC en kötü durumda Cihaza ve PCye koşulsal çıktıları gönderirken Cihaz ve PCden o anda gelen veriyi de hatasız alması olayı.
Koşulsal dedigim sey ise atıyorum PCden connect komutu geldi. PIC hemen Cihazın son duurmuna bakacak eger cihaz herhangi bir işle mesgul değilse önceden hazırlanmıs bir tablodan cihazın connect komutunu bulup cihaza gönderecek. yine atıyorum bu esnada cihaz PICe periyodik status bilgisini gönderiyor olabilir yada PCnin kendisine birsey göndermesini istiyor olabilir.
Arada PIC kullanmamım nedeni ise PC ve uzak noktadaki PIC+cihaz arasında RF baglanti zorunlulugu (not RF bağlantı full duplex kapasiteli )
PC kodunu yazdım ama PIC kodu uğraştırıyor. PIC in hızının (20MHz) yeterli olacagını dusunuyorum.
Aslında işin özü PICe paralel işlemler yaptırma. Tabi PIC in öyle bir özelliği yok yani sadece 1 tane ALUsu var. Ama haberleşme hızı düşük olduğu için bir çeşit time division task yazılımı yapılabilir. Örnek

50us boyunca 1. RXi oku
50us boyunca 2.Rxi oku
50us boyunca Tx 1-2  görev kontrolü
10us Tx bufferllarını yukle/transmiti baslat
30us Rx leri yorumla/geekli işemleri yap
10us check status

yukarıdaki gibi işlemleri periyodik olarak yaptırmamız gerekiyor. Ve  periyodun bir bitin transfer zamanından kısa olması gerekiyor. Bu yazılım çözümü olabilir. Ama yukarıdaki algoritma yanında hardware ve interruptlardan faydalanırsak daha güvenli çalışabilir.
Fikirlerinizi bekliyorum.
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

engin_

Burda picten  her iki tarafa veri yollamak almaya göre daha kolay olacaktır yada işin kolayı bulunabilir.

Önemli olan veriyi düzgün bir biçimde almak ve bunu yaparken aynı zamanda göndermek için gerekli zaman aralığını da tedarik etmek.

Şimdi ilk alma olayına bakalım. Sonuçta aynı anda almak kolay iş değil. Gönderme işini pic yapacağından her iki taraftan bi düzgünce alalım da göndermeyi sonra düşünürüz.

Öncelikle pice iki giriş noktası var ve bunları gerçek zamanlı kontrol etmek istiyoruz. Bunun için en uygun bacaklar 16F84A için RB4-RB7 bacakları. RX uçları buraya bağlanacak ve böylece bu uçlarda meydana gelen değişimleri anında algılayacağız ama kesme rutinimiz uzun sürmeyecek şekilde hazırlamak lazım sonuçta her iki bacak aynı anda çalışır vaziyette her zaman olmaz belli bir süre sonra da çalışabilir. Bu daha da kötüdür.

Bunun için oluşan kesme ile sadece bu bacakları okuyacağız yani,
RX1 RB4 e ve RX2 RB5 e bağladık diyelim. Kesme olduğunda yapacağımız tek şey

RB4 ü kaydedici1 LSB 'ye yüklemek
RB5 i  kaydedici2 LSB 'ye yüklemek

Artık bol bol vaktimiz var gibi , şimdi yapamamız gereken nerden veri geliyor onu bulmak.Eğer normalde veri aktarımı yokken hat 0V ise nerden veri geldiğine bulmak çok kolay. Bu veriyi ilgili kaydediciye kaydedebiliriz. Ve sonra bir sola kaydırız.

Burda asıl önemli nokta hattın her iki ucunun da birlikte aktif olamayabileceğilidir. Yani RX1 aktif oldu ve kesmeden sonra bu durum için gerekli ayarlamayı biz yaptık ama daha hala RX1 aktif iken RX2 de aktif oldu ve kesme sonucu biz iki ucunda sanki yeniden aktif olmuş gibi algılayacağız yani RX1 iiçin iki defa işlem yapacağız bu durumu önlemek için de programa etkisi olmayan timer kullanacağız yani bir kesme oluştuktan sonra geçen süreyi sayacağız. Sonuçta RX1 sıfıra düştüğündede kesme meydana gelecek

Bu süre normalde RX1 in tekrar lojik0 olması için gereken süreden kısa olduğunu görürsek bunun RX1 den değil RX2 den kaynaklandığını anlayacağız. Burda 0 dan 1 e geçiş  ve 1 den 0 a geçiş de kesme oluşturduğu unutulmamalı.

iki hattın aktif olma süreleri birbirine kesme rutinin süresinden daha kısa olmamalı yoksa veri kaybı oluşur.

Valla geç oldu artık kafa çalışmıyor. Elimden geldiğince yazdım daha açıklığa kavuşması gereken çok nokta var .

Bazı şeyleride yanlış yazmış olabilirim. Aslında picten bilgisayar meşgul olduğunu bildiren bir sinyal kullansan işler çok kolaylaşırdı.

armys2000

usart interrupt kullan ama burda şuna dikkat et  her iki tarafında baudrate i aynı olmasın interrupt sağlıklı olmaz
pc tarafı normal rs232 modülü olsun cihaz tarafı interrupt lı olan olsun ve baud rate  olarak ta pc tarafı yuksek olsun tavsiyem budur