TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Diego E. en 22 de Octubre de 2009, 12:51:17
-
Buenos días grupo, me sucede algo incomprensible para mi:
Configuro una variable de la siguiente manera:
Si configuro de esta forma, la variable resultado_ad no funciona bien, los valores se pierden
char analogo[4]; //matriz de 4 variables
int16 resultado_ad; //variable 16 bit
Si configuro de esta otra forma, la variable resultado_ad si funciona bien
int16 resultado_ad; //variable 16 bit
char analogo[4]; //matriz de 4 variables
Con las pruebas que hice veo que la variable siguiente a una matriz no funciona bien.
A alguien la ha pasado algo similar?
gracias.
-
Hola, es probable que no funcione porque estés usando mal el índice de analogo[].
Un ejemplo del probable error...
char analogo[4]; //matriz de 4 variables
int16 resultado_ad; //variable 16 bit
//Ahora apuntamos erróneamente analogo[]
analogo[4] = 0xAB;
Al apuntar a la quinta posición no existente de análogo estás invadiendo un byte de los 2 bytes de resultado_ad, que están justamente después de los 4 chars.
Es decir, que estás modificando el byte alto de resultado_ad por apuntar mal analogo.
Ahora, de la otra forma que pones no falla porque si modificas el quinto byte no existente estarás modificando RAM no empleada por nada más. Resultado_ad fue ubicada antes de analogo[].
Con la poca información que das eso es lo que se me ocurre ;-)
-
Hola migsantiago, gracias por responderme
Yo creo que si se está invadiendo el primer registro de resultado_ad, pero no sé en que momento, esto ocurre cuando ejecuto esta instrucción:
sprintf(analogo,"%04lu",resultado_ad); // le estoy diciendo que el los 4 caracteres de análogo descomponga la variable resultado_ad
Ahora, cuando defino la variable
char analogo[4]; //4 son las variables contenidas.
Esta es la fracción de código completo:
void msj_analogo1() //"RA0 = 0000 000%"
{
int i;
sprintf(analogo,"%04lu",resultado_ad);
display_4b(0 , 0x88); //Dirección donde se escribirá el mensaje
for(i=0;i<sizeof(analogo);i++) //Ciclo que envía el texto al LCD
{
display_4b(1 , analogo[i]);
}
i = ((int32)resultado_ad * 100) / 1024; //se calcula porcentaje
sprintf(analogo,"%03u%%",i);
display_4b(0 , 0x8e); //Dirección donde se escribirá el mensaje
for(i=0;i<sizeof(analogo);i++) //Ciclo que envía el texto al LCD
{
display_4b(1 , analogo[i]);
}
}
saludos.
-
Debes agregar 1 elemento más a analogo debido a que sprintf agrega el carácter nulo '\0' para indicar finalización del string.
Saludos!
-
Hola Suky, casualmente probé haciendo lo que me estás indicando y efectivamente funciona, pero ahora comprendo la razón.
gracias.
saludos.
-
El valor de resultado_ad va de 0 hasta 1023 por lo que necesitas 4 chars para escribirlo pero los strings necesitan de un char extra que indica dónde termina la información, es decir, que en el peor de los casos analogo debe ser de 5 elementos...
char analogo[5];
resultado_ad=1023;
sprintf(analogo, "%04lu", resultado_ad);
analogo queda:
analogo[0]='1';
analogo[1]='0';
analogo[2]='2';
analogo[3]='3';
analogo[4]=NULL; //Fin de cadena
Acá más detalles sobre el funcionamiento de cadenas.
http://www.todopic.com.ar/foros/index.php?topic=25785.msg210802#msg210802
-
migsantiago, que excelente explicación, ideal para todos los que apenas nos iniciamos en el tema de PIC en lenguaje C.
migsantiago, abusando de tu conocimiento y luego de ofrecer disculpas al foro en general, quiero hacerte una pregunta que nada tiene que ver con PIC. ! si depronto sabes algo...!.
En flash (action Actionscript) se utiliza código C, hay forma de utilizar la librería string.h o si de alguna forma se puede utilizar la función "sprintf".
mil gracias y de nuevo disculpas.
-
migsantiago, que excelente explicación, ideal para todos los que apenas nos iniciamos en el tema de PIC en lenguaje C.
migsantiago, abusando de tu conocimiento y luego de ofrecer disculpas al foro en general, quiero hacerte una pregunta que nada tiene que ver con PIC. ! si depronto sabes algo...!.
En flash (action Actionscript) se utiliza código C, hay forma de utilizar la librería string.h o si de alguna forma se puede utilizar la función "sprintf".
mil gracias y de nuevo disculpas.
De ninguna manera abusas de mi conocimiento sobre actionscript... no sé nada al respecto :D
-
Es claro migsantiago, mil gracias.
Hasta pronto.