1-Wire ile picler nasıl haberleştirilir

Başlatan emre07, 01 Mayıs 2009, 16:14:49

emre07

1 tane master picten 5 tane pice tek hat üzerinden bilgi göndermek ve bununla bazı makineleri çalıştırmak istiyorum örnek kodlara ihtiyacım var bu konuda tecrübeli arkadaşların yardımlarını bekliyorum.

Tagli

Konu hakkında deneyimim yok ama aklıma bir fikir geldi. Normal RS232'de yaptığımız gibi veri yolla ama verinin başında bir adres değeri oldun. Kendin bir biçim belirleyebilirsin. Mesela 9 byte yollarsın, ilk byte adres değerini içerir. Hattı dinleyen PIC'lerden adresi tutan diğer 8 byte'ı alıp işler. Diğer PIC'ler de kalan 8 byte'ı alır ama sadece sayarlar, herhangi bir iş yapmazlar. Ancak buradaki en büyük sorun sistemin dışarıdan gelebilecek parazitlere karşı savunmasız olması. Veri hattında yaşanabilecek bir veri kaybı her şeyi altüst edebilir. Belki kendin gönderilen paketlere kontrol amaçlı veriler gömebilirsin, CRC gibi. Bu 5 PIC'ten master konumundaki PIC'e de veri gitmesi gerekiyorsa işin daha da zorlaşacak. İmkansız değil ama uğraştırır baya.
Gökçe Tağlıoğlu

dijital74

Bu işler için bir de CAN protokolü vardı. Araştırırsan belki işine yarayabilir.

huskapukaya

birde bu linke bak istiyorsan

http://www.ccsinfo.com/faq.php?page=connect_pics

ccs in example larınada bi bak iyi olur gibi. ben bişeyler yazmıştım  ama çalıştıramamıştım. onlarıda buraya ekleyeyim ama çalışmıyorlar. genede belki fikir verir hani
ayrıca bu kodlar son uğraştığım halleriyle duruyorlar yani aslında zaten baya eksikler.
master :
#include <16F877A.h>

#fuses HS,WDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)

#use rs232(baud=9600, xmit=PIN_B0, rcv=PIN_B0,stream=pictopic)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,stream=pc) 


#include <input.c>
#include <stdlib.h>
#include <string.h>

char alim[5];
char bos[1];

#int_rda
void serialim()
{

output_high(pin_e0);
  fgets(alim,pc);
  

   delay_ms(5);
  fputs(alim,pc);

  delay_us(20);
   fputs(alim,pictopic);
     fputs(alim,pictopic);
    
}


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


void main ()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_ccp2(CCP_off);

setup_ccp1(CCP_off);
 
enable_interrupts(int_RDA); 
   enable_interrupts(global); 





   while(1)
   {
  

}

}


slave:
#include <16F877A.h>

#fuses HS,WDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)

#use rs232(baud=9600, float_high,ERRORS,xmit=PIN_B0,FORCE_Sw, rcv=PIN_B0,stream=pictopic)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,stream=pc) 

#include <input.c>
#include <stdlib.h>
#include <string.h>



int8 x;



char al[10];
    
char ver2[]="1";
char ver1[20];
char analog_s3[5]="    ";
 
#int_ext
void serialim()
{
 output_high(pin_e0); 

 strcat(ver1,ver2);
   delay_us(20);
strcat(ver1,analog_s3);
   delay_us(20);

        
        fgets(al,pictopic);
      
       

 fputs(al,pc);





                

}

 
     
       


 
     


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


void main ()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_ccp2(CCP_off);

setup_ccp1(CCP_off);
 
enable_interrupts(int_ext); 
   enable_interrupts(global); 


enable_interrupts(int_ext);


   while(1)
   {
memset(ver1, 0, 20);
memset(al, 0, 5);
 x=input_d();
 




 
 


}

}

emre07

cevap yazan arkadaşlara teşekkür ediyorum.aşağıdaki verdiğim linkte şekildeki gibi http://ul.to/2mn65v
nasıl yazılabilir.

huskapukaya

biraz zaman girdi araya ama olsun.
kendimce bişeyler yazmaya çalıştım. biliyorum belkide pek başarılı değil ama genede çalışan birşey. o yüzden burada paylaşmak iyi olur dedim. Proteusta 4 picle denedim çalıştı. gerçekte deneme fırsatım henüz olmadı. deneyebilirsem size iletirim sonuçlarını.
ayrıca başka arkadaşlarda fikir verirlerse belki iyi bişeyler ortaya çıkar.

master:
#include <16F877A.h>

#fuses HS,noWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)

#use rs232(baud=9600,float_high, xmit=PIN_B0, rcv=PIN_B0,stream=pictopic)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,stream=pc) 


#include <input.c>
#include <stdlib.h>
#include <string.h>
#define ONE_WIRE_PIN PIN_B0
char alim[10];
char alim2[10];
char adres;// master olduğundan adres istemez
char set[10];


void onewire_reset() 
{
 output_low(ONE_WIRE_PIN);
 delay_us( 500 ); 
 output_float(ONE_WIRE_PIN);
 delay_us( 500 ); 
 output_float(ONE_WIRE_PIN);
}



#int_rda
void serialim()
{

  fgets(alim,pc);
 fputs(alim,pc);
memcpy(set, &alim[1], 5);
adres= alim[0]; 
 fputc(adres,pictopic);
fputs(set,pictopic);

// bilgisayarın seri portundan gönderdiğiniz string  

//buradan göndereceğiniz string önemli bilgisayardan gönderilen string de //ilk karakter hangi pic ile işlem yapılacaksa o pic in adresidir
// ikinci karakterse ne işleminin yapılacağını söyler. yani mesela eğer //2.karakterimiz 1 ise adresi verilen pic ten an0 daki okunan değeri //istiyordur demek eğer 2 ise ozaman 3. karakterden itibaren olan 4 //karakteri ccp1 e yazar yani pwm üretir. mesela eğer bilgisayarda 11 //gönderilirse 1.pic teki analog okumayı istiyordur. 21 giderse 2. picteki //analog okuma.
//yada 12100 giderse birinci picteki pwm in duty si 100 olur. yada 22500 //yazarsanız 2.picteki pwm in duty si 500 olur.
  

  


if(alim[1]=='1')
{



  fgets(alim2,pictopic);
  
  fputs(alim2,pc);

}
 clear_interrupt(int_rda);
  onewire_reset();

}





void main ()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_ccp2(CCP_off);

setup_ccp1(CCP_off);
 
enable_interrupts(int_RDA); 
   enable_interrupts(global); 





   while(1)
   {
    memset(alim, 0, 10);
  memset(alim2, 0, 10);
    memset(set, 0, 10);

}

}


slave:

#include <16F877A.h>
#device ADC=10
#fuses HS,noWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)

#use rs232(baud=9600, float_high, xmit=PIN_B0, rcv=PIN_B0,stream=pictopic)




#include <stdlib.h>
#include <string.h>
#include <input.c>
#define ONE_WIRE_PIN PIN_B0

int1 z=0;
int16 y;
int16 pwm;
char al;
char adres='1'; // bu slave pic imizin adresi her pic için farklı olacak.
char alim[10];
char ver[10];
char set[10];
char analog_s3[5]="    ";
 
 
void onewire_reset()  
{
 output_low(ONE_WIRE_PIN);
 delay_us( 500 );
 output_float(ONE_WIRE_PIN); 
 delay_us( 500 );
 output_float(ONE_WIRE_PIN);
}



#int_ext
void  EXT_isr(void) 
{





if(kbhit(pictopic))
{

al=fgetc(pictopic);

if(al==adres)
{
fgets(alim,pictopic);

 y=read_adc();
    sprintf(ver,"%ld",y);
 


 memcpy(set, &alim[1], 4);


if(alim[0]=='1')
 {


delay_ms(20);
fputs(ver,pictopic);

 }
 
if(alim[0]=='2')
 {

pwm=atol(set);
set_pwm1_duty(pwm);


 }
z=0;
  onewire_reset();

}
else
{
z=0;
}
 clear_interrupt(int_ext);

}  
}



void main ()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_ccp2(CCP_off);


 setup_adc(adc_clock_div_32);
setup_adc_ports(AN0_AN1_AN3);
             
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16,250,1); 


ext_int_edge( h_to_l );
   enable_interrupts(global);
   enable_interrupts(int_ext);
 set_adc_channel(0);
                                     delay_us(100);

set_pwm1_duty(0);

   while(1)
   {
   
memset(ver, 0, 10);
memset(set, 0, 4);
memset(analog_s3, 0, 5);





}

}