TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Medusa en 11 de Enero de 2011, 20:34:24

Título: No se escribe correctamente un int16 en la eeprom
Publicado por: Medusa en 11 de Enero de 2011, 20:34:24
Hola, estoy tratando de escribir un int16 en la eeprom pero no logro hacerlo correctamente, se debe de escribir el numero 0x1781, pero se escribe el numero 0xF506, cual es mi error?

Aqui esta mi codigo:
Código: [Seleccionar]
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20MHz)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)// RS232 Estándar

#include <string.h>
#include <internal_eeprom.c>
#include <STDLIB.H>
#include <MATH.H>

char Buffer_LSB[5];
int16 Pag_LSB;

void main(){ 
       Buffer_LSB[0] = "1";
       Buffer_LSB[1] = "7";
       Buffer_LSB[2] = "8";
       Buffer_LSB[3] = "1";

       Pag_LSB = atol(Buffer_LSB);
       write_int16_eeprom(0,Pag_LSB);

while (TRUE);
}
Título: Re: No se escribe correctamente un int16 en la eeprom
Publicado por: AngelGris en 11 de Enero de 2011, 20:55:24

..........

Aqui esta mi codigo:
Código: [Seleccionar]
#include <18F452.h>

........

char Buffer_LSB[5];
int16 Pag_LSB;

void main(){ 
       Buffer_LSB[0] = "1";
       Buffer_LSB[1] = "7";
       Buffer_LSB[2] = "8";
       Buffer_LSB[3] = "1";

       Pag_LSB = atol(Buffer_LSB);
       write_int16_eeprom(0,Pag_LSB);

while (TRUE);
}


  ¿Pero se puede asignar de esa manera valores a un array que van a formar una cadena? No se porque, pero me parece que no se puede. En todo caso proba al declarar la variable hacer así   
Código: C
  1. char Buffer_LSB[5] = "1781";
a ver que ocurre.
Título: Re: No se escribe correctamente un int16 en la eeprom
Publicado por: Medusa en 11 de Enero de 2011, 22:05:04
Citar
char Buffer_LSB[5] = "1781";a ver que ocurre

Hola AngelGris, el problema es el mismo!!!
Se debe de escribir el numero 0x1781, pero se escribe el numero 0xF506, cual es el error?


Citar
#include <18F452.h>
.
.
.

char Buffer_LSB[5] = "1781";
int16 Pag_LSB;

void main(){
      
      Pag_LSB = atol(Buffer_LSB);                  
      write_int16_eeprom(0,Pag_LSB);
            
while (TRUE);
}
Título: Re: No se escribe correctamente un int16 en la eeprom
Publicado por: AngelGris en 11 de Enero de 2011, 22:14:18
  Creo que descubrí el problema... ese "1781" lo toma como el número 1781 (mil setecientos ochenta y uno) que en hexa es 06F5. Son los valores que vos obtenés, aunque todavía no me queda claro el porque los obtenés invertidos, es decir F506

  Hay que ver si no hay una función para convertir un texto en hexa, y sino habrá que desarrollarla.
Título: Re: No se escribe correctamente un int16 en la eeprom
Publicado por: BrunoF en 11 de Enero de 2011, 22:35:38
 Creo que descubrí el problema... ese "1781" lo toma como el número 1781 (mil setecientos ochenta y uno) que en hexa es 06F5. Son los valores que vos obtenés, aunque todavía no me queda claro el porque los obtenés invertidos, es decir F506

Cita de: Ayuda del CCS
Integers are stored in little endian format.  The LSB is in the lowest address.


  Hay que ver si no hay una función para convertir un texto en hexa, y sino habrá que desarrollarla.

Cita de: Ayuda del CCS
ivalue = atoi(string)
[...]
Converts the string passed to the function into an int representation. Accepts both decimal and hexadecimal argument. If the result cannot be represented, the behavior is undefined.


Título: Re: No se escribe correctamente un int16 en la eeprom
Publicado por: AngelGris en 11 de Enero de 2011, 22:47:27
  Gracias BrunoF por la pronta intervención. Como yo no uso CCS, no sé como trabaja dicho compilador con respecto a estas funciones.
  Me guíe con el manual de Hitech que dice... "The atoi() function scans the character string passed to it, skipping leading blanks and reading an optional sign. It then converts an ASCII representation of a decimal number to an integer." Como dice que convierte una "representación decimal en integer" supongo que sólo se le puede pasar un string decimal y no hexa. Pero repito, que es pensando en el compilador HiTech.
Título: Re: No se escribe correctamente un int16 en la eeprom
Publicado por: BrunoF en 11 de Enero de 2011, 22:53:02
No hay drama. No tomes mi respuesta como un reto o una cosa sobresabida. Solo lo puse asi para ser fiel a la fuente y porque me parecio que estaba lo suficientemente claro como para acotar algo. Pero por sobre todo eso, no tenia ganas de redactar...

Saludos.
Título: Re: No se escribe correctamente un int16 en la eeprom
Publicado por: AngelGris en 11 de Enero de 2011, 23:01:42
No hay drama. No tomes mi respuesta como un reto o una cosa sobresabida. Solo lo puse asi para ser fiel a la fuente y porque me parecio que estaba lo suficientemente claro como para acotar algo. Pero por sobre todo eso, no tenia ganas de redactar...

Saludos.

  Tranquilo, que no lo tomé como un reto. Y sí, realmente está clarísima la explicación de la ayuda de CCS.
  O sea, que si Medusa quisiera pasarle un hexa a ATOL sólo tendría que hacer que la variable Buffer_LSB sea 0x1781. Para que ATOL interprete que se trata de un valor en hexadecimal.
Título: Re: No se escribe correctamente un int16 en la eeprom
Publicado por: BrunoF en 11 de Enero de 2011, 23:31:09
Si, deberia ser asi. Vi mal. Pense que era atoi pero es atol. Igualmente la definicion del CCS es analoga para longs.

Saludos.
Título: Re: No se escribe correctamente un int16 en la eeprom
Publicado por: AngelGris en 11 de Enero de 2011, 23:34:11
Si, deberia ser asi. Vi mal. Pense que era atoi pero es atol. Igualmente la definicion del CCS es analoga para longs.

Saludos.

  Sí, en HiTech también dice lo mismo para atol que para atoi.
Título: Re: No se escribe correctamente un int16 en la eeprom
Publicado por: MLO__ en 11 de Enero de 2011, 23:39:16
Hola.

La función te pasa a entero ... así que el número que debes guardar en el bufer es 6017. Si lo escribe invertido es por la función de escritura de la EEPROM que debe escribir el LSB primero.

Saludos