TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: josefe en 26 de Noviembre de 2012, 01:03:08

Título: Problemas al imprimir LCD 16x2
Publicado por: josefe en 26 de Noviembre de 2012, 01:03:08
Buenas tengo unas 5 horas tratando de resolver un problema ya casi esta listo pero tengo problemitas al imprimir.

El problema esta en que por ejemplo imprimo  (2,1,text) y luego (2,4,text2) pero el segundo texto no imprime en el cuarto caracter si no en el 8 o mas lejos del 4.

Algo asi hago

Código: [Seleccionar]
char *prueba="mundo",*tex1,*tex2;


Lcd_Out(1, 1, "Hola");
Lcd_Out(1, 6, prueba);

Lcd_Out(2, 1, text1);
Lcd_Out(2, 4, tex2);


Esto imprime asi
==========
|Hola mundo   |
|hi         word |
==========


Como ven hay demasada separación entre text1 y 2 y no se porque.

Tambien probe con  Lcd_Out_Cp(text2) pero igual qda



Título: Re: Problemas al imprimir LCD 16x2
Publicado por: Nocturno en 26 de Noviembre de 2012, 02:55:21
¿Qué valores tienen las variables tex1 y tex2?
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: josefe en 26 de Noviembre de 2012, 09:02:11
¿Qué valores tienen las variables tex1 y tex2?

hi y world, es solo un ejemplo
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: josefe en 26 de Noviembre de 2012, 09:20:13
Ya estoy viendo el error pero igual no se que hacer, el valor lo extraigo de la eeprom, por ejemplo yo tenia 0(cero) en xdireccion, lo extraigo le sumo 1 y lo muestro en pantalla, este se muestra correctamente pero lo mustra como con espacios, como si antes del valor hubieran espacios en blanco que ocupan casillas del lcd

guardo en la eeprom el valor 1

estraigo le sumo 1 y muestro en pantalla

=============
|Suma:              2  | LCD16x2..linea 2
=============

Por que los espacios en blanco? entre 3 y 5.

Sera porq lo saca como HEX?
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: fuente en 26 de Noviembre de 2012, 09:30:04
No se como funcionará la funcion LCD_OUT por dentro, pero puede ser la falta de un terminador.
Las funciones de tratamiento de cadena suelen recorrer la misma hasta que encuentran un valor nulo (0, o /n).
Cuando termines de formar la cadena, que el último valor sea 0 (o un caracter de escape /n si la estas construyendo con un sprintf)
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: Nocturno en 26 de Noviembre de 2012, 12:32:14
Enséñanos cómo cargas las variables tex1 y tex2, seguro que te falta el 0 al final
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: josefe en 26 de Noviembre de 2012, 12:53:17
Enséñanos cómo cargas las variables tex1 y tex2, seguro que te falta el 0 al final

int valor;
char prueba; //tambien probe *prueba *prueba[2], este ultimo arroja caracteres raros
Código: [Seleccionar]
int valor;
char prueba;

valor=EEPROM_Read(0x30);

IntToStr(valor,prueba);

Lcd_Out(2, 1, text1);
Lcd_Out(2, 4, prueba);//este da el problema, probe colocando un texto y aparece justo en la cuarta linea del LCD



El valor se muestra pero muy alejado
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: fuente en 26 de Noviembre de 2012, 13:24:40
¿Qué versión de C es?

Prueba con esto. Declara prueba con una longitud determinada:

Código: [Seleccionar]
char prueba[4];
Si la función IntToStr no te pone el terminador, cosa que dudo, pónselo tu:

Código: [Seleccionar]
prueba[3]=0;
eso suponiendo que únicamente vas a tener 3 dígitos.
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: josefe en 26 de Noviembre de 2012, 18:04:19
¿Qué versión de C es?

Prueba con esto. Declara prueba con una longitud determinada:

Código: [Seleccionar]
char prueba[4];
Si la función IntToStr no te pone el terminador, cosa que dudo, pónselo tu:

Código: [Seleccionar]
prueba[3]=0;
eso suponiendo que únicamente vas a tener 3 dígitos.

Lo he hecho como has dicho pero nada.


(http://www.subeimagenes.com/img/asdas-472289.jpg)

Como vez alli el primer cuadro es colocando un texto directo.

El segundo colocandolo como explique en otro comentario y qda alejado mas si suma que es lo importante.

El tercer cuadro es colocandolo como dijiste pero sin igualarlo a 0, este me muestra caracteres raros ademas del simbolo de grados que parece que lo copiara de la linea de arriba, cuado lo hice como dijiste no mostraba nada, o sea como el primer cuadro pero sin letras.


Y en el segundo cuadro para poder que se vean los numeros tuve que eliminat la impresion del max ya que lo tapaba.


Estoy usando Mikroc 2012
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: fuente en 27 de Noviembre de 2012, 04:57:21
Esa versión de C no la he utilizado nunca, no se como se comporta.
Busca en la ayuda de mikroC esa función para ver como se comporta y que requerimientos tiene.
Por lo que se ve en las imágenes que has puesto, parece que devuelve una longitud de cadena fija y bastante grande, por lo que borra todo el texto que tenga por debajo.
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: josefe en 27 de Noviembre de 2012, 17:01:44
Esa versión de C no la he utilizado nunca, no se como se comporta.
Busca en la ayuda de mikroC esa función para ver como se comporta y que requerimientos tiene.
Por lo que se ve en las imágenes que has puesto, parece que devuelve una longitud de cadena fija y bastante grande, por lo que borra todo el texto que tenga por debajo.


Y cual es la version que todos usan o por lo menos la mayoria ya que siempre pregunto por mikroc y todos dicen que no lo usan cuando a mi me ha parecido un programa sencillo y facil de utilizar.
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: fuente en 27 de Noviembre de 2012, 18:23:16
Facil de utilizar si, pero muy poco control sobre el micro.
Yo utilizo el C18,  y es mas parecido al ansi c. También he usado el sdcc, y no va nada mal.
¿qué te decia el manual de la función inttostr?
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: josefe en 29 de Noviembre de 2012, 16:10:27
Facil de utilizar si, pero muy poco control sobre el micro.
Yo utilizo el C18,  y es mas parecido al ansi c. También he usado el sdcc, y no va nada mal.
¿qué te decia el manual de la función inttostr?

Prototype: void IntToStr(int input, char *output);
 
Returns: Nothing.
 
Description: Converts input signed integer number to a string. The output string has fixed width of 7 characters including null character at the end (string termination). The output string is right justified and the remaining positions on the left (if any) are filled with blanks.

Parameters :

input: signed integer number to be converted
output: destination string

 
Requires Destination string should be at least 7 characters in length.
 
Example int j = -4220;
char txt[7];
...
IntToStr(j, txt);  // txt is " -4220" (one blank here)
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: fuente en 29 de Noviembre de 2012, 18:18:53
Pues ahí te lo está diciendo todo.
La salida es una cadena de longitud fija de 7 caracteres, justificada a la derecha y relleno de caracteres en blanco, por eso te sobreescribe el MAX.
Mira a ver si tienes alguna otra función que haga lo que quieres.
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: Nocturno en 30 de Noviembre de 2012, 00:59:25
Fuente tiene razón, lo explica la ayuda de tu función.

Prueba haciendo esto:
Lcd_Out(2, 4, prueba[3]);

Así imprimirás a partir del 4º carácter del string.
Título: Re: Problemas al imprimir LCD 16x2
Publicado por: josefe en 30 de Noviembre de 2012, 12:20:08
Pues ahí te lo está diciendo todo.
La salida es una cadena de longitud fija de 7 caracteres, justificada a la derecha y relleno de caracteres en blanco, por eso te sobreescribe el MAX.
Mira a ver si tienes alguna otra función que haga lo que quieres.


Fuente tiene razón, lo explica la ayuda de tu función.

Prueba haciendo esto:
Lcd_Out(2, 4, prueba[3]);

Así imprimirás a partir del 4º carácter del string.

Lo que hice fue cambiar la funcion de IntTostr q me toma 7, por ByteToStr q imprime hasta 255, lo que me sirve ya que el minimo es 32 y el maximo a imprimir es 40