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

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

Desconectado Eyedol

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


Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #1 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
"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 #2 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.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #3 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.
"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 #4 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.

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #5 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
"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 #6 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.
« Última modificación: 22 de Agosto de 2006, 19:47:35 por Eyedol »

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #7 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.
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 flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #8 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.
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #9 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í).
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 #10 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
« Última modificación: 23 de Agosto de 2006, 12:59:43 por navaismo »
"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 #11 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.
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 #12 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.           
"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 #13 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

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Conversor AD PIC16f877a y lcd problema resoluion???
« Respuesta #14 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.
"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."