STM32F4 ve RS-422 ile ilgili bir soru?

Başlatan mtekin, 15 Kasım 2014, 23:28:42

mtekin

Merhaba,

Stm32f4 ile arayüzü rs422 olan 4 slave cihaza (sürücü)komut göndermek istiyorum.  Sanırım Usart dan tranceiver ile çıkacağım.

Sorum burada 1 USART kullanarak farkli kanallara farklı komutlar gönderebilir miyim?

Ikinci sorum bu olmaz ise 4 usart i ayrı ayrı 4 tranceiver ile mi süreceğim nasıl bir çözüm önerirsiniz.

Teşekkürler.

CLR

Knowledge and Experience are Power

mtekin

Alıntı yapılan: CLR - 16 Kasım 2014, 15:52:12
4 usart - 4 transceiver
CLR cevap için teşekkürler. 
Rs422 de CAN bus gibi bir adresleme yok mu yane istediğim slave cihaza veri gönderemez miyim.

CLR

Hepsini aynı hatta bağlayacaksan gönderirsin, bir tanesi master geri kalan slave olur ve mater zaman paşlaşımlı sistemi yönetir veya slave'ler request oluşturarak master ile haberleşmek isteyebilirler.   
Knowledge and Experience are Power

mtekin

Alıntı yapılan: CLR - 16 Kasım 2014, 17:49:08
Hepsini aynı hatta bağlayacaksan gönderirsin, bir tanesi master geri kalan slave olur ve mater zaman paşlaşımlı sistemi yönetir veya slave'ler request oluşturarak master ile haberleşmek isteyebilirler.   
CLR hocam aslında sorunumu anladınız ama ben bıraz daha acıklamak ıstedım nasıl yapacagım konusnda bılgı almak ıcın:
4 farklı sürücü kartım var RS422 üzerinden haberleşiyor hepsi, ayrı ayrı motorları suruyor, benim işlemcim(stm32f4) master; şimdi yalnızca 1. karta (slave1) X komutunu  (diyelim motoru su yonde su kadar dondur) nasıl gönderirim? Bu anlattıgım 1 USART--RS422 Tranciever ----(paralel 4 rs422 node) şekilnde olur mu ? (İlk cevabınızdan anladıgım hayır, ama ıkıncınde sankı evet gibi bire algı oldu bende)
Yane RS422 de Master herkese aynı komutu gondermıyor sanırım, kodlama ıle bunu nasıl ayırıyor haberleşirken sorum bu aslında. STM32 serisinde bunu hangi usart konfıgurasyonu/fonsksıyonu (?) hallediyor.
Tesekkurler.


CLR

@mtekin

Birinci cevabımda tüm slave'leri aynı hatta bağlayacağını düşünmediğim için ayrı ayrı sürmen gerekir dedim. Sonra senin cevabından hepsini aynı hatta bağlayabileceğini söylemiş oldun. Bu defa ona göre cevap verdim.

İstersen her karta ayrı ayrı, istersen hepsine birden istediğin kadar data(veri) gönderebilirsin. Bu yazacağın programa bağlı. Basit bir örnek vereyim gerisini sen getir.

Mesela protokolü basit olarak aşağıdaki gibi kurabilirsin, bir karta veya bu şekilde hepsine 256byte kadar veri gönderebilirsin, Command ile veri kullanacak kartı seçebilirsin.

SOF(start byte)(1byte) + Command(1byte) + Datalength(1byte) + Data(DataLength kadar veri) + CheckSum(1byte) +EOF(EndByte)(1byte)

Command = 0x01 ise sadece 1. kart veriyi alsın
Command = 0x05 ise sadece 5. kart veriyi alsın
Command = 0x3F ise sadece 1. ve 5. kart veriyi alsın, diğerleri almasın
Command = 0xA5 ise tüm kartlar veriyi okusun

Evet senin yukarıda yazdığın gibi 1 USART--RS422 Tranciever ----(paralel 4 rs422 node) kullanman gerekir.


Knowledge and Experience are Power

mtekin

CLR Hocam, acıklama için tesekkurler şimdi daha net oldu.
Yazdıklarından anladıgım RS422 bu sekılde adreslenır herkes boyle kullanır mıdır, yoksa senın tavsıyen mı bunu bir sorayım.

"Evet senin yukarıda yazdığın gibi 1 USART--RS422 Tranciever ----(paralel 4 rs422 node) kullanman gerekir."
Önerebilceğim bir devre şeması var mıdır bu çalışma için, yada tarnciever arkasına onerecegı çoklu rs422 entegre çözümü.
Saolasın.

mtekin


mtekin




Gerbay hocam, kurmak ıstedıgım ornek topolojıyı ekledım. "Kendinize gore gelistirip kullanabilirsiniz" derken CLR hocam yazdıgı mantıklı geldı rs422 ını bır formatı var sanırım ona uyacagız, gerçi stm32 de bir ornek gorsem daha saglıklı olacak mutlaka bırılerı calısmıstır.

CLR hocam örnek topolojımde de sızın soyledıgınıznyontem calısır sanırım.

CLR

#9
@mtekin

Sorduğun soru haberleşme tarihinde ilk bilinen problemdir. Bir master ile bir çok slave arasında olması gereken haberleşme tekniği. Bu nedenle aslında F4 kullanan/kullanacak biri bu konulara kısmen aşina olması beklenir ama öğrenci veya bu konuda tecrübesiz olabilirsin diye düşünüyorum. Ama bu defa Stm32f4'ü neden seçti diye düşünmeden edemiyorum, çünkü F4 sadece bu iş için çok çok profesyonel bir işlemci kalır.   

Soruna cevap olarak, benim bahsettiğim yapıyıda kullanabilirsin veya master ve slave'ler arasında haberleşme üzerine soft ve/veya hard olarak bir çok protokoller geliştirilmiş.Soft için modbus'ı inceleyebilirsin,  Hard+Soft yapıyı birlikte barındıran can bus var. ST'nin sitesinde bu konular üzerine örnekler mevcut. Veya önceki kartlar rs422 bu nedenle basit soft protokol kurmam gerekiyor diyorsan, kendi protokolünü kendin de oluşturabilirsin. Önemli olan hatalı data almayacak soft bir yapı oluşturmak. Ayrıca bu protokolleri nasıl kullanman gerektiği de önemli, mesela Time division(zaman paylaşımlı), data request(data alımı/gönderimi için istekte bulunmak) vs tabanlı teknikler var, yoksa çakışmalar yaşayabilirsin ve paket kayıpları olabilir.

Mesela ben olsam,  can bus kullanırdım. Receive Filtresine sadece data almak istediğin kartların ID'sini yazman yeterli olacaktır. Tabii aynı anda 8 byte'tan büyük data transferi yapacaksan o zamanda extra buffar'a veya protokole ihtiyacın olacaktır ama birçok gereksiz yazılım zahmetinden seni kurtaracaktır, mesela datanın geldiği kaynağı kolayca bulabilecektin ve hatasız haberleşme sağlayabilecektin.(tabii yine paket kaybı yapmadığın sürece).   

Sonuç olarak, sistemin değiştirilebilirse can bus'ı kullanmanı tavsiye ederim, herşeyi bundan sonra onunla yaparsın,  değiştirilemezse modbus veya yukarıda bahsettiğim tekniğide kullanabilirsin.

Knowledge and Experience are Power

mtekin

@clr
Ihtıyacım ıle ılgılı sordugum konu bu ıslemcıye yüklenmeyi düşündüğüm ıslemlerden yalnız bırı rs422 ıle hıc çalışmadım çokda stm32 servisi ıle kaynak bulamadığımdan sordum. Daha önceden farklı protokollerde bırkac uygulama gelıstırdım. Kalkıp destek verırken haberleşme tarıhıne atıflar yapman karsındakını ogrencı yapman hoş olmadı neyse destegın ıcın tekrar tesekkurler.

CLR

@mtekin

Amacım seni küçük düşürmek değil ama bu olay Türkiye'deki herkesin sorunu, mutlaka bir öğreticiye veya bir öğretmene ihtiyacı oluyor. Aslında bunu senin konunda açtığım için seni kırmış olabilirim ama niyetim kötü değil. Mesela bir proje yapılacak olsun, önce tüm herşeyi kendimiz araştırmalıyız ama bir türlü içinden çıkamıyorsak forumda veya daha bilgili insanlara sormak gerekir, doğrusu ve en öğreticisi bu.  Bu olaya "kendi başına öğrenmeyi öğrenmek" denir, bu nedenle sözlerim çoğu insan için kırıcı oluyor ama aslında bunu insanlar başarsa çok zor konular hariç herkes istediğini başarır ve o konuyu araştırırken onlarca şey beraberinde öğrenilir. Bu anlattığım olay yurtdışında kolej eğitim sisteminin yapı taşı. Benim niyetim burada yazdığım gibi, kesinlikle büyüklenmek değil. Buna rağmen kırıldıysam özür dilerim.

stm32 ile kaynak bulamadım diyorsun, aşağıdaki kaynak işini görecektir, yukarıda bahsettiğim gibi bir yapı kur ve bu yapıyı bir array veya struct içinde kurarsan ve bu arrayin/struct içinde dataları değiştirirsin mesela hangi kara göndereceksen command kısmını veya data uzunluğu ve dataları ram üzerinde değiştirirsin sonra dma'ya struct/array başlangıç adresini gösterip başlatman yeterli. Software data gönderirken dma kullanıyor, buda senin için iyi bir avantaj, hardware ayrıca tx/rx kontrolüde yapıyor. Örnek STM32F05x için ama kolayca F4'e adapte edebilirsin.

http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1734/PF259345#
Knowledge and Experience are Power