TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pablo en 17 de Octubre de 2009, 18:16:41

Título: Problema con write_eeprom
Publicado por: pablo en 17 de Octubre de 2009, 18:16:41
Hola gente.
Tengo un problema con un programa que estoy haciendo.
El error se produce cuando intento graba en la eprom en una direccion superior a la direccion 255. Cuando intento hacer esto, los datos que estan en los primeros bytes de la misma se sobre escriben.
 
Grabo con esta cuenta. Osea el tema no es que este usando una variable de 8bits. Pero pareceria que el resultado lo devuelve en 8bits.
write_eeprom(((numPrograma-1)*5)+236,b3);

Esto es posible? Deberia castear de alguna forma.
El micro tiene 1024 bytes de eprom.

Desde ya muchas gracias.
Saludos. Pablo
Título: Re: Problema con write_eeprom
Publicado por: Suky en 17 de Octubre de 2009, 18:48:49
Prueba de la siguiente manera:

Código: C
  1. write_eeprom((((long (numPrograma))-1)*5)+236,b3);

Seguramente numPrograma esta definido en 8 bits y se trunca la operación.-

Saludos!
Título: Re: Problema con write_eeprom
Publicado por: pablo en 17 de Octubre de 2009, 20:56:58
Gracias. Estuve intentando lo que me dijiste y al principio, debuguie el resultado y se truncaba cuando pasaba los 255.

Ahora no se trunca, pero directo sigue haciendo lo mismo, intente tambien guardarlo en una variable pero tampoco resulta.

   address = (((((int16)numPrograma-1))*5)+233);
   write_eeprom((int16)address,b1);

Si se te ocurre otro cosa avisame.

Muchas gracias.
Título: Re: Problema con write_eeprom
Publicado por: Suky en 17 de Octubre de 2009, 21:32:23
 :shock: Si no se trunca debería de funcionar! Según la ayuda de CCS address puede ser de 8 o 16 bits dependiendo del micro. Prueba de colocar una dirección bien conocida:

Código: C
  1. write_eeprom(300,0xAA);


Saludos!
Título: Re: Problema con write_eeprom
Publicado por: migsantiago en 17 de Octubre de 2009, 22:00:08
Gracias. Estuve intentando lo que me dijiste y al principio, debuguie el resultado y se truncaba cuando pasaba los 255.

Ahora no se trunca, pero directo sigue haciendo lo mismo, intente tambien guardarlo en una variable pero tampoco resulta.

   address = (((((int16)numPrograma-1))*5)+233);
   write_eeprom((int16)address,b1);

Si se te ocurre otro cosa avisame.

Muchas gracias.

Hola, creo que está mal tu casting.

Código: [Seleccionar]
int16 address;
address = (int16) ((int16) numprograma-1)*5 + 233;
write_eeprom((int16)address,b1);

Si eso no funciona alguna combinación de castings debería, cuida que todas las operaciones sean ejecutadas como int16.
Título: Re: Problema con write_eeprom
Publicado por: Suky en 17 de Octubre de 2009, 22:24:32
Hola, creo que está mal tu casting.

:| el casting esta bien!  :5]   :mrgreen:   ;-) Hay muchos paréntesis, eso si  :D

Saludos!
Título: Re: Problema con write_eeprom
Publicado por: migsantiago en 17 de Octubre de 2009, 22:34:34
Uff perdón Suky, es que las prioridades de castings no son mi fuerte... y pues está muy parentesiseado su código  :D

La otra cosa es que su pic no tenga los 1024 bytes de eeprom... pero pues quién sabe.  :z)
Título: Re: Problema con write_eeprom
Publicado por: pablo en 17 de Octubre de 2009, 22:51:29
El casting esta bien, pero sigue confundiendome algo.
Acabo de probar esto

write_eeprom(256, 'x');

Inspeccione el programa con el proteus y lo graba en el byte 0 de la memoria. Como cuando uno se pasa de el valor maximo del un byte y vuelve a empezar.
El pic que estoy usando es un 18F4620 supuestamente tiene 1024bytes.
Título: Re: Problema con write_eeprom
Publicado por: migsantiago en 17 de Octubre de 2009, 23:06:08
Ah, con que simulando en Proteus... mira lo que a mi me entrega al simularlo...

http://img14.imageshack.us/img14/3771/proteusbug.png
(http://img14.imageshack.us/img14/3771/proteusbug.png)

Mejor pruébalo en tu pic porque en proteus no va a funcionar porque solo simula los primeros 256 bytes.  :?

Lo probé con Proteus 7.5 SP3.
Título: Re: Problema con write_eeprom
Publicado por: Suky en 17 de Octubre de 2009, 23:17:41
Me parecía que era el bendito proteus  :5]
Título: Re: Problema con write_eeprom
Publicado por: pablo en 17 de Octubre de 2009, 23:23:11
Es verdad en la simulacion no funciona. Es algo extraño, debo estar haciendo algo mal.
Primer error casting, solucionado. Pero sigue sobrescribiendo los primeros bytes de la eeprom.
Sigo revisando el codigo y les cuento.

Gracias.
Título: Re: Problema con write_eeprom
Publicado por: migsantiago en 18 de Octubre de 2009, 09:55:10
Me parecía que era el bendito proteus  :5]

Hey Suky, yo hace años dejé de usar Proteus 5.x por eso mismo... los bugs que no avisan... ahora que retomé la versión 7.5 poco han cambiado las cosas  :D
Título: Re: Problema con write_eeprom
Publicado por: pablo en 18 de Octubre de 2009, 12:10:57
Todo solucionado. Era un tema de casting.

int16 address;
address = (int16) ((int16) numprograma-1)*5 + 233;
write_eeprom((int16)address,b1);

Me funciono de esta forma, con las otras seguía teniendo problemas.

Tenia un problema de casting y cuando lo chequie en el proteus me mostraba que si me pasaba del byte 255 volvía a empezar, justo lo que me estaba haciendo en el micro sin castear. De ahí es que termine confundiéndome y creí que ese era el error y no el casting.

Si no usan el proteus que herramienta usan para probar un código?

Muchas gracias a todos por la ayuda.
Saludos, Pablo
Título: Re: Problema con write_eeprom
Publicado por: Suky en 18 de Octubre de 2009, 12:34:09
Que raro, el tema del casting lo había probado y no truncaba el resultado  :oops: Esa forma de hacer el casting es como muestra la ayuda de CCS. Además creería que hacer esto write_eeprom((int16)address,b1); no es necesario si address es de 16 bits y el parámetro de la función también lo es  :undecided:
Bueno, por lo menos se solucionó el problema  :-/

Saludos!
Título: Re: Problema con write_eeprom
Publicado por: migsantiago en 18 de Octubre de 2009, 14:42:59
Si no usan el proteus que herramienta usan para probar un código?

Muchas gracias a todos por la ayuda.
Saludos, Pablo

jeje pues con mucha imaginación y un poco de pesimismo buscando qué partes del código fallarán al probar el circuito en protoboard.

¿Quién dice que los programadores no somos pesimistas? Es lo que nos ayuda más para generar código robusto.  ;-)
Título: Re: Problema con write_eeprom
Publicado por: PalitroqueZ en 18 de Octubre de 2009, 16:58:50
(http://img14.imageshack.us/img14/3771/proteusbug.png)

umm. Según el aviso, no es un bug del proteus, sino una limitación (por lo menos te avisa). Limitaciones hay en todos los simuladores, no esperemos que nos vaya hacer todo fielmente el programa que escribamos. Para autenticas "simulaciones" tenemos el ICE2000.

...Si no usan el proteus que herramienta usan para probar un código?
...

están el pic simulator IDE (solo basic y asm) y el mplab-sim, pero te advierto que éste último tiene mucha mas limitaciones que el proteus.



Título: Re: Problema con write_eeprom
Publicado por: ASTROCAR en 18 de Octubre de 2009, 18:44:21
Hola disculpen lo tarde y de verdad nunca he trabajado eeprom i2c con ccs pero el caso que ustedes comentan yo siempre lo tengo presente pero para la configuracion de las paginas o bloques de la eeprom i2c que se este tratando.

Saludos y espero que este sea el caso.
Atten.
Alexander Santana.
Barcelona-Venezuela.