Autor Tema: Visualizar voltaje en Lcd  (Leído 5855 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Visualizar voltaje en Lcd
« en: 02 de Febrero de 2016, 19:00:41 »
Buenas noches, estoy intentando crear un menú en el lcd, algo como esto: https://www.youtube.com/watch?v=S88RLnohySQ&index=14&list=PLA4AF5BC61DE424D6 minuto 2:00, pero me encuentro que itoa solo acepta valores int no float y no se como resolver el problema. ¿Alguien podría ayudarme con la solución y decirme si el programa tiene errores?
Otra cosa, ¿Porque 10 como ultimo parámetro de itoa?
Código: C
  1. void main(void)
  2. {
  3.     char cadena_de_texto [5];
  4.     unsigned int valor_adc, voltios;
  5.    
  6.     OpenXLCD(FOUR_BIT & LINES_5X7);     // Iniciamos Lcd
  7.     comandXLCD(0x06);       // Nos aseguramos incremento de direccion, display fijo
  8.     OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_16_TAD,
  9.             ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS, ADC_0ANA);
  10.     comandXLCD(0x0C);       // Encendemos Lcd
  11.     gotoxyXLCD(1,1);
  12.     putrsXLCD("Bateria: ");
  13.     gotoxyXLCD(1,2);
  14.     putrsXLCD("Estado: ");
  15.    
  16.    
  17.     while(1)
  18.     {
  19.        ConvertADC();    //Iniciamos conversion
  20.        while(BusyADC());    //Esperamos que termine la conversion
  21.        valor_adc = ReadADC();
  22.        voltios = (valor_adc/1024.0)*5.0;
  23.        gotoxyXLCD(10,1);
  24.        itoa(cadena_de_texto, voltios, 10);
  25.        putsXLCD(cadena_de_texto);
  26.     }
  27. }

Gracias.
« Última modificación: 02 de Febrero de 2016, 19:03:21 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Visualizar voltaje en Lcd
« Respuesta #1 en: 02 de Febrero de 2016, 19:13:26 »
Que tal con

Código: C
  1. sprintf(cadena_de_texto,"%.2f",voltios);

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Visualizar voltaje en Lcd
« Respuesta #2 en: 02 de Febrero de 2016, 19:31:45 »
El 10 representa la base en la que quieres el resultado, decimal = 10, hexadecimal = 16...

Saludos

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #3 en: 02 de Febrero de 2016, 19:37:04 »
Gracias KILLERJC por la solución, he sustituido
Código: C
  1. itoa(cadena_de_texto, voltios, 10);
por
Código: C
  1. sprintf(cadena_de_texto,"%.2f",voltios);
y ahora funciona.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #4 en: 03 de Febrero de 2016, 18:21:47 »
Hola de nuevo, he cambiado el código anterior por este y no funciona como debería, el Lcd no para de fluctuar. No se donde puede haber el error, a mi parecer el procedimiento es el correcto.
Código: C
  1. void main(void)
  2. {
  3.     char cadena_de_texto [5];
  4.     unsigned int valor_adc;
  5.     float voltios;
  6.    
  7.     OpenXLCD(FOUR_BIT & LINES_5X7);     // Iniciamos Lcd
  8.     comandXLCD(0x06);       // Nos aseguramos incremento de direccion, display fijo
  9.     OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_16_TAD,
  10.             ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS, ADC_0ANA);
  11.     comandXLCD(0x0C);       // Encendemos Lcd
  12.    
  13.     while(1)
  14.     {
  15.         comandXLCD(0x01);   //Borramos pantalla
  16.         SetChanADC(0);  //Seleccionamos canal
  17.         ConvertADC();    //Iniciamos conversion
  18.        
  19.         while(BusyADC()){}    //Esperamos que termine la conversion
  20.         valor_adc = ReadADC();  //Leemos conversion y la guardamos en valor_adc
  21.         voltios = (valor_adc/1024.0)*5.0;   //Convertimos valor ADC
  22.         gotoxyXLCD(1,1);    //Nos posicionamos en el Lcd
  23.         putrsXLCD("Bateria: ");
  24.         sprintf(cadena_de_texto,"%.2f",voltios);    //Visualizamos voltaje en formato float
  25.         putrsXLCD(cadena_de_texto);
  26.     }
  27. }

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re:Visualizar voltaje en Lcd
« Respuesta #5 en: 03 de Febrero de 2016, 18:37:52 »
Hola Miguel, y a todos en gral, vuelvo a escribir luego de mucho tiempo de no hacerlo.... espero no estar tan oxidado  :D :D :D

  Si siempre lees el mismo canal del ADC, creo que no debería ser necesario seleccionarlo siempre, por lo tanto podrías sacarlo del ciclo while. ¿Al borrar el LCD no queda posicionado directamente en el inicio del mismo? (Habría que ver en el datasheet que indica respecto de ese comando)
  En ocasiones suele variar el bit de menor peso entre lecturas sucesivas del ADC es por ello que se estila hacer un promedio de varias lecturas. A su vez podrías mantener en una variable el valor anterior y compararlo con el nuevo valor y de haber diferencia sí hacer todo el procedimiento de escritura en el LCD....
  Algo así

valor0 = ADC
valor1 = ADC
valor3 = ADC
valorLeido = (valor0 + valor1 + valor2)/3 // para hacer el promedio de las lecturas

si valorLeido != valorAnterior
{
  valorAnterior = valorLeido
  borrar display
  convertir a ascii
  imprimir display
}

  Controla el consumo de sprintf, ya que suele llevarse muchos ciclos de instrucción

Espero haberme explicado
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #6 en: 03 de Febrero de 2016, 18:38:54 »
Resuelto, no me había dado cuenta de que estaba borrando la pantalla constantemente.

Saludos!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #7 en: 03 de Febrero de 2016, 18:42:46 »
Hola AngelGris te has dado mas prisa que yo ¿Que otra opción hay a parte de sprintf, porque itoa solo trabaja con int?
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re:Visualizar voltaje en Lcd
« Respuesta #8 en: 03 de Febrero de 2016, 18:53:12 »
  Una vez lo había resuelto multiplicando el número digamos por 100 para poder obtener 3 decimales y hacía uso de módulo y otras funciones que no recuerdo si eran del compilador o las había hecho yo. Voy a fijarme entre los programas que tengo guardados a ver que encuentro.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #9 en: 03 de Febrero de 2016, 18:54:49 »
Gracias AngelGris.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #10 en: 04 de Febrero de 2016, 11:35:31 »
Bueno veamos si se explicarme, tengo este código;
Código: C
  1. void main(void)
  2. {
  3.     char cadena_de_texto [5];
  4.     unsigned int valor_adc;
  5.     float voltios;
  6.    
  7.     OpenXLCD(FOUR_BIT & LINES_5X7);     // Iniciamos Lcd
  8.     comandXLCD(0x06);       // Nos aseguramos incremento de direccion, display fijo
  9.     OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_16_TAD,
  10.             ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS, ADC_0ANA);
  11.     comandXLCD(0x0C);       // Encendemos Lcd
  12.     comandXLCD(0x01);   //Borramos pantalla
  13.    
  14.     while(1)
  15.     {
  16.         SetChanADC(0);  //Seleccionamos canal
  17.         ConvertADC();    //Iniciamos conversion
  18.        
  19.         while(BusyADC()){}    //Esperamos que termine la conversion
  20.         valor_adc = ReadADC();  //Leemos conversion y la guardamos en valor_adc
  21.         voltios = (valor_adc/1024.0)*5.0;   //Convertimos valor ADC
  22.         gotoxyXLCD(1,1);    //Nos posicionamos en el Lcd
  23.         putrsXLCD("Bateria: ");
  24.         sprintf(cadena_de_texto,"%.2f",voltios);    //Visualizamos voltaje en formato float
  25.         putsXLCD(cadena_de_texto);
  26.         gotoxyXLCD(1,2);
  27.         putrsXLCD("Estado: ");
  28.         Delay1KTCYx(180);
  29.     }
  30. }
y me pasa que después de iniciar el programa al cabo de unos segundos me empiezan a aparecer caracteres extraños en el Lcd (funcionaria bien de no ser por esto). Pero si quito la instrucción sprintf y coloco en su lugar itoa declarando voltios como int ya que no puedo hacerlo como float funciona como es debido sin que aparezcan caracteres raros en el Lcd, y mi duda es si sera problema de hardware o por el contrario sera la instrucción sprintf la que ocasiona el fallo.

Gracias.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #11 en: 04 de Febrero de 2016, 12:44:42 »
He encontrado esta instruccion:
Código: C
  1. ftoa(float f, int * status);
en stdlib.h pero no se muy bien como usarlo, ya que a mi parecer lo que hace es convertir un float a int.

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Visualizar voltaje en Lcd
« Respuesta #12 en: 04 de Febrero de 2016, 12:57:04 »
Yo mire y no posee nada asi la stdlib.h de C.
Es una implementacion de Microchip y si miras la funcion:


Código: C
  1. char *
  2. ftoa(float f, int * status)
  3. {
  4.         static char             buf[17];
  5.         char *                  cp = buf;
  6.         unsigned long   l, rem;
  7.  
  8.         if(f < 0) {
  9.                 *cp++ = '-';
  10.                 f = -f;
  11.         }
  12.         l = (unsigned long)f;
  13.         f -= (float)l;
  14.         rem = (unsigned long)(f * 1e6);
  15.         sprintf(cp, "%lu.%6.6lu", l, rem);
  16.         return buf;
  17. }

tenes tu sprintf :P
Si queres un ftoa hecho a "mano" el programa se puede volver bastaaaante larguito. Si es que buscas rapidez.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:Visualizar voltaje en Lcd
« Respuesta #13 en: 04 de Febrero de 2016, 13:11:06 »
Gracias KILLERJC habia visto la funcion pero lo que no termino de entender es el porque de los fallos en el Lcd al usar sprintf.

Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Visualizar voltaje en Lcd
« Respuesta #14 en: 04 de Febrero de 2016, 13:26:31 »
No se por que tendrias fallos en el LCD por usar sprintf algo esta mal entonces, pero no el programa, tal ves el driver? o tal ves el LCD.

La otra que queda es si podes ver el string que salio del sprintf de algun otra forma ( UART ) y ver que exactamente esta saliendo como debe.
« Última modificación: 04 de Febrero de 2016, 13:30:51 por KILLERJC »