Qué tal gente todopic!
Pues aquí estoy nuevamente yo para hacerles una consulta...
Estoy manejando una memoria EEPROM externa 24LC256 para guardar variables de tipo float, el código que uso es este:
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#define RX PIN_C7
#define Tx PIN_C6
#define EEPROM_SDA PIN_C4
#define EEPROM_SCL PIN_C3
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#use delay (CLOCK=20000000)
#use rs232 (BAUD=19200,XMIT=Tx,RCV=Rx)
#use i2c (MASTER,SCL=EEPROM_SCL,SDA=EEPROM_SDA)
#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#byte porte = 0x09
#locate valor = 0x20
#include <24256.c>
void envia_float_ext_eeprom (long int adress,float data)
{
float *p,*q;
int k,buffer_out[4];
p=&data;
q=&buffer_out[0];
for(k=0;k<4;k++)write_ext_eeprom(adress+k,buffer_out[k]);
}
float recibe_float_ext_eeprom (long int adress)
{
float data,*r,*s;
int t,buffer_in[4];
r=&buffer_in[0];
s=&data;
for(t=0;t<4;t++)buffer_in[t]=read_ext_eeprom(adress+t);
return(data);
}
void main (void)
{
float valor,valor_recibido;
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTE = 0x00;
set_tris_a(0b00000000);
set_tris_b(0b00000000);
set_tris_c(0b10010000);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
init_ext_eeprom();
valor=-100.2;
while(TRUE)
{
envia_float_ext_eeprom (0,valor);
valor_recibido=recibe_float_ext_eeprom(0);
printf("Valor en EEPROM 0x0000 = %f\n\r",valor_recibido
); }
}
Sencillamente estoy dándole diversos valores a la variable "valor" y viendo a ver qué tal va...
La cuestión está en que pruebo tal como está y funciona bien, pero cuando agrego en la opción "FORCE_HW" en el #use i2c, no me funciona tan bien la interfaz con la eeprom.
Fíjense, esto es lo que muestra la terminal del proteus (olvidé comentarlo, lo estoy probando con proteus, no en físico aún):
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
En cambio cuando le coloco el FORCE_HW, me sale esto:
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = -100.20
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = -127.99
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Valor en EEPROM 0x0000 = 0.00
Como ven, los primeros cinco valores están perfectos, pero luego se echa a perder la cosa...
También he probado colocando FORCE_HW y SLOW, pero da lo mismo.
Qué creen ustedes? Alguien ha probado la interfaz i2c con FORCE_HW para manejar memorias externas exitosamente?
Será un error del proteus?
Bueno desde ya les agradezco grandemente sus comentarios.
Allí les dejo el archivo con la simulación en proteus y el .hex (ese .hex es de la última compilación, que incluye el FORCE_HW con SLOW)...
Ok saludos, nos leemos!