Autor Tema: Mostrar datos en pantalla LCD con pic 18f4620  (Leído 4159 veces)

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

Desconectado andreaymaria

  • PIC10
  • *
  • Mensajes: 45
Mostrar datos en pantalla LCD con pic 18f4620
« en: 21 de Febrero de 2011, 16:47:31 »
Hola a todos!
Estoy trabajando en mi proyecto, en el cual mido con un PIC una determinada frecuencia, y la muestro por una pantalla LCD.

Mido la frecuencia constantemente, más o menos, cada medio minuto.

Mi problema es, que tras la 1ª vuelta, la LCD muestra correctamente el resultado, pero a la siguiente vuelta, aparecen unos símbolos muy extraños, y a la siguiente otra vez lo muestra correctamente.

He intentado todo, borrar la pantalla tras un delay, borrarla al inicio del main...cuando hago esto a la 1ª vuelta me muestra el dato y a la siguiente la pantalla se pone en negro...y así sucesivamente.

Pienso que el problema debe estar en la libería que utilizo..pero no se donde puede estar.

Teneis idea de lo que me puede estar pasando??Es como si no se refrescara la pantalla...

Aquí os adjunto la libería que utilizo para la LCD y la parte de mi programa en el que muestro los datos.

Saludosss! y Gracias!!Me serían de gran ayuda vuestras respuestas!!

Estas son las asignaciones:

unsigned float f;
unsigned float frecuencia,f_fracpart;
unsigned int s_intpart;
unsigned int u_fracpart;
char buf[10];

Código:

Inicializa_LCD();
Comando_LCD(CURSOR_ON & BLINK_ON);
for(i=1;i<=10;++i){
Delay10KTCYx(100);
}
s_intpart = frecuencia; // integer part of float, as a signed int
f_fracpart = (frecuencia - s_intpart); // fractional part of float, as a float
u_fracpart = f_fracpart * 100; // 100 * fractional part, as an unsigned int
sprintf(buf,(const far rom char*) "%d.%02u", s_intpart , u_fracpart );
Datos_LCD(" F= ");//una cadena desde la memoria de programa
Dato_String_LCD(buf);//una cadena desde la memoria de datos
Datos_LCD(" Hz ");//una cadena desde la memoria de programa
//con este comando pasamos a la linea 2 del LCD
Comando_LCD(DDRAM_LINEA_2);
for(i=1;i<=60;++i){
Delay10KTCYx(250);

Comando_LCD(CLEAR);

Gracias!!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Mostrar datos en pantalla LCD con pic 18f4620
« Respuesta #1 en: 21 de Febrero de 2011, 18:18:45 »
  A mi me da por pensar que sería como si tu variable buff se llenara incorrectamente y entonces muestra cualquier dato en el display. ¿Lo estás simulando o probando en físico? Creo que habría que debuggear y ver los valores que van tomando las distintas variables.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Mostrar datos en pantalla LCD con pic 18f4620
« Respuesta #2 en: 21 de Febrero de 2011, 19:03:06 »
andreaymaria:
                     Comparto lo que te ha dicho AngelGris.
El array de chars me ha dado varios dolores de cabeza para mostrar caracteres por un lcd al no tener en cuenta el final de cadena "\0".
Cuando escribía valores de un sólo dígito de 0 a 9 funcionaba bien. Pero cuando aumentaba a dos dígitos se enloquecía!!
Probá aumentando en uno el valor de char buf[11];

Mirá este hilo por las dudas.
http://www.todopic.com.ar/foros/index.php?topic=33100.0
         Saludos.
                    Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado andreaymaria

  • PIC10
  • *
  • Mensajes: 45
Re: Mostrar datos en pantalla LCD con pic 18f4620
« Respuesta #3 en: 22 de Febrero de 2011, 16:25:21 »
Hola!Gracias por vuestras respuestas!!

Lo estoy probando en físico...

El caso es que..la 1ªvez que muestra la frecuencia, me muestra el dato correctamente pero cuando vuelve al main y se vuelve a ejecutar el programa...me muestra símbolos raros, y si pongo un clear, directamente se me pone en negro y no muestra nada...y a la siguiente vez que ejecuto el programa lo muestra correctamente...y así siempre...es muy extraño..

Probaré mañana a aumentar el buff...a ver que pasa...la librería es correcta no??

Pero a mí me da qué pensar porque al ejecutar este código, que no muestra números, si borras el while(1) y pones un delay y dejas que se ejecute infinitas veces...ocurre lo mismo:

#include <p18f2525.h>
#include <delays.h>            // Rutinas de retardo
#include "C:\PIC\18F\EUART\LCD4b2x16.h"//ruta del archivo en mi PC
 
#pragma config OSC = XT,FCMEN = OFF,IESO = OFF //CONFIG1H
#pragma config PWRT = ON,BOREN = OFF,BORV = 0 //CONFIG2L
#pragma config WDT = OFF,WDTPS = 32768 //CONFIG2H
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = PORTC//CONFIG3H
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF//CONFIG4L
#pragma config CP0 = ON,CP1 = ON,CP2 = ON//CONFIG5L
#pragma config CPB = ON,CPD = ON//CONFIG5H
#pragma config WRT0 = ON,WRT1 = ON,WRT2 = ON//CONFIG6L
#pragma config WRTB = ON,WRTC = ON,WRTD = ON//CONFIG6H
#pragma config EBTR0 = ON,EBTR1 = ON,EBTR2 = ON//CONFIG7L
#pragma config EBTRB = ON//CONFIG7H
//******************************************************//
//******************************************************//
//
//
//      Programa Principal
//
//
//******************************************************//
//******************************************************//
char mensaje[]="Henry";
 
void main(void)
{
   TRISA = 0X00;
   TRISB = 0XF0;
   TRISC = 0X00;
   PORTA = 0X00;
   PORTB = 0X00;
   PORTC = 0X00;
   Inicializa_LCD();
   Comando_LCD(CURSOR_OFF & BLINK_ON);
   Dato_LCD('#');//un dato
   Datos_LCD(" PERU ");//una cadena desde la memoria de programa
   Dato_String_LCD(mensaje);//una cadena desde la memoria de datos
 
   //con este comando pasamos a la linea 2 del LCD
   Comando_LCD(DDRAM_LINEA_2);
   Datos_LCD("micro_cadaver");
   while(1);
}

Una vez se muestran correctamente, otra vez no, otra vez sí y así sucesivamente...y utiliza la misma librería..

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Mostrar datos en pantalla LCD con pic 18f4620
« Respuesta #4 en: 22 de Febrero de 2011, 19:50:08 »
  ¿Y por casualidad no te habrá quedado el ""inicializa_LCD();" dentro del loop?
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas


 

anything