stm32F031 RS485 Haberleşme problemi

Başlatan hakansefau, 07 Ekim 2016, 17:55:40

hakansefau

Arkadaşlar merhabalar,

Bir projemde seri haberleşme problemi yaşıyorum belki aranızda daha önce böyle bir sorunla karşılaşmış birisi vardır diye yazıyorum. 2 cihaz rs485 üzerinden haberleşiyor normal uart haberleşmesi modbus falan yok. Burada birinci cihaz ikinci cihaza 50 60mS de bir data gönderiyor. İkinci cihazda bu dataları parse edebiliyor.

Buralarda problem yok, fakat bu işlem 10 20 sn sonra ikinci cihazın kitlenmesi ile duruyor. Devamlı komut gönderen cihaz komut göndermeye devam ediyor bunu test ettim. İkinci cihaz artık bu saniyelerden sonra handlar a girmemeye başlıyor. Projede timer interrupt var, timer interruptına düşüyor falan usart interrupına belli bir saniye geçtikten sonra düşmüyor. Var mı fikri olan?

ibocakir

50 60mS'de değil de 500-600 mS'de bir göndermeyi deneyin. Gene 10-20 saniyede mi yoksa 100-200 saniyede mi takınıyor ona bakabilirsiniz, buffer'ı doluyor olabilir hocam.

mufitsozen

Alıntı yapılan: hakansefau - 07 Ekim 2016, 17:55:40
Arkadaşlar merhabalar,

Bir projemde seri haberleşme problemi yaşıyorum belki aranızda daha önce böyle bir sorunla karşılaşmış birisi vardır diye yazıyorum. 2 cihaz rs485 üzerinden haberleşiyor normal uart haberleşmesi modbus falan yok. Burada birinci cihaz ikinci cihaza 50 60mS de bir data gönderiyor. İkinci cihazda bu dataları parse edebiliyor.

Buralarda problem yok, fakat bu işlem 10 20 sn sonra ikinci cihazın kitlenmesi ile duruyor. Devamlı komut gönderen cihaz komut göndermeye devam ediyor bunu test ettim. İkinci cihaz artık bu saniyelerden sonra handlar a girmemeye başlıyor. Projede timer interrupt var, timer interruptına düşüyor falan usart interrupına belli bir saniye geçtikten sonra düşmüyor. Var mı fikri olan?

usart arabiriminde "overflow", "framing" vb bir hata olusmustur. Bunu temizlemeden baska karakter alamazsiniz, ustelik durmadan ISRa geri donersiniz (interrupt yaratan durum devam ettigi icin) ISR icinde hata durumunu gosteren bitleri kontrol edip, hata durumunu ortadan kaldiriniz.
                               
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

hakansefau

Yani aslında durum şu;

void USART1_IRQHandler(void){
			
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
		
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);	
				
		UART_Buffer.rxBUFFER[UART_Buffer.rxindex] = USART_ReceiveData(USART1);


Bu şekilde RNE clear edilip tekrar girmesi gerekiyor değil mi? Fakat buraya tekrar girmiyor. Şimdi olay aslında şu; bir tane ana devrem var, main boad diyorum buna; bu arkadaş 60mS de bir 485 den data gönderiyor, bu mainboard çıkışına iki tane ayrı ayrı cihaz bağlı, bunlar normalde aynı anda handler fonk. düşüyor. Birinci alıcı sürekli alabiliyor bunda bir sıkıntı yok. Fakat ikinci cihaz bir kez alıyor ya da 20 kez alıyor belli bir süre geçtikten sonra artık handler fonk. girmiyor bile.

Burada konuşabilen iki cihazdan bu cihazın tek farkı şu usart pinleri AF fonk. 1 olarak veriyoruz, birinde A9 ile A10. Diğerinde A2 ve A3. Ama ikisinde tanımlarken AF1 olarak datasheette de görüldüğü gibi tanımlıyorum başka da bir fark yok. Bunun bu koşullar altında diğer çalışan cihazda olduğu gibi çalışması gerekiyor diye düşünüyorum, ama çalışmıyor bende bakmadığım birşey olabilir diye düşünüyorum.

Library olarak standart periph. lib. kullanıyoruz, herşey aslında olması gerektiği gibi görünüyor

Klein

Debug modunda baktın mı?
USART registerlerinin (ayarlarının) içeriği korunuyor mu?
Parity,framing gibi hata bayrakları çekilmiş mi?

hakansefau

Aslında evet çekilmiş görünüyor. Bir durum daha var şüphelendiğim ama alakalı mıdır sizce 485 çipinin çıkışındaki AB uçları arasında sadece 100R var. Normalde RS485ESA IC kullanıyoruz, burada datasheette önerilen 120R bizde şimdi bu vardı diye 100R kullandık. Ama bu durumda da Interrupta düşerdi her türlü kodu alırken hatalı almalar olabilirdi değil mi? Bu direnç değeriyle de alakalı değil gibi geliyor.

İşlemci donmuyor debug modda bakıyorum timer iterruptına giriyor. İşlemciyi USART interruptına düşüren max olduğundan oraya odaklanıyorum şimdi. Orada da bir şey bulamadık. Bunun RX enable uçları mcu ya bağlı, normalde low da tutunca data alıyor, high yaptık mı da data çıkıyoruz ya, bu hep data alıyor arada high low yapmak mı gerekir var mı tecrübeniz?

yasin_arsln

#6
Alıntı yapılan: hakansefau - 08 Ekim 2016, 12:16:16
Yani aslında durum şu;

void USART1_IRQHandler(void){
			
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
		
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);	
				
		UART_Buffer.rxBUFFER[UART_Buffer.rxindex] = USART_ReceiveData(USART1);


Bu şekilde RNE clear edilip tekrar girmesi gerekiyor değil mi? Fakat buraya tekrar girmiyor. Şimdi olay aslında şu; bir tane ana devrem var, main boad diyorum buna; bu arkadaş 60mS de bir 485 den data gönderiyor, bu mainboard çıkışına iki tane ayrı ayrı cihaz bağlı, bunlar normalde aynı anda handler fonk. düşüyor. Birinci alıcı sürekli alabiliyor bunda bir sıkıntı yok. Fakat ikinci cihaz bir kez alıyor ya da 20 kez alıyor belli bir süre geçtikten sonra artık handler fonk. girmiyor bile.

Burada konuşabilen iki cihazdan bu cihazın tek farkı şu usart pinleri AF fonk. 1 olarak veriyoruz, birinde A9 ile A10. Diğerinde A2 ve A3. Ama ikisinde tanımlarken AF1 olarak datasheette de görüldüğü gibi tanımlıyorum başka da bir fark yok. Bunun bu koşullar altında diğer çalışan cihazda olduğu gibi çalışması gerekiyor diye düşünüyorum, ama çalışmıyor bende bakmadığım birşey olabilir diye düşünüyorum.

Library olarak standart periph. lib. kullanıyoruz, herşey aslında olması gerektiği gibi görünüyor
Hocam merhaba,
Usart1'in register larında overrun hatasını kontrol etmesini engelleyip deneyebilirmisin. Overrun'u disable et ve Error interrupt enable bitini 0 yap.
örnek olarak.
USART1->CR3 = 0x00001000;
Usart1 Control register 3 'e bakabilirsin. Ben STM32F051 'de sorunsuz haberleşiyorum BaudRate'im 115200.


mesaj birleştirme:: Ekim 11, 2016, 14:11:19

Alıntı yapılan: hakansefau - 11 Ekim 2016, 12:54:23
Aslında evet çekilmiş görünüyor. Bir durum daha var şüphelendiğim ama alakalı mıdır sizce 485 çipinin çıkışındaki AB uçları arasında sadece 100R var. Normalde RS485ESA IC kullanıyoruz, burada datasheette önerilen 120R bizde şimdi bu vardı diye 100R kullandık. Ama bu durumda da Interrupta düşerdi her türlü kodu alırken hatalı almalar olabilirdi değil mi? Bu direnç değeriyle de alakalı değil gibi geliyor.

İşlemci donmuyor debug modda bakıyorum timer iterruptına giriyor. İşlemciyi USART interruptına düşüren max olduğundan oraya odaklanıyorum şimdi. Orada da bir şey bulamadık. Bunun RX enable uçları mcu ya bağlı, normalde low da tutunca data alıyor, high yaptık mı da data çıkıyoruz ya, bu hep data alıyor arada high low yapmak mı gerekir var mı tecrübeniz?
En son da kullanıdğınız direnç aslında sonlandırma direnci. Rs485 bir bus hattını kablo ile oluşturulduğundan Bus'ın en sonuna  kablo empedansıyla aynı değer genellikle 120 ohm 'luk bir direnç takılır. Takılmadığı taktirde hatta gürültü oluşur.
Aşağıdaki linkteki app note a bakabilirsin.
https://www.maximintegrated.com/en/app-notes/index.mvp/id/763

skara1214

direncin 100 yada 120 olması deli önemli birşey değil. interrupta her girişinizde errorları kontrol edip silin. Sıkıntı kalacağını zannetmiyorum.
Herkes ölür ama herkes gerçekten yaşamaz

Bertan

İşlemci timer interruptında çok mu zaman geçiriyor ? Ya da timer interruptına çok sık mı giriyor ?

Timer interruptı içindeyken usart interruptına giremeyip usart overrun olabilir.

hakansefau

Arkadaşlar ilginiz için teşekkür ederim. Sorunu çözdüm, belli bir süre sonra max485 in enable ucu high oluyor sanki transmit yapacakmış gibi. Muhtemelen timer içinde gpio ları anahtarlarken o pini high yapmamama rağmen gene de belli süre sonra high oluyor. Bunu yakaladım, ben de her türlü timerdan çıkarken hep o pini lowda tutuyorum. Sorun çözüldü interrupta da düşüyor flagi clear edememe sorunu da kalmadı.