Hola amigos!
EN la búsqueda por realizar el despliegue de imágenes en la pantalla gráfica , leí un poco xD y cambie el modo de acceso a la memoria , leyendo los datos en bloques de 1KB y almacenandolos en buffer para manipularlos al antojo.
Puede que contenga errores xD ando empezando en C .
El programilla de prueba accesa a la eepron desde la direccion de inicio que especifiquemos hasta la direccion final , con un máximo de 1024 direccion , debido al tamaño de buffer.
Tambien agregue un timer para saber el tiempo que tardo en leer la memoria y almacenarla en el buffer.
Adjunto el programa y una imagen ^^
#include <18F252.h>
#FUSES H4,NOOSCSEN,PUT,BROWNOUT,BORV27,NOWDT,CCP2C1,NOLVP,NODEBUG
#use delay(clock=32M)
#use rs232 (UART1,BAUD=9600,xmit=pin_c6,rcv=pin_c7)
int8 buffer[1024];
#include "24256.c" //eeprom
#include "HDM64GS12.c"
#include "funciones.c"
#include "graphics.c"
#byte port_c = 0xf82
#zero_ram //ponemos la ram a 0 siempre al iniciar
INT8 C;
#INT_TIMER0
VOID TIMER(){
SET_TIMER0(231);
C++;
}
void main()
{
int16 x;
int8 a,b;
delay_ms(100);
//----------------------------------
init_ext_eeprom(); //Inicializar EEPROM
SETUP_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT);
while(1){
printF(" Lectura secuencial EEPROM 24LC256 @400KHz \r\n");
printF(" 1024 DIRECCIONES \r\n\n");
enable_interrupts(int_TIMER0);
enable_interrupts(GLOBAL);
SET_TIMER0(231);
read_ext_sec_eeprom(0,1024); // Direccion inicial 0 . Direccion final < 1024 (tammaño del buffer)
disable_interrupts(GLOBAL);
printf("Tiempo de lectura = %u * 0.1ms \r\n",c);
a=0;
b=0;
c=0;
for(x=0;x<1024;x++){
printf(" %X ",buffer[x]);
if(++a==0x10){
a=0;
++b;
printf("\r\n");}
if(b==0x08){
b=0;
printf("\r\n");}
}
delay_ms(1000);
}
Y la adición a la libreria de la eeprom
void read_ext_sec_eeprom(long int address,long int last_address) {
int16 i;
SSPADD=19; // 400Khz
i2c_start();
i2c_write(0xa0); //(Ctrl BYTE)Write
i2c_write(address>>8); //High Byte adress
i2c_write(address); //Low Byte adress
i2c_start();
i2c_write(0xa1); //(Ctrl BYTE)Read
do{
buffer[i]=i2c_read(1); //lectura con ACK
i++;
}while(i<last_address-1);
buffer[i]=i2c_read(0); //lectura sin ACK
i2c_stop(); //termina lectura secuencial
}
Saludos!