Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

RS485 düzensiz kilitlenme

Başlatan akuntman, 23 Mayıs 2009, 03:26:31

akuntman

merhaba,

Max 485 entegreleri ile 3 pici haberleştirirken piclere gelen enerji kesilip tekrar verildiğinde bazen, ilk veri iletiminde kilitlenme oluyor ve bir daha devre iletim yapamıyor. Bu kilitlenme sadece ilk veri iletiminde yaşanabiliyor eğer ilk sefer yaşanmazsa bir daha olmuyor.

Benim farkına vardığım nokta max485 entegrelerinin veri alıp verme bacakları olan DE ve RE 'ye pic'den gelen bilgilerin zamanlaması bu kilitlenme oranını artırıp azaltabiliyor. Yani RE DE değiştirildikten sonra 2-3 ms gibi bir gecikme konulması gerekiyor. Zaten hiç gecikme verilmezse iletim hiç gerçekleşmiyor.

Fakat ne yaptımsa %15 oranında bir hatadan kurtulamadım. Bu bacaklara ile ilgili bir zaman diyagramı var mı? Veri gönderildikten veya alındıktan sonra tam olarak ne kadar bir gecikme konulması gerekir?

Aşagıdaki programda D1 pini RE ve DE ye bağlı;

output_high(pin_d1);delay_ms(4);
veri_gonder();
delay_ms(2);
output_low(pin_d1);delay_ms(4);
veri_al();
delay_ms(2);

TEŞEKKÜRLER

akuntman

Farkına vardım ki bu kilitlenme sadece 3 pic birden haberleşirken gerçekleşiyor. Master cihaz iki picle de ayrı ayrı veri alıp verebiliyor sorun çıkmıyor. Fakat Aynı hatta 3 ü birden bağlanınca bahsettiğim sorun meydana gelebiliyor.

emrahmrcn

Merhabalar, sorun büyük ihtimalle dediğin gibi zamanlama olabilir. Ekte yolladığım resimdeki boşluk zamanlamalarına dikkat et. Örneğin 9600 de haberleşirken mesajlar arası 3,5 karakter yani 4ms boşluk bırak. Her bir bayt yollarkende 2ms boşluk bırak. İyi Çalışmalar

Benim yaradılışımda bir ayrıcalık varsa o da TÜRK olmamdır. M.K ATATÜRK

kadirbas

Selamlar akuntman.

Alıntı Yap
Fakat Aynı hatta 3 ü birden bağlanınca bahsettiğim sorun meydana gelebiliyor.

Bu kısmı biraz açabilir misiniz ? Buradaki haberleşme mantığınızda da bir sorun olabilir diye düşünüyorum...

MURSEL

// #use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7,enable=pin_c5,parity=N, stop=1)

bu komutta zaten enable pinini (c5)           max485 de     (de ile re)kısa devre edip bu uca baglıyorsunuz   picin usart modulu varmı yokmu software olrak mı datayı alıp veriyorsunuz bunlarıda bildirirseniz daha yardımcı olabilcegimizi düşünüyorum..

output_high(pin_d1);delay_ms(4); 
veri_gonder(); 
delay_ms(2); 
output_low(pin_d1);delay_ms(4); 
veri_al(); 
delay_ms(2);


bu şekilde yazmana gerek yok
///////////////////////////////////////////////
putc(data);
data=getc();

//bunları yapman yeterli bilgisayar ile haberleşiyormusun gibi düşün sadece veri yoılu farklılıgı var  verileri alırken usart kesmesini kulmanı kesinlikle tavsiye ederim

akuntman

Akadaşlar hepinize çok teşekkür ederim. Sorun düşündüğümüz gibi RE ve DE pinlerinin konumları ile ilgiliymiş. Ben bu pinleri yazılımsal olarak ayarlıyordum. Fakat bu şekilde birçok sorun meydana geliyor. Mürsel arkadaşımızın dediği gibi enable pini ayarlayınca herşey düzeldi.
#use rs232(baud=9600,parity=N,xmit=PIN_c6,rcv=PIN_c7,enable=pin_d1,bits=8)

Diğer arkadaşlara da faydası olması için programı kısaca anlatayım. PC' ye USB den bağlı 18f4550 14 byte veriyi VB de yazılmış programdan alıyor. Gelen verinin ilk byte ı 1 ise bu verileri 2 ile çarpıp sırası ile PC ye gönderiyor. Değilse Rs232 portu ve SP485 entegreleri ile diğer iki pice gönderiyor. Gelen verileri ise aynen PC ye aktarıyor

18f4550 nin yazılım aşağıda:

#include <18F4550.h>
#fuses XTPLL,NOWDT, NOCPD, NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV4,VREGEN
#use delay(clock=16000000)
#use rs232(baud=9600,parity=N,xmit=PIN_c6,rcv=PIN_c7,enable=pin_d1,bits=8)

//Tells the CCS PIC USB firmware to include HID handling code.
#DEFINE USB_HID_DEVICE  TRUE
//the following defines needed for the CCS USB PIC driver to enable the TX endpoint 1
// and allocate buffer space on the peripheral
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE    14  //allocate 8 bytes in the hardware for transmission

//the following defines needed for the CCS USB PIC driver to enable the RX endpoint 1
// and allocate buffer space on the peripheral
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for OUT bulk/interrupt transfers
#define USB_EP1_RX_SIZE    14  //allocate 8 bytes in the hardware for reception

#include <pic18_usb.h>   //Microchip 18Fxx5x hardware layer for usb.c
#include <usb_desc_hid.h>   //USB Configuration and Device descriptors for this UBS device
#include <usb.c>        //handles usb setup tokens and get descriptor reports

int data[14];
int data_in[14];
int data_out[14];

void veri_gonder(){

              putc(data_in[0]);delay_ms(2);
              putc(data_in[1]);delay_ms(2);
              putc(data_in[2]);delay_ms(2);
              putc(data_in[3]);delay_ms(2);
              putc(data_in[4]);delay_ms(2);
              putc(data_in[5]);delay_ms(2);
              putc(data_in[6]);delay_ms(2);
              putc(data_in[7]);delay_ms(2);
              putc(data_in[8]);delay_ms(2);
              putc(data_in[9]);delay_ms(2);
              putc(data_in[10]);delay_ms(2);
              putc(data_in[11]);delay_ms(2);
              putc(data_in[12]);delay_ms(2);
              putc(data_in[13]);
             }

void veri_al(){

data[0]=getc();
data[1]=getc();
data[2]=getc();
data[3]=getc();
data[4]=getc();
data[5]=getc();
data[6]=getc();
data[7]=getc();
data[8]=getc();
data[9]=getc();
data[10]=getc();
data[11]=getc();
data[12]=getc();
data[13]=getc();
}

void main() {

usb_init();
usb_task();

while (TRUE) {

while(!usb_kbhit(1)) {}

if (usb_kbhit(1)) {
 
usb_get_packet (1, data_in, 14);
 
if (data_in[0]==1)
{
output_high(pin_d4);
data_out[0]=data_in[0]*2;
data_out[1]=data_in[1]*2;
data_out[2]=data_in[2]*2;
data_out[3]=data_in[3]*2;
data_out[4]=data_in[4]*2;
data_out[5]=data_in[5]*2;
data_out[6]=data_in[6]*2;
data_out[7]=data_in[7]*2;
data_out[8]=data_in[8]*2;
data_out[9]=data_in[9]*2;
data_out[10]=data_in[10]*2;
data_out[11]=data_in[11]*2;
data_out[12]=data_in[12]*2;
data_out[13]=data_in[13]*2;  

usb_put_packet(1, data_out, 14, USB_DTS_TOGGLE);
}

else{

veri_gonder();
delay_ms(3);

veri_al();
delay_ms(3);

usb_put_packet(1, data, 14, USB_DTS_TOGGLE);
             
}        
             
}
}
}

MURSEL

akuntman kardeşim  dataları bu sekilde alıp göndermen cok dogru değil

göndermen için tek komut

printf("%s",data_in); //data_in dizini gönder

yada bu komut

printf("%s",&data_in[0]); data in dizini  0 adresinden en son ki adresine kdar gönder


putc(data_in[0]);delay_ms(2); 
putc(data_in[1]);delay_ms(2); 
putc(data_in[2]);delay_ms(2); 
putc(data_in[3]);delay_ms(2); 
putc(data_in[4]);delay_ms(2); 
putc(data_in[5]);delay_ms(2); 
putc(data_in[6]);delay_ms(2); 
putc(data_in[7]);delay_ms(2); 
putc(data_in[8]);delay_ms(2); 
putc(data_in[9]);delay_ms(2); 
putc(data_in[10]);delay_ms(2); 
putc(data_in[11]);delay_ms(2); 
putc(data_in[12]);delay_ms(2); 
putc(data_in[13]); 
}



veri alırkende


void veri_al(){ 

data[0]=getc(); 
data[1]=getc(); 
data[2]=getc(); 
data[3]=getc(); 
data[4]=getc(); 
data[5]=getc(); 
data[6]=getc(); 
data[7]=getc(); 
data[8]=getc(); 
data[9]=getc(); 
data[10]=getc(); 
data[11]=getc(); 
data[12]=getc(); 
data[13]=getc(); 
}


bu sekilde yapma 13 bayt veri alma süresi kadar bekleyeceksin demek  bu veri alma işini kesme içinde yap ki picin başka işleride varsa onları halletsin  kesme içinde  sürekli getc () diyerek değil tabi
picin usart modulu var ise!! rda kesmesi aktif edilmis ise!!
#int_ext
void kesmerda (void)
{
i++
data=getc();
}
 saglık veri alımı için bu yeterli değil hata bulma kodu başlangıç kodu vs bunları da
işin içine kat daha saglıklı bir iletişim saglamış ol

kolay gelsin kardeşim

cemilkendir

#use rs232(baud=9600,parity=N,xmit=PIN_c6,rcv=PIN_c7,enable=pin_d1,bits=1,errors)

buraya [ERRORS] bayrağınıda eklersen sanırım kitlenme sorunun çözülecektir
benimde başıma gelmişti böyle bir durum bunu aktif hale getirince kitlenme kalmadı tabiki böyle bir durumda (kitlenme olduğunda) aldığın veride hatalı olacaktır