Autor Tema: No se escribe correctamente un int16 en la eeprom  (Leído 3637 veces)

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

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
No se escribe correctamente un int16 en la eeprom
« 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);
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: No se escribe correctamente un int16 en la eeprom
« Respuesta #1 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: No se escribe correctamente un int16 en la eeprom
« Respuesta #2 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);
}
« Última modificación: 11 de Enero de 2011, 22:11:56 por Medusa »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: No se escribe correctamente un int16 en la eeprom
« Respuesta #3 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: No se escribe correctamente un int16 en la eeprom
« Respuesta #4 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.


"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: No se escribe correctamente un int16 en la eeprom
« Respuesta #5 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: No se escribe correctamente un int16 en la eeprom
« Respuesta #6 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: No se escribe correctamente un int16 en la eeprom
« Respuesta #7 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: No se escribe correctamente un int16 en la eeprom
« Respuesta #8 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: No se escribe correctamente un int16 en la eeprom
« Respuesta #9 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: No se escribe correctamente un int16 en la eeprom
« Respuesta #10 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
El papel lo aguanta todo


 

anything