rs232 üzerinden sıralı bilgi transferi

Başlatan fm, 02 Mart 2013, 21:59:42

fm

Merhaba, bir konuda yardımınıza ihtiyacım var. Denetleyiciler arası sıralı bilgi göndermeye çalışıyorum.
1 tane master ve 2 tane slave denetleyici var tasatımda. Her slavede birer adet potansiyometre ve lm35 sıcaklık sensörü var.
Slavelerde okunan değerleri mastera sıralı olarak gönderip yazdırmak amacım. Ancak bi sorun yaşıyorum. İlk slaveden gelen bilgi oknuyor her defasında.

Ne yapmam gerektiğini çözemedim. Yardım ederseniz çok sevinirim. Tasarımı ve kodları ekledim.

Saygılarımla..

Salih

Master, Slave1'den istek de bulunsun. Cevabı beklesin. Cevap gelince Slave2'ye istek de bulunsun.
İşlem sürekli bu şekilde devam etmelidir.
Siz böylemi yaptınız?

omereliusuk

Alıntı yapılan: salih - 03 Mart 2013, 19:45:33
Master, Slave1'den istek de bulunsun. Cevabı beklesin. Cevap gelince Slave2'ye istek de bulunsun.
İşlem sürekli bu şekilde devam etmelidir.
Siz böylemi yaptınız?
veya
tümüne sensörleri oku komutu tek komut olarak gönder. her slave mikrodenetleyicinin bir genel adresi(hepsinde aynı olacak atıyorum preamble genel) kendine özel adresi olacak tabi atıyorum(preamble slave1,slave2 gibi)
sonra sırayla her slave işlemciye okuduysan sensörden aldığın bilgiyi gönder emrini ver. onlar da sana bilgiyi okudum bu da okuduğum bilgim şeklinde cevap versin veya bilgiyi okuyamadım sen diğer düğüme geç onunla iletişim kur bilgisi verilecek. halka yöntemini uygulayacaksın kısacası.
unutma ve ayrıca checksum bilgisi ile birlikte cevap gelsin ki aldığın bilgi hatalı olmasın...

fm

Öncelikle cevaplarınız için çok teşekkürederim. Dediğiniz şeyleri yapmaya çalışıyorum ama bi yerlerde ya eksik yapıyorum yada yanlış yapıyorum. Her seferinde ilk slaveden gelen bilgiyi yazdırıyor. Yazdığım kodları eklememişim hemen ekliyorum. Yalnız tasarımın şemasını nasıl ekleyeceğimi bulamadım.


Master denetleyici için;
#include <16F877A.h>
#include <string.h>

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
#FUSES WRT_50%
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

#define use_portb_lcd TRUE
#include <lcd.c>

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, uart1, stop=1)
char veri=123;
char bayrak, s;
//!char veri1[] = "picsifir";
//!char veri2[] = "picbir";
//!char giris[20]; 
int i,m,t;
//int dizi[25]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25}; // slavelere sırası ile gönderme yapılacak
int dizi[2]={1,2};

char sec[]={'a','b','c','d'};
//!char *k; //pointer olrak k alınıyor.
//!char *l; //pointer olrak l alınıyor.

#int_rda //seri haberleşme kesmesi
void seri_haberlesme()
{  
     enable_interrupts(int_rda); 
     
     s=getc();
     sec[t]=s;
     delay_ms(300);
     
     if(t<4)
     {
     bayrak=1;
     }
     t++;
}

void main()
{
   setup_adc_ports (NO_ANALOGS) ;
   setup_adc (ADC_OFF) ;
   setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_comparator (NC_NC_NC_NC) ;
   setup_vref (FALSE) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;
   
   set_tris_b (0x00) ;
   output_b (0x00) ;
   
   set_tris_c (0x80);
   
   set_tris_d (0x03);
   output_d (0x00);
   
   lcd_init ();
   
   enable_interrupts (int_rda);
   enable_interrupts (GLOBAL);
   
   bayrak = 0;
   i=0;
   t=0;
   
   printf(lcd_putc,"\fLutfen");
   printf(lcd_putc,"\nBekleyiniz");
   delay_ms(1000);
   printf(lcd_putc,"\fOkuma Yapiliyor");
   delay_ms(200);

   while (1)
   {
      for(i=0;i<2;i++)
      {
        putc(dizi[i]);
        delay_ms(500);
      
         if(bayrak==1)
         { 
            printf(lcd_putc,"\f%d numarali",dizi[i]);
            printf(lcd_putc,"\nslave okunuyor");
            delay_ms(500);
            printf(lcd_putc,"\fsicaklik=%d",sec[0]);
            printf(lcd_putc,"\nvoltaj=%d",sec[1]);
            delay_ms(1000);
            printf(lcd_putc,"\fLutfen");
            printf(lcd_putc,"\nBekleyiniz");
     }
     
     bayrak=0;
    
    }
   }  
}

Slave0 için;
#include <16F877A.h>

#device ADC=10    // adc çevirme ileminin kaç bitle yapılacağını söyler.

#include <string.h>  // string kütüphanesi programa tanıtılıyor.

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
#FUSES WRT_50%
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

#define use_portb_lcd TRUE
#include <lcd.c>

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=0)

char bayrak;
char veri[] = "picsifir";
char giris[20]; 
char *k; //pointer olrakk alınıyor.

unsigned long int gerilim_bilgi,sicaklik_bilgi;   // işaretsiz 16 bitlik tamsayı tipinde değişken tanımlanıyor
int voltaj, sicaklik, secici;
float svoltaj; // sıcaklık hesabında kullanılan voltaj.

#int_rda //seri haberleşme kesmesi
void seri_haberlesme()
{  
   enable_interrupts(int_rda);
   secici=getc();
   
   if (secici == 1) // giris ve veriye atanan string ifadeler aynı ise sonuc 0 döndürür.
      {
         bayrak = 1;
      }
}

   
void main()
{
   setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;
   setup_adc(adc_clock_div_32);
   setup_adc_ports(ALL_ANALOG);
   
   set_tris_a(0x0F);
 
   set_tris_b(0x00);
   output_b (0x00);
   
   set_tris_c (0x80);
   
   set_tris_d (0xF0);
   output_d (0x00);
   
   enable_interrupts (int_rda);
   enable_interrupts (GLOBAL);
   
   bayrak = 0;
   
   lcd_init ();
   printf(lcd_putc,"\fTest Olcumu");
   printf(lcd_putc,"\nButona Basin");
   
   while (1)
   {
      output_low(pin_d0);
   
      set_adc_channel(0);
      delay_us(20);
      gerilim_bilgi=read_adc();
      voltaj=gerilim_bilgi*0.0048828125;
    
      set_adc_channel(1);
      delay_us(20);
      sicaklik_bilgi=read_adc();
      svoltaj=(sicaklik_bilgi*0.0048828125)*1000; // Dijitale çevirme işlemine uğrayan sinyalin mV cinsinden gerilim değerini hesaplar. O yüzden 1000 ile çarpıyoruz.
      sicaklik=(svoltaj/10);  // her 10mV'ta 1 derece artma.
   
   
      if(input(pin_d7))
   {
    delay_ms(20);
    while(input(pin_d7));
       
       putc(voltaj);
       delay_ms(200);
   }
   
      
      if (bayrak == 1)
      {
      
         putc(sicaklik);
         delay_ms(200);
      
         output_high(pin_d0);
         delay_ms(500);
         output_low(pin_d0);
         
         putc(voltaj);
         delay_ms(200);
      }
      
      bayrak=0;
  }

}

Slave1 için;
#include <16F877A.h>

#device ADC=10    // adc çevirme ileminin kaç bitle yapılacağını söyler.

#include <string.h>  // string kütüphanesi programa tanıtılıyor.

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
#FUSES WRT_50%
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

#define use_portb_lcd TRUE
#include <lcd.c>

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=0)

char bayrak;
char veri[] = "picsifir";
char giris[20]; 
char *k; //pointer olrakk alınıyor.

unsigned long int gerilim_bilgi,sicaklik_bilgi;   // işaretsiz 16 bitlik tamsayı tipinde değişken tanımlanıyor
int voltaj, sicaklik, secici;
float svoltaj; // sıcaklık hesabında kullanılan voltaj.

#int_rda //seri haberleşme kesmesi
void seri_haberlesme()
{  
   enable_interrupts(int_rda);
   secici=getc();
   
   if (secici == 2) 
      {
         bayrak = 1;
      }
}

   
void main(){

   //setup_adc_ports (NO_ANALOGS) ;
   //setup_adc (ADC_OFF) ;
   setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   //setup_comparator (NC_NC_NC_NC) ;
   //setup_vref (FALSE) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;
   
   setup_adc(adc_clock_div_32);
   setup_adc_ports(ALL_ANALOG);
   
   set_tris_a(0x0F);
 
   set_tris_b(0x00);
   output_b (0x00);
   
   set_tris_c (0x80);
   
   set_tris_d (0xF0);
   output_d (0x00);
   
   enable_interrupts (int_rda);
   enable_interrupts (GLOBAL);
   
   bayrak = 0;
   
   lcd_init ();
   printf(lcd_putc,"\fOlcum Icin");
   printf(lcd_putc,"\nButona Basin");

   while (1)
   {
      output_low(pin_d0);
   
      set_adc_channel(0);
      delay_us(20);
      gerilim_bilgi=read_adc();
      voltaj=gerilim_bilgi*0.0048828125;
    
      set_adc_channel(1);
      delay_us(20);
      sicaklik_bilgi=read_adc();
      svoltaj=(sicaklik_bilgi*0.0048828125)*1000; // Dijitale çevirme işlemine uğrayan sinyalin mV cinsinden gerilim değerini hesaplar. O yüzden 1000 ile çarpıyoruz.
      sicaklik=(svoltaj/10);  // her 10mV'ta 1 derece artma.
   
   
      if(input(pin_d7))
      {
         delay_ms(20);
         while(input(pin_d7));
         putc(voltaj);
         delay_ms(200);
      }
   
      
      if (bayrak == 1)
      {
    
         putc(sicaklik);
         delay_ms(200);
         
         output_high(pin_d0);
         delay_ms(500);
         output_low(pin_d0);
      
         putc(voltaj);
         delay_ms(200);
      }
      
      bayrak=0;
  }

}

haydarpasamikro

Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

fm

hocam şu resim göndermek nasıl olacak? yaptığımız tasarımı size göndereyim..

haydarpasamikro

http://imageshack.us/ kullanıyorum. Siz üye olup resmi upload ediyorsunuz. O da size form sitelerindeki burada yazdığımız alan gibi yerlere yapıştrımak için html linkini veriyor. O linki buraya copy-paste yapıyorsunuz.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

fm