Autor Tema: Dudas I2C Multiesclavo con 18F458 en CCS  (Leído 2904 veces)

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

Desconectado raulval82

  • PIC10
  • *
  • Mensajes: 14
Dudas I2C Multiesclavo con 18F458 en CCS
« en: 29 de Agosto de 2011, 04:39:55 »
Buenas a todos,

Estoy empezando con el bus I2C entre micros, y después de haber visto mil ejemplos, y haber conseguido unas cuantas cosas se me plantean un par de dudas. He conseguido comunicar dos 18F458 entre sí mediante I2C maestro esclavo utilizando un ejemplo que hay por la web portado a mi PIC, y en principio parece una comunicación sencilla, pero en el momento de añadir un segundo esclavo, no consigo que este esclavo vea el dato que le envío, así que entiendo que hago algo mal...

Esta es la función de envío que utilizo, quiero enviar el mismo dato a todos los pic, solo el primero de los dos recibe el dato, el segundo no lo recibe.
Código: [Seleccionar]

void envio_I2C(){
  
      i2c_start();         //Comienzo de la comunicación I2C ...
      i2c_write(0x02);     //...con la dirección del PIC esclavo...
      i2c_write(tecla);    // Envia dato
      i2c_stop();          //Finalización de la transmisión  
      delay_ms(500);
      i2c_start();         //Comienzo de la comunicación I2C ...
      i2c_write(0x04);     //...con la dirección del PIC esclavo...
      i2c_write(tecla);    // Envia dato
      i2c_stop();          //Finalización de la transmisión  
      delay_ms(500);

  }

Y la configuración del bus de los tres pics:

Código: [Seleccionar]
#use i2c(MASTER, SDA=PIN_C4, SLOW, SCL=PIN_C3, NOFORCE_SW)
#use I2C(SLAVE, SDA=PIN_C4 ,SLOW, SCL=PIN_C3, ADDRESS=0x02, NOFORCE_SW)
#use I2C(SLAVE, SDA=PIN_C4 ,SLOW, SCL=PIN_C3, ADDRESS=0x04, NOFORCE_SW)

Junto con la lectura del dato:
Código: [Seleccionar]
  while (1) {
  
      // Recepción por comunicación I2C    
      if(i2c_poll()) {
         dato=i2c_read();
         lcd_putc(dato);                  //Muestra dato recibido por pantalla
         if (dato=='*') lcd_putc("\f");   //Si es * borra la pantalla lcd
         }

Independientemente de que no me funcione, NOFORCE_SW no sale como tal en la ayuda de CCS, no es lo mismo que FORCE_HW? esto me marea un poco... ya que no tengo muy claro el tema de i2c soft vs i2c hard. Por otro lado i2c_poll() entiendo que ya tiene en cuenta que la dirección a la que van los datos es la suya no?? porque si no es esto, o algún tema de tiempos estoy muy perdido...

Muchas gracias de antemano y saludos!!!

Actualizo: He estado haciendo pruebas, si en lugar de enviar el dato a cada uno de los pics lo hago al mismo dos veces lo recive ok, por lo tanto entiendo que el envío se hace bien. Con el i2c debugger, he
podido ver que el segundo pic me devuelve NAK, os pongo una captura:



Uploaded with ImageShack.us
« Última modificación: 29 de Agosto de 2011, 07:50:00 por raulval82 »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Dudas I2C Multiesclavo con 18F458 en CCS
« Respuesta #1 en: 04 de Septiembre de 2011, 17:12:23 »
Te explico la diferencia entre i2c soft y hardw, el i2c por soft unicamente son funciones hechas para transmitir, es decir, esa funcion escrita se encarga de poner los delays, poner los 0,1 y ademas controlar el sck.

Lo ideal es por hardware, ya que el pic tiene un modulo (MSSP) encargado de esto, por lo cual te olvidas de problemas, de funciones bloqueantes, incluso el mismo hardware se encarga de darle su velocidad (la que hayas configurado).

Creo que el i2c_poll solo se puede usar por hardware, intenta poner todo por hardware, quizas asi te funcione, intenta evitar las funciones por software, estas se usan cuando el PIC (en este caso) no dispone de hardware y se intenta emular.

Desconectado raulval82

  • PIC10
  • *
  • Mensajes: 14
Re: Dudas I2C Multiesclavo con 18F458 en CCS
« Respuesta #2 en: 08 de Septiembre de 2011, 03:39:27 »
Gracias por la aclaración, voy a seguir intentándolo y en cuanto lo tenga solucionado lo postearé.

Saludos.


 

anything