PİC e ADRESS İD verme ve birden fazla PİC ile haberleştirme

Başlatan macero, 07 Mayıs 2018, 22:37:57

macero

arkadaşlar merhaba bir proje yapmak istiyorum 10 adet sensör var ben bu sensörlere devre yapıp adres id verip kablo vasıtası ile kontrol kartıma haberleştirmek istiyorum kontrol kartımıda seri veya ethernet üzerinden pc ile haberleştirmek istiyorum ancak bir türlü pic lere id adresi nasıl verebilirim ve bu adresi nasıl degiştire bilirim bulamadım

Murat Mert

S.A.

**Seri uart iletişim 485
**Can-bus

Seri uart 485 iletişimde 2 li burgulu sağlam bir kablo ile master ve slave cihazlarınız arasında uart protokolü ile kendi yazacağınız yada nette hazır bulacağınız kodlar ile rahatca haberleşirsiniz.

Canbus da canbus protokolü ve canbuslu bir pic18f serisi mcu ile bütün sensör kartlarınız ile rahatca haberleşirsiniz.
mert07

fide

Daha önce id verme ile ilgili bir uygulama yaptım. Çift uart portu olak 18f26k80 kullandım. Uartın birini veri alıp göndermek, diğerini de hem debug, hem id gömmek için kullandım. İcsp ile firmware yazdıktan sonra debug amaçlı kullandığım uartta bilgisayardan id verisi gönderip kendi üzerindeki hafızaya kaydettim. Resetledikten sonra açılışta bu verinin olup olmadığına bakarak açılıyordu.
İd lerin yanında rgb, ils, ana, alt, sens gibi grup bilgisi içeren text de ekledim. Böylece tek programla üniversal id yazabilecek bir yapı oluşturdum.
İstersen kodları paylaşabilirim.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

macero

Alıntı yapılan: Murat Mert - 09 Mayıs 2018, 11:09:35S.A.

**Seri uart iletişim 485
**Can-bus

Seri uart 485 iletişimde 2 li burgulu sağlam bir kablo ile master ve slave cihazlarınız arasında uart protokolü ile kendi yazacağınız yada nette hazır bulacağınız kodlar ile rahatca haberleşirsiniz.

Canbus da canbus protokolü ve canbuslu bir pic18f serisi mcu ile bütün sensör kartlarınız ile rahatca haberleşirsiniz.


Elinizde proteus çizimi veya ccs kodları var mı

macero

Alıntı yapılan: fide - 09 Mayıs 2018, 19:42:00Daha önce id verme ile ilgili bir uygulama yaptım. Çift uart portu olak 18f26k80 kullandım. Uartın birini veri alıp göndermek, diğerini de hem debug, hem id gömmek için kullandım. İcsp ile firmware yazdıktan sonra debug amaçlı kullandığım uartta bilgisayardan id verisi gönderip kendi üzerindeki hafızaya kaydettim. Resetledikten sonra açılışta bu verinin olup olmadığına bakarak açılıyordu.
İd lerin yanında rgb, ils, ana, alt, sens gibi grup bilgisi içeren text de ekledim. Böylece tek programla üniversal id yazabilecek bir yapı oluşturdum.
İstersen kodları paylaşabilirim.

Çok iyi olur
Kodları paylaşırsanız sevinirim

fide

ID verme programı İşlemci tarafı:
RDA rutini
 counter_data=0;
   counter_temp=0;
   hi_x(rda2_activity);
        do{
            if(kbhit(comm_dbg))
            {
                  counter_dummy=fgetc(comm_dbg);
                  if(counter_data<max_rda2_data)  //gelen veriler fazla uzun ise  250 karakterden sonrasını önemseme 
                  {
               
                     rda2_data[counter_data]=counter_dummy;
                     counter_data++;
                     rda2_data[counter_data]='\0';
                     
                     //rf_rda_data[counter_data]='\0';
                     counter_temp=0;
                  }
            }
            counter_temp++;
            
      }while(counter_temp<1000);
            //rf_rda_data[counter_data]=0;
            
            
           // fprintf(Comm_dbg,"Data:%s\r\n"rf_rda_data);
      rda2_int_activity=1;
      lo_x(rda2_activity);

Main Bloğu
 if(rda2_int_activity==1)
         {
            //fprintf(comm_dbg,"Data2:%s\r\n"rda2_data);
            rda2_int_activity=0;
            
                        
            strcpy(temp_buffer,my_cmd[AT].str);// GET device_id
            if(strcmp(rda2_data,temp_buffer)==0)
            {
               fprintf(comm_dbg,"AT:OK\r\n");
            }
            strcpy(temp_buffer,my_cmd[ATI].str);// GET device_id
            
            if(strcmp(rda2_data,temp_buffer)==0)
            {
               fprintf(comm_dbg,"ATI:%s\r\n"dev_id);
            }
           
            strcpy(temp_buffer, my_cmd[ATHW].str);// GET cHW_id
            if(strcmp(rda2_data,temp_buffer)==0)
            {
               fprintf(comm_dbg,"ATHW:%s\r\n"device_data[cHW_id].hw_str);
            }
            
            strcpy(temp_buffer, my_cmd[ATHWr].str);// GET Hardware revizyon
            if(strcmp(rda2_data,temp_buffer)==0)
            {
               fprintf(comm_dbg,"ATHWr:%s\r\n"device_data[cHW_rev].hw_str);
            }
            
            strcpy(temp_buffer, my_cmd[ATSW].str);// GET Sofware revizyon
            if(strcmp(rda2_data,temp_buffer)==0)
            {
               fprintf(comm_dbg,"ATSW:%s\r\n"device_data[cSW_version].hw_str);
            }
            
            strcpy(temp_buffer,my_cmd[ATC].str); // clear device_id
            if(strcmp(rda2_data,temp_buffer)==0)
            {
               for (counter_temp=0;counter_temp<20;counter_temp++)
               dev_id[counter_temp]='\0';
               write_dev_id();
               fprintf(comm_dbg,"ATC:OK\r\n");
            }
            
            strcpy(temp_buffer,my_cmd[ATr].str); // clear device_id
            if(strcmp(rda2_data,temp_buffer)==0)
            {
               
               fprintf(comm_dbg,"Resetting...\r\n");
               bekle(t_medium);
               reset_cpu();
            }
            
            strcpy(temp_buffer,my_cmd[ATW].str);//write device_id
            if(strstr(rda2_data,temp_buffer)>13)
            {
               //fprintf(comm_dbg,"ATW\r\n");
               counter_gen=strlen(rda2_data);
               if((counter_gen<26)&&(counter_gen>19))
               {
               
                  for(counter_data=0;rda2_data[counter_data]!=':';counter_data++)
                  {}
                  counter_data++;
                  
                  //fprintf(comm_dbg,"str_len:%lu\r\n"strlen(rda2_data));
                  
                  counter_gen=counter_gen-counter_data-2;
                  for(counter_temp=0;counter_temp!=counter_gen;counter_temp++)
                  {
                     dev_id[counter_temp]=rda2_data[counter_temp+counter_data];
                  }
                  dev_id[counter_temp]='\0';
                  write_dev_id();
                  fprintf(comm_dbg,"ATW:OK\r\n");
                 
               }
               else
               {
                  fprintf(comm_dbg,"ATW:ERROR\r\n");
               }
            }
            
         }

Tanımlar:
//LEDlerin  gorev tanımları

#define led10 Pin_C3
#define led11 Pin_C2
#define led12 Pin_C1
#define led13 Pin_C0
#define
#define bekle(x) delay_ms(x)
#define bekle_ss(x) delay_ms(x)
#define bekle_us(x) delay_us(x)


#define hi_x(x) output_high(x)
#define lo_x(x) output_low(x)
#define x_to(x,y) output_bit(x,y)

fonksiyon tanımları:
u1 read_dev_id(void)
{
   u8 sayac;
   char temp;
   read_dev_id_ok=0;
   for(sayac=0;sayac<19;sayac++)
   {
      temp=read_eeprom(sayac + dev_id_addr);
      if((temp>32)&&(temp<128))
      {
         dev_id[sayac]=temp;
         read_dev_id_ok++;
      }
      else
      {
          if(sayac>1)
          {
            dev_id[sayac]='\0';
          }
          
      }
      
   }
   dev_id[sayac]='\0';
   
   
   if(read_dev_id_ok>15)
   {
      fprintf(comm_dbg,"dev_id=%s\r\n"dev_id);
      
      cntrOfTire=0;
      for (sayac=0;sayac<strlen(dev_id);sayac++)
      {
         if(dev_id[sayac]=='.')
         {
            cntrOfTire++;
            if(cntrOfTire==3)
            {
               locOfTire=sayac;
            }
         }
      }
       cntrOfTire=0;
      for (sayac=locOfTire+1;sayac<strlen(dev_id);sayac++)
      {
         shortDevId[cntrOfTire]=dev_id[sayac];
         cntrOfTire++;
      }
       shortDevId[cntrOfTire]='\0';
       fprintf(comm_dbg,"short_dev_id=%s\r\n"shortDevId);
      
      return 1;
   }
   else
   {
      fprintf(comm_dbg,"dev_id--> N/A \r\n");
      return 0;
   }
   
   

}

void write_dev_id(void)
{
   u8 sayac2;
   char chr;
   u16 addr;
   
   
   for(sayac2=0;sayac2<20;sayac2++)
   {
      addr=sayac2+dev_id_addr;
      chr=dev_id[sayac2];
      write_eeprom(addr+1,'\0');   //yazdığından bir ilerdeki karakteri 0'la
      write_eeprom(addr,chr);
   }
}

void clear_dev_id(void)
{
   u8 sayac2;
   char chr;
   u16 addr;
   
   
   for(sayac2=0;sayac2<20;sayac2++)
   {
      addr=sayac2+dev_id_addr;   //yazdığından bir ilerdeki karakteri 0'la
      write_eeprom(addr,'\0');
   }
}

Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

c# Seri Port ayarlama ve veri alma handler kısmı
  private void btnBaglan_Click(object sender, EventArgs e)
        {
            //Daha önceki bağlantı bilgilerini textboxlardan sil
            //resetTextFields();
            
            try
            {
                serialPort1.PortName = cmbPortNames.SelectedItem.ToString();
                serialPort1.BaudRate = 115200;
                
                //serialPort1.Open();

                serialPort1.RtsEnable = false;

                serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
                if (serialPort1.IsOpen == true)
                { serialPort1.Close(); }

                serialPort1.Open();
                
                //serialPort1.Close();

                //bağlantı başarılı ise butonların Enabled durumlarını değiştir
                btnBaglan.Enabled = false;
                btnBitir.Enabled = true;
                btnCihazAra.Enabled = true;
                btnOlusturYaz.Enabled = true;
                btsnDevReset.Enabled = true;

            }
            catch (Exception ex)
            {
                MessageBox.Show("Port erişiminde hata var. Lütfen cihazınızı kontrol edin. HataKodu:" + ex.ToString(), formName);
            }

           

        }
        //seri port veri alma handler
        private  void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string inData = sp.ReadExisting();
            string dbResp;
            
            //recData = indata;
            
            Console.WriteLine("Data Received:");
            Console.Write(inData);
            
            // ATC:OK
            if (inData.StartsWith("ATC:OK") && inData.EndsWith("\r\n"))
            {
                serialPort1.Write(cmd[7].ToString());
                MessageBox.Show("Dev ID silindi.",formName,MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            
            //ATW:OK
            if (inData.StartsWith("ATW:OK") && inData.EndsWith("\r\n"))
            {
                //veri geldikten sonra cihazı resetle
                serialPort1.Write(cmd[7].ToString());
                
                MessageBox.Show("Dev ID kayıt edildi.", formName, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            //ATW:ERROR
            if (inData.StartsWith("ATW:ERROR") && inData.EndsWith("\r\n"))
            {
                MessageBox.Show("Dev ID kayıt edilemedi.", formName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            
            
            //AT:OK
            if (inData.StartsWith("AT:OK") && inData.EndsWith("\r\n"))
            {
                cmdCounter++;
            }

            //--------------------------------------------------ATHW:-------------------------------------------------------------------------------
            //ATHW:FD.ILS.TSUB.R01 veya ATHW:FD.ILS.TMAIN.R01
                      
            if ( inData.StartsWith("ATHW:") && inData.EndsWith("\r\n"))
            {
                char[] noktalama = { ':', '.' };
                string[] bolum = inData.Split(noktalama);
                
                if(bolum[1]==mfcPreFix)       // bolum[1]=="FD" ise
                {
                    dev.mainGroupHWFix = bolum[2];
                    dev.subGroupHWFix = bolum[3];

                    //burada hata veriyor. buraya try catch ekle
                    dev.HwID = bolum[1] + "." + bolum[2] + "." + bolum[3] + "." + bolum[4];

                    //MessageBox.Show("Cihaz mHW: " + dev.mainGroupHWFix + "sHW: " + dev.subGroupHWFix);

                    //Burada mainGroupIDFix ve subGroupIDFix veritabanından sorgulanacak

                    SqlConnection baglanti = new SqlConnection();
                    baglanti.ConnectionString = connStr; // "Data Source=.;Initial Catalog=kutuphane;Integrated Security=SSPI";
                    SqlCommand komut = new SqlCommand();
                    komut.CommandText = "select mainGroupIDFix from tblMainGroup where mainGroupHWFix='" + dev.mainGroupHWFix + "'";
                    komut.Connection = baglanti;
                    komut.CommandType = CommandType.Text;
                    //komut.CommandType = CommandType.StoredProcedure;
                    //komut.Parameters.AddWithValue()
                    //SqlDataReader dr;
                    baglanti.Open();

                    dbResp = komut.ExecuteScalar().ToString(); //.ExecuteNonQuery(); //.ExecuteReader();
                    
                    //MessageBox.Show("mainGroupIDFix: " + dbResp);                                
                    
                    baglanti.Close();

                    if (dbResp.Length>1)
                    {
                        dev.mainGroupIDFix = dbResp;    //cihazın HWFix sabitine ait IDFix sabiti burada aktarılıyor.
                        
                        //SqlConnection baglanti = new SqlConnection();
                        //baglanti.ConnectionString = connStr; // "Data Source=.;Initial Catalog=kutuphane;Integrated Security=SSPI";
                        //SqlCommand komut = new SqlCommand();
                        komut.CommandText = "select subGroupIDFix from tblSubGroup where (mainGroupIDFix='" + dev.mainGroupIDFix + "' and subGroupHWFix='" + dev.subGroupHWFix + "')";
                        komut.Connection = baglanti;
                        komut.CommandType = CommandType.Text;
                        //komut.CommandType = CommandType.StoredProcedure;
                        //komut.Parameters.AddWithValue()
                        //SqlDataReader dr;
                        baglanti.Open();

                        dbResp = komut.ExecuteScalar().ToString(); //.ExecuteNonQuery(); //.ExecuteReader();

                        if (dbResp.Length > 1)
                        {
                            dev.subGroupIDFix = dbResp;
                        }
                        else
                        {
                            //database cevabı boş ise bildirim ekle yada yeni database anahtarları eklemek için yönlendirme yap
                        }
                        
                        //MessageBox.Show("Cihaza  ait olarak: mainGroupIDFix: " + dev.mainGroupIDFix + " subGroupIDFix: " + dev.subGroupIDFix);
                        //okumanın sağlıklı olarak yapıldığı ile ilgili buraya bildirim eklenebilir.
                        baglanti.Close();


                    }
                    else
                    {
                        //database cevabı boş ise bildirim ekle yada yeni database anahtarları eklemek için yönlendirme yap
                    }


                }
                cmdCounter++;   
            }
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

macero

fide ustam kodlar için teşekkürler emegine sağlık

Murat Mert

mert07

memoliz188


macero

Alıntı yapılan: Murat Mert - 17 Mayıs 2018, 10:45:55İşinizi çözebildiniz mi?
Hocam devreyi kurmak için araştırmalar yapıyorum

Devre şu şekilde olacak

Anakart pc ile rs232 den veya Network ten bağlanacak

Ana kartın rs 485 çıkışları olacak 1,2,3,4,5 gibi her çıkışa 50 adet sensör bağlanacak çıkışlar üzerinden ıd ile sensör kartlarını adresleyip sensör durum bilgisini pc yazılımından okuyucagız mesela sensör açıldı kapandı gibi