Autor Tema: Necesitomostrar una temperatura con decimales en LCD  (Leído 5709 veces)

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

Desconectado crisec80

  • PIC10
  • *
  • Mensajes: 20
Necesitomostrar una temperatura con decimales en LCD
« en: 23 de Septiembre de 2004, 08:22:00 »
Hola chicos!.

Yo ya hice un termometro que tiene un ADC0831 como conversor,un LM35 como sensor y en estos momentos estoy mostrando la temperatura sin precision es decir valores enteros ej: 25 C.

Lo que necesito es mostrar la temperatura con 1 digito decimal de precision ej: 25,4 C.La resolucion de este AD es de 8 bits.
Yo he visto por ahi que se puede usar el comando LCDOUT con algunos argumentos. pero antes de esto hacen una dicision usando los simbolos "/" y "//" quelo que hacen es dividir la parte entera y la parte fraccionaria.

Quisiera saber si alguien tiene experiencia en esto y como lo hizo o si hay una practica de hacerlo sin mucho revuelo.Lo que quiero evitar es de poner un operacional para acondicionar la señal.

Repito se quese puede hacer pero no tengo experiencia en eso.


Agradecere me puedan dar una mano.


Saludos a todos !


gabriel (crisec80)

Desconectado tonyusp

  • PIC10
  • *
  • Mensajes: 17
RE: Necesitomostrar una temperatura con decimales en LCD
« Respuesta #1 en: 24 de Septiembre de 2004, 01:58:00 »
No se especificamente que es lo que quieres hacer pero lo dice en el manual de PBP es lo siguiente:

PBP efectua divisiones de 16 x 16 bit . El operador ´/ ´devuelve el resultado de 16 bit . El operador ´// ´
devuelve el resto ( módulo del número).

Ejemplo
W1 = W0 / 1000 ´ Divide el valor de W0 por 1000 y coloca el resultado en W1
W2 = W0 // 1000 ´ Divide el valor de W0 por 1000 y coloca el resto en W2

Aqui tienes una rutina rapida como ejemplo:

cont VAR WORD
sor VAR WORD
res VAR WORD
tado VAR WORD

loop:
sor=5
For cont=1 to 255
LCDOut $FE,1
LCDOut "Div",#cont," por ",#sor
res=cont/sor
tado=((cont//sor)*100)/sor
LCDOut $Fe,$C0
LCDOut #res,",",#tado
Pause 1000
Next cont
GoTo loop

un abrazo
Tony

Desconectado MarquesSalsero

  • PIC18
  • ****
  • Mensajes: 467
RE: Necesitomostrar una temperatura con decimales en LCD
« Respuesta #2 en: 24 de Septiembre de 2004, 05:45:00 »
En tu caso lo tienes dificil, pero no por que el asunto sea dificil, ya que es muchisimo mas sencillo de lo que parece y de hecho esto, exactamente esto, ya se ha tratado en otras cadenas de mensajes y a poco que hubieses buscado lo habrias encontrado.

El problema es que si quieres mostrar una medicion entre -10C y 40C, que es lo minimo que se le deberia pedir a un termometro, con una precision de una decima necesitaras al menos la posibilidad de contar de 0 a 500 ( diferencial entre maximo y minimo multiplicado por 10 que son las decimas ). Dado que no dispones mas que de un convertidor de 8 bits lo maximo que vas a tener es una cuenta de 256.... asi que tu idea descartada.

Lo que si puedes hacer es contentarte con un decimal pero con precision de 0.2.

Es decir en vez de mostrar 0.1 0.2 0.3 etc.. podras mostrar 0.2 0.4 0.6 etc..


El como hacerlo es muy sencillo, simplemente trabaja con multiplos de lo que deseas mostrar. Si deseas mostra el valor con un decimal y precision de una decima trabaja en todo moento con los valores multiplicados por diez. En este cso la medicion de 13.5 grados la trabajaras como 135 y puedes en todo momento usar enteros sin ningun problema, que deseas tener dos decimales pues multiplica por cien y en ese caso la medicion de 16,25 grados ( si tienes un sensor con esa precision ) la trabajaras como 1625.

A la hora de enviarlo al LCD lo que deberas hacer es por ejemplo para un decimal.

Si la variable temp_leida contiene tu lectura de 135 que corresponde a 13.5 enviaras

temp_leida/10

pondras el caracter de punto ( o coma dependiendo de como se haga en tu tierra ) y a continuacion enviarás

temp_leida-((temp_leida/10)*10).

En la operacion de dividir temp_leida por diez y luego multiplicarla por diez, al no trabajar con decimales lo que habremos hecho es lo siguiente:

135/10=13 ( al no tener decimales se decarta el resto )
13*10=130
135-130=5

Esto se puede usar para cualquier numero de decimales y/o precision.

Si quieres trabajar con un precision de 0.2 en vez de multiplicar por diez lo haras por cinco, con lo cual una lectura de 13.5=13.5*5 que es 67.5 que al trabajar sin decimales se queda en 67 y cuando al final lo dividamos de nuevo por 5 nos quedarán 13.4 ( como ves la precision será de 0.2 y no de 0.1 )

Ya se que me suelo liar un poco al escribir sobre la marcha, pero espero que te haya quedado algo mas claro.
Hay 10 tipos de personas las que entienden binario y las que no

Desconectado crisec80

  • PIC10
  • *
  • Mensajes: 20
RE: Necesitomostrar una temperatura con decimales en LCD
« Respuesta #3 en: 24 de Septiembre de 2004, 08:07:00 »
Mira marquez:

En primer lugar te aclaro que no he buscado los emails como decis vos porque no me sobra tiempo yaque trabajo todo el dia.Quizas a vos te sobra.....a mi no...ok?


En segundo lugar muy lindo lo que me explicaste pero investigando en la web y preguntando a algunos amigos me dicen que si se puede leer con precisión con un conversor de 8 bits y aca  esta la rutina.Está  basada en un conversor de 10 bits pero igual sirve para mi:


use the DEC modifier. Here"s one example using
A/D to get
better precision.
 
> Define ADC_BITS 10          " Set number of bits in result
 > Define ADC_CLOCK 3       "  Set clock source /32
 > Define ADC_SAMPLEUS     50 " Set sampling time in uS
 > ADval var word                 " Variable for 10-bit A/D
 > result
 > Quanta  con 1251             " +Vref = 5V (adjust Quanta
 > if +Vref changes)
 >                                           " 10-bit A/D resolution =
 > 5V/1023 = 4.887586 mV
 >                                               " Quanta = 4.888 mV * 256 = 1251
 >                                                       " If +Vref = 4.95V then
 > Quanta = 4.95/1023*256 = 1238
 >   TRISA = 1                                   " Set PORTA.0 = input
 >  ADCON1 = %10001110 " Set PORTA.0 = analog , right justifresult
 >     PAUSE 2000
 >
 > loop:
 >     ADCIN 0,adval  " Read A/D channel 0 into ADval
 > variable
 >     ADval = ADval */ Quanta   " Middle 16-bits of  ADval * Quanta

 >  HSEROUT [dec ADval dig 3,".",dec3 ADval,13,10]

 >     Pause 100"250      " Wait 1/4 seconds
 >     Goto loop           " Do it forever
 >  End

Y en el libro de " programming with picbasic lenguage" hay una rutina con LM35 y conversor de 8 bits que tambien usa un algoritmo simple y muestra el valor con decimales.

Todo esto es muy lindo pero me confunde porque no se quien tiene el conocimiento correcto.

Escrito originalmente por MarquesSalsero
En tu caso lo tienes dificil, pero no por que el asunto sea dificil, ya que es muchisimo mas sencillo de lo que parece y de hecho esto, exactamente esto, ya se ha tratado en otras cadenas de mensajes y a poco que hubieses buscado lo habrias encontrado.

El problema es que si quieres mostrar una medicion entre -10C y 40C, que es lo minimo que se le deberia pedir a un termometro, con una precision de una decima necesitaras al menos la posibilidad de contar de 0 a 500 ( diferencial entre maximo y minimo multiplicado por 10 que son las decimas ). Dado que no dispones mas que de un convertidor de 8 bits lo maximo que vas a tener es una cuenta de 256.... asi que tu idea descartada.

Lo que si puedes hacer es contentarte con un decimal pero con precision de 0.2.

Es decir en vez de mostrar 0.1 0.2 0.3 etc.. podras mostrar 0.2 0.4 0.6 etc..


El como hacerlo es muy sencillo, simplemente trabaja con multiplos de lo que deseas mostrar. Si deseas mostra el valor con un decimal y precision de una decima trabaja en todo moento con los valores multiplicados por diez. En este cso la medicion de 13.5 grados la trabajaras como 135 y puedes en todo momento usar enteros sin ningun problema, que deseas tener dos decimales pues multiplica por cien y en ese caso la medicion de 16,25 grados ( si tienes un sensor con esa precision ) la trabajaras como 1625.

A la hora de enviarlo al LCD lo que deberas hacer es por ejemplo para un decimal.

Si la variable temp_leida contiene tu lectura de 135 que corresponde a 13.5 enviaras

temp_leida/10

pondras el caracter de punto ( o coma dependiendo de como se haga en tu tierra ) y a continuacion enviarás

temp_leida-((temp_leida/10)*10).

En la operacion de dividir temp_leida por diez y luego multiplicarla por diez, al no trabajar con decimales lo que habremos hecho es lo siguiente:

135/10=13 ( al no tener decimales se decarta el resto )
13*10=130
135-130=5

Esto se puede usar para cualquier numero de decimales y/o precision.

Si quieres trabajar con un precision de 0.2 en vez de multiplicar por diez lo haras por cinco, con lo cual una lectura de 13.5=13.5*5 que es 67.5 que al trabajar sin decimales se queda en 67 y cuando al final lo dividamos de nuevo por 5 nos quedarán 13.4 ( como ves la precision será de 0.2 y no de 0.1 )

Ya se que me suelo liar un poco al escribir sobre la marcha, pero espero que te haya quedado algo mas claro.

Desconectado crisec80

  • PIC10
  • *
  • Mensajes: 20
RE: Necesitomostrar una temperatura con decimales en LCD
« Respuesta #4 en: 24 de Septiembre de 2004, 08:10:00 »
Mil gracias Tony por la practica explicacion.Otro abrazo para vos.




Escrito originalmente por tonyusp
No se especificamente que es lo que quieres hacer pero lo dice en el manual de PBP es lo siguiente:

PBP efectua divisiones de 16 x 16 bit . El operador ´/ ´devuelve el resultado de 16 bit . El operador ´// ´
devuelve el resto ( módulo del número).

Ejemplo
W1 = W0 / 1000 ´ Divide el valor de W0 por 1000 y coloca el resultado en W1
W2 = W0 // 1000 ´ Divide el valor de W0 por 1000 y coloca el resto en W2

Aqui tienes una rutina rapida como ejemplo:

cont VAR WORD
sor VAR WORD
res VAR WORD
tado VAR WORD

loop:
sor=5
For cont=1 to 255
LCDOut $FE,1
LCDOut "Div",#cont," por ",#sor
res=cont/sor
tado=((cont//sor)*100)/sor
LCDOut $Fe,$C0
LCDOut #res,",",#tado
Pause 1000
Next cont
GoTo loop

un abrazo
Tony

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Necesitomostrar una temperatura con decimales en LCD
« Respuesta #5 en: 24 de Septiembre de 2004, 11:06:00 »
Crisec80, creo que no has entendido correctamente la respuesta de Marqués. Él no te dice que no puedas leer el sensor con precisión, te dice que no lo puedes leer con una resolución superior a la que aportan 8 bits, que es de 256 posiciones.

En el ejemplo que has puesto, el sensor de 10 bits arroja una resolución cuatro veces superior al que tú tienes, es decir, que puedes leer hasta 1024 posiciones diferentes.

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: Necesitomostrar una temperatura con decimales en LCD
« Respuesta #6 en: 24 de Septiembre de 2004, 16:48:00 »
Hola:
Pues no quiero quedar descolgado pero por que no usas un 877 que tiene un ad de 10 bits ,con lo que tu resloucion sera cuando le ingreses 5 volts el ad entregara el numero 1023 ,aqui te mando un programita ya hecho a ver si te ayuda
No le des bolilla a las rpm estaba hecho para medir rpm y temperarura con un LM35 .
Espero te sirva de algo
saludos
khasistos
  Name    : adrpm.BAS  
"*  Date    : 01/05/04

 
          DEVICE = 16F877
        XTAL = 20


   LCD_DTPIN = PORTD.4   
   LCD_RSPIN = PORTE.0
   LCD_ENPIN = PORTE.1
   LCD_INTERFACE = 4   " 4-bit Interface
   LCD_LINES = 2
   LCD_TYPE = 0
       
          ADIN_RES   10               " Set the resolution to 10
        ADIN_TAD   FRC               " Choose the RC osc for ADC samples
          ADIN_STIME   100                 " Allow 100us for charge time
       
        Dim Raw       as Word         
       Dim Value       as Word
          Dim Volts       as Byte
          Dim Millivolts    as Word   
        DIM RPM as WORD " Declare a word size variable
        Delayms 500                  " Wait for PICmicro to stabilise
        Cls
      TRISB.1=1                         " Clear the LCD
       TRISA.0 = 1                  " Setup bit-0 of PortA as an input
          ADCON1 = %10000010            " Set PORTA analog and right justify result
Again:    Raw = ADIN 0               " Read the ADC
       
        Value = 489 *(Raw / 10)         " Quantasize the result
        Volts = Value / 10000
       Millivolts = (Value // 10000) / 100
          Print at 1,1,Dec1 Volts,".",Dec2 Millivolts,"V" " Display the result
       Delayms 30
      

 
RPM = COUNTER PORTB.1 , 50 " Variable WRD now contains the Count
Print at 2,1, "RPM = ", DEC RPM *20" Display the decimal result on the LCD
goto Again        

Desconectado MarquesSalsero

  • PIC18
  • ****
  • Mensajes: 467
RE: Necesitomostrar una temperatura con decimales en LCD
« Respuesta #7 en: 25 de Septiembre de 2004, 03:53:00 »
Lo siento, pero despues de esa contestacion....
Hay 10 tipos de personas las que entienden binario y las que no

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: Necesitomostrar una temperatura con decimales en LCD
« Respuesta #8 en: 25 de Septiembre de 2004, 07:06:00 »
Hola.
Solo puse un post con un ejemplo de uso de un Lm35 y el ad del 877 ,no creo haber sido ofensivo para nadie ,incluso a la programacion......No le veo el "enganche" con mi post a menos que hagas referencia a otro anterior, Marques,si es asi aclaralo pues parece que he puesto una burrada........cosa que no veo pues es un programa que esta funcionando ,pero si cometi un error dejamelo enmendar.....

Saludos
khasistos

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Necesitomostrar una temperatura con decimales en LCD
« Respuesta #9 en: 25 de Septiembre de 2004, 08:26:00 »
No te preocupes Khasistos, creo que es evidente que Marqués no se refiere a tu post...

Desconectado MarquesSalsero

  • PIC18
  • ****
  • Mensajes: 467
RE: Necesitomostrar una temperatura con decimales en LCD
« Respuesta #10 en: 26 de Septiembre de 2004, 05:52:00 »
Escrito originalmente por nocturno66
No te preocupes Khasistos, creo que es evidente que Marqués no se refiere a tu post...


Por supuesto que no...
Hay 10 tipos de personas las que entienden binario y las que no

Desconectado Nillton

  • PIC10
  • *
  • Mensajes: 22
RE: Necesitomostrar una temperatura con decimales en LCD
« Respuesta #11 en: 22 de Noviembre de 2005, 21:06:00 »
Bueno, Yo tampoco he podido lograr mayor resolucion con 8 bits, si alguien sabe como seria estupendo que lo dijera claramente.
Por lo pronto les envio este enlace.
http://www.engineering.uiowa.edu/~ggerling/HANDSONENG/Documentation/ExperimentsDoc/analog_digital/baad3.pdf#search="resolution%20adc0831"
Creo que al leerlo nos daremos cuenta quien tiene razon y cuanta.
Saludos de Arequipa Peru