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.