İki pic devresini RS485 aracılığıyla haberleştirmek...

Başlatan caresiz_kaptan, 18 Haziran 2013, 17:54:16

caresiz_kaptan

Merhaba arkadaşlar...

Çalışmış olduğum bi devre üzerinde bi noktada takıldım onun için bilen arkadaşlardan yardım isteyecektim...Yaptığım devrenin mantığı bir tane anakart olucak (Master) ve 5 adet de yardımcı kart olacak (slave) yardımcı kartlar ortamın ışık ile ısı bilgisini ölçüp anakarta gönderecek..Arada mesafe yaklaşık 50 metre olduğu için RS485 kullanmak zorundayım..Yardımcı kartlar sıra ile sürekli anakarta bilgi göndericek...Bunun için en basit halde anakart ile tek bir yardımcı kartın haberleşmesinin yazılımını CCS derleyicisinde yazdım fakat devreyi çalıştırdığımda yardımcı kart bilgiyi gönderiyor sonra birda bilgi göndermiyor bir nevi donup kalıyor...Buyuk bir ihtimalle putc(); yada getc(); komutları arasında bir zaman uyumsuzluğu var herhalde ama bir türlü çözemedim yardımlarınızı bekliyorum...




Anakakart:

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.


#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD  // Denetleyici konfigürasyon ayarları

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#define use_portb_lcd TRUE   // LCD B portuna bağlı


#define cihaz_1 (0x01) // yardımcı kartlara id belirlendi.
#define cihaz_2 (0x02)
#define cihaz_3 (0x03)
#define cihaz_4 (0x04)
#define cihaz_5 (0x05)

#include <lcd.c>   // lcd.c dosyası tanıtılıyor

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7,enable=pin_C5, parity=N, stop=1) // RS232 protokolünün 9600 bit/sn baud hızında olacağını ve
                                                                                                                                      // TX,RX uçlarının hangi pinler olacağını tanımlıyor
                                                                                                                                     // parity bitinin olmadığını, stop bitinin 1 bit olacağı belirtiliyor

unsigned int8 gelen_id,sensor_isik,sensor_sicaklik;  // işaretsiz tam sayı değişkenleri belirtiliyor..


/********* ANA PROGRAM FONKSİYONU********/


void main ( )
{
   setup_psp(PSP_DISABLED);                         // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);                    // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1)               // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);              // ANALOG giriş yok
   setup_adc(ADC_OFF);                              // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);                          // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);                          // CCP2 birimi devre dışı

 
   lcd_init();   // LCD'yi hazırla



   while(true) // Sonsuz döngü
   {
   
 
    putc(0x01);  //  1.sensör kartının id gönderiyor...
   delay_ms(10);
   
   
   
   
   while(!kbhit()); // veri gelene kadar program bekliyor...
   
   gelen_id=getc(); // Yardımcı kartlardan id bilgisi geliyor
   delay_ms(10);
 
 
       
   if(gelen_id==cihaz_1)  // Eğer gelen bilgi 1. kart ise şart sağlanılıyor ve sıcaklık, ışık bilgisi alınıyor...
   {
 
   
       while(!kbhit()); // veri gelene kadar program bekliyor...   
       sensor_sicaklik=getc();  // 1. yardımcı karttan gelen sıcaklık bilgsi değişkene aktarılıyor..
       delay_ms(10);
     
       
        while(!kbhit()); // veri gelene kadar program bekliyor...
       sensor_isik=getc();    //1. yardımcı karttan gelen ışık bilgsi değişkene aktarılıyor..
       delay_ms(10);
     
   
       lcd_gotoxy(1,1);
        printf(lcd_putc,"\f %u",sensor_sicaklik);
            delay_ms(1000);
       
        lcd_gotoxy(1,2);
        printf(lcd_putc," %u", sensor_isik);
        delay_ms(1000);
   
 
   }
   
     
   }
}




Yardımcı Kart Programı



#include <16f877.h>                                   // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=8                                          // 8 bitlik ADC kullanılacağı belirtiliyor.
// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)                 // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#use fast_io(a)
#define use_portb_lcd TRUE                 // LCD B portuna bağlı

#include <lcd420.c>                             // lcd.c dosyası tanıtılıyor

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7,enable=pin_c5, parity=N, stop=1) // RS232 protokolünün 9600 bit/sn baud hızında olacağını ve
                                                                                                                                       // TX,RX uçlarının hangi pinler olacağını tanımlıyor
#INT_AD                                                                                                                         // parity bitinin olmadığını, stop bitinin 1 bit olacağı belirtiliyor
#define ID (0x01)   


unsigned int8 gelen_id,bilgi,bilgi_1;                                                                               // İşaretsiz 8 bitlik tam sayı tipinde değişken tanımlanıyor





/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
   setup_psp(PSP_DISABLED);                        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);                   // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1);            // T2 zamanlayıcısı devre dışı
 
             
   setup_CCP1(CCP_OFF);                             // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);                             // CCP2 birimi devre dışı

   output_low(pin_c5); // RC5 çıkışı ilk anda sıfırlanıyor
   lcd_init();   // LCD'yi hazırla



   setup_adc(adc_clock_div_32);              // ADC clock frekansı fosc/32
   setup_adc_ports(ALL_ANALOG);

   
enable_interrupts(GLOBAL); // Tüm kesmeler aktif

while(1)
{
   
    while(!kbhit());                   // veri gelene kadar program bekliyor.
   
   
    gelen_id=getc();              // Yardımcı kartlardan id bilgisi geliyor

   
   
   
   
   if(gelen_id==ID)                   // Eğer gelen bilgi 1. kart ise şart sağlanılıyor ve sıcaklık, ışık bilgisi okunuyor...
   
   {
      set_adc_channel(0);               // RA0/AN0 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);
      bilgi=read_adc();                    // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
   
 
      set_adc_channel(1);              // RA1/AN1 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);
      bilgi_1=read_adc();               // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
 
 
 
         lcd_gotoxy(1,1);
      printf(lcd_putc," %u",bilgi);                  // sıcaklık bilgisi desimal olarak ekrana yazdırılıyor
       delay_ms(1000);
       
     
      lcd_gotoxy(1,2);   
     printf(lcd_putc," %u",bilgi_1); // ışık bilgisi desimal olarak ekrana yazdırılıyor...
      delay_ms(1000);
     
     
     
          putc(0x01);                        // id bilgisi gönderiliyor..
        delay_ms(100);
     
       putc(bilgi);                           // sıcaklık bilgisi rs232 den gönderiliyor...
   delay_ms(100);
     
       putc(bilgi_1);                       // ışık bilgisi rs232 den gönderiliyor...
    delay_ms(100);
   
     
   
 
   }
   
}
}




chamakh48

hocam bu devreyle ilgili devre çizimini paylaşabilmeniz mümkün müdür çok acil hocam saygılarımla..

Kabil ATICI

rs485 bilgi alış veriş olayını nasıl kontrol ediyorsun? Programından anlaşılmıyor?

RS485 olayına girmeden burada yazdığın programlar UART üzerinden birbiri ile iletişim kurabiliyor mu? Doğrudan bunu dene bu çalışırsa diğerine geçersin! (yön kontrol olayı haricinde aynıdır.)
Eğer kablo bağlantın konusunda sıkıntı varsa iletişim hızını düşürmen gerekebilir...

Şema , şema! Daha fazla kişi yardımcı olabilir.
ambar7