Autor Tema: i2c pic18f2455  (Leído 1308 veces)

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

Desconectado jmpmscorp

  • PIC10
  • *
  • Mensajes: 12
i2c pic18f2455
« en: 28 de Mayo de 2009, 00:14:44 »
Hola a todos.

Me hallo en la imposibilidad de programar el i2c para transmitir, por lo que recurro a ustedes a ver si son capaces de hacerme ver la luz. La idea es controlar un expansor de i2c a 16 bits con dicho programa, pero actualmente es indiferente su uso y estoy intentando probar en el proteus su funcionamiento antes de probarlo en el dispositivo. El problema que tengo es que me salen mensajes de error de colision en la condicion de inicio y a continuacion todo lo enviado en ignorado. Les adjunto el codigo de la funcion de configuracion, asi como la funcion de envio. Agradezco cualquier tipo de solucion o idea que puedan aportarme, ya que llevo dias sin pasar de aqui.

El pic es el 18f2455, la velocidad de trabajo del pic es de 10MHz, queriendo que el i2c trabaje a 100kHz y el pic sera el maestro. El lenguaje utilizado es PICC.

void conf_i2c(void)
{
   PIE1 = 0x08;   // Activo la interrupcion del MSSP con prioridad alta
   IPR1 = 0x08;
   SMP = 1;
   SSPADD = 0x18;
   SSPCON1 = 0x28;
   SSPCON2 = 0x00;
}

void escribe_i2c (unsigned char registro, unsigned char dato)
{
   SEN = 1;  //condicion de START

   while (int_i2c == 1); //esperemo a que MSSP este listo para escribir datos
   
   SSPBUF = 0x40; //direccion del LCD

   while (int_i2c == 2); //esperemo a que MSSP este listo para escribir datos

   SSPBUF = registro; //direccion del registro a escribir

   while (int_i2c == 3); //esperemo a que MSSP este listo para escribir datos

   SSPBUF = dato;   //direccion del dato a colocar

   while (int_i2c == 4); //esperemo a que MSSP este listo para escribir datos
   
   PEN = 1;   // condicion de STOP

   while (int_i2c == 5); //esperemo a que MSSP este listo para escribir datos
   
   int_i2c = 0;   
}


El hecho de que no realice ninguna espera a flag de ocupacion BF, es que si no tengo mal entendido, la interrupcion se genera una vez que el bus de datos ha sido liberado y BF ha sido borrado por hardware. La variable int_i2c lo unico que hace es contar interrupciones del bloque i2c, que me ayudaran a saber en que parte de la trama del expansor me encuentro, para saber que dato he de enviar.

Bueno, creo que mas o menos lo he explicado, si algo no ha quedado claro, diganmelo y lo contestare lo mas rapido posible.

Muchas gracias. Espero que alguien pueda echarme una mano.
« Última modificación: 28 de Mayo de 2009, 00:18:11 por jmpmscorp »