TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: AKENAFAB en 26 de Julio de 2009, 13:46:33
-
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 ^^ :mrgreen:
(http://img43.imageshack.us/img43/9027/eepromsecread.th.jpg) (http://img43.imageshack.us/i/eepromsecread.jpg/)
#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!
-
Hola AKENAFAB un gran aporte, es justo lo que estoy necesitando. Pero te hago una consulta; en la libreria de le eeprom no deberia el read que escribe los datos en el lazo do-while llevar el 0 de no ack y el externo el 1 de ack. Disculpa la pregunta pero recien estoy iniciandome con esto.
Saludos
-
Ya ni recuerdo :D
Pero me funciono muy bien xD.
Saludos!
-
Está bien conforme está (el 1 también se podría quitar).
Con (0) indicamos que el periferico no produzca la señal ACK del protocolo i2c
Colocaremos (0) siempre que vayamos a leer el último dato de la comunicación
-
Gracias!