RS-232 HABERLEŞMESİ

Başlatan vulture, 18 Şubat 2020, 16:50:57

vulture

merhabalar,

bir cihaz bana sürekli 8 bayt veri gönderiyor. cihazın bir veri gönderme formatı var. önce % karakterini gönderiyor daha sonra 6 tane herhangi bir karakter en sonda ! karakterini gönderiyor.

ben bu veri formatını o cihazdan alıp lcd de gösteriyorum.fakat bir sorunum var.

önce benim yaptığım devreye enerji verip daha sonra cihazı açarsam haberleşme sağlanıyor.
önce cihazı açıp sonra benim devreyi çalıştırırsam haberleşme olmuyor.

ana döngünün içerisine ilk olarak bir değişkene getch() fonksiyonu ile karakteri atıyorum. eğer o karakter % karakteri ise getch() fonksiyonu ile 7 kez daha okuyorum ve işlemleri yaptırıyorum. fakat değilse break ile döngüyü sonlandırıyorum.

bu şekilde yaptığımda yukarıda bahsettiğim hata ile karşılaşıyorum.
 
bana bu sorunu çözmem için yardımcı olursanız sevinirim.

ete

Öncelikle büyük harflerle mesaj yazmayın. Forum dilinde bağırmak anlamına geldiği için yanlış anlaşılmalara sebep oluyor.

Sorununuz senkron sorunu gibi gözüküyor. Mesaja herhangi bir kod eklemediğiniz için genel anlamda cevaplandıracağım.
Ancak cihazların açılış sırasının senkron işinde bu kadar etkili olduğuna ilk defa şahit oluyorum. Zira veri sürekli geliyor ise mutlaka cihazınızın geç de olsa bu paketi yakalaması gerekirdi.
Burada akla hemen acaba programınız başka işlerlede uğraşıyormu yani oralarda vakit harcarken veri başını sürekli kaçırıyormu sorusu geliyor. Ama aynı kaçırmayı doğru açılış yapıldığında sağlayabilirken yapmıyor diyorsunuz. Enteresan sonuç gerçekten.
Tavsiyem USART kesmesi kullanmanız yönünde olacak. Kesme oluştuğunda gelen karakterin % olup olmadığını test edip ardından gelen bayt lerı almanız ve ! karakteri ile alma işlemini sonlandırmanız gerekir.
Açıklamanızda bu yönde tek farkla kesme kullandığınıza dair bir açıklamanız yok.
Veri 8 baytlık bir paket halinde gönderiliyor. Şayet sürekliliği var ise paket lokomotifi % işareti olacak. Senkron sağlamak için bu işaretin yakalanması ve ardından gelenlerin alınması gerekir.

Ete

vulture

Büyük harfle yazmanın böyle bir durumu teşkil ettiğini bilmiyordum, düzenledim.

Cevabınız için teşekkürler. Aşağıdaki gibi alıyorum verileri fakat sonuç dediğim gibi oluyor.

int_rda kesmesini kullanarak nasıl yapabilirim?

while()
{
   w=getch();
     
   if(w==0x25) // % karakterinin hex karşılığı
   {
      for(int i=0;i<7;i++) // % karakterinden sonraki gelen 7 veriyi diziye aktarıyorum.
      {
         data=getch();
      }

...


   }
}



ete

C diline çok hakim değilim. Bilenler kesme için sana bilgi verebilirler umarım.
Uyguladığın yönteme bakıyorum da,
- Önce gelen karekterin 0x25 olup olmadığına bakıyorsun bu tamam.
- ardından şayet ilk karekter 0x25 ise peşinden gelen 7 adet byte alıyorsun. Buda tamam ama yanlış olan bir şey var.
Aldığın  her karekteri Data isimli değişkene veriyorsun. Sonra hangisi data-1 hangisi data-3 nereden anlayacaksın.
Acaba C dilinde bilmediğim bir özellikmi var. Yani Data değişkenin bir dizi (string) değişkeni ve kurduğun döngüde değişkenler otomatik diziye mi yerleşiyor.?

Ete

Mayhoş

#use rs232(baud=...., parity=...., xmit=...., rcv=...., enable=...., bits=...., ERRORS)

RS232 ayarlarınızı bilmiyorum ama hatalar kısmı ekli mi acaba?
Eğer bu ekli değilse programda kilitlenmeler oluşabiliyor. Öncelikle bunu ekleyip bir deneyin. Olmaz ise kodun geriye kalan kısmına bakalım.

fatih88

bu şekil haberleşme olmaz ccs c software haberleşmek için iyi değil donanımsal haberleşme yapmalısınız değilse veri kaybına uğrarsınız
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

Mayhoş

#6
Alıntı yapılan: fatih88 - 19 Şubat 2020, 13:11:40bu şekil haberleşme olmaz ccs c software haberleşmek için iyi değil donanımsal haberleşme yapmalısınız değilse veri kaybına uğrarsınız


Mevcut projemde CCS C ile aynı pic üzerinde i2C ve RS485 ile haberleşme yapmaktayım 1 master 16 slave pic kullanıyorum ve henüz bir sorun görmedim. Donanımsal derken max232 gibi entegreleri mi söylüyorsunuz? Projeye göre zaten mecbur eklenmesi gerekmektedir. Ama bunun dışında haberleşme için CCS C'de bir sorun olduğunu düşünmüyorum. Zaten hangi dilde yazılırsa yazılsın o entegreleri duruma göre kullanmak gerekecek. Mesela ben de projede i2C haberleşmesi için uzak mesafe olduğundan P82B715 kullandım ve rs485 bağlantısı için de SN75176 kullandım. Bunun dışında geriye kalan her şey yazılımsal zaten. Tasarımsal sorun yok ise yazılım açısından haberleşmeye bir engel yok bence.

vulture

#7
Alıntı yapılan: ete - 19 Şubat 2020, 09:29:22C diline çok hakim değilim. Bilenler kesme için sana bilgi verebilirler umarım.
Uyguladığın yönteme bakıyorum da,
- Önce gelen karekterin 0x25 olup olmadığına bakıyorsun bu tamam.
- ardından şayet ilk karekter 0x25 ise peşinden gelen 7 adet byte alıyorsun. Buda tamam ama yanlış olan bir şey var.
Aldığın  her karekteri Data isimli değişkene veriyorsun. Sonra hangisi data-1 hangisi data-3 nereden anlayacaksın.
Acaba C dilinde bilmediğim bir özellikmi var. Yani Data değişkenin bir dizi (string) değişkeni ve kurduğun döngüde değişkenler otomatik diziye mi yerleşiyor.?

Ete

Ete Hocam data[ i ]=getch(); şeklinde olacaktı, yanlışlık olmuş. Devre halen dediğim gibi çalışıyor.

Alıntı yapılan: emaxx - 19 Şubat 2020, 09:54:12
#use rs232(baud=...., parity=...., xmit=...., rcv=...., enable=...., bits=...., ERRORS)

RS232 ayarlarınızı bilmiyorum ama hatalar kısmı ekli mi acaba?
Eğer bu ekli değilse programda kilitlenmeler oluşabiliyor. Öncelikle bunu ekleyip bir deneyin. Olmaz ise kodun geriye kalan kısmına bakalım.

#use rs232( baud = 9600, rcv = pin_d7, xmit = pin_d6, PARITY = N, bits = 8, ERRORS)
Ayarlar bu şekilde.


Alıntı yapılan: fatih88 - 19 Şubat 2020, 13:11:40bu şekil haberleşme olmaz ccs c software haberleşmek için iyi değil donanımsal haberleşme yapmalısınız değilse veri kaybına uğrarsınız


Cihazın üzerindeki max232 entegresinden gelen veri önce benim devremdeki max232 entegresine daha sonra mcu ya gelmektedir.

--------------------------------------

Cevaplarınız için teşekkürler.Umarım sorunu çözerim ve sizlerde bu sorun karşısında bana yardımcı olursunuz.

fatih88

#include <16F628A.h>
#fuses HS ,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOMCLR
#use delay(clock=20000000) 
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, parity=N, bits=8)


#int_rda 
void seri_haberlesme_kesmesi()
{   
   Gelen=getc();
   
   delay_us(10);
   
}


void main()
{
   set_tris_a(0);
   set_tris_b(0b00000010);
     
   enable_interrupts(int_rda); 
   enable_interrupts(GLOBAL); 
   
      
   while(1)
   {
      
      
   }
 }
donanımsal haberleşme mcu nun rx ve tx bacaklarının kullanılarak kesme içerisinde veri almaktır
software haberleşme ise ccs c nin yazılımla hazırladığı haberleşime sistemidir bu sistem kullanışlı değildir
yukardaki kod belki birşey canlandırır kafanda
bilgi paylaştıkça çoğalır!!

www.fayelektronik.com

Mayhoş

#9
Tamamdır rx-tx bacakları ve kesmelerden bahsettiğinizi anlayamamışım özür dilerim. Ben ek olarak bir haberleşme donanımı var diye düşündüm. Şuan uğraşmakta olduğum projede haberleşme üzerine olduğundan bir şeyleri kaçırmış ya da eksik yapmış olmamak adına merak ettim.

Eğer yazılımsal bir sorun yok ise (yukarıdaki gibi) max232 bağlantılarınızı kontrol etmenizi öneririm. Hatta şemanız varsa paylaşırsanız daha iyi yardımcı olabiliriz.

Bir de kullandığınız pic'i, yazılımın (son halini) en azından haberleşmeye dair olan kısmının tamamını atarsanız daha rahat görebiliriz sorunu.

void main(void)
{
    while (TRUE)
    {
    ..........
    }
}

While(true) kısmını atlamayın. Pic'in uykuya geçmesini engelleyecektir.

if (kbhit())
{
    w=getc();
}

Bu yapı senin ilk işaretini algılamak için daha rahat olacaktır. Verinin gelmesini bekleyecektir program.
Ve son olarak tavsiyem pic'in başlangıcına bir gecikme eklemen. Pic'in ilk açılış anında kendini hazırlaması için iyi olur.

Serdar Çiçek'in kitabından bir örnek belki işinize yarayabilir:
https://i.ibb.co/LvGkHfz/rs232.png

vulture

Sorunu baud rate i düşürerek çözdüm. 9600 yerine 2400 olarak ayarladım ve denediğimde hiç bir sorunla karşılaşmadım. Fakat 9600 ile neden olmuyor hala merak etmekteyim.

Sorularıma yanıt veren ve yardımcı olan herkese teşekkürler...

Mayhoş

Alıntı yapılan: vulture - 21 Şubat 2020, 17:16:13Sorunu baud rate i düşürerek çözdüm. 9600 yerine 2400 olarak ayarladım ve denediğimde hiç bir sorunla karşılaşmadım. Fakat 9600 ile neden olmuyor hala merak etmekteyim.

Sorularıma yanıt veren ve yardımcı olan herkese teşekkürler...
CCS'in destek forumunda şöyle bir cevap almıştım buna benzer bir konuda;
Baud rate 9600 iken picten veriyi gönderdikten sonra 100ms bekleme ekliyordum. Yoksa gönderilen veride hatalar oluşuyordu. Veri tam iletilmiyordu sanırım. Ama bu bekleme benim için çok fazlaydı bunu düşürmem için bana tavsiye ettikleri baud rate 250000bps yapmamdı. Bunu yaptıktan sonra 50us'lere kadar düşürebildim beklemeyi. Sizde de bu tarz bir sorun olabilir belki.

Ama yine de ilk önce sizin devreyi çalıştırıp sonra diğerini çalıştırınca çalışıyor fakat tam tersi durumda çalışmıyorsa bununda bir engel teşkil edeceğini sanmıyorum. Her iki türlüde sorunla karşılaşmanız gerekirdi diye düşünüyorum. Bu arada size 8 bayt veri gönderen cihazın baud rate'i nedir?

MB_77

#12
bu mesaj tarafımdan silinmiştir.

Powered by EzPortal