Autor Tema: Comunicacion entre Pics a larga distancia  (Leído 3864 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rachelies

  • PIC12
  • **
  • Mensajes: 65
Comunicacion entre Pics a larga distancia
« en: 08 de Junio de 2010, 12:01:53 »
Hola:
Necesito comunicar varios pic que serian esclavos, con un maestro situado a 1-1,5 metros. He probado con I2C, y ya en 40cm se pierde la señal y no funciona. ¿Habrá que colocar unas resistencias de distinto valor a 4k7 para I2C?
¿Que comunicación me recomendais que se pueda implementar con CCS? No tiene porque ser muy rápido, pero cuanto más mejor. He probado con el I2C a 100kbps a 5cm y funciona perfectamente, pero necesito mucha mas longitud.

Un saludo y muchas gracias.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Comunicacion entre Pics a larga distancia
« Respuesta #1 en: 08 de Junio de 2010, 12:16:30 »
Hola, el I2C por si solo no esta preparado para trabajar a distancias grandes, podrias usar otros sistemas de comunicaciones como por ejemplo el RS-485 o algún expander:

http://www.nxp.com/documents/data_sheet/P82B715.pdf

http://personales.mundivia.es/joanra/iic/an444%20(%20I2C%20LONG%20CABLES).pdf

Saludos !

Desconectado rachelies

  • PIC12
  • **
  • Mensajes: 65
Re: Comunicacion entre Pics a larga distancia
« Respuesta #2 en: 08 de Junio de 2010, 12:26:08 »
Y para trabajar con 485, tendria que poner un max485 a la salida o salida de cada pic,¿no?

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Comunicacion entre Pics a larga distancia
« Respuesta #3 en: 08 de Junio de 2010, 12:31:54 »
Si, aunque también existen otros integrados que sirven, el tema es que para la comunicacion 485 necesitas reemplazar el I2C con un serie ( UART ) y establecer vos el protocolo master-slave. Tal vez la idea del I2C expander implique el menor trabajo para lo que necesitas.

Saludos !

Desconectado rachelies

  • PIC12
  • **
  • Mensajes: 65
Re: Comunicacion entre Pics a larga distancia
« Respuesta #4 en: 08 de Junio de 2010, 12:34:22 »
Si, es mas sencillo, y ademas he visto que los integrados cuestan más o menos lo mismo, asi que seguiré con el I2C
Muchas gracias

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Comunicacion entre Pics a larga distancia
« Respuesta #5 en: 08 de Junio de 2010, 12:35:45 »
Bueniisimo, después seria estupendo que subas los avances ( esquematicos, firmware ) asi todos aprendemos un poco mas :-)

Saludos !

Desconectado rachelies

  • PIC12
  • **
  • Mensajes: 65
Re: Comunicacion entre Pics a larga distancia
« Respuesta #6 en: 08 de Junio de 2010, 12:45:45 »
El código de los pic lo puedo poner ahora, el esquemático aún no está hecho. Los pic hacen lo siguiente, aunque de momento solo a modo de ejemplo y ensayos (para las pruebas de i2c): Hay 2 pic, uno Maestro (A) un 18F2455, y un esclavo (B) 16F873A. El esclavo lee una señal analogica por RA0. Con esta entrada hace parpadear más o menos un led por medio de la salida de PWM 1 y lo guarda en el buffer para poder ser leido por el Maestro.
El maestro lee otra señal analogica por RA0, y a su vez, lee por i2c el valor analogico del Esclavo. Este valor analógico, hace que parpadee otro led en la salida PWM1 de este pic, haciendo que se ilumine más o menos según la entrada analógica del Pic Esclavo. Esto de los led lo hago para comprobar que la conversion A/D funciona, y que también funciona la transmisión.
Si todo esto fuese poco, los 2 valores analógicos los envío por USB, reconociendolo el PC como un joystick y variando 2 ejes.
Los códigos son los siguientes:

ESCLAVO
Código: [Seleccionar]
#include <16F873A.h>
#device ADC=8
#fuses HS,NOWDT,PUT
#use delay(clock=20000000)
#use i2c(SLAVE,SCL=PIN_C3,SDA=PIN_C4,SLOW,FORCE_HW,ADDRESS=0x0A)


int pichB,state,buffer[0x01],adress;

#INT_SSP
void ssp_interrupt()
{ output_high(PIN_A2);
state=i2c_isr_state();
if(state==0x80){
i2c_write(buffer[0x00]);
output_high(PIN_A1);
}
}

void main(){
set_tris_A(0b00000001);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(20);
pichB=read_adc();

enable_interrupts(GLOBAL);
    enable_interrupts(INT_SSP);

adress=0x00;

while(TRUE){

set_adc_channel(0);
delay_us(20);
pichB=read_adc();
buffer[0x00]=pichB;
delay_ms(1);
output_high(PIN_A3);

}
}

MAESTRO
Código: [Seleccionar]
#include <18F2455.h>
#device ADC=8
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)

#DEFINE USB_HID_DEVICE TRUE

#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 8

#include <pic18_usb.h>
#include <.\include\midi_hid2.h>
#include <usb.c>
#include <ctype.h>

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c(MASTER,SCL=PIN_B1,SDA=PIN_B0,SLOW,FORCE_HW)
#use fast_io(A)
#use fast_io(C)

int pichA,pichB;
int out_data[2];
long ciclo;

void main(void) {

delay_ms(1000);
set_tris_A(0b0000001);
set_tris_C(0);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
    usb_init_cs();

setup_timer_2(T2_DIV_BY_1,129,1);
setup_ccp1(CCP_PWM);

   while (TRUE) {
      usb_task();
      if (usb_enumerated())

      {
set_adc_channel(0);
delay_us(20);
pichA=read_adc();

delay_ms(10);

i2c_start();
i2c_write(0x0A+1);
pichB=i2c_read(0);
i2c_stop();


ciclo=pichB*2.0392;
set_pwm1_duty(ciclo);
output_high(PIN_A1);

        out_data[0]=pichB;
out_data[1]=pichA;
 
usb_put_packet(1,out_data,2,USB_DTS_TOGGLE);
         
      } 

   }
}

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Comunicacion entre Pics a larga distancia
« Respuesta #7 en: 08 de Junio de 2010, 14:05:43 »
Muchas gracias !!!


 

anything