Autor Tema: Guardar 150 bytes en 24c32. Memoria ROM llena  (Leído 3345 veces)

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

Desconectado nestoriano

  • PIC10
  • *
  • Mensajes: 19
Guardar 150 bytes en 24c32. Memoria ROM llena
« en: 16 de Octubre de 2011, 17:00:35 »
Hola de nuevo.

Estoy tratando de realizar un DUMP de la RAM de un 16f877a en una EEPROM externa y poder restaurarlo posteriormente.

Si lo hago de la forma que lo se hacer seria:

      write_ext_eeprom   (   1   ,   byte_01   );     
      delay_ms(30);
      write_ext_eeprom   (   2   ,   byte_02   );
      delay_ms(30);
      write_ext_eeprom   (   3   ,   byte_03   );
      delay_ms(30);
      write_ext_eeprom   (   4   ,   byte_04   );
      delay_ms(30);
      write_ext_eeprom   (   5   ,   byte_05   );
      ....
      ...
      ..
      .
      write_ext_eeprom   (   150   ,   byte_150   );



Memoria EEPROM me sobra pero me falta memoria ROM.


En los registros "bytes" están guardado los valores en 8bit (lecturas de puerto) que posteriormente los quiero recuperar.  El programa me funciona pero necesito el doble de memoria ROM del 16f877a solo para escribir. Para restaurarlo supongo que serán otros dobles de memoria ROM.



Hay alguna forma mas practica de realizar el Dumpeo de la RAM o esta es la unica forma?
Gracias.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Guardar 150 bytes en 24c32. Memoria ROM llena
« Respuesta #1 en: 16 de Octubre de 2011, 19:11:33 »
Haslo con ciclos for, algo asi:

Código: [Seleccionar]
int8 i;
int8 bytes[150];

for (i=0; i < 150; i++)
{
write_ext_eeprom(i+1, bytes[i]);
delay_ms(30);
}
« Última modificación: 16 de Octubre de 2011, 19:15:53 por jeremylf »

Desconectado nestoriano

  • PIC10
  • *
  • Mensajes: 19
Re: Guardar 150 bytes en 24c32. Memoria ROM llena
« Respuesta #2 en: 16 de Octubre de 2011, 21:19:21 »
Muchas gracias por responder. La verdad la sentencia "for" no lo entiendo muy bien, se puede hacer lo mismo con la sentencia "do{ ....  }while(condicion)" no?

Me podrás explicar como funciona el ciclo que me planteaste? Puedo suponer como funciona pero el "for" y el [ ] no lo entiendo muy bien porque nunca los he usado.

Igualmente gracias, seguiré investigando.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Guardar 150 bytes en 24c32. Memoria ROM llena
« Respuesta #3 en: 16 de Octubre de 2011, 21:56:23 »
el for tambien es como un while, solo que tiene incremento y comprobacion,

for
x=0; declaramos que x=0.
x<150; mientras x sea menor a 150
x++; incremento de x en 1, el incremento se hace al final de los corchetes automaticamente


los [] son para usar un array, es recomendable que te busques un tutorial de arrays para que lo entiendas mejor porque es algo largo, pero facil de entenderlo.

Desconectado nestoriano

  • PIC10
  • *
  • Mensajes: 19
Re: Guardar 150 bytes en 24c32. Memoria ROM llena
« Respuesta #4 en: 16 de Octubre de 2011, 22:11:56 »
Entonces el ciclo escrito de la forma que yo entiendo seria

------------------------
x=0;

do{     
                 
     x++;
      write_ext_eeprom(........);

}while(x<150);
------------------------

eso seria lo mismo?

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Guardar 150 bytes en 24c32. Memoria ROM llena
« Respuesta #5 en: 16 de Octubre de 2011, 23:40:55 »
el x++ ira debajo, osea despues del write_ext, aunque tu programa no funcionaria igual, porque este hace la comprobacion de x<150 al final del codigo

seria mas bien un

x=0;
while(x<150)  {
write();
x++;
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Guardar 150 bytes en 24c32. Memoria ROM llena
« Respuesta #6 en: 16 de Octubre de 2011, 23:45:53 »
Ayudate con los debug, ejecutando ciclo a ciclo y viendo como evolucionan las variables, puede que te ayude a entender varias cosas  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado nestoriano

  • PIC10
  • *
  • Mensajes: 19
Re: Guardar 150 bytes en 24c32. Memoria ROM llena
« Respuesta #7 en: 17 de Octubre de 2011, 18:37:47 »
Estuve leyendo sobre arrays y el for y volví a reescribir mis programas y ahora esta funcionando perfectamente (mejor dicho igual pero con mucha menos instrucciones).
Todo los días se aprende algo nuevo...

Muchas gracias por las ayudas.
Tema solucionado.

Desconectado nestoriano

  • PIC10
  • *
  • Mensajes: 19
Re: Guardar 150 bytes en 24c32. Memoria ROM llena
« Respuesta #8 en: 21 de Octubre de 2011, 01:07:39 »
Hola de nuevo, ahora tengo otro problema con el simulador ISIS y eeproms externos.

Estoy teniendo problemas en estas rutinas:

------------------------------------------------------------------------
int i;
for(i=0;i<60;i++)
                  {
                  write_ext_eeprom(i, byte_b);
                  delay_ms(10);
                  }
------------------------------------------------------------------------
y en otro lado:
------------------------------------------------------------------------

for(i=0;i<60;i++)
                  {
                  byte_b=read_ext_eeprom (i);
                  delay_ms(10);
                  }
------------------------------------------------------------------------
Simulo esto en proteus y el problema es que a veces escribe bien y otras veces como que lo saltea.

Por ejemplo pongo una eeprom nueva, grabo 240 bytes con 0, escribió todo bien menos 4 o 5 datos dejandome el valor 0xFF. Tambien cuando lee a veces lee un 0xFF.

Estoy trabajando con un 16f877a a 4mhz (a 10mhz me salen 600 errores en el simulador) eeprom 24c08 y 24c32 en Protus 7.8 y CCS.

El error que se repite es

[I2CMEM TIMING] Repeated start time setup violated..... min setup time is 600ns.



Esto venia en CCS

void init_ext_eeprom() {
   output_float(EEPROM_SCL);
   output_float(EEPROM_SDA);
}

BOOLEAN ext_eeprom_ready() {
   int1 ack;
   i2c_start();            // If the write command is acknowledged,
   ack = i2c_write(0xa0);  // then the device is ready.
   i2c_stop();
   return !ack;
}

void write_ext_eeprom(long int address, BYTE data) {
   while(!ext_eeprom_ready());
   i2c_start();
   i2c_write((0xa0|(BYTE)(address>>7))&0xfe);
   i2c_write(address);
   i2c_write(data);
   i2c_stop();
}

----------------------------------------

Puse resistencias de 4k7 y también con 10k es en data y clock, tambien con eeproms de 100khz y 400khz y de diferentes capacidad. No probé si funciona en placa todavía.
Mi pregunta es, sera problema del simulador? Porque cuando escribe y lee la eeprom externa la cpu (1 core del i5) se pone al 85%. 
Gracias.


Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Guardar 150 bytes en 24c32. Memoria ROM llena
« Respuesta #9 en: 21 de Octubre de 2011, 03:02:54 »
En proteus para i2c debes poner una resistencias especiales q se llaman pullup creo, prueba con eso.

Desconectado nestoriano

  • PIC10
  • *
  • Mensajes: 19
Re: Guardar 150 bytes en 24c32. Memoria ROM llena
« Respuesta #10 en: 21 de Octubre de 2011, 04:29:24 »
Waooo ahora si que funciona bien!!! Hice el cambio de resistencias por pullups y la lectura y escritura se hace sin problema, muchisimo mas rápido, sin errores y sin aquel exceso de consumo de CPU!

Que cosa rara que es proteus...

Muchisimas gracias jeremylf y a todos por la ayuda!

Saludos!


 

anything