Cryn, muéstranos tu función write_ext_eeprom() y te digo algo. :mrgreen:Hola RedPic, esa la tengo incluída de la librería 241025.c del CCS, quedá así:
char leido[30];write_string_eeprom(5000,dato);write_string_eeprom(5000,&dato[0]);char *pmessage="ya es el tiempo";
char *leido;
write_string_eeprom(5000,&datos[0][0]); status=i2c_write(command);
while(status==1)
{
i2c_start();
status=i2c_write(command);
}Cryn, hay una cosa que echo en falta y que yo tuve que poner porque si no no había forma de que escribiese bien ... y es un pequeño delay de unos 5 ms tras escribir cada byte en la memoria externa. Es como si requiriese ese tiempo para dejar "fijado" en byte recién escrito en la EEPROMLa librería de CCS, después de escribir un byte queda en espera de que la memoria escriba lo que a guardado en su Buffer interno (Condición ACK). Y no es necesario la demora que indicas. Lo curioso de estas memorias, es que por ejemplo en una 24LC512 demora los mismo en escribir un byte o una página de 128 bytes :shock: (aprox. 3ms)
Al mandar escribir todo un string se agolpaban los bytes y unos se escribían y otros no ... dale un vistazo a esto: Circuito y Driver C para 4 Memorias EEPROM 24AA1025 con un total de 512 Kbytes (http://www.todopic.com.ar/foros/index.php?topic=14328.msg118819#msg118819) donde decía:
"Lo de los 5 milisegundos tras cada escritura es crítico. Poniendo 4 milisegundos se produce un error de cada tres escrituras. Con 3 milisegundos falla el 50% de las escrituras. Con esos 5 milisegundos no he tenido ningún error en miles de escrituras."
Así que le puse directamente el delay_ms(5) al final de la escritura de un byte en la EEPROM externa, y así me aseguraba de que siempre se cumpliría dicho retardo.
Saben de un lugar, tutorial, u otro donde pueda aprender todo sobre punteros, más que todo como paso de parametros en funciones, tanto al recibir como de retorno, leo y leo y encuentro lo mismo de siempre, nada que me satisfaga y me sienta capaz de darle con confianza a las cadenas y funciones con punteros.
Son GENIALES!!! :-/ :-/ :-/
//Recibe:
//direccion - dirección en donde empieza a leer la eeprom
//cadena - un arreglo de chars con ram apartada para volcar la cadena
//chars_max - un número máximo de chars a leer para evitar escritura de ram ajena
void lee_cadena_eeprom(int16 direccion, char *cadena, int8 chars_max)
{
while(chars_max-- != 0)
{
*cadena=read_ext_eeprom(direccion++);
if(*cadena==NULL) return;
++cadena;
}
*(--cadena)=NULL; //Por si rebasó los chars_max, asegura que la cadena tenga fin
}
...
//Ya dentro del main
char cadena_leida[30]; //Recibe hasta 29 chars y un NULL char
lee_cadena_eeprom(direccion, cadena_leida, 30);
Bruno, le diste en el clavo, ahora si funciona el código, como dijsite, ahora estoy contento con los punteros, esque lían mucho. Gracias mil Bruno!!!!
pero me quedó una duda, de si es necesario hacerlo en 2 lineas, se puede en una?:
char mystr[40];
char *leido=mystr;
Hola Cryn, tanto tiempo, tengo que leer los datos de una eeprom lc256. y mostrarlos en una pc por rs232
Necesitaria por favor que mes des unas líneas de sugerencias para poder hacerlo. Como son muchos datos creo que tendria que trabajar con punteros he leido algo pero o me cierran algunas ideas.
muchas gracias
Hola Cryn, tanto tiempo, tengo que leer los datos de una eeprom lc256. y mostrarlos en una pc por rs232
Necesitaria por favor que mes des unas líneas de sugerencias para poder hacerlo. Como son muchos datos creo que tendria que trabajar con punteros he leido algo pero o me cierran algunas ideas.
muchas gracias
dentro de lo q desconozco, es necesario el uso de punteros para leer desde una eeprom externa?Es como dice Bruno, no es restringido a usar punteros, depende de muchas cosas, conocimientos (del tema de punteros o no), memoria, velocidad, eficiencia etc etc y uno puede utilizar la herramienta que más le conviene.
dir=0;
while(dir<0x7FF) putc(read_ext_eeprom(dir++));