TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Cryn en 27 de Junio de 2009, 03:51:37

Título: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 27 de Junio de 2009, 03:51:37
Hola amigos, he intentado por todos los medios hacer estas dos funciones, escribir y leer una string en una memoria externa I2C mediante punteros, lo logré a medias solo pude escribir, tengo esto y no me da la lectura, espero puedan ayudarme a encontrar el error, esto de las cadenas ya me esta volviendo loco :x:

Código: C#
  1. void write_string_eeprom(int32 address,char *data){
  2.    do{
  3.       write_ext_eeprom(address++,*data);
  4.       data++;
  5.    }while(*data!=0);
  6.    write_ext_eeprom(address,0);
  7. }
  8.  
  9. char *read_string_eeprom(int32 address,char *s1){
  10.    do{
  11.       *s1=read_ext_eeprom(address++);
  12.       s1++;
  13.    }while(*s1!=0);
  14.    *s1=0;
  15.    return s1;
  16. }

y la llamada a mis funciones, para verlas en el puerto serie:
Código: C#
  1. void funcion(){
  2.    char *leido;
  3.    char dato[]="111112";
  4.  
  5.    write_string_eeprom(5000,dato[0]);
  6.    ...
  7.    leido=read_string_eeprom(5000,leido);
  8.    printf("%s",leido);
  9. }

no se fijen mucho en la variable dato, simplemete hay que considerarlo como un string, con su null al final.

cuando lo pongo así no aparece nada en la linea del puerto serie, pero si uso un for en vez de la función read, leyendo letra por letra hasta encontrar el null si lo lee, por tanto de esa manera deduje que mi escritura esta bien, pero la lectura con punteros es la que falla.

Espero su ayuda, muchas gracias.

un saludo a todos.

Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: RedPic en 27 de Junio de 2009, 05:40:21
Cryn, muéstranos tu función write_ext_eeprom() y te digo algo.  :mrgreen:
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: BrunoF en 27 de Junio de 2009, 08:08:45
Hola Cryn:

Código: C#
  1. char *read_string_eeprom(int32 address,char *s1){
  2.    do{
  3.       *s1=read_ext_eeprom(address++);
  4.       s1++;
  5.    }while(*s1!=0);
  6.    *s1=0;
  7.    return s1;
  8. }

Dos cositas:

Primero; para que haces que esta función devuelva la posicion(el puntero) de donde se encontró el final de la cadena(el caracter ASCII=0x00)?. La lectura podría no devolver nada o bien otra cosa como si se logró leer sin problemas, pero no lo que me parece que quisiste hacer.

Segundo: El do{}while(condición) asegura que el bucle se ejecute al menos una vez antes de revisar la condición del while(). Ahora te hago la pregunta: que pasa si estás ante una cadena nula? es decir, su primer caracter, es su caracter de fin(ASCII=0x00)? Sucederían cosas sumamente indeseadas...El algorítmo no se detendría hasta encontrar el próximo ASCII=0x00 en todo el mapa de la RAM...Lo mísmo te digo para el do{} while() de la rutina de escritura...


Por otro lado,

Código: C#
  1. void funcion(){
  2.    char *leido;
  3.    char dato[]="111112";
  4.  
  5.    write_string_eeprom(5000,dato[0]);
  6.    ...
  7.    leido=read_string_eeprom(5000,leido);
  8.    printf("%s",leido);
  9. }

Acá se combina el problema que te mencione antes con lo que devuelve la función. Uno generalmente manda  a imprimir un puntero con el primer caracter de la cadena. Vos estás mandando a imprimir justo desde el caracter ASCI=0x00 que es la posición que devuelve la función de lectura...

Resumiendo, intentalo así:

Código: C#
  1. void write_string_eeprom(int32 address,char *data){
  2.    while(*data!=0){
  3.       write_ext_eeprom(address++,*data);
  4.       data++;
  5.    }
  6.    write_ext_eeprom(address,0);
  7. }

Código: C#
  1. void read_string_eeprom(int32 address,char *s1){
  2.    while(*s1!=0){
  3.       *s1=read_ext_eeprom(address++);
  4.       s1++;
  5.    }
  6.    *s1=0;
  7. }

Código: C#
  1. void funcion(){
  2.    char *leido;
  3.    char dato[]="111112";
  4.  
  5.    write_string_eeprom(5000,dato[0]);
  6.    ...
  7.    read_string_eeprom(5000,leido);
  8.    printf("%s",leido);
  9. }

Un saludo.
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 27 de Junio de 2009, 10:16:22
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í:

Código: C#
  1. void write_ext_eeprom(int32 address, BYTE data)
  2. {
  3.    int1 status;
  4.    int  command;
  5.  
  6.    if (address>65535)command=0xa8; // Check if address is located in Block 0/1
  7.    else command=0xa0;
  8.  
  9.    i2c_start();
  10.    i2c_write(command);
  11.    i2c_write(address>>8);
  12.    i2c_write(address);
  13.    i2c_write(data);
  14.  
  15.    i2c_stop();
  16.    i2c_start();
  17.    status=i2c_write(command);
  18.    while(status==1)
  19.    {
  20.       i2c_start();
  21.       status=i2c_write(command);
  22.    }
  23. }

Bruno, tienes mucha razón, pense en eso de que si se pasaba la menos una vez por la rutina, y que podría escribir y/o leer basura, pero estaba casi seguro que siempre las strings estaría con al menos un caracter. Pero si, es mejor hacerlo de la manera que sugieres.

Y ahora me doy cuenta de lo que dices sobre devolver el puntero a quien sabe donde apunta desde la dirección que quedo, lo que pretendo es que me devuelva el puntero a la string que leyó.

Hice los cambios en escritura y da bien, los cambios en lectura también los hice, pero sigue sin dar :(

que dicen?

muchas gracias por las respuestas, un saludo.
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: migsantiago en 27 de Junio de 2009, 10:44:48
Hola

- Variable leido
Esta variable la declaras sin un tamaño dentro de la función 'funcion'. Esto está mal porque al ir llenando los chars de la variable se irán depositando en posiciones talvez no existentes de la memoria ram. Dale un tamaño del máximo string que almacenarás, de lo contrario podrías estar escribiendo ram ajena.

Código: [Seleccionar]
char leido[30];
- La línea write_string_eeprom(5000,dato[0]); está mal.
Debes pasarle un char* a la función write y lo que estás pasando es un char normal. Cámbiala así o así:

Código: [Seleccionar]
write_string_eeprom(5000,dato);
Código: [Seleccionar]
write_string_eeprom(5000,&dato[0]);
Si sigues teniendo problemas ponnos tu código actual.  :mrgreen:
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 27 de Junio de 2009, 13:05:37
hola mig,

me base en esto al declarar mi variable leido:
(http://img194.imageshack.us/img194/6243/apuntadores.jpg)

pero quizá no sea correcto hacerlo así en CCS, no? coloque entonces como me recomendaste, pero quisiera manejarlo como variable puntero, si es que hubiera forma, claro:
char leido[10]; y al pasar el parametro:

read_string_eeprom(5000,&leido[0]); ó
read_string_eeprom(5000,leido); y ambas compilan bien.

El funcionamiento todavía no va bien, creo que hay algo mal todavía con mi función read, porque solo lee los primeros 2 caracteres, seguire revisando.

La funcion write me compilaba y estaba funcionando, en realidad estoy usando una matriz, no lo coloque para no liar mucho, pero esta sería mi matriz:

char datos[10][10]={"111112","2222223","33333334","444444445"};

y creo que solo puedo hacerlo de esa manera:

write_string_eeprom(5000,datos[0]);
porque cuando pongo la & no compila.

Solamanete son funciones de prueba, imprimendolas por puerto serie, así que no hay más codigo que ese. Quiero estas funciones para después trabajar más detalladamente después

muchas gracias pro ayuda, saludos.
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 27 de Junio de 2009, 14:34:42
la verdad que no entiendo que pasa con mi funcion con punteros, la cambié por un for y esta como mencioné antes da muy bien:

Código: C#
  1. void read_string_eeprom(int32 address,char *s1){
  2.    int i,a;
  3.  
  4.    for(i=0;i<10;i++){
  5.       a=read_ext_eeprom(address+i);
  6.       if(a==0)
  7.          break;
  8.       s1[i]=a;
  9.    }
  10. }

la dejare con el for, aunque no me gusta la idea, porque mejor se verá con punteros :mrgreen: pero ya debo pasar a seguir programando, he perdido mucho tiempo

saludos, muchas gracias y si logro solucionarlo les aviso, y si logran ver algun error lo revisaré
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: RedPic en 27 de Junio de 2009, 14:51:39
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 EEPROM

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.

Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: migsantiago en 27 de Junio de 2009, 15:14:20
Cryn, si declaras:

Código: [Seleccionar]
char *pmessage="ya es el tiempo";

El compilador reserva los chars que contiene la cadena, pero el problema es que declaras leido sin tamaño:

Código: [Seleccionar]
char *leido;

Y así el compilador solo reserva los 2 bytes de la dirección pero ningún byte para la cadena que deseas recibir en ella.

Para lograr que lo siguiente compile debes poner dos índices:

Código: [Seleccionar]
write_string_eeprom(5000,&datos[0][0]);
Diego, sobre el tiempo de espera de escritura de la eeprom, creo que la rutina de CCS ya tiene implementada la rutina de espera a que el dato quede bien grabado:

Código: [Seleccionar]
  status=i2c_write(command);
  while(status==1)
  {
     i2c_start();
     status=i2c_write(command);
  }

Cuando la eeprom ya está lista para recibir otro dato ella enviará un ACK (nivel lógico 0) pero mientras está grabando el bus estará en nivel lógico 1, es por eso que los de CCS pusieron el while. Aunque creo que el delay de 5ms que propones es bueno mientras la aplicación de Cryn no esté justa en tiempo.
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Suky en 27 de Junio de 2009, 15:28:54
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 EEPROM

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.


La 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)
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: BrunoF en 27 de Junio de 2009, 15:41:07
Esto funciona...

Código: C
  1. void write_string_eeprom(int32 address,char *data){
  2.    while(*data!=0){
  3.       write_ext_eeprom(address++,*data);
  4.       data++;
  5.    }
  6.    write_ext_eeprom(address,0);
  7. }
  8.  
  9. void read_string_eeprom(int32 address,char *s1){
  10.      s1--;
  11.   do{
  12.      s1++;
  13.      *s1=read_ext_eeprom(address++);
  14.   }while(*s1!=0);
  15. }

Código: C
  1. void main()
  2. {
  3.   char dato[]="HOLA MUNDO";
  4.   char *leido=&dato[0];
  5.   //...
  6.  
  7.  
  8.   write_string_eeprom(5000,&dato[0]);
  9.   read_string_eeprom(5000,leido);
  10.  
  11.   printf("Valor: %s\r\n",leido);
  12.   //...
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: BrunoF en 27 de Junio de 2009, 15:48:22
O para que se note mejor podría ser:

Código: C
  1. void main()
  2.       {
  3.        char mystr[40];
  4.        char dato[]="Todopic";
  5.        char *leido=mystr;
  6.        //...
  7.  
  8.        write_string_eeprom(5000,dato);
  9.        read_string_eeprom(5000,leido);
  10.        printf("Valor: %s\r\n",leido);
  11.        //...
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 27 de Junio de 2009, 20:25:02
muchimas gracias a todos, de verdad :-/ :-/

Redpic, si leí ese hilo, y hasta recordé que había posteado ahí :mrgreen: y tenía alguna duda con ello, pero la verda que me grabó hasta ahora todos los datos muy bien, ya llevo unos 3000 datos grabados y todos hasta ahora en buen estado, seguramente es como Suky dice, gracias por los datos Suky! Y sí, estoy con muchos datos, así que el tiempo es oro jeje.

Mig, fue una confusión mía lo de los punteros sin espacio reservado, creí haber visto algo como mencionába, m e equivoque, gracias por hacermelo notar y por los consejos, y quisiera poder ver una función tuya con esa idea, para este caso de la lectura.

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;

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!!! :-/ :-/ :-/
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: migsantiago en 28 de Junio de 2009, 15:37:01
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!!! :-/ :-/ :-/

¿No conoces el tutorial de Pedro Palitroquez?  :shock:

El tema de los punteros...
http://www.todopic.com.ar/foros/index.php?topic=16680.0

Edito: te escribo una función rápida para leer una cadena almacenada en una eeprom externa... escrita al vapor así que te tocará probarla.

Código: [Seleccionar]
//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);
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 28 de Junio de 2009, 17:06:58
si, vi el temon de Pali, con ese tema me inicie aquella vez, pero Pali lo suspendió porque no hizo la parte de recibir cadenas y devolver cadenas, y las combinaciones más comunes, usuales y correctas, que me cuesta tenerlas.

muchas gracias mig, la pruebo y te aviso, un saludo.
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: BrunoF en 28 de Junio de 2009, 17:19:57
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;

Podrías obviar el puntero "leido", haciendo:

Código: C
  1. char mystr[40];
  2. char dato[]="Todopic";
  3. ...

y luego,

Código: C
  1. write_string_eeprom(5000,dato);
  2.   read_string_eeprom(5000,&mystr[0]);

o lo que es lo mísmo:

Código: C
  1. write_string_eeprom(5000,dato);
  2.   read_string_eeprom(5000,mystr);
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 28 de Junio de 2009, 17:31:48
ok, ya veo, muchas gracias Bruno
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 23 de Enero de 2010, 13:07:01
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
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Suky en 23 de Enero de 2010, 13:10:41
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

Muestra como lo vas haciendo y te indicamos que puede estar mal o como se puede hacer mejor. Así se ve el esfuerzo propio  :mrgreen:

Saludos
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: jhozate en 23 de Enero de 2010, 13:57:12
dentro de lo q desconozco, es necesario el uso de punteros para leer desde una eeprom externa?
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: BrunoF en 23 de Enero de 2010, 14:19:50
Por supuesto que no!

Uno podria trabajarla sin punteros, asi como tambien prácticamente sólo con ellos.
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 23 de Enero de 2010, 14:32:19
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

Cuanto es "muchos datos"? 10? 100? 1000? que tipo de datos son? bytes? long (16bits)? long long (32bits)? float? string? como en mi caso o que tipo?

Porque la eeprom solo conoce de bytes y ya después uno lo adapta a lo que necesita.

Y como recomendó suky muéstranos que tienes hecho y será más fácil ayudarte, saludos.

Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 23 de Enero de 2010, 14:34:27
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.

saludos
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 23 de Enero de 2010, 15:04:02
lo que tengo armado en principio es esto que funciona.a modo de prueba
 case '2': 
                  lcd_gotoxy(1,1);
                  printf(lcd_putc,"enviando datos ",);
                  dat=read_ext_eeprom(adress1++);
                  dat1=read_ext_eeprom(adress1++);
                                            dat2=read_ext_eeprom(adress1++);
                                            dat3=read_ext_eeprom(adress1++);
                                            printf("hora:%02d\n\r",dat);
                                            printf("min:%02d\n\r",dat1);
                                            printf("dia:%02d\n\r",dat2);
                                            printf("mes:%02d\n\r",dat3);
                                           adress1=0;       
                                            break;
 solo leo las 4 primers líneas de la 256. y las muestro mediante la PC.
lo que tendria que hacer es leer el contenido de todas las direcciones hasta la ox7fff. y mostralas en la pc
Gracias
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Suky en 23 de Enero de 2010, 16:30:07
Una forma sencilla sería:

Leer y enviar sería de la siguiente forma:

Código: [Seleccionar]
dir=0;
while(dir<0x7FF) putc(read_ext_eeprom(dir++));


Pero si además es indicar que tipo de valor se esta mandando ya hay que hacer otra cosa mas trabajada y dependerá de que significa cada dato  :?


Saludos!



Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 23 de Enero de 2010, 17:03:58
Ok, lo intentare con estas línea.
gracias
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 23 de Enero de 2010, 17:25:43
Solamente obtengo simbolos,
 lo q guarde en memoria son valores de la hora min dia y mes tendria que visualizarse estos numeros ¿como se haria ?
gracias
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 23 de Enero de 2010, 17:32:20
creo que puedes hacerlo de 2 formas:

while(dir<0x7FF) putc(read_ext_eeprom(dir++)+0x30); // para números

o

while(dir<0x7FF) printf("%u ",read_ext_eeprom(dir++));
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 23 de Enero de 2010, 18:22:05
gracias cryn, con la ultima obtengo lectura de numeros. que corrsponden a lo guradado.
 Lo que tratare ahora es de colocarlos en estre formato
Byte0: hh
Byte1:nim
Byte2:dd
Byte3:mm
....
.....
Byte n: (el dato que corresponda)
Como puedo hacer corresponder el "n" con la direccion de memoria leida???
Gracias !!!
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 23 de Enero de 2010, 19:38:18
lo quiero hacer de esta forma pero da error de compilacion
Estoy uitlizando una for para lo requerido
for (i=0; i=0x7ff;i++)
printf("byte %u=%2u/n/r",i,read_ext_eeprom(dir++));
}
el compilador me dice que hay un error en la linea del printf
cual sera???Gracias!!!
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 23 de Enero de 2010, 19:42:27
si tu variable i varía de 0 a 0x7ff debe ser int16 no?

entonces hay que colocar en lugar de %u, %lu ó %ld
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 23 de Enero de 2010, 20:10:56
Gracias cryn.
seguire trabajando en este tema.
un saludo
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 24 de Enero de 2010, 00:21:49
otra consulta cryn. HAsta ahora todo iba sobre ruedas.

write_ext_eeprom (dir++,value);
write_ext_eeprom (dir++,(value>>8));     ////agregue esta linea de programa y en la compilacion me aparece este error
 write_ext_eeprom (dir++,hr);
 write_ext_eeprom (dir++,min);
 write_ext_eeprom (dir++,day);
 write_ext_eeprom (dir++,mth);   



Clean: Deleting intermediary and output files.
Clean Warning: File "C:\codigos\final\final.o" doesn't exist.
Clean: Deleted file "final.HEX".
Clean: Deleted file "final.LST".
Clean: Deleted file "final.PJT".
Clean: Deleted file "final.ERR".
Clean: Deleted file "final.COF".
Clean: Done.
Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FM "final.c" +DF +LN +T +A +M +Z +Y=9 +EA
>>> Warning 203 "C:\ARCHIV~1\PICC\drivers\ds1307.c" Line 233(1,1): Condition always TRUE
*** Error 71 "final.c" Line 177(4,5): Out of ROM, A segment or the program is too large    rs232
Seg 00035-007FF, 0010 left, need 0760
  Seg 00800-00FFF, 0800 left, need 080A
  Seg 01000-017FF, 0800 left, need 080A
  Seg 01800-01FFF, 0800 left, need 080A
  Seg 00000-00003, 0000 left, need 080A
  Seg 00004-00034, 0000 left, need 080A
  Seg 00035-007FF, 0010 left, need 080A

     
1 Errors,  1 Warnings.
Halting build on first failure as requested.
BUILD FAILED: Sun Jan 24 00:09:25 2010

Que puede estar pasando. Cdo elimino esta linea todo bien
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Nocturno en 24 de Enero de 2010, 03:57:02
Te has quedado sin espacio en la zona de programa de tu micro, lo tienes hasta las trancas.

Te va a tocar optimizar algo el código y hacer hueco para que entre lo que necesitas.
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 24 de Enero de 2010, 10:57:37
cuando compilo este programa en otra Pc no tengo problemas. En una computadora si se compila bien y en otra me arrojas ese error porque puede suceder eso.?????
 Executing: "C:\Archivos de programa\PICC\Ccsc.exe" +FM "final.c" +DF +LN +T +A +M +Z +Y=9 +EA
>>> Warning 203 "C:\ARCHIV~1\PICC\drivers\ds1307.c" Line 233(1,1): Condition always TRUE
>>> Warning 216 "final.c" Line 177(4,5): Interrupts disabled during call to prevent re-entrancy:  (lcd_init)
>>> Warning 216 "final.c" Line 177(4,5): Interrupts disabled during call to prevent re-entrancy:  (@delay_ms1)
>>> Warning 216 "final.c" Line 177(4,5): Interrupts disabled during call to prevent re-entrancy:  (lcd_gotoxy)
>>> Warning 216 "final.c" Line 177(4,5): Interrupts disabled during call to prevent re-entrancy:  (lcd_putc)
      Memory usage:   ROM=55%      RAM=34% - 43%
      0 Errors,  5 Warnings.
Loaded C:\todos\final\final.cof.
BUILD SUCCEEDED: Sun Jan 24 10:56:45 2010
solo tengo esos lugares de memoria ocupados
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Nocturno en 24 de Enero de 2010, 12:30:08
¿Con la misma versión de CCS?
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 24 de Enero de 2010, 14:44:58
si te quedaste sin memoria te va a tocar trabajar con punteros quizá, no estoy seguro pero creo que optimiza un poquitin el código...

saludos
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 24 de Enero de 2010, 19:37:05
lo extraño es que tengo la misma version del ccs en ambas maquinas.
quite dos líneas putc y deje la que me daba problemas.
me llama la atencion el porcentaje de memoria utilizado ya sea la ROM o la RAM. (55 y 44)  Una linea no me puede ocupar tanto porcentaje cuando la icluyo
gracias!
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 25 de Enero de 2010, 11:05:23
Cual putc es la instrucción que te ocupa tanto ROM?

Los printf por ejemplo ocupan bastante rom

Habrá que ver en el código donde se puede optimizar algo.
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 28 de Enero de 2010, 22:29:46
hola Cryn a ver si me puedes dar por favor una manito con este codigo. Resulta que no me responde a la interrupcion por el tmr0. tal vez estoy haciendo algo mal. te paso el codigo
MuchaS GRACIAS
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 29 de Enero de 2010, 22:03:22
Hola parece que esta bien configurado, salvo que no entiendo muy bien que es lo que quieres hacer

setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_4);
setup_counters(RTCC_EXT_L_TO_H,RTCC_DIV_4);
solo hace falta uno de ellos no ambos.

y no vi por ningún lado que después deshabilites la interrupción, o es que una vez que se selecciona el modo 2 todo el tiempo tendrá que mostrar los datos de la eeprom?

ahora con el div_4 estas obteniendo un divisor de frecuencia de tu señal de entrada externa, tienes un pulsador por ahí? que es lo que buscas hacer? para que inicializas al tmr0 con este valor?
set_TIMER0(0xF1);

Bueno ahí me dices que el lo que pretendes y un poco del hardware que tienes para poder ayudarte mejor.

saludos.
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 29 de Enero de 2010, 22:35:23
 Gracias por la respuesta cryn .La idea es en el "case 2" se muestre la fecha, hora y temperatura en un lcd y por cada 60 pulsos que vienen del rtc  entrado por el RA4 se produzca la interrupcion. Cuando se atienda a esta se grave en ext memory estos datos. Estaría grabando cada min. Para ello inicializo el tmr0 con 0xF1 con un prescaler.
con el case 1 muestro todo lo grabado.
Gracias. nuevamente
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 30 de Enero de 2010, 02:08:19
trabajé un sencillo programa con la interrupcion por separado la estoy simulé en proteus y anduvo.  Ahora esta la tengo que incorporar al prog principal lo voy a hacer con el case. pero surge otro inconveniente

agrego esto

case '3':
          setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_4);
          enable_interrupts(int_timer0);
          enable_interrupts(GLOBAL);
          trisb=0x00;            //puerto b como salida
          portb=0x00; 
          set_TIMER0(0xF1); //inicializa el timer0
 do
{
   ds1307_get_date(day,mth,year,dow);        /// se obtiene la fecha 
                ds1307_get_time(hr,min,sec); 
}   
while (true);
 y me arroja este error  """"** Error 51 "ultimo2.c" Line 167(1,5): A numeric expression must appear here"""
   
break;
}
 La linea a la que se refiere es la del case '3':

Gracias por las sugerencias!!!!!
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 30 de Enero de 2010, 11:18:38
Solucionado tbien este problema. Ahra veremos como funciona cuando se integra.
gracisa
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: Cryn en 30 de Enero de 2010, 11:34:57
que bueno que lo tengas resuelto cuales fueron los problemas?

saludos
Título: Re: Lectura y escritura de string en eeprom extera
Publicado por: kidpic en 30 de Enero de 2010, 23:52:20
cambie de lugar el case. genere un case 0. en la primera linea del swicth.
Esta contando e interrumpiendo como se deseaba .
Gracias CRYN. por lo aportes
un saludo