TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Eyedol en 21 de Agosto de 2006, 22:33:39

Título: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Eyedol en 21 de Agosto de 2006, 22:33:39
Tengo un grave problema amigos no se que hacer con un pic 16f877a  estoy leyendo una entrada analogica por el AN0 todo funciona bien el lcd y entrada pero me tiene confundido la resolucion que muestra este micro tiene entradas analogas de resolucion 10 bit (0-1023)

pero cuando envio el valor de la variable al lcd me da valores desde 0-65535 algo asi como 16bit pero no lo son porque van avanzando a medida que muevo el potenciometro en el puerto analogo de 64 en 64 osea que al final son 1024 cuentas pero PORQUE MUESTRA DE 0 A 65535?

ADEMAS E REALIZADO MUCHISMAS PRUEBAS Y ME SIGUE DANDO RESULTADOS INSATISFACORIOS ADJUNTO EL CODIGO EN EL CODIGO SE VE TRANTANDO DE REFLEJAR UN VALOR DE O A 100 PERO NO HACE LO ESPERADO TAMBIEN ENVIA UN DATO POR EL PUERTO SERIE Y TAMPOCO LO HACE BIEN:

NOTA: EL POTENCIOMETRO ES DE UN MEGAOHNMIO EN EL AN0 OSEA VARIA MUY FINAMENTE. TAMBIEN E PROBADO COLOCAR # EN VES DE DEC A VER SI FUNCIONA Y ES LO MISMO.  :( :( :(


define OSC 20
include "modedefs.bas"
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTB
Define  LCD_RSBIT       0
Define  LCD_EREG        PORTB
Define  LCD_EBIT        1
Define  ADC_BITS 10   

pause 1000

input portb.6
output portb.7

b1 var byte
variable var word
temp var byte


pause 500
lcdout $FE,1,"PRUEVA LCD"
gosub boton

boton:
button portb.6,0,100,10,b1,1,enviar
gosub boton

enviar:
high portb.7
pause 100
low portb.7

ADCIN 0,variable  ' Lea el canal 0 a variable
pause 500

temp = (variable*100)/1023

lcdout $FE,1,dec variable," ",dec temp

serout portb.5,2,[variable]

gosub boton
end

Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: navaismo en 22 de Agosto de 2006, 00:05:54
Hola mira asi de una vista rapida tu programa esta medio rarito no? 

mira cuando haces esto
pause 500
lcdout $FE,1,"PRUEVA LCD"
gosub boton

boton:
button portb.6,0,100,10,b1,1,enviar
gosub boton

tienes 2 gosub boton lo cual tu programa va a estar ahi siempre porque no veo por donde lo saques de esa rutina, luego lo que ves en el lcd y lo que mandas a la pc es

lcdout $FE,1,dec variable," ",dec temp

serout portb.5,2,[variable]


y la variable arriba la definiste como word

b1 var byte
variable var word
temp var byte

aca te dejo unna rutina que hice es muy basica para medir temperatura y mostrarla en un lcd esta en este post.
http://www.todopic.com.ar/foros/index.php?topic=12300.0

dale una checadita a la parte que te digo y tambien porque no checa el programa que puse ahi en el link y te das una idea.  si no de todas formas aca vemos que onda
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Eyedol en 22 de Agosto de 2006, 12:42:36
navaismo amigo gracias por tu rapida respuesta....

mira acepto lo que me dices acerca de esas rutinas solo estan hay porque es codigo reciclado de otros programas que habia hecho esperimentando un poco.

mi problema en si, no es lo de las variables porque las e puesto byte word etc.  y igual me pasa lo mismo. El problema esta en que cuando envio la VARIABLE "variable" al lcd me envia un numero del 0 al 65472 variando de 64 en 64 que quiero decir pues que tiene 1024 cuentas (contando el cero) porque 64*1023 = 65472 y eso es lo que me muestra en el lcd cuando tengo la entrada a 5 VDC.  Otra cosa es que no se como hacer una rutina para tomar esta variable y convertirlo en algo entendible para un usuario por ejemplo una medicion de temperatura de 0 a 100 ºC o una presion de 0 a 200 psi (claro esta tomados de unos sensores). e visto como lo hacen con 8 bits ejemplo.

temp = (variable*100)/255 algo asi pero hago esto con 10bit y me da algo estraño menos lo esperado ejem:

temp = (variable*100)1023

soy nuevo en esto asi que disculpen que sea tan chivo. actualemte estoy leyendo tu articulo pero esta algo largo y no soy muy dado a la programacion.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: navaismo en 22 de Agosto de 2006, 13:02:28
Hola mira lo del link no te hagas muchas bolas ya que lo unko que hice fue anexar a la rutina de punto flotante una simple linea.

MIra te muestro. sin el punto flotante la rutina quedaria asi:


Define  __16F877    1       ' DEFINICION DE MCU

Define   LCD_DREG   PORTD
Define   LCD_DBIT   4
Define   LCD_RSREG   PORTA   ' DEFINICION DE LOS REGISTROS DEL LCD
Define   LCD_RSBIT   2
Define   LCD_EREG   PORTA
Define   LCD_EBIT   5

Define   ADC_CLOCK      3   ' PONIENDO EN 3 EL RELOJ DE LA FUENTE
Define   ADC_BITS     10     ' NUMERO DE BITS DEL RESULTADO
Define   ADC_SAMPLEUS  15   ' SETEO DEL TIEMPO DE MEDICION


  TRISA  = 11           ' PUERTO A 3 ENTRADAS Y 3 SALIDAS                                                           
  TRISB  = 127
  ADCON1 = 142            ' PUERTO A COMO ADC Y JUSTIFICACION A LA DERECHA
 

   
   
  Low PORTA.4          ' APAGO LINEA DEL LCD R/W (W)
  Pause 500              ' PAUSA PARA LCD
   
   
sensor       var byte   ' VARIABLE PARA GUARDAR EL VALOR DE ADC   
temp         var  word


TERMO VAR PORTA.0


INIT:

 lcdout $fe,1, " TEMPERATURA DE:"
 LCDOUT $FE,$C0,dec temp," ßC"

 
 ADCIN  TERMO, sensor
 
 

 temp=(sensor*104)

goto init


obviamente solo mostrara enteros si es un numero decimal solo habra ceros, de igual forma yo no puse voltajes de referencia lo cual hace bastante inexacta la rutina pero cuando la probe en el protoboard solo fallaba por 1 o 2 grados, cosa que no me molesto mucho.

el sensor que use es el famoso lm35 dz que segun se te entrega 10mV por cada grado, lo cual me ayudo a no hacer mas operaciones ni nada.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Eyedol en 22 de Agosto de 2006, 16:03:57
amigo e copiado el codigo que me diste y aun asi no me da los resultados esperados osea quisiera simplemente escalar la señal de entrada analogica y mostrarla de 0 a 100% en el display. al mostrar la variable no hay problema muesta un valor de que parte desde 0, 64, 128, 192 ......65472.  pero si trato de mostrar un valor que refleje lo que en verda estoy midiendo temperatura o lo que sea pues se queda fijo en 0 o hace otras cosas menos lo esperado.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: navaismo en 22 de Agosto de 2006, 17:38:30
haber haber, ese  ejemplo lo probe, midiendo temperatura y me mostraba la escala de la temperatura real +/- 2 grados lo ponia en la del lcdout DEC temp. haber sube el codigo para que lo cheque aca y lo simule talvez pueda ayudarte
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Eyedol en 22 de Agosto de 2006, 19:42:23
Amigo mira el siguiente codigo:

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [set under view...options]                        *
'*  Notice  : Copyright (c) 2006 [set under view...options]     *
'*          : All Rights Reserved                               *
'*  Date    : 22/08/2006                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
 define OSC 20
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTB
Define  LCD_RSBIT       0
Define  LCD_EREG        PORTB
Define  LCD_EBIT        1

adval  var word               'Create adval to store result
x var byte
y var byte

   TRISA = %11111111     ' Set PORTA to all input
    ADCON1 = %10000010    ' Set PORTA analog and RIGHT justify result
   ADCON0 = %11000001   ' Configure and turn on A/D Module
    Pause 500          ' Wait .5 second


loop:       ADCON0.2 = 1               'Start Conversion

notdone:   pause 5
         if ADCON0.2 = 1 Then notdone   'wait for low on bit-2 of ADCON0, conversion finished

         adval.highbyte = ADRESH         'move HIGH byte of result to adval
         adval.lowbyte = ADRESL         'move LOW byte of result to adval
         x = (adval*100)
         y = x/1023
          Lcdout $fe, 1               'Clear screen
           Lcdout "Value: ", DEC adval      'Display the decimal value
            lcdout $fe,$c0,dec x, " ",dec y

           Pause 100                   'Wait .1 second

             Goto loop                   'Do it forever
           End

      ....Lo obtube de la pasigina del pic basic la variable adval si es enviada al lcd de 0 a 1023 uno a uno excelente. si te das cuenta le agregue algo de codigo (las variable "x" e "y" y el codigo de calculo) pero los la variable "y" en el display sienpre esta en 0 y la variable x no es linial osea muestra numeros sin orden. creo que este esta mas facil que opinas?


ademas si puedes ayudarme a comprender que es lo que sucede con el "ADCIN chanel, var" como usarlo (algo que no sea lo que esta en la ayuda del pbp) y lo que pasa cuando envio los datos al lcd. etc ya sabes. gracias por tu apoyo amigo.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Mario en 23 de Agosto de 2006, 00:43:52
Eyedol.

Utiliza este enlace:http://www.rentron.com/PICX2.htm

Prueba con ese código a ver si te presenta algo mejor.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: flacoclau en 23 de Agosto de 2006, 00:55:18
Hola Eyedol: el problema que tienes creo es que el dato que sacas por an0 está justificado a la izquierda, y no a la derecha como debería ser. te doy el ejemplo más simple de porqué te avanza de 64 en 64:
 por ejemplo si el adc te mide el valor 1 y el resultado lo justificas a la derecha el resultado que te queda es así

                             00000000  00000001 = 1 decimal

Por el contrario si lo justificas a la izquierda te queda así:

                             00000000  01000000 = 64 decimal

se entiende?
saludos.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Mario en 23 de Agosto de 2006, 01:07:17
Eso es cierto flacoclau  :o.

Pero si Eyedol dice:
   TRISA = %11111111     ' Set PORTA to all input
    ADCON1 = %10000010    ' Set PORTA analog and RIGHT justify result   
ADCON0 = %11000001   ' Configure and turn on A/D Module

sería algo muy extraño que no se compilara bien.

Eyedol, descarta el enlace que te puse.
Ese enlace utiliza la justificación a la izquierda (como sugiere Flacoclau) y no te servirá para 10 bits (lo siento  :? me confundí).
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: navaismo en 23 de Agosto de 2006, 12:56:37
 :shock:

haber corriganme si me equivoco por favor. cuando yo uso el adc lo configuro asi

 ADCON1 = 142            ' PUERTO A COMO ADC Y JUSTIFICACION A LA DERECHA
 
y los resultados que despliego me salen como quiero no uso el adcon0 nunca lo he usado y poner eso seria lo mismo a

 ADCON1 =   %10001110          ' PUERTO A COMO ADC Y JUSTIFICACION A LA DERECHA
saludos

creo que he vivido en un engaño jijijiji tengo que replantear muchos programas
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Mario en 23 de Agosto de 2006, 15:31:18
Hola Navaismo.

Si usas PBP para adquirir la información de conversión (ADCIN canal, variable) no utilizas el ADCON0.

El ADCON0 lo usas si no utilizas la instrucción ADCIN.

Si tienes el microcode studio Plus has una simulación adquiriendo datos del A/D y fíjate en el registro ADCON0, verás lo que digo.

El ADCON1 es necesario, el ADCON0 no lo es (si usas PBP claro).

Espero ayude.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: navaismo en 24 de Agosto de 2006, 00:00:11
si asi es, uso PBP 2.46 con el MCSP v2.3 y siempre uso el adcon1   con el ADCIN volvi a probar el ejemplo que le puse a eyedol y me funciona bien.           
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: electronando en 24 de Agosto de 2006, 00:44:56
haber analizando tu codigo veo una falta aca
ADCIN 0,variable  ' Lea el canal 0 a variable
pause 500

temp = (variable*100)/1023
estas dividiendo entre 1023 lo cual esta mal se divide entre la cantidad de pedazos que serian 1024 y ademas no estas trabajando con variables con punto flotante entonces mira no te hagas bolas 100/1024=0.0976562 , en vez de trabajar con esas unidades prueba temp=variable*97 y a tu resultado lo divides entre 1000(pero mentalmente y eso es tu resultado aprox ni se te ocurra hacerlo en el programa del pic) y puedes mostrar en el lcd los valores en caso sea 100 voltios como maximo seria lo q muestres 100000 milivoltios solo cambian las unidades para que torturar tanto al compilador
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: navaismo en 24 de Agosto de 2006, 19:43:01
Jovenes!!!!, de plano ya me hice bolas, a ver sia lguno de ustedes me puede sacar de dudas segun yo el codigo que  esta aca http://www.todopic.com.ar/foros/index.php?topic=12300.0 (que como veran adapte el adcin a las rutinas de punto flotante, pa que luego no digan que me pirateo el programa). Mide la temperatura mas menos 2 grados porque porque tambien segun yo el lm35 dz entrega de -1V a 6v por lo cual mis vrefs son 0 y 5v.

ahora por lo que he estado viendo es muy probable que no entregue lo que es. Quisiera alguien probarlo y decirme que pasa.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Mario en 24 de Agosto de 2006, 23:30:43
Pues yo YA me hice bolas con el código ese navaismo  :D

Cuando he tenido que hacer algo parecido (también use ese sensor) siempre trato de linealizar el sensor (sacar la ecuación de la recta).

Para ese caso si mal no recuerdo (fue en el 2004) use este ejemplo: http://www.rentron.com/PicBasic/LM34.htm

Son 8 bits pero se pueden ajustar a 10 bits.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Eyedol en 28 de Agosto de 2006, 09:57:52
Saludos amigos hace dias no me conectaba ya estoy aqui.... Gracias por aclararme varias dudas. aun me quedan algunas. veo que cuando utilizo "ADCIN canal, Variable" no necesito utilizar "ACON0" ya tengo ejemplo de como obtener los datos con los 10 bits con el adcon0 y el adcin pero me quedan unas dudas. creo que es lo mas simple. cuando utilizo el ejemplo del ultimo codigo que les mande (el que utiliza adcon0 para obtener el canal 0) enviando la variable directament al display osea esto:

adval.highbyte = ADRESH         'move HIGH byte of result to adval
adval.lowbyte = ADRESL         'move LOW byte of result to adval
Lcdout $fe, 1               'Clear screen
Lcdout "Value: ", DEC adval      'Display the decimal value

puedo observar en el display valores que van desde 0 a 1023. Ahora como hago para enviar digamos valores de 0 a 100%. se que electroando me ha dado un ejempo al respecto voy a ver como me va luego te cuento.


Ahora bien con respecto al adcin (mi dolor de cabeza) cuando envio los datos al display directamente eso es esto:

adcin 0,variable
pause 250

lcdout $FE,1,dec variable

me da valores que van desde 0 hasta 65472. los valores van de 64 en 64 porque? aunque es claro que la resolucion es de 1024 pues 65472/64 =1023 (mas el 0 son 1024). como haria en este caso para mostrar lo recivido por el puerto analogo en el display en valores de 0 a 100%.  bueno imagino que es como sugiere electroando pero si pueden darme un codigo o una ecuacion de ejemplo para entender. aunque pienso corrijanme si me equivoco que mis ecuaciones estan bien solo que  no lo doy el tratamiento adecuado a los datos (punto flotante) bueno saludos.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: navaismo en 28 de Agosto de 2006, 12:45:52
Pues si quieres mostrar valores de 0 a 100% digamos que 1024 es el 100% porque no intentas una regla de tres tomando que 0=0% y 1024=100%
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: electronando en 28 de Agosto de 2006, 17:07:38
aja oye eyedol si tenias razon con lo del los valores q te salian de 65472 creo esto esta escrito en el manual del picbasic pro actualizado me refiero descargate el manual de la misma pagina de melabs no uses los manuales antiguos alli hablan sobre ese problema eso te sale por lo de q en la configuiracion para 10 bits adcon.7=1 y creo para configuracion de 8 bits adcon.7=0 claro esto previamente usando en la cabecera los respectivos defines , usa el ejemplo que te comente
pero hay que tener cuidado tambien por ejemplo tedoy lo de un voltimetro que funciona con una resolucion aceptable , veamos , es para un rango de 0 a 5 voltios lo que debe salir por el lcd , lo que (aca si me entro la duda entre 1023 o 1024) bueno probare por 1023  la constante o razon de cambio sera (vmax-vmin)/1023=5/1023=0.004887 lo cual acercare a 0.0049  que es igual a 49/10000  y mira lo q te comente era multiplicar por ejemplo volt=variablemedida*49/10000 que me dara el valor entero y milivolt=variablemedida*49//10000 que me dara el valor del residuo o los decimales y se muestra en el lcd asi :dec1 volt,"." dec4 milivolt  , ojo esto debes de tener en cuenta no pasarte la variable word pues fijate aca variablemedida*49(no debe de pasarse 65536)  si es que por la resolucion variablemedida al maximo me dara 1023 entonces 1023*49= 50127 uf con las justas hasta alli te puedo ayudar no se una idea para hacer mas grande la multiplicacion o no lo e probado pero se podria usar la operacion */ creo q te da los bits medios de el resultado de 32 bits  :mrgreen:
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Mario en 29 de Agosto de 2006, 02:00:48
Precisamente lo que dices electronando.
4.88 milivolts por cada bit a 10 bits.

Cuando me pasa eso yo uso la instrucción DIV32 y no he tenido mayor problema que ajustar a menos de los 65535 (si quiero 5.0000, 5000.0, 500.00, etc.) o cualquier cantidad que requieras.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: navaismo en 29 de Agosto de 2006, 02:11:09
AAAAAAAAAHHHHHHHHH, me estoy volviendo loco.........

Bueno he repaso una y otra vez este post, y nada quedo peor. Repito alguein seria tan amable de checar el codigo que puse en el link de unos mensajes arriba. lo unico que anexe fue el adcin y reflejar la variable en las del punto flotante. Porque me interesa, porque todos mis programas estan basados en ese metodo, normalmente nunca hago ecuaciones, ni nada el dia que probe con el link de rentron que me paso mario cuando me tenia que dar 1024 me daba 1068 y cuando tenia que dar 2 me daba 4 u 8.

Haber segun he explicado hasta el cansancio sin respuesta alguna usando el lm35 (y checando en el mismo foro otros post, me confundo mas y mas) este sensor entrega 10mV por cada grado es decir cuando el lm35dz me de 10mV en el adc voy a tener un 2 decimal que equivale a 1ºC y asi sucesivamente, por ejemplo cuando me de 30mV voy a tener 3ºC y en el ADC un 6 decimal.

Podria alguien desmentirme uso 10 bits y justificado a la derecha. ¿Entonces para que hacer tantas ecuaciones y un promedio si al final me sale diferente?
Ayudad a este pobrre ciego a ver jijiji
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Mario en 30 de Agosto de 2006, 04:22:25
Hola Navaismo.

 :? MMMmmmmmmmmmmmmmmmmmmmmmmm :?


El código que pones no le entiendo aqui:


Define   ADC_CLOCK      3   ' PONIENDO EN 3 EL RELOJ DE LA FUENTE
Define   ADC_BITS     10     ' NUMERO DE BITS DEL RESULTADO
Define   ADC_SAMPLEUS  15   ' SETEO DEL TIEMPO DE MEDICION


  TRISA  = 11           ' PUERTO A 3 ENTRADAS Y 3 SALIDAS
  TRISB  = 127
  ADCON1 = 142            ' PUERTO A COMO ADC Y JUSTIFICACION A LA DERECHA
   
   
sensor       var byte   ' VARIABLE PARA GUARDAR EL VALOR DE ADC   

TERMO VAR PORTA.0

ADCIN  TERMO, sensor
 
 resulthold= (sensor*104)    

Si utilizas el ADC de 10 bits no estás tomando las lecturas adecuadas a la hora de hacer los cálculos porque como dice flacoclau:
por ejemplo si el adc te mide el valor 1 y el resultado lo justificas a la derecha el resultado que te queda es así

                             00000000  00000001 = 1 decimal

Por el contrario si lo justificas a la izquierda te queda así:

                             00000000  01000000 = 64 decimal


Tu tienes justificado a la derecha por lo que alcanzarías tu máximo aqui:
0000 0011 1111 1111.

Si tomamos la referencia de Electronando y hacemos (5v/2^n-1 bits) = (5v/1023 bits) = 4.887 milivots por cada bit del ADC para 10 bits.

Si tuvieras los 10 bits serían 4.999401 volts (se pierde exactitud en la resolución por el redondeo).

Al definir SENSOR como byte lo máximo que estás adquiriendo es: 0000 0011 1111 1111.
Lo anterior se traduce en (255) (4.887 milivotls) = 1.246185 que, para cuestiones prácticas vendría dándonos como 124.6 grados. Todo eso multiplicado por 104 que nos daría: (104) (1.246185) = 129.60324 grados.

Al multiplicar por 104 aumentas a casi 130 grados tu medición lo cual está dentro del rango (+155).
 

Con lo que comentas:
Haber segun he explicado hasta el cansancio sin respuesta alguna usando el lm35 (y checando en el mismo foro otros post, me confundo mas y mas) este sensor entrega 10mV por cada grado es decir cuando el lm35dz me de 10mV en el adc voy a tener un 2 decimal que equivale a 1ºC y asi sucesivamente, por ejemplo cuando me de 30mV voy a tener 3ºC y en el ADC un 6 decimal.

Podria alguien desmentirme uso 10 bits y justificado a la derecha. ¿Entonces para que hacer tantas ecuaciones y un promedio si al final me sale diferente?
Ayudad a este pobrre ciego a ver jijiji


Ese sensor es de -55 a 150 grados, te da 10 mV/grado.
Si tienes 2 en el ADC tienes (2*0.004887) = 0.009774 =>   9.774 mV => casi un grado pero no es un grado.

Si tienes 6 en el ADC tienes (6*0.004887) = 0.029332 => 29.332 mV => Poco mas de 29 grados pero lejos de 30 grados.

Si tomamos esto como referencia tendremos que:
Si tienes 255 en el ADC tienes (255*0.004887) = 1.246185 => 1246185 mV => 124.6185 grados; como multiplicas por 104 tenemos que te da 129.60324 grados, que no se parece a 127.5 grados.

Eso es lo que yo veo del código (mencionas que +- Vref son 5 y 0).

No pienses en 10 mV/grado, piensa en cuántos bits del convertidor son necesarios para que te den 10 mV y por ende, un grado; dos bits no te dan 10 mV.
Veo que tu redondeas a 5mV cada bit (lo cual no está mal).

Si solo utilizarás los 8 bits de menor peso en el convertidor para tus cálculos, no necesitas usar el AD a 10 bits, puedes definir que usarás 8 en el DEFINE ADC_BITS.

Espero no hacerte mas bolas  :D.

Por eso uso la DIV32, te ayuda mas y sería una solución para lo que propone electronando.

Saludos.
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: navaismo en 30 de Agosto de 2006, 12:15:54
Ah gracias, que "toy" me vi jeje, eso de deifnir la variable como byte, no me habia fijado. BUeno gracias voy a probar todo lo que me dicen
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: Eyedol en 03 de Septiembre de 2006, 13:24:55
Saludos amigos yo ya he entendido todo lo que me han dicho gracias por su colaboracion creo que con todo esto esta claro que es lo que pasaba. yo tambien habia declarado mi variable como BYTE ese era uno de mis problemas ademas que no sabia que para usar adcin habia que usar justificacion a la derecha. bueno quiero hacer un nuevo tema con un problema derivado de este y es tener precision en los resultados enviados al LCD (Con decimales y todo) pero sin usar punto flotante. si alguien sabe algo aviseme. Gracias por su colaboracion  :lol: :lol: :lol: :-/ :-/ :-/ :-/. ah adjuno el codigo que realice para enviar un valor de 0 a 100 al lcd pero no me siento satisfecho pues la precision deja mucho que desear. al menos ya tengo mi valor de 0 a 100. :? :? :?

define OSC 20
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTB
Define  LCD_RSBIT       0
Define  LCD_EREG        PORTB
Define  LCD_EBIT        1
Define   ADC_CLOCK      3   ' PONIENDO EN 3 EL RELOJ DE LA FUENTE
Define   ADC_BITS     10     ' NUMERO DE BITS DEL RESULTADO
Define   ADC_SAMPLEUS  30   ' SETEO DEL TIEMPO DE MEDICIONDefine   ADC_CLOCK     
ADCON1 = %10000010    ' Set PORTA analog and RIGHT justify result

pause 500

x var word
a var x.lowbyte
b var x.highbyte
perc var word
porc var word
pirc var word
rtotal var word
total var word
c var x.9
d var x.8
f var word
g var word

lcdout $FE,1,"Iniciando..."
pause 500

conversion:

adcin 0,x
pause 50
f = d * 256
g = c * 512
perc = f * 50
porc = g * 25
pirc = a * 25

perc = perc/512
porc = porc/256
pirc = pirc/255

total = perc + porc + pirc 


lcdout $fe,1,"V: ",dec x
lcdout $fe,$C0,"n: ",dec total,"ºC"
pause 250
goto conversion

end
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: atricio en 01 de Octubre de 2009, 10:50:26
hola amigos no se si me podiran ayudar estoy haciendo un conversor analogo digital con el 16F877A ya lo he logrado mas o menos le estoy leyendo a un potenciometro de o 255 pero quiero que en el LCD me muestre lo que me arroja un canal en una escala de 0 a 500 con 2 decimales y el segundo de 0 a 30 con 2 decimales pero quisiera que se muestre 0,01 ; 0,02 ;0.03; asi hasta llegar a la escala que mencione anteriormente seria posible por si acaso posteo el codigo que he realizado para ver si me dan una mano

;==========================================================================================================
;-------------------------------* CONFIGURACION INTERNA DEL MICROCONTROLADOR *----------------------------

@devicext_osc ; oscilador externo XT
define osc 4
;==========================================================================================================
;---------------------------- * CONFIGURACION DE COMUNICACION DEL LCD *------------------------------------


define LCD_DREG PORTD
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 5
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 4

;==========================================================================================================
;-------------------------------------* DECLARACION DE VARIABLES *-----------------------------------------

P1 VAR WORD
P2 VAR WORD
P3 VAR WORD
X VAR word
Y VAR BYTE
BOTON VAR PORTB.4
BOTON1 VAR PORTB.5
BOTON2 VAR PORTB.6
BOTON3 VAR PORTB.7
BO VAR BYTE
B1 VAR BYTE
BA VAR BYTE

;========================================================================================================
;-------------------------------------------* CARATULA * ------------------------------------------------   
    PAUSE 200
   
    FOR BO =144 TO 128 STEP -1
    LCDOUT $FE,1
    LCDOUT $FE,BO,"    TORNO CN   "
    LCDOUT $FE,$0C,B1
    PAUSE 100
    NEXT


    LCDOUT $FE,$C0
    FOR BO=0 TO 15
 
    LOOKUP BO,[" MICROLOGIX 1100 "],B1
    LCDOUT $FE,$0C,B1
    PAUSE 100
    NEXT
    pause 1500
   
    FOR Y = 0 TO 2
    PAUSE 200
    LCDOUT $FE,1,"POR FAVOR ESPERE"
    LCDOUT $FE,$C0
    LCDOUT $FE,$0C,"CARGANDO"
    FOR BO = 0 TO 15
    LOOKUP BO,["........"],B1
    LCDOUT $FE,$0C,B1
    PAUSE 150
    NEXT

    NEXT
    PAUSE 300
;=======================================================================================================
;--------------------------* CONFIGURACION INTERNA DEL CONVERSOR ANALOGO DIGITAL *----------------------
ADCON1=%100

INICIO:

PAUSE 300
POTEN1:
    ADCON0=%1000001
    GOSUB MEDIR
    P1= ADRESH
   
POTEN2:
    ADCON0=%1001001
    GOSUB MEDIR
    P2=ADRESH
   
POTEN3:
    ADCON0=%1011001
    GOSUB MEDIR
    P3=ADRESH
    x=P1*2
;=========================================================================================================   
;----------------------------* CONFIGURACION DE VISUALIZACION DE ALARMAS *--------------------------------   
IF BOTON=1 THEN
    LCDOUT $FE,1
    LCDOUT $FE,$1,"E.LON:"
    LCDOUT $FE,$88,DEC X,".",DEC2 P1, "mm"
    LCDOUT $FE,$C0,"E.TRAN:"
    LCDOUT $FE,$c9,DEC (P2*30)/255,".",DEC2 P2,"mm"
        IF BOTON1=1 THEN
            LCDOUT $FE,1
            LCDOUT $FE,$1,"E.LON:"
            LCDOUT $FE,$88,DEC X,".",DEC2 P1, "mm"
            LCDOUT $FE,$C0,"E.TRAN:"
            LCDOUT $FE,$c9,DEC (P2*30)/255,".",DEC2 P2,"mm"
                IF BOTON2=1 THEN
                    LCDOUT $FE,1
                    LCDOUT $FE,$1,"E.LON:"
                    LCDOUT $FE,$88,DEC X,".",DEC2 P1, "mm"
                    LCDOUT $FE,$C0,"E.TRAN:"
                    LCDOUT $FE,$c9,DEC (P2*30)/255,".",DEC2 P2,"mm"   
                        IF BOTON3=1 THEN
                            LCDOUT $FE,1
                            LCDOUT $FE,$1,"E.LON:"
                            LCDOUT $FE,$88,DEC X,".",DEC2 P1, "mm"
                            LCDOUT $FE,$C0,"E.TRAN:"
                            LCDOUT $FE,$c9,DEC (P2*30)/255,".",DEC2 P2,"mm"   
   
                        ELSE
                            LCDOUT $FE,1,$82,"  ULTIMO DATO"
                            LCDOUT $FE,$C0,"     BORRADO"
                       
                        ENDIF
                   
                ELSE
                    LCDOUT $FE,1,$82,"TODOS LOS DATOS"
                    LCDOUT $FE,$C0,"    BORRADOS"
                ENDIF
        ELSE
            LCDOUT $FE,1,$82," DATO GRABADO"
            LCDOUT $FE,$C0
   
        ENDIF
   
   
   
ELSE
    LCDOUT $FE,1,$82," MEMORIA LLENA"
    LCDOUT $FE,$C0 
   
     
ENDIF

GOTO INICIO
;========================================================================================================
;--------------------------* CONFIGURACION DE MUSTREO DEL CONVERSOR A/D *--------------------------------
MEDIR:
    PAUSE 50
    ADCON0.2=1
    PAUSEUS 50
    RETURN

end

la variables P1 P2 P3 son las que manejo la informacion desde el potenciometro lo que dice alarmas son para cuando me de informacion otro circuito me despliegue en el LCD ese aviso...por favor ayuda 
Título: Re: Conversor AD PIC16f877a y lcd problema resoluion???
Publicado por: minssss en 08 de Noviembre de 2009, 21:17:50
disculpa estoy haciendo una calculadora de 4 digitos pero al colocar la operacion mas grande es decir 9999*9999 me da 37601 y donde guardo la multiplicacion es una variable de tipo word, tendra algun detalle el lcd? la programacion es la correcta la estoy haciendo con un 16f877a les estare agradecido