TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Vayadespiste en 11 de Noviembre de 2007, 17:17:25

Título: envio a LCD
Publicado por: Vayadespiste en 11 de Noviembre de 2007, 17:17:25
Saludos al foro, estoy iniciándome en el C (mc18) y me he encontrado este problema:

char minbuf[2];                           
char maxbuf[2];

T_Minima=20;
T_Maxima=26;
.......

      btoa (T_Minima,minbuf);      /* Conversión de Hex a un array de ASCII */
      btoa (T_Maxima,maxbuf);      
      WriteCmdXLCD(LINEA_2);
      putsXLCD(minbuf);      /* Envió del valor de la Temperatura */   
                                .........
Cuando se envía la rutina de escritura de los 2 valores en minbuf (20 en este caso), la secuencia de envió de la cadena envía seguidos los 2 caracteres de maxbuf, es decir al LCD manda 2026 cuando el envió es solo "minbuf". De momento lo he solucionado enviando un carácter por vez, es decir putcXLCD(minbuf[0]) y despues el otro carácter, la pregunta:
"¿ que estoy haciendo mal para que me envié las 2 cadenas?.

Gracias y un saludo.


Título: Re: envio a LCD
Publicado por: maunix en 12 de Noviembre de 2007, 15:57:42
A tu cadena le falta un caracter de fin de cadena.  Por ello y al estar ambas cadenas minbuf y maxbuf contiguas en memoria de seguro la función toma todo hasta que encuentra un #0 en la memoria y deja de enviar.

Debes agregarle a tu string un null de fin de string .
Título: Re: envio a LCD
Publicado por: Vayadespiste en 13 de Noviembre de 2007, 03:23:58
Gracias por tu tiempo Maunix, como me suele pasar una respuesta suele llevar a otra pregunta ya he encontrado el carácter normal a usar como fin de strin que si no  he leído mal es \0 y me ha quedado la duda como hacerlo, al mismo tiempo en el mismo pdf he visto que como ejemplo se declaraba un bufer sin número que lo limite es decir, en lugar de minbufer[2] he visto que se declaraba minbufer[] y parece que esto añade el carácter de fin automáticamente, creo que queda claro que estoy empezando con "C". Pero bueno, lo dicho al principio gracias por tu tiempo y ahora por lo menos se donde mirar.

Gracias y un saludo.

Título: Re: envio a LCD
Publicado por: maunix en 13 de Noviembre de 2007, 11:59:00
Pero minbufer[] asi nomas? Hablas del C18 o de un C genérico?

Fijate si no tiene además un "const" antes y al lado un "=" de definicion.  POr ej.


const char mystr[] = "my string";


o bien


char mystr[] = "my string";
Título: Re: envio a LCD
Publicado por: Vayadespiste en 13 de Noviembre de 2007, 15:01:27
Si es tal y como dices, lleva = y el valor a continuación.

Gracias y un saludo.
Título: Re: envio a LCD
Publicado por: maunix en 14 de Noviembre de 2007, 09:36:19
Si es tal y como dices, lleva = y el valor a continuación.

Gracias y un saludo.

Bueno, el = es porque en realidad estas definiendo una constante o dicho de otra forma es un string con un largo perfectamente conocido -> el largo de lo que le sigue .  Y luego el C le agrega el NULL

SI haces

char mystr[] = "hola"

El compilador habrá creado un string de 5 chars, 4 para hola y uno extra para el NULL.

Título: Re: envio a LCD
Publicado por: Vayadespiste en 15 de Noviembre de 2007, 13:20:39
Gracias a tu ayuda Maunix ya me funciona como quería, ahora las cadenas que tengo declaradas si que terminan, siguiendo tus instrucciones las he declarado he inicializado al mismo tiempo y funcionan perfectamente:

char minbuf[]= "00";
char maxbuf[]="00";

Ahora al inicializarlas con esos valores aunque sea de 0 me coloca el compilador el " . " y corta la cadena en su punto, luego al asignarle los valores mediante el "btoa......" los coloca perfectamente en su sitio.

Un saludo.