Intento guardar en la posición 1928 de una EEPROM el valor de 208, y luego leer esa misma posición para escribir en una pantalla lcd su valor, así que el lcd debería mostrar "208", pero muestra "7"(que sería el valor en decimal del byte alto del valor de la posición es decir el 1928 el cual en binario sería: 111 1000 1000)
Cuando cargo el registro SSPADD con el valor de 9, el lcd no muestra 7 sino 136, y estando el SSPADD cargado con 4, si habilito los 2 if que están comentados en el código, el lcd muestra 161.
Cuando hago la simulacion en proteus, el error que muestra 7 veces es:
"Data written SSPBUF whilst MSSP(in I2C master mode) is active-data has been ignored"
Estoy usando el compilador PICC, y sé que este tiene sus funciones para la conexion I2C, de hecho ya lo hice de esa manera y me funcionó, pero esta vez lo quiero hacer sin el uso de esas funciones.
Agradezco cualquier opinion, gracias.
Este es el código:
#INT_SSP
void inti2c(){
sspif==0;
}
long int dir=1928;
void main(){
TRISC = 0b10011000;
PORTC = 0x00;
SSPSTAT = 0b00000000;
SSPCON = 0b00101000; //modo master; habilita el modulo ssp
SSPCON2 = 0x00;
SSPADD = 4; //baud rate 100kHZ
INTCON = 0b11000000;
PIE1 = 1; //habilita int. por ssp
lcd_init();
/********************************************************************/
/****************************ESCRITURA*******************************/
/********************************************************************/
sen = 1; //condicion start.
while(sspif==1); //espera a que start termine.
/********************************************************************/
sspbuf = 0xa0; //carga el registro con la dir. del esclavo en modo escritura
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
sspbuf = dir>>8; //direccion a escribir de la eeprom (parte alta)
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
sspbuf = dir; //direccion a escribir de la eeprom (parte baja)
//if(ack==1)PORTC_5 = 1;
//if(ack==0)PORTC_1 = 1;
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
sspbuf = 208; //dato a escribir
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
pen = 1; //condicion stop.
while(sspif==1); //espera a que el stop termine.
/********************************************************************/
/****************************LECTURA*********************************/
/********************************************************************/
sen = 1; //condicion start.
while(sspif==1); //espera a que start termine.
/********************************************************************/
sspbuf = 0xa0; //carga el registro con la dir. del esclavo en modo escritura
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
sspbuf = dir>>8; //direccion a escribir de la eeprom (parte alta)
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
sspbuf = dir; //direccion a escribir de la eeprom (parte baja)
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
SSPCON2 = 0b00001010; //habilita modo recepcion y start repetido
while(sspif==1); //espera a que start termine.
/********************************************************************/
sspbuf = 0xa1; //carga el registro con la dir. del esclavo en modo lectura
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
printf(lcd_putc,"%u",sspbuf);
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
pen = 1; //condicion stop.
while(sspif==1); //espera a que el stop termine.
while(1);
}
Cuando cargo el registro SSPADD con el valor de 9, el lcd no muestra 7 sino 136, y estando el SSPADD cargado con 4, si habilito los 2 if que están comentados en el código, el lcd muestra 161.
Cuando hago la simulacion en proteus, el error que muestra 7 veces es:
"Data written SSPBUF whilst MSSP(in I2C master mode) is active-data has been ignored"
Estoy usando el compilador PICC, y sé que este tiene sus funciones para la conexion I2C, de hecho ya lo hice de esa manera y me funcionó, pero esta vez lo quiero hacer sin el uso de esas funciones.
Agradezco cualquier opinion, gracias.
Este es el código:
#INT_SSP
void inti2c(){
sspif==0;
}
long int dir=1928;
void main(){
TRISC = 0b10011000;
PORTC = 0x00;
SSPSTAT = 0b00000000;
SSPCON = 0b00101000; //modo master; habilita el modulo ssp
SSPCON2 = 0x00;
SSPADD = 4; //baud rate 100kHZ
INTCON = 0b11000000;
PIE1 = 1; //habilita int. por ssp
lcd_init();
/********************************************************************/
/****************************ESCRITURA*******************************/
/********************************************************************/
sen = 1; //condicion start.
while(sspif==1); //espera a que start termine.
/********************************************************************/
sspbuf = 0xa0; //carga el registro con la dir. del esclavo en modo escritura
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
sspbuf = dir>>8; //direccion a escribir de la eeprom (parte alta)
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
sspbuf = dir; //direccion a escribir de la eeprom (parte baja)
//if(ack==1)PORTC_5 = 1;
//if(ack==0)PORTC_1 = 1;
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
sspbuf = 208; //dato a escribir
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
pen = 1; //condicion stop.
while(sspif==1); //espera a que el stop termine.
/********************************************************************/
/****************************LECTURA*********************************/
/********************************************************************/
sen = 1; //condicion start.
while(sspif==1); //espera a que start termine.
/********************************************************************/
sspbuf = 0xa0; //carga el registro con la dir. del esclavo en modo escritura
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
sspbuf = dir>>8; //direccion a escribir de la eeprom (parte alta)
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
sspbuf = dir; //direccion a escribir de la eeprom (parte baja)
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
SSPCON2 = 0b00001010; //habilita modo recepcion y start repetido
while(sspif==1); //espera a que start termine.
/********************************************************************/
sspbuf = 0xa1; //carga el registro con la dir. del esclavo en modo lectura
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
printf(lcd_putc,"%u",sspbuf);
while(sspif==1); //espera a que el dato sea recibido.
/********************************************************************/
pen = 1; //condicion stop.
while(sspif==1); //espera a que el stop termine.
while(1);
}