Buenos dias muchachos! Mi nombre es Diego y hace rato que vengo leyendo el foro. Por lo general no soy de postear consultas, pero la verdad que estoy desconcertado.
No me gusta trabajar con librerias ajenas, asi que yo mismo hago todas las librerias que uso. Ahora estoy haciendo un programa de comunicacion I2C para un 18F. Converti la libreria que tenia en assembler para poder usarla en C18, pero no hay forma de que me comunique, y la verdad que no puedo encontrar el error.
Aca se las copio.... Cualquier ayuda sera agradecida... y por ahi le sirve a alguien tambien:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// Prototipos de las funciones ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void I2C_SDA_ES (unsigned char);
void I2C_SCL_AB (unsigned char);
void I2C_Envia_Start (void);
void I2C_Envia_Stop (void);
void I2C_Envia_Byte (unsigned char);
unsigned char* I2C_Lee_Byte (unsigned char cantbytes);
void I2C_24XX_InicializaEscritura (unsigned char ,unsigned char);
void I2C_24XX_InicializaLectura (unsigned char ,unsigned char);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// Defines y variables gloables ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char aux;
unsigned char aux2;
unsigned char cont;
unsigned char cont2;
unsigned char i=0;
unsigned char datos[4];
unsigned char* f;
#define SDA TRISCbits.TRISC4
#define SCL TRISCbits.TRISC3
#define RC4 LATCbits.LATC4
#define RC3 LATCbits.LATC5
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// I2C_SDA_ES ////
//// ////
//// Proposito: Establece a SDA con entrada o salida ////
//// Parametros: tipo: 0 = salida 1 = entrada ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void I2C_SDA_ES (unsigned char tipo)
{
if (tipo == 0) // Salida
{
SDA = 0;
RC4 = 0;
}
else
SDA = 1; // Entrada
RC4 = 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// I2C_SCL_AB ////
//// ////
//// Proposito: Establece a SCL con entrada o salida y establece el nivel ////
//// Parametros: tipo: 0 = salida 1 = entrada ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void I2C_SCL_AB (unsigned char tipo)
{
if (tipo == 0)
{
SCL = 0; // Salida
RC3 = 0; //Mantiene en nivel bajo
}
else
{
SCL = 1; // Entrada
RC3 = 1; //Mantiene en nivel alto
while (RC3 == 0)
{ // Si algun esclavo mantiene la linea en bajo hay que esperar
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// I2C_Envia_Start ////
//// ////
//// Proposito: Envia lacondicion de Start ////
//// Parametros: Ninguno ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void I2C_Envia_Start () // Crital de 8MHz
{
I2C_SDA_ES(1); // SDA Nivel Alto
I2C_SCL_AB(1); // SCL Nivel Alto
Delay10TCYx(1); // Espera de 5us
I2C_SDA_ES(0); // SDA Nivel Bajo
Delay10TCYx(1); // Espera de 5us
I2C_SCL_AB(0); // SCL Nivel Bajo
Delay10TCYx(1); // Espera de 5us
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// I2C_Envia_Stop ////
//// ////
//// Proposito: Envia la condicion de Stop ////
//// Parametros: Ninguno ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void I2C_Envia_Stop () // Crital de 8MHz
{
I2C_SDA_ES(0); // SDA Nivel Bajo
I2C_SCL_AB(1); // SCL Nivel Alto
Delay10TCYx(1); // Espera de 5us
I2C_SDA_ES(1); // SDA Nivel Alto
Delay10TCYx(1); // Espera de 5us
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// I2C_Envia_Byte ////
//// ////
//// Proposito: Envia un byte ////
//// Parametros: BYTE: Byte a enviar ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void I2C_Envia_Byte (unsigned char BYTE) // Crital de 8MHz
{
aux = 0x80;
cont = 8;
for (cont=8 ; cont!=0 ; cont--) // Envio de a uno los bits
{
aux2 = aux & BYTE; // Verifico si es un 0 o un 1
if (aux2 == aux)
{
I2C_SDA_ES(1); // SDA Nivel Alto
}
else
{
I2C_SDA_ES(0); // SDA Nivel Bajo
}
I2C_SCL_AB(1); // SCL Nivel Alto
Delay10TCYx(1); // Espera de 5us
I2C_SCL_AB(0); // SCL Nivel Bajo
Delay10TCYx(1); // Espera de 5us
aux >>= 1;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// I2C_Lee_Byte ////
//// ////
//// Proposito: Lee un byte ////
//// Parametros: BYTE: Byte a enviar ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char* I2C_Lee_Byte (unsigned char cantbytes) // Crital de 8MHz
{
cont = 8;
aux = 0x08; // Mascara para agregar los 1 que voy leyendo
aux2 = 0; // Aca almaceno el byte leido
I2C_SDA_ES(1); // SDA Nivel Alto
for (cont2 ; cont2!=0 ; cont2--)
{
for (cont=8 ; cont!=0 ; cont--) // Envio de a uno los bits
{
I2C_SCL_AB(1); // SCL Nivel Alto
if (SDA == 1) // Si es un 1, se lo agrego
aux2 += aux;
I2C_SCL_AB(0); // SCL Nivel Bajo
Delay10TCYx(1); // Espera de 5us
aux >>= 1;
}
datos=aux2;
i++;
if (cont2!=0) // Veo si es el ultimo byte a leer. Si es, no tengo que enviar el ACK
I2C_SDA_ES(0); // SDA Nivel Bajo: Envio el ACK
I2C_SCL_AB(1); // SCL Nivel Alto
Delay10TCYx(1); // Espera de 5us
I2C_SCL_AB(0); // SCL Nivel Bajo
Delay10TCYx(1); // Espera de 5us
}
I2C_SDA_ES(0); // SDA Nivel Alto ////////////////////
I2C_Envia_Stop ();
//datos[0]=0x34;
f=datos;
return f;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// I2C_24XX_InicializaEscritura ////
//// ////
//// Proposito: Prepara la memoria para la escritura ////
//// Parametros: unisgned char AddressHight: Parte alta de la direccion donde se va a escribir ////
//// unisgned char AddressLow: Parte baja de la direccion donde se va a escribir ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void I2C_24XX_InicializaEscritura (unsigned char AddressHight, unsigned char AddressLow)
{
I2C_Envia_Start (); // Envia Start
I2C_Envia_Byte (0xA0); // Direccion de escritura del esclavo (Con A0,A1 y A2 conectados a masa)
I2C_Envia_Byte (AddressHight); // Envio la parte alta de la direccion de memoria a escribir
I2C_Envia_Byte (AddressLow); // Envio la parte baja de la direccion de memoria a escribir
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// I2C_24XX_InicializaLectura ////
//// ////
//// Proposito: Prepara la memoria para la lectura ////
//// Parametros: unisgned char AddressHight: Parte alta de la direccion donde se va a leer ////
//// unisgned char AddressLow: Parte baja de la direccion donde se va a leer ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void I2C_24XX_InicializaLectura (unsigned char AddressHight, unsigned char AddressLow)
{
TRISC = 0x00;
I2C_Envia_Start (); // Envia Start
I2C_Envia_Byte (0xA0); // Direccion de escritura del esclavo (Con A0,A1 y A2 conectados a masa)
I2C_Envia_Byte (AddressHight); // Envio la parte alta de la direccion de memoria a escribir
I2C_Envia_Byte (AddressLow); // Envio la parte baja de la direccion de memoria a escribir
I2C_Envia_Stop (); // Envia Stop
I2C_Envia_Start (); // Envia Start
I2C_Envia_Byte (0xA1); // Direccion de lectura del esclavo (Con A0,A1 y A2 conectados a masa)
}