Autor Tema: Problema con I2C en C18  (Leído 8856 veces)

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

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Problema con I2C en C18
« en: 18 de Octubre de 2010, 13:11:42 »
Hola que tal;

Estoy usando el protocolo de comunicación i2c para hechar andar una memoria eeprom externa (24lc256) de microchip apartir del ejemplo que viene en el tutorial de C18 de Suky, hasta ahorita solamente para realizar pruebas y estoy usando un microcontrolador PIC18F4610 el cual actua como maestro. Pero tengo un problema al momento de cambiar los pines. En teoría este microcontrolador usa la version I2C_V1 y en la libreria trae por default estos pines:

Pines libreria
Código: [Seleccionar]
#if defined (I2C_IO_V1 )
#define I2C_SCL TRISCbits.TRISC3
#define I2C_SDA TRISCbits.TRISC4
#endif

y yo lo que hice fue solamente modificar de i2c.h lo siguiente:
Código: [Seleccionar]
#if defined (I2C_IO_V1 )
#define I2C_SCL TRISEbits.TRISE1
#define I2C_SDA TRISEbits.TRISE2
#endif

Según yo es lo unico que ocupo modificar... ya que al momento de simularlo en proteus me esta tomando los pines PORTD0 Y PORTD1 para tal comunicacion.....

Hay algo adicional que deba de modificar en esto?

Gracias

Saludos
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con I2C en C18
« Respuesta #1 en: 18 de Octubre de 2010, 13:15:17 »
Por cierto este es el codigo del microcontrolador

Código: [Seleccionar]
//SSPADD= (Fosc/(4*Clock))-1

#include <p18f4610.h>

#include <delays.h> //Libreria para los retardos
#include <stdlib.h> //Libreria para conversiones a string
#include <stdio.h>
#include <sw_uart.h>
#include <string.h>
#include <math.h>
#include <i2c.h>
#include "./Include/lcd_serial.h"
#include "./Include/LCD_CRYSTAL.h"
#include "./Include/Teclado.h"
#include "./Include/ds1302.h"

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

void ByteWriteI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion,unsigned char DataI2C);
unsigned char ByteReadI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion);

void main(void)
{
ADCON1=15;
    OpenUART(); //Habilita los puerto de comunicación serial por software
ds1302_init(); //Inicializa el reloj ds1302 para su funcionamiento
OpenI2C(MASTER,SLEW_OFF);
SSPADD=49;
}

void ByteWriteI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion,unsigned char DataI2C)
{
IdleI2C();
StartI2C();
while(SSPCON2bits.SEN);
WriteI2C(ByteControl);
WriteI2C(HighDireccion);
WriteI2C(LowDireccion);
WriteI2C(DataI2C);
StopI2C();
while(SSPCON2bits.PEN);
while(EEAckPolling(ByteControl));
}

unsigned char ByteReadI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion)
{
unsigned char Valor;

IdleI2C();
StartI2C();
while(SSPCON2bits.SEN);
WriteI2C(ByteControl);
WriteI2C(HighDireccion);
WriteI2C(LowDireccion);
RestartI2C();
while(SSPCON2bits.RSEN);
WriteI2C(ByteControl | 0x01);
Valor=ReadI2C();
NotAckI2C();
while(SSPCON2bits.ACKEN);
StopI2C();
while(SSPCON2bits.PEN);
return (Valor);
}
Lo que no me destruye, me fortalece

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con I2C en C18
« Respuesta #2 en: 18 de Octubre de 2010, 13:16:33 »
Palomino, procura publicar mensajes en hilos que ya tengas abiertos. No abras hilos nuevos a menos que traten de un tema diferente.

Por ahora sigue tu tema en este mismo hilo. El otro quedará cerrado.

Gracias y suerte con tu I2C.

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con I2C en C18
« Respuesta #3 en: 18 de Octubre de 2010, 13:19:47 »
Ok disculpa
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con I2C en C18
« Respuesta #4 en: 18 de Octubre de 2010, 14:31:33 »
Se me traba al momento de entrar a la funcion ByteWriteI2C


Código: [Seleccionar]
#include <p18f4610.h>

#include <delays.h> //Libreria para los retardos
#include <stdlib.h> //Libreria para conversiones a string
#include <stdio.h>
#include <sw_uart.h>
#include <string.h>
#include <math.h>
#include <i2c.h>
#include "./Include/lcd_serial.h"
#include "./Include/LCD_CRYSTAL.h"
#include "./Include/Teclado.h"
#include "./Include/ds1302.h"

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

unsigned char Data;

void ByteWriteI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion,unsigned char DataI2C);
unsigned char ByteReadI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion);

void main(void)
{
ADCON1=15;
    OpenUART(); //Habilita los puerto de comunicación serial por software
// ds1302_init(); //Inicializa el reloj ds1302 para su funcionamiento
OpenI2C(MASTER,SLEW_OFF);
SSPADD=49;

Data=1;

Delay_ms(500);
WriteUART(0xFE);
WriteUART(0x01);
WriteLCD(" Prueba a Memoria",17);

ByteWriteI2C(0xA0,0x00,0x00,Data);
Delay1KTCYx(5);
//ByteReadI2C(0xA0,0x00,0x00);
Delay_ms(500);
WriteUART(0xFE);
WriteUART(0x01);
WriteLCD(" Prueba a Memoria 1",19);
}

void ByteWriteI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion,unsigned char DataI2C)
{
IdleI2C();
StartI2C();
while(SSPCON2bits.SEN);
WriteI2C(ByteControl);
WriteI2C(HighDireccion);
WriteI2C(LowDireccion);
WriteI2C(DataI2C);
StopI2C();
while(SSPCON2bits.PEN);
while(EEAckPolling(ByteControl));
}

unsigned char ByteReadI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion)
{
unsigned char Valor;

IdleI2C();
StartI2C();
while(SSPCON2bits.SEN);
WriteI2C(ByteControl);
WriteI2C(HighDireccion);
WriteI2C(LowDireccion);
RestartI2C();
while(SSPCON2bits.RSEN);
WriteI2C(ByteControl | 0x01);
Valor=ReadI2C();
NotAckI2C();
while(SSPCON2bits.ACKEN);
StopI2C();
while(SSPCON2bits.PEN);
return (Valor);
}
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con I2C en C18
« Respuesta #5 en: 18 de Octubre de 2010, 16:27:12 »
Estoy haciendo algo mal?  :shock:
Lo que no me destruye, me fortalece

Desconectado gary_servin

  • PIC12
  • **
  • Mensajes: 65
Re: Problema con I2C en C18
« Respuesta #6 en: 18 de Octubre de 2010, 21:04:57 »
y yo lo que hice fue solamente modificar de i2c.h lo siguiente:
Código: [Seleccionar]
#if defined (I2C_IO_V1 )
#define I2C_SCL TRISEbits.TRISE1
#define I2C_SDA TRISEbits.TRISE2
#endif

Según yo es lo unico que ocupo modificar... ya que al momento de simularlo en proteus me esta tomando los pines PORTD0 Y PORTD1 para tal comunicacion.....

No me queda muy claro para que quieres modificar los pines, y creo que es algo que no puedes hacer, ya que esos pines están asignados al modulo spi/i2c por hardware que posee el microcontrolador. Según tengo entendido a partir desde los pic24 recién se pueden cambiar las funciones de los pines así.
Saludos

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con I2C en C18
« Respuesta #7 en: 18 de Octubre de 2010, 21:40:59 »
Según yo se..... los pines que vienen en las librerías de c18 son modificables....
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con I2C en C18
« Respuesta #8 en: 18 de Octubre de 2010, 21:43:11 »
Aunque tambien he estado realizando la simulacion con los pines especificos para la comunicacion i2c y ni asi me funciona en proteus...

Saludos
Lo que no me destruye, me fortalece

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con I2C en C18
« Respuesta #9 en: 18 de Octubre de 2010, 22:48:46 »
Según yo se..... los pines que vienen en las librerías de c18 son modificables....

Los pines I2C por hardware no son modificables. Sólo los pines I2C por software son modificables.

Leyendo rápido veo que usas I2C por hardware, por lo que lo que comenta Gary_servin puede ser la raíz del problema.

Cuando los pines son remapeables, en el dibujo del PIC aparece RPn en negritas.

Desconectado gary_servin

  • PIC12
  • **
  • Mensajes: 65
Re: Problema con I2C en C18
« Respuesta #10 en: 18 de Octubre de 2010, 22:50:57 »
Claro, los pines los puedes "modificar" en la librería, pero no les puedes asignar a estos las funciones que no figuren en el datasheet, a no ser que emules una comunicación i2c por software.

Si te fijas en los archivos que trae el c18 para manejar el modulo i2c, como por ejemplo el i2c_read.c, el compilador no trabaja con los pines en casi ningún momento, sino con los registros asociados al modulo, y por ende con los pines asignados al modulo i2c que en tu caso son TRISCbits.TRISC3 TRISCbits.TRISC4.

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con I2C en C18
« Respuesta #11 en: 19 de Octubre de 2010, 12:46:33 »
Ok, bueno debido a las necesidades que tengo voy a tener que realizarlo por software... Gracias por sacarme de dudas a ambos; voy a tratar de realizarlo pero me seria de utilidad si alguien por aquí tuviera algún ejemplo del protocolo i2c por software.

Saludos
Lo que no me destruye, me fortalece

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con I2C en C18
« Respuesta #12 en: 19 de Octubre de 2010, 14:45:06 »
Ok, bueno debido a las necesidades que tengo voy a tener que realizarlo por software... Gracias por sacarme de dudas a ambos; voy a tratar de realizarlo pero me seria de utilidad si alguien por aquí tuviera algún ejemplo del protocolo i2c por software.

Saludos

En este mismo subforo Suky ha hablado del I2C por software en C18. Dale una buscada.

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con I2C en C18
« Respuesta #13 en: 19 de Octubre de 2010, 14:52:17 »
Ok. Gracias. Lo busco de inmediato

Saludos
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con I2C en C18
« Respuesta #14 en: 19 de Octubre de 2010, 16:04:12 »
No logro encontrar el hilo, seguiré buscando si alguien se sabe el nombre le agradecería que me lo dijera por aquí

Saludos  :mrgreen:
Lo que no me destruye, me fortalece


 

anything