Hola que tal, yo aqui de nuevo, con lo mismo
. La verdad ya lei que encontraron un problema para la simulación de este tipo de memorias externas en el proteus, en las versiones 6.4 y 6.5 pero yo creo que para la version 7.4 ya lo solucionaron. Bueno de todos modos te describo mas detalladamente mi problema, a ver si fuera un error en mi programación. Estoy usando el pic24fj128ga010 con el compilador de mplab c30, utilizo la libreria que por default te da microchip para el manejo de i2c, esta libreria es la <i2c.h>, en ella esta la funcion que sirve para escribir un byte de datos, la que uso es la MasterWriteI2C1(0xA1); la cual escribe el dato en el bus de transmision y espera hasta que se escribio el dato.
IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
StartI2C1(); //COMUNICATION START!
while(I2C1CONbits.SEN ); //WAIT TILL START CONDITION IS OVER
IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
MasterWriteI2C1(0xA0); //CONTROL BYTE
IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
MasterWriteI2C1(0xA1); //BYTE
//////////////////////////////////HASTA AQUI ESCRIBE LOS DOS BYTES DE MANERA CORRECTA//////////////////////////////////////////////////////////////////////////////////
Se que escribe los dos bytes de manera correcta por que en el proteus le pongo un I2C debugger y me muestra que manda los dos bytes y recibe los dos bits ACK que debe de recibir. mas sin embargo, cuando vuelvo a mandar la funcion MasterWriteI2C1(0x02); el pic se traba, y ya lo depure paso a paso, y donde se traba es en la condicion del MasterWriteI2C1(); en donde espera a que el dato haya terminado de escribir. Despues de los bytes estos que le mando no le puedo mandar ni un Stop, ni un Start ni nada, ya intente reiniciar la conexion con la funcion RestartI2C1(); y nada, ya intente cerrar la conexion CloseI2C1(); y volverla a abrir con el OpenI2C1(); y nada sigue funcionando hasta ahi. No entiendo por que la funcion masterWriteI2C1(); funciona bien las dos primeras veces, y despues ya no :O! no se si mi programacion este bien, me gustaria que me dijeras si mas o menos si esta bien la programacion para evitarme de simular y armarlo, seria un gran avance saber que mi programa esta bien. Muchas gracias por tu tiempo, y a ver que pasa!
Les dejo el programa completo y una foto del I2C debugger para que vean lo que sale. Gracias.
PROGRAMA COMPLETO///////////////////////////////////////////////////////////////////////////////////
#include<p24fj128ga010.h>
#include<stdlib.h>
#include<lcd_ams24.h>
#define FCY 2000000UL //THIS IS FOR THE USE OF THE DELAY LIBRARY "libpic30.h"
#include<libpic30.h>
#include<i2c.h> //INCLUDE OF THE I2C LIBRARY
_CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx2 & FWDTEN_OFF & WINDIS_OFF & FWPSA_PR128 & WDTPS_PS32768);
_CONFIG2( FNOSC_PRI & FCKSM_CSDCMD & POSCMOD_HS ); //CONFIGURATION BYTES
unsigned int config1=0, config2=0, v1 ;
unsigned char dato=50, v2[10];
void write_eeprom()
{
IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
StartI2C1(); //COMUNICATION START!
while(I2C1CONbits.SEN ); //WAIT TILL START CONDITION IS OVER
IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
MasterWriteI2C1(0xA0); //CONTROL BYTE
IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
MasterWriteI2C1(0xA1); //BYTE
/
IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
MasterWriteI2C1(0xA2); //CONTROL BYTE
IdleI2C1(); //WAIT TILL THE COMUNICATION BUS IS FREE
MasterWriteI2C1(0xA3); //CONTROL BYTE
__delay_ms(5); //DELAY TO WAIT FOR THE WRITE OF THE MEMORY
StopI2C1(); //COMUNICATION STOP!
}
void main()
{
lcd_init(); //INITIALIZATION OF THE LCD
__delay_ms(1); //DELAY FOR THE CORRECT INITALIZATION OF THE LCD
/* Turn off I2C modules */
CloseI2C1(); //Disbale I2C1 mdolue if enabled previously
config2 =(37); //CONFIGURE OF THE I2C1BRG REGISTER: 100KHZ
config1 =(I2C_ON | I2C_7BIT_ADD ); //CONFIGGURE OF THE I2C1CON REGISTER: I2C1 ENABLE, I2CADD IS 7 BIT ADDRESS
OpenI2C1(config1,config2); //CONFIGURATION OF THE MICROCONTROLLER AS MASTER AND WITH VELOCITY OF 100KHZ (SLEW RATE DISABLED)
write_eeprom();
while(1)
{
}
}
Utilizo PRoteus V7.4