Autor Tema: Conversor AD PIC16f877a y lcd problema resoluion???  (Leído 16539 veces)

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

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #15 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.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado Eyedol

  • PIC16
  • ***
  • Mensajes: 129
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #16 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.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #17 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%
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado electronando

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 427
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #18 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:

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #19 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.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #20 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
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #21 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.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #22 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
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado Eyedol

  • PIC16
  • ***
  • Mensajes: 129
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #23 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

Desconectado atricio

  • PIC10
  • *
  • Mensajes: 2
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #24 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 

Desconectado minssss

  • PIC10
  • *
  • Mensajes: 1
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #25 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