TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: saveuc_siul en 23 de Enero de 2012, 18:52:35

Título: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: saveuc_siul en 23 de Enero de 2012, 18:52:35
Buenas tardes,

Hola les escribo para ver si alguien me puede ayudar, lo que pasa es que tengo que hacer una red de micros con el PIC18f4550 como maestro y cuatro PIC18f2550 como esclavos, el problema que tengo es que según lo que entiendo para lograr la comunicación debo utilizar las RB0 y RB1 que es donde se encuentran el SDA y SCL de este modelo de micros y bueno en la aplicación donde requiero la red necesito hacer uso de las tres interrupciones de la parte baja del puerto B del PIC y de la interrupción por cambio de estado en la parte alta del mismo puerto, entonces no se que hacer porque la comunicación I2C necesita a los dos primeros pines del puerto B, ¿hay alguna otra forma de lograr la comunicación I2C????

Les explico un poco la función de la red. Les esclavos tienen que leer un encoder cada uno, debido a que el sensor tiene 3 señales de modulación se hace uso de todas las interrupciones del puerto B para poder identificar flancos de subida y de bajada y tener una mejor resolución, posteriormente la información de los esclavos será enviado al PIC maestro para que este se comunique con una PC que procesará la información.

REALMENTE ESPERO QUE ALGUIEN ME PUEDA AYUDAR, ME URGE SACAR ESTE PEQUEÑO PROYECTO ADELANTE.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: NoSepComo en 24 de Enero de 2012, 05:42:13
Hola, no se en que compilador trabajas, pero en CCS creo que en las opciones de ensamblado puedes elegir los pines de SDA y SCL y el código del compilador automáticamente te modifica el firmware para usar una u otra.
Le puedes especificar por ejemplo que en vez de usar RB0 y RB1 te use RC4 y RC5 (que son las habituales en pics de 40 patas para el I2C).
Yo la verdad que siempre usé las de por defecto, pero se pueden seleccionar otras seguro. En otros compiladores no se si estará la opción directamente o tendrás que modificar a lo mejor los ficheros header para poder usar otras o incluso implementar tu el protocolo "a pelo" en el firmware.
Si usas CCS #use I2C(master,sda=PIN_C4,scl=PIN_C3,...)
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: saveuc_siul en 01 de Marzo de 2012, 20:29:28
Hola, no se en que compilador trabajas, pero en CCS creo que en las opciones de ensamblado puedes elegir los pines de SDA y SCL y el código del compilador automáticamente te modifica el firmware para usar una u otra.
Le puedes especificar por ejemplo que en vez de usar RB0 y RB1 te use RC4 y RC5 (que son las habituales en pics de 40 patas para el I2C).
Yo la verdad que siempre usé las de por defecto, pero se pueden seleccionar otras seguro. En otros compiladores no se si estará la opción directamente o tendrás que modificar a lo mejor los ficheros header para poder usar otras o incluso implementar tu el protocolo "a pelo" en el firmware.
Si usas CCS #use I2C(master,sda=PIN_C4,scl=PIN_C3,...)

Hola, hice lo que me digiste y no me funciona, no me hace el cambio :S
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: marito en 16 de Abril de 2012, 18:56:23
Hola! alguien logró hacer funcionar la comunicación I2C con un PIc18F4550?

Estoy trabajando en la comunicación entre una placa controladora de motores y el PIC que mencionaba. Hasta el momento no me funcionó. Hay algún límite de velocidad?
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: MerLiNz en 16 de Abril de 2012, 20:23:59
creo que son 400kbps
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: NoSepComo en 17 de Abril de 2012, 05:09:39
Si 400kbps es el limite.
Pues de todas formas, yo nunca he tenido problemas, salvo quizá en la manera de comunicarte, si quieres cuelga el código y a lo mejor sacamos algo más en claro.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: marito en 17 de Abril de 2012, 08:37:21
Estoy trabajando con un 18F4550, con un clock de 48MHz y mi ciclo de programa, dentro del cual tengo la sentencia de comunicación, tiene una duración de 5mseg. Estoy excedido del límite? Como se calcula la frecuencia de 400kbps?
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: nZeta en 17 de Abril de 2012, 09:05:42
Estoy trabajando con un 18F4550, con un clock de 48MHz y mi ciclo de programa, dentro del cual tengo la sentencia de comunicación, tiene una duración de 5mseg. Estoy excedido del límite? Como se calcula la frecuencia de 400kbps?
es el estandar I2C FAST MODE (http://www.i2c-bus.org/fastmode/) Si tu micro soporta I2C por hardware no debes tener problema haciendo la comunicaciona a 400kbps. Fijate la capacitancia del bus, si es muy grande tendrás que reducir la frecuencia del bus y/o reducir el valor de las resistencias Pull Up.
Tambien hay HIGH SPEED MODE de hasta 4Mbps pero muy pocos lo soportan.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: marito en 17 de Abril de 2012, 09:13:02
Gracias nZeta, una pregunta básica, como se calcula la velocidad de comunicación? Es decir, determinar si trabajo a 100, 400 ó 4000kbps?
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: AngelGris en 17 de Abril de 2012, 09:42:42
Gracias nZeta, una pregunta básica, como se calcula la velocidad de comunicación? Es decir, determinar si trabajo a 100, 400 ó 4000kbps?

  Eso debería estar explicado en el datasheet del PIC a utilizar..

  Hay que configurar los bits SSPM3...SSPM0 del registro SSPCON1. Según el datasheet que tengo yo, está en la página 204. Luego, en la página 223 hay unos ejemplos de valores de frecuencia del bus I2C
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: marito en 17 de Abril de 2012, 09:52:26
Buenísimo AngelGris!

Entonces, si mal no entiendo, la velocidad de transmisión es independiente de mi tiempo de ciclo de programa y del clock?

Cuando yo configuro por programa:

Código: [Seleccionar]
USE I2C(master, SDA=PIN_B0, SCL=PIN_B1, Slow)
Con el slow ya determino la velocidad de mi transmisión... Es correcto?

PD: Estoy trabajando con lenguaje C
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: AngelGris en 17 de Abril de 2012, 12:53:40
Buenísimo AngelGris!

Entonces, si mal no entiendo, la velocidad de transmisión es independiente de mi tiempo de ciclo de programa y del clock?

Cuando yo configuro por programa:

Código: [Seleccionar]
USE I2C(master, SDA=PIN_B0, SCL=PIN_B1, Slow)
Con el slow ya determino la velocidad de mi transmisión... Es correcto?

PD: Estoy trabajando con lenguaje C

  No es independiente. Fijate que según la velocidad de clock que tengas hay que utilizar distintos valores para los bits SSPM3...SSPM0.

  Veo que estás utilizando el compilador CCS, se supone que dicha sentencia USE ya configura automáticamente los registros que intervienen en el manejo de I2C. Consultá con el manual del compilador para ver si no hay una opción para asegurarse que utilice el módulo de HardWare que posee el PIC y no que lo intente implementar por SoftWare.

  Yo no uso dicho compilador y por ello no puedo darte una mejor respuesta.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: marito en 17 de Abril de 2012, 13:11:24
Usando un PIC16F876A, con un clock de 20MHz, funciona con la siguiente configuración:

Código: [Seleccionar]
USE I2C(master, SDA=pin_c4,SCL=pin_c3, slow)
Ahora con el PIC18F4550, con la configuración que mencione anteriormente (la copio de nuevo), no funciona

Código: [Seleccionar]
USE I2C(master, SDA=pin_b0,SCL=pin_b1)
Lo intente con y sin la opción SLOW.

Con ambos PICs uso resistencias de pull-up de 2k2.

AngelGris, leyendo un poco sobre lo que mencionabas de trabajar vía hardware, use la opción noforce_sw, pero tampoco funciona...
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: AngelGris en 17 de Abril de 2012, 13:52:38
  Si estuvieses programando en assembler, hay que asegurarse de configurar dichos pines como entrada (configurando el registro TRIS adecuado y de la manera adecuada), y a su vez hay que tener en cuenta que dichos pines por defecto son entradas analógicas con lo cual puede traer conflictos.

  Asegurate de configurar dichos pines como digitales (otra vez, para ello tendrás que consultar la ayuda del compilador) antes de usar la sentencia USE para el uso del I2C.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: marito en 17 de Abril de 2012, 14:03:02
Muy buen dato AngelGris, en un rato lo pruebo y te comento los resultados! Espero que con eso funcione!
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: marito en 18 de Abril de 2012, 06:59:14
Lamentablemente, no funcionó.

Configure el puerto C como salida, pero no logré comunicar.

Verifique que en el proyecto que me funciona con el PIC16F876A, tengo el puerto C como salida y comunica correctamente.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: AngelGris en 18 de Abril de 2012, 08:56:55
  Otra opción que encuentro es ver como es el código que genera en asm. Entre los 16F87xA y los 18F2550/4550 hay una forma distinta de configurar los conversores AD y como dichos pines también pueden ser utilizados como entradas analógicas, tal vez exista algún conflicto en como los está configurando.

  ¿Con qué estás haciendo las pruebas, directamente con otro pic conectado como slave? Podrías probar comunicarte con alguna memoria para ver si el master funciona bien y luego ir sumando dispositivos.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: NoSepComo en 18 de Abril de 2012, 12:13:04
hola, porque no pegas algo del código (al menos la configuración y como lo ejecutas después). Por ver si sacamos algo en claro.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: marito en 19 de Abril de 2012, 20:31:00
Hola! Ayer y hoy estuve haciendo un curso de PLC, no me pude poner con el PIC.

Tengo dos placas, una con un PIC 16f876A y la otra con el PIC18F4550. Estoy comunicando cada una de las placas con una placa controladora de motores, el modelo es la MD25, que viene con dos motorcitos de corriente contínua. El código que uso para el 18F es el que sigue:

Código: [Seleccionar]
#include <18F4550.h>
#Device ADC=10
#fuses HSPLL,NOMCLR,NOWDT,PROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=56000,xmit=pin_c6,rcv=pin_c7)//configuracion del puerto rs232 envia por pin_c6 y recibe por pin_c7
#use i2c (master,scl=PIN_B1,sda=PIN_B0,slow,force_hw)   //habilitación y configuración de las funciones I2C por hardware



// Librerías usadas
#include <STDLIB.H>
#include <MATH.H>
#include <STDIO.H>

//Declaración de las librerías para uso de controladora MD25
int I2C_Buffer [16]; //buffer de recepción de un dispositivo I2C
#include <I2C_16-18FXXX.H> //Incluye rutinas I2C básicas de propósito general
#include <MD23_16-18FXXX.H> //Incluye rutinas de control del driver MD25



//Con estas instrucciones evitamos que se este configurando cada vez que usamos alguna instruccion de entrada o salida
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)




void main()
{

//Configuración de puertos como entrada y salida
SET_TRIS_A(0xFF); // se configura el puerto A como entrada
SET_TRIS_B(0x00);     // se configura el puerto B como salida
SET_TRIS_C(0x00);     // activa las resistencias de pull-up

//Configuración del conversor AD
SETUP_ADC(ADC_CLOCK_DIV_64); // configuras esto para que el a/d funcione con un reloj interno del micro
SETUP_ADC_PORTS(ALL_ANALOG||VSS_VDD);     // aca determinar que el puerto RA0, RA1 será analógico

//Configuración de la interrupción RTCC
SETUP_COUNTERS(RTCC_INTERNAL,RTCC_DIV_1); //TIMER0: Clock Interno, Preescaler 1
ENABLE_INTERRUPTS(INT_RTCC);               // Habilito Interrupción RTCC
ENABLE_INTERRUPTS(GLOBAL);                 // Habilito Interrupciones

//MD23_Modo(2);

//Definición de variables locales del main
float  Bateria=0.0;

while(true)
{


//Leo el voltage de alimentación de la placa
         Bateria=MD23_Bat()/10.0;         //Esta funcion esta incluida en la libreria de la placa

//Envío valores  al PC
printf(" %f ",Bateria);//imprimo datos por puerto serie

     
}
}

El mismo código con algunas modificaciones como la líbrería del PIC, funciona correctamente para el PIC16F876A.

La única diferencia que encuentro es que estoy trabajando con un bootloader serie diferente para cada PIC. El bootloader del 18F, escribe los Fuses, lo cual no se si afecta.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: AngelGris en 19 de Abril de 2012, 22:59:00
  En el 18F estás configurando todas las posibles entradas analógicas, justamente como analógicas. Eso implica que si los pines B0 y/o B1 son configurados como entrada, serán analógicas por lo tanto cuando se las intente leer como digitales siempre leerán 0.

  Según el datasheet del 18F4550, para que funcione el módulo I2C por HardWare, los pines B0 y B1 deben ser configurados como entrada, además de activar dicho módulo.

  Si el código generado por la sentencia "USE I2C" de CCS coloca los pines B0 y B1 como entrada, posiblemente se genere algún conflicto ya que dichos pines también están configurados como entradas analógicas.

  Habría que ver en el manual de CCS la forma de que dichos pines no sean entradas analógicas.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: saveuc_siul en 20 de Abril de 2012, 00:53:05
gracias a todos por su ayuda y lo que encontre fue que únicamente se puede hacer i2c por software en el Master porque el si puede simular los pines necesarios, sin embargo en los esclavos (PIC18F2550) no es posible porque el esclavo hace uso de las interrupciones para funcionar. GRACIAS
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: NoSepComo en 20 de Abril de 2012, 04:45:33
Hola, creo que el compilador se salta el sentido de las gpio cuando usas el modulo i2c.
Lo que yo nunca he usado en la configuración es el force_hw ni el slow, no creo que te afecten negativamente, pero si los quitas por probar a ver que pasa?.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: marito en 20 de Abril de 2012, 09:17:49
Hola!

AngelGris! Voy a estudiar el tema de la configuración de los puertos analógicos! Espero que sea ese mi problema!

NoSepcomo, a que te referís con gpio? Lo de sacar el force_hw y el slow ya lo intenté, pero tampoco funciono.

Saludos!
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: nZeta en 20 de Abril de 2012, 10:10:00
gracias a todos por su ayuda y lo que encontre fue que únicamente se puede hacer i2c por software en el Master porque el si puede simular los pines necesarios, sin embargo en los esclavos (PIC18F2550) no es posible porque el esclavo hace uso de las interrupciones para funcionar. GRACIAS
¿Porque tiene que ser PIC18F2550? en tu descripción no aparece nada que haga referencia a que los slave o masters necesiten USB y esa es la principal caracteristica de los 18F2550. Recuerda que tienes que escojer el mejor MCU que se acomode a tu aplicación y no tratar de acomodar tu aplicación a un MCU.

Por el costo de un 18f2550 yo compraría un PSOC3 de gama baja y puedo sintetizar I2C esclavo en hardware en cualquier pin y ademàs tengo interrupcion en todos los pines
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: saveuc_siul en 21 de Abril de 2012, 00:05:32
Hola hola, si se me olvido comentar que necesito los puertos usb 2.0 porque están funcionando igual como daq para un robot, gracias a todos ya pude terminar el proyecto en buena forma....

gracias a todos por su ayuda y lo que encontre fue que únicamente se puede hacer i2c por software en el Master porque el si puede simular los pines necesarios, sin embargo en los esclavos (PIC18F2550) no es posible porque el esclavo hace uso de las interrupciones para funcionar. GRACIAS
¿Porque tiene que ser PIC18F2550? en tu descripción no aparece nada que haga referencia a que los slave o masters necesiten USB y esa es la principal caracteristica de los 18F2550. Recuerda que tienes que escojer el mejor MCU que se acomode a tu aplicación y no tratar de acomodar tu aplicación a un MCU.

Por el costo de un 18f2550 yo compraría un PSOC3 de gama baja y puedo sintetizar I2C esclavo en hardware en cualquier pin y ademàs tengo interrupcion en todos los pines
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: marito en 21 de Abril de 2012, 21:21:31
FUNCIONO!!!

Gracias a la ayuda de ustedes y a Dios funciona la comunicación I2C entre mi PIC18F4550 y la placa controladora de motores!

Efectivamente, como lo mencionó el querido AngelGris, tuve que configurar sólo los canales que uso como analógicos, y que usa el protoloco I2C como digitales. Además, como dijo NoSepComo, tuve que quitar el Slow y el force_hw. Gracias a eso, ya estoy comunicando!

Muchas gracias chicos!!! Saludos.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: AngelGris en 21 de Abril de 2012, 22:25:10
  Me alegro que haya funcionado  :-/ :-/ :-/
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: NoSepComo en 24 de Abril de 2012, 06:21:33
Yo también me alegro :). Por terminar, con lo de GPIO me referia a "General Purpose Input Output", que son todas las entradas/salidas digitales que tiene el PIC.
Un saludo.
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: risslock en 19 de Mayo de 2012, 13:28:26
Hola me alegro que te haya funcionado!

Yo también estoy trabajando una comunicación I2C con el microcontrolador 18f4550 pero entre él y un conversor analógico digital, pero no he logrado establecer la comunicación... podrías poner por favor la configuración que te funcionó???

Saludos!
Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: marito en 20 de Mayo de 2012, 18:08:53
Hola risslock!

La configuración del I2C es la que sigue:

Código: [Seleccionar]
#use i2c (master,scl=PIN_B1,sda=PIN_B0)
Además hay que tener en cuenta de configurar los puertos B0 y B1 como salidas digitales. Uno de los errores que yo tenía es el de haber configurado todos los puertos como analógicos.

Título: Re: Cómo hacer comunicación I2C con PIC18f4550/2550???
Publicado por: Suky en 20 de Mayo de 2012, 19:15:29
Atención que según recuerdo CCS solo usa el módulo MSSP si se le indica FORCE_HW, sino genera las funciones por software   ;-)