Autor Tema: Lectura secuencial EEPROM i2c 24LC256 @400KHz  (Leído 3027 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Lectura secuencial EEPROM i2c 24LC256 @400KHz
« 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:



Código: [Seleccionar]
#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
Código: [Seleccionar]
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!
« Última modificación: 26 de Julio de 2009, 13:49:35 por AKENAFAB »

Desconectado ivanbv4

  • PIC10
  • *
  • Mensajes: 21
Re: Lectura secuencial EEPROM i2c 24LC256 @400KHz
« Respuesta #1 en: 15 de Marzo de 2011, 11:32:07 »
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

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Lectura secuencial EEPROM i2c 24LC256 @400KHz
« Respuesta #2 en: 15 de Marzo de 2011, 15:36:13 »
Ya ni recuerdo  :D

 Pero me funciono muy bien xD.

Saludos!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: Lectura secuencial EEPROM i2c 24LC256 @400KHz
« Respuesta #3 en: 15 de Marzo de 2011, 15:52:59 »
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

Desconectado ivanbv4

  • PIC10
  • *
  • Mensajes: 21
Re: Lectura secuencial EEPROM i2c 24LC256 @400KHz
« Respuesta #4 en: 15 de Marzo de 2011, 16:35:30 »
Gracias!