TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jmpmscorp en 18 de Junio de 2009, 15:13:22
-
Hola.
De nuevo con el mismo tema. Llevo mas de dos semanas intentanto de hacer funcionar el i2c con un expansor de bus en un PIC18f2455. Lo estoy realizando con C18 y utilizando las librerias todo parezco entenderlo. El problema es a la hora de simularlo. Tras la condicion de inicio, en todas las simulaciones me aparece una codicion de Reinicio, sin q yo la envie. Ya no se si es problema de mi codigo o problema al realizar mal la simulacion. Agradeceria todo tipo de ayuda. Adjunto ambos archivos, tanto el codigo, como la simulacion. Gracias desde ya.
#include <p18F2455.h>
#include <i2c.h>
#include <delays.h>
#pragma config IESO = OFF, FOSC = HSPLL_HS, PLLDIV = 5, CPUDIV = OSC4_PLL6 //configuracion de CONFIG1L
unsigned char fin_mensaje = 0;
void escribir_expansor (unsigned char DevAdd, unsigned char RegAdd, unsigned char valor);
void main (void)
{
OSCCON=0b01110000;
TRISA = 0x00;
TRISB = 0x03;
TRISC = 0x00;
SSPADD = 39; //
OpenI2C (MASTER, SLEW_OFF);
escribir_expansor (0x40,0x0A,0xC0);
while (!fin_mensaje);
fin_mensaje = 0;
escribir_expansor (0x40,0x0A,0xFF);
while (!fin_mensaje);
escribir_expansor (0x40,0x14,0XFF);
fin_mensaje = 0;
while (1);
}
void escribir_expansor (unsigned char DevAdd, unsigned char RegAdd, unsigned char valor)
{
SSPCON2bits.RSEN = 0;
StartI2C ();
IdleI2C();
WriteI2C (DevAdd);
WriteI2C (RegAdd);
WriteI2C (valor);
StopI2C();
fin_mensaje = 1;
}
-
Prueba así:
void escribir_expansor (unsigned char DevAdd, unsigned char RegAdd, unsigned char valor)
{
IdleI2C(); // ensure module is idle
StartI2C(); // initiate START condition
while ( SSPCON2bits.SEN ); // wait until start condition is over
WriteI2C( DevAdd );
IdleI2C(); // ensure module is idle
WriteI2C( RegAdd );
IdleI2C(); // ensure module is idle
WriteI2C ( valor );
IdleI2C(); // ensure module is idle
StopI2C(); // send STOP condition
while ( SSPCON2bits.PEN ); // wait until stop condition is over
fin_mensaje = 1;
}
-
Muchas gracias por tu respuesta suky, pero ya lo he probado y sin exito. Todo igual q estaba. Os agrego una captura de pantalla de lo que me sale en el I2CDebugger al ejecutar este codigo.
(http://i702.photobucket.com/albums/ww22/jmpmscorp/pantallazo-1.jpg)