TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: telojurito en 25 de Octubre de 2008, 17:36:03

Título: Conversor A/D con PIC16F76
Publicado por: telojurito en 25 de Octubre de 2008, 17:36:03
Hola,

Con la ayuda del foro acabo de hacer funcionar mi LCD de 4x20 y eso ha sido el inicio para el proyecto que traigo entre manos.

Se trata de un display LCD de 4x20 gobernado por un PIC16F76 con cristal de 8MHz que va a estar monitoreando el voltaje de entrada ya rectificado, es decir después del transformador de bajada de 127VAC a 18VAC. Después de rectificarlo con un puente de onda completa y capacitor de 100uF tengo un voltaje de 26VDC aprox.

Le he puesto un divisor de tensión con 1 resistencia de 10Kohms y luego una de 2Kohms y en medio de estas dos saco el valor muestra que lo llevo al RA5/AN5 de PIC. Esto es porque las RA0-RA3 las ocupo para controlar el LCD. Según mis calculos y lo que he encontrado de información aquí en el foro, el Valor Real de lo leido en el ADC seria

Vreal = 0.1171 * Vadc

Ok, el display funciona y al querer mostrar el valor leido en el ADC me muestra los caracteres correspondientes al binario del registro ADRES de acuerdo al mapa de caracteres del LCD. Encontré una rutina que convierte de binario a decimal y lo mujestra en el display:

LCDval08:
   clrf   Bcheck
   movlw   d'100'
   movwf   TEMP2
   call   VALcnv
   movlw   d'10'
   movwf   TEMP2
   call   VALcnv
   movlw   d'1'
   movwf   TEMP2
   bsf      Bcheck,0
   call   VALcnv
   return

VALcnv:
      clrf   TEMP1
      movfw   TEMP2
VALc01   subwf   VIN,0
      skpc
      goto   LCDval2
      incf   TEMP1,1
      movfw   TEMP2
      subwf   VIN,1
      bsf      Bcheck,0
      goto   VALc01

LCDval2   movlw   '0'
      addwf   TEMP1,0
      btfss   Bcheck,0
      movlw   ' '
      call   LCD_DAT

el valor de VIN es el que saco del registro ADRES.

Lo he probado físicamente y sí me muestra un valor decimal en el display pero no me parece que sea el valor que busco a veces es un valor de un sólo digito, a veces de 2 digitos a veces es cero y a veces nada. Podrían explicarme cómo funciona esta rutina? ya que como mencioné la encontre en un libro en pdf y sólo lo copié con algunos cambios de acuerdo a mis variables pero no logro entender cómo funciona.

Por otro lado, si hay alguna forma para hacer que el valor en ADRES lo pueda visualizar en el LCD les agradecería me dijeran cómo hacerlo.

Saludos
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 25 de Octubre de 2008, 21:20:10
Bueno, una pregunta más concreta:

Si ya tengo un valor en el registro ADRES del PIC cómo lo convierto al correspondiente valor real de voltaje y lo pongo en el lcd?
Título: Re: Conversor A/D con PIC16F76
Publicado por: Chenao en 27 de Octubre de 2008, 18:57:35
Saludos

Lo único mal que veo por encima es que no estás configurando las entradas del puerto A como entradas digitales,
La sugerencia que te doy es que configures el módulo A/D, los registros son los siguientes ADCON0 y ADCON1 (1FH, 9FH respectivamente), creo que el error esta aquí.

Un saludo desde Pereira - Colombia
Título: Re: Conversor A/D con PIC16F76
Publicado por: Chenao en 27 de Octubre de 2008, 19:53:45

Saludos

Que pena compañero pero la red esta loca. lo que te queria comentar es que tienes que tener en cuenta la resolución de loa conversión. La conversión es dada por, Resolución = VREF / (2^N - 1) donde N es el número de bits, creo que este micro tiene 10 Bits lo que da una resolución de = VREF / 1023. Lo que decir , que por cada paso el conversor me va a entragar VREF / 1023.

Espero haber sido conciso y espero que puedas solucionar tu problema

Un saludo desde Pereira - Colombia 
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 28 de Octubre de 2008, 19:39:46
No el PIC16F76 tiene un ADC de 8 bits. Como comentaba al principio del post trato de monitorer el voltaje de entrada ya rectificado, es decir después del transformador de bajada de 127VAC a 18VAC. Después de rectificarlo con un puente de onda completa y capacitor de 100uF tengo un voltaje de 26VDC aprox.

Le he puesto un divisor de tensión con 1 resistencia de 10Kohms y luego una de 2Kohms y en medio de estas dos saco el valor muestra que lo llevo al RA0/AN0 del PIC (los pines de control del display los cambié al PORTC. En el divisor de tensión fije el voltaje de entrada o V1 a 30VDC y el de salida o V2 a 5V. De ahi los valores de las resistencias, fijé el de la primera a 10Kohms y de los cálculos me dá la segunda a 2Kohms. Según mis calculos y lo que he encontrado de información aquí en el foro, el Valor Real de lo leido en el ADC seria

Vreal = 0.1171 * Vadc

y si mi Vref+ sería de 5V y el Vref- de 0V

estoy en lo correcto????

Ahora, sé que tengo un valor en ADRES al hacer la conversión, por ejemplo un dato leido es el 100110011 = 307 DEC = 133 HEX

y lo que me esta faltando es cómo muestro el valor real de voltaje en el display?????

es decir, si tomo el valor de ADRES y lo pongo en el PORTB de datos del display me da el caracter correspondiente a ese valor

Saludos
Título: Re: Conversor A/D con PIC16F76
Publicado por: Chenao en 28 de Octubre de 2008, 20:27:51

Saludos

Lo ùnico que tienes que hacer es multiplicar el valor del ADRES por la resolución del sistema
Título: Re: Conversor A/D con PIC16F76
Publicado por: AKENAFAB en 28 de Octubre de 2008, 20:30:07
Tienes que convertir el valor de converison a ASCII

Y ese ascii ya lo puedes enviar al lcd.

Saludos
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 28 de Octubre de 2008, 21:13:11
Tal vez haga una pregunta tonta pero ahi va....

si mi valor leido en la conversión es 100110011 = 307 DEC = 133 HEX y lo multiplico por la resolución que es de 0.1171, en una calculadora normal me sale 15.5743,, pero cómo hago la multiplicación en asembler?????

otra, una vez hecha la multiplicación cómo pongo el resultado en el display??? por lo menos que ponga 15.5 V

Saludos

Título: Re: Conversor A/D con PIC16F76
Publicado por: AKENAFAB en 28 de Octubre de 2008, 21:21:58
Digamos que tienes tu resultado en X registro,lo que tienes que hacer , como te lo dije arriba es pasar ese valor a caracteres ascii.

si tines digamos 155 en tu registro y eso equivaldria a 15.5 v

Lo que haces es pasar el valor de centenas , decenas y unidades.

Es decir

Esos 155 del registro inicial pasarlo a 1   5   5

le sumas 30 y lo tendras en ascii asi lo envias al lcd y listo.

En este mismo foro estan las rutinas de hex a ascii


Espero haberme explicado

Saludos
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 28 de Octubre de 2008, 21:25:49
Ok, me queda claro, pero cómo hago la multiplicación?
Título: Re: Conversor A/D con PIC16F76
Publicado por: Chenao en 28 de Octubre de 2008, 21:46:32
Saludos

Hay maneras mas fácil sin tener que hacer la multiplicación y, es con una tabla, teniendo el valor del adresh se le asigna un valor de voltaje.

Pero si quieres hacer la multiplicación te deja tu correo y te envio un PDF con rutinas matemáticas en el ensamblador

Un saludo desde Pereira - Colombia
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 28 de Octubre de 2008, 22:00:11
De acuedo chenao, te lo voy a agradecer muchisimo:

telojurito@hotmail.com

Gracias
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 29 de Octubre de 2008, 00:04:25
Ya le he hecho algunas modificaciones a mi programa con ayuda de las funciones matemáticas que publica Microchip en el AN526, le añadí las rutinas de la multiplicación de 2 registros de 8 bits y luego le puse el de convertir Ninario (16bits) a BDC. La cosa es que me aparecen 3 caracteres correspoondientes a los resultados de R0, R1 y R2 pero siguen siendo caracteres correspondientes al mapa de caracteres del LCD y no a los valores del conversor.

En las entradas para llamar a la multiplicación hago el multiplicando mulcnd = 0x75 dado que como mi resolución es de 0.117 lo tomo como 117 DEC = 0x75 HEX y el multiplicador mulplr = VIN que es el valor leido por el convertidor. Me da la impresión que por aquí esta el error pero no logro descifrarlo.

Si pudieran echarle un vistazo a estas rutinas y revisarlas? le quite alguno return y retlw pensando en modificarlas o ajustarlas a mi programa pero no estoy seguro si lo hice bien

Saludos compañeros y gracias nuevamente
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 29 de Octubre de 2008, 13:50:34
Pos ya nomas un paso más....  :-/

Ya probe la lectura del conversor, que me genera un dato en ADRES. También ya probé la multiplicación que en el archivo anterior no trabajaba bién, en este archivo pongo los datos VIN, H_byte y L_byte en el display para comprobar la multiplicación y está correcta VIN * 0x75 = H_byte:L_byte.

Lo que me falta es convertir H_byte:L_byte (16bits) a ASCII (5 digitos), aunque estoy probando algunas que he encontrado en Microchip y en Piclist quisiera ver si alguien tiene alguna rutina que me puedan ayudar o alguna idea?????

Adjunto el archivo asm actualizado con la rutina correcta del multiplicador

Gracias
Título: Re: Conversor A/D con PIC16F76
Publicado por: Chenao en 29 de Octubre de 2008, 20:27:46

Saludos

Compañero cuanto es el valor máximo, de voltaje que deseas mostrar en los displays.
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 30 de Octubre de 2008, 02:57:56
Hola Chenao,

El valor REAL a leer esta alrededor de 26 vdc y maximo espero tener 30vdc que es el valor que use para el calculo del div de tension. Las lecturas las pretendo dar en formato xx.xx vdc

Muchas gracias
Título: Re: Conversor A/D con PIC16F76
Publicado por: Chenao en 30 de Octubre de 2008, 18:40:59

Saludo

Te tengo una posible solución, es poco confiable pero me ha funcionado muy bien y consiste en lo siguiente:

si tienes un numero, por ejemplo 123, para descomponerlo en tres numeros osea 1, 2 y 3 primero lo divides entre 100 y obtienes el 1 al residúo lo divides entre 10 y obtienes el 2 y la residúo que te quede de esta división lo divides entre 1 y obtienes 3, este es un método llamado de binario a BCD pero a 8 bits, es decir, que sólo puedes convertir numeros entre 0 y 255 (D).

Para tu aplicación tendrías que hacer la conversión tanto para la parte entera como para la décimal.

Voy a buscar la rutina y te la mando.

Un saludo desde Pereira - Colombia
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 04 de Noviembre de 2008, 20:54:55
Pues bueno compañeros,

Ya ha sido muchisimo el avance, finalmente pude realizar la conversión de binario 16 bits a BCD 5 digitos. Después de varias pruebas y utilizando unas rutinas del PICLIST, no quedaban y no quedaban hasta que pensé en sumarle 0x30 a cada resultado de la conversión y encontré que me daban como 0x6x, lo cuál se me hizo raro y probé a despues restarles los mismos 0x30, total, era pa probar...... y EUREEEEEKA, que salen los dígitos por el display.

Probé con otra subrutina e intenté lo mismo y nuevamente obtuve los dígitos en el display.

Estoy adjuntando dos archivos que funcionan en cuanto a lo de mostrar los dígitos pero todavia me falta un detalle:

El conversor ADC no parece funcionar muy bién, me explico....al aplicar la energía parece comenzar a leer el valor por RA0, pero comienza a variar, incrementa luego baja, a veces llega hasta a cero luego sube, se estabiliza un poco y bueno, en general varia mucho. Pensé que era por el convertidor de binario a bcd pero lo intenté con las dos rutinas que mencioné y sucede los mismo. También intente con dos diferentes rutinas del conversor y nada. Incluso pense en ruido en el circuito, ya que después de puente rectificador puse un filtro de 100uF, lo cambié por uno de 1,000uF y nada......

Podrían echarle un vistazo y ayudarme un poco más por favor??????

He de decir que para la multiplicación estoy haciendo el valor leido y guardado en VIN lo multiplico por 0x75 = 117 DEC, dado que es mi factor de conversión o resolución en el divisor de voltaje de entrada por RA0

Señores les agradezco mucho toda la ayuda proporcionada.
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 04 de Noviembre de 2008, 20:55:50
Y aquí está el otro archivo
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 04 de Noviembre de 2008, 22:54:58
Pensé en poner un video con lo que sucede en el display:

1104_173327.avi - 3.6 Mb (http://share.fribits.com/227DQ0MP5VT8/1104_173327.avi)

como se puede observar, el valor mostrado varia demasiado y con el Fluke se miden 26.6 volts casi casi estables varia un poco solo un poco, de acuerdo al voltaje de línea.

Yo sospecho de la rutina del conversor AD o creen que pueda ser hardware??????

Saludos
Título: Re: Conversor A/D con PIC16F76
Publicado por: BrunoF en 05 de Noviembre de 2008, 00:03:39
Hola. Te tiro un par de ideas/sugerencias:

*No miré tu rutina, pero podrías intentar aumentar el tiempo de muestreo del conversor AD(si ya no lo estas haciendo), mediante los pines <ADCS2> y <ADCS1:ADCS0>(leer en el datasheet);
*Es altamente recomendado esperar un cierto tiempo antes de realizar la próxima conversión para dar tiempo a que el capacitor interno se descargue completamente;
*Tal vez estés trabajando con el conversor en modo 10 bits, y el ultimo bit es muy inestable, tal vez convenga utilizar al menos un bit menos;
*y por último, pero lo más importante, por lo que he leído en tus comentarios, la impendancia con la que ingresa tu señal a convertir es demasiado alta. La máxima impendancia recomendada para estos modelos de uC es de 2,5kohms, y me parece que el divisor de tensión que utilizás posee una impendancia muy superior. Cuanto menor sea la impendancia mejor responderá el módulo ADC.

Espero haberte ayudado un poco.

Saludos.
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 05 de Noviembre de 2008, 18:02:35
Hola BrunoF,

El muestreo que estoy seleccionando en <ADCS1:ADCS0> = 11 Derivado del oscilador interno del Modulo AD, bit <ADCS2> no existe en el PIC16F76, crees que deba o sería recomendable cambiarlo? Fosc/32, Fosc/8, Fosc/2. Una pregunta aquí, a qué se refieren estos datos y a cuanto corresponderían con un cristal de 8MHz?

En lo del tiempo de espera para la conversión estoy revisando una información que posteo maunix hace tiempo:

http://www.todopic.com.ar/foros/index.php?topic=14529.msg88942#msg88942

El convertidor AD del PIC16F76 es por si mismo diseñado a 8 bits según entiendo, porque no he visto cómo setearlo para 8 o para 10 bits.

Y en cuanto a la impedancia de entrada de la señal me parece importante comentarlo, ya que a lo mejor estoy haciendo mal el diseño desde el hardware. De la fuente que estoy monitoreando utilizo un divisor de tensión con 2 resistencias, el punto medio entre ambas lo llevo directamente a RA0


                                                      /\                        /\
     Vin = 26.6VDC aprox  O----------/   \    /-----o------/    \   /----------O GND
                                                           \/         |              \/
                                                     R1=10K      |        R2=2K
                                                                      |
                                                                      O
                                                                    a RA0

Según el diagrama, la impedancia de entrada al convertidor es de 2Kohms y por lo que me comentas y que se menciona en el datasheet, la máxima impedancia de entrada recomendad es de 10Kohms pero podría intentar con resistencias de menor valor, 5Kohms y 1Kohms por ejemplo.

En este punto mis cálculos son: aunque el voltaje de entrada es de 26.6 volts aprox, pongo como máximo valor 30 volts y como máximo de entrada al convertidor en RA0 5 volts. Si fijo a R1, 5Kohms aplicando

R2 = R1 [ V2 / (V1 - V2) ] = 1Kohm

Entonces mi Vref+ = 5v y mi Vref- = 0v y el valor real Vreal a leer teniendo el valor leido del AD Vadc sería

Vreal = [ (Vref+ - Vref-) / (2^8 - 1)  * Vadc * 6 = 0.117 * Vadc

por 6, porque si 30v es el valor máximo real y 5v el valor máximo de referencia la relación entre los dos valores es de 6.

Hasta aquí es lo que tengo y cómo he desarrolado mi proyecto en cuanto a cálculos, por favor si he cometido algún error en lo anterior, les agradeceré me lo indiquen.

Gracias nuevamente
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 05 de Noviembre de 2008, 21:54:23
 :-/ :-/ :-/

Tengo el agrado de comentarles que finalmente logró funcionar este proyecto como se esperaba.....

En cuanto a los tiempos del conversor AD encontré en el datasheet para el 16F76 el TAD es de 4 useg típico y el tiempo de conversión de 9 * TAD lo cual nos da 36 useg, yo puse un retardo antes de disparar ADCON0, 2 o sea GO/DONE de 40 useg.

También encontré que para este PIC, seleccionar el clock interno del conversor RC en ADCON0 o sea 11 para frecuencias mayores de 1MHz es sólo recomendable para la operación SLEEP, entonces según una tabla de ahí mismo dice que

2Tosc Max Freq 1.25MHz
8Tosc Max Freq 5MHz
32Tosc Max Freq 20MHz

entonces tocaba seleccionar 32Tosc.....

Pero aún así no funcionaba correctamente, hasta que decidí cambiar las resistencias del divisor de tensión y me dí cuenta que la segunda resistencia R2 que según iba a GND, estaba a GND del puente de diodos pero ese GND no estaba conectado al del resto del sistema, estaba flotando. A lo que me refiero, es que puse un rectificador por separado al del sistema entero para el monitoreo del voltaje, el cual estaba en 26.6VDC aprox. Lo conecté al GND del 7805 del sistema entero y tan tan..... a funcionar......

No me queda nada más que agradecerles mucho a todos por ayudarme en este proyecto, ya que es la primera vez que trabajo con el convertidor AD, es más, no soy muy asiduo programador pero de vez en cuando se me ocurre algo y me pongo a trabajar en ello, pero como no soy muy frecuente, algunos detalles se olvidan.

Nuevamente muchas gracias
Título: Re: Conversor A/D con PIC16F76
Publicado por: BrunoF en 06 de Noviembre de 2008, 03:56:59
Me alegro telojurito. :)

Y es verdad, fue mi error lo del bit <ADCS2> ya que ni existe en el 16F876. Los cálculos de las resistencias están bien.
Ojo, si no me equivoco el TAD de 4uS es tipico cuando esta configurado con el RC interno del conversor AD.

Si, debías seleccionar FOSC/32 para 8mhz.

Cualquier cosa estamos por acá.

Éxitos
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 14 de Noviembre de 2008, 21:38:16
Estimados amigos,

Una nueva inquietud al respecto con este proyecto.

Sucede que estoy haciendo varias lecturas, cada una cuando presiono un botón que le incorporé al circuito. Presiono el botón y realiza la lectura conversión y todo, la inquietud surge en cuanto a la presentación de los valores en el display a partir de la lectura número 10 que me pone el valor correspondiente de acuerdo al mapa de caracteres del display:

V1=xx.xx
V2=xx.xx
V3=xx.xx
V4=xx.xx
V5=xx.xx
V6=xx.xx
V7=xx.xx
V8=xx.xx
V9=xx.xx
V:=xx.xx en vez de V10
V;=xx.xx en vez de V11

como comenté anteriormente, al valor recibido de la conversión debo restarle 0x30 para que concuerde con el mapa de caracteres y pueda desplecar cada caracter adecuadamente, pero este punto considero que es meramente programación no me imagino como solucionarlo. Alguna idea o secuencia en ensamblador con que me puedan ayyudar?????

Nuevamente gracias
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 14 de Noviembre de 2008, 21:47:03
Para ilustrar mejor, la secuencia que estoy utilizando es muy simple dentro de un bucle:

incf   K,1
movlw   0x30
addwf   K,1

movf   K,0
call   LCD_DAT

movlw   0x30
subwf   K,1

cada que realiza esta parte dentro del bucle va incrementando los valores 1,2,3,4,5, etc pero como comentaba, al llegar a 0x0A muestra el valor de (:) del mapa de caracteres y la idea es que muestre el n´mero 10 y así sucesivamente
Título: Re: Conversor A/D con PIC16F76
Publicado por: BrunoF en 14 de Noviembre de 2008, 22:51:20
El siguiente código que hice soporta hasta 999 lecturas

K(deberias renombrar a Uni o parecido para mejor legibilidad) contiene las unidades
Dec contiene las decenas
Cen contiene las centenas

                                         ;Dec y Cen deben ser declaradas en RAM. Las tres variables deben ser inicializadas a cero al iniciar el programa del uC.

                      incf K,1        ;incremento unidades
                      movlw .10
                      xorwf K,W
                      btfss STATUS,Z
                      goto  Muestra

                      clrf  K   
                      incf  Dec,F
                      movlw .10
                      xorwf Dec,W
                      btfss STATUS,Z
                      goto  Muestra

                      clrf  Dec   
                      incf  Cen,F

Muestra           movf  Cen,w
                      btfsc   STATUS,Z
                      goto    MuestraDec

                      addlw 0x30
                      call    LCD_DAT
 
MuestraDec     movf  Dec,w
                      btfsc   STATUS,Z
                      goto    MuestraUni

                      addlw 0x30
                      call    LCD_DAT
                   

MuestraUni      movf  K,w
                      addlw 0x30
                      call    LCD_DAT


Eso sería trabajando en Código BCD. Podría optimizarse.

Saludos.                       
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 14 de Noviembre de 2008, 23:47:17
Nooooo, si de verdad que el que sabe.... sabe!!!!!!!

Mil gracias BrunoF, la secuencia funciona de maravilla, a la perfección. Le hice unas modificaciones en cuanto al incremento de las posiciones cuando cambia a 2 y 3 dígitos, sólo que cuando cambia de 99 a 100 se sigue con la secuencia de sólo dos dígitos, el primero y el tercero el segundo como que se lo vuela, no lo muestra: 10, 11, 12, 13, etc. Aquí esta tu código con las modificaciones que menciono:

         incf   Uni,1         ;incremento unidades
         movlw   .10
         xorwf   Uni,W
         btfss   STATUS,Z
         goto   Muestra

         clrf   Uni
         incf   Dec,F
         movlw   .10
         xorwf   Dec,W
         btfss   STATUS,Z
         goto   Muestra

         clrf   Dec
         incf   Cen,F

Muestra    movf   Cen,w
         btfsc   STATUS,Z
         goto   MuestraDec

         addlw   0x30
         call   LCD_DAT
         call   ADDRESS

MuestraDec   movf   Dec,w
         btfsc   STATUS,Z
         goto   MuestraUni

         addlw   0x30
         call   LCD_DAT
         call   ADDRESS

MuestraUni   movf   Uni,w
         addlw   0x30
         call   LCD_DAT
         call   ADDRESS

Y un último favor, considero que el hacer funcionar algo es importante, pero imprescindible saber cómo se hizo funcionar, podrías explicar un poco la filosofía de tu secuencia? de cómo es que funciona?

Mil gracias nuevamente
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 15 de Noviembre de 2008, 00:12:14
Le hice unas pequeñas modificaciones depués de clrf Dec pero nada.... hace exactamente lo mismo, como que falta algo pero no logro entender bién la secuencia.....

         incf   Uni,1         ;incremento unidades
         movlw   .10
         xorwf   Uni,W
         btfss   STATUS,Z
         goto   Muestra

         clrf   Uni
         incf   Dec,F
         movlw   .10
         xorwf   Dec,W
         btfss   STATUS,Z
         goto   Muestra

         clrf   Dec
         incf   Cen,F
         movlw   .10
         xorwf   Cen,W
         btfss   STATUS,Z
         goto   Muestra

Muestra    movf   Cen,w
         btfsc   STATUS,Z
         goto   MuestraDec

         addlw   0x30
         call   LCD_DAT
         call   ADDRESS

MuestraDec   movf   Dec,w
         btfsc   STATUS,Z
         goto   MuestraUni

         addlw   0x30
         call   LCD_DAT
         call   ADDRESS

MuestraUni   movf   Uni,w
         addlw   0x30
         call   LCD_DAT
         call   ADDRESS

Título: Re: Conversor A/D con PIC16F76
Publicado por: BrunoF en 15 de Noviembre de 2008, 06:57:09
Nooooo, si de verdad que el que sabe.... sabe!!!!!!!

Mil gracias BrunoF, la secuencia funciona de maravilla, a la perfección. Le hice unas modificaciones en cuanto al incremento de las posiciones cuando cambia a 2 y 3 dígitos, sólo que cuando cambia de 99 a 100 se sigue con la secuencia de sólo dos dígitos, el primero y el tercero el segundo como que se lo vuela, no lo muestra: 10, 11, 12, 13, etc. Aquí esta tu código con las modificaciones que menciono:

         incf   Uni,1         ;incremento unidades
         movlw   .10
         xorwf   Uni,W
         btfss   STATUS,Z
         goto   Muestra

         clrf   Uni
         incf   Dec,F
         movlw   .10
         xorwf   Dec,W
         btfss   STATUS,Z
         goto   Muestra

         clrf   Dec
         incf   Cen,F

Muestra    movf   Cen,w
         btfsc   STATUS,Z
         goto   MuestraDec

         addlw   0x30
         call   LCD_DAT
         call   ADDRESS

MuestraDec   movf   Dec,w
         btfsc   STATUS,Z
         goto   MuestraUni

         addlw   0x30
         call   LCD_DAT
         call   ADDRESS

MuestraUni   movf   Uni,w
         addlw   0x30
         call   LCD_DAT
         call   ADDRESS

Y un último favor, considero que el hacer funcionar algo es importante, pero imprescindible saber cómo se hizo funcionar, podrías explicar un poco la filosofía de tu secuencia? de cómo es que funciona?

Mil gracias nuevamente

Buenas! Si. Es que me he equivocado un poquiño. Ahí lo soluciono.

         incf   Uni,1         ;incremento unidades
         movlw   .10            ;cargo 10 en W para comparar
         xorwf   Uni,W        ;Si Uni XOR 10 da 0, entonces es hora de incrementar decenas
         btfss   STATUS,Z          ;Dió cero?
         goto   Muestra             ;No. Entonces listo el cálculo. Mostrar

         clrf   Uni                    ;Si. Dió cero y es hora de poner a cero las unidades e
         incf   Dec,F                ;incrementar las decenas
         movlw   .10            ;Ahora cargo 10 en W para comparar
         xorwf   Dec,W       ;Si Dec XOR 10 da cero, entonces es hora de incrementar decenas
         btfss   STATUS,Z          ;Dió cero?
         goto   Muestra             ;No. Entonces fin cálculos

         clrf   Dec                   ;Si. Dió cero. Entonces poner Decenas a cero e
         incf   Cen,F                ;incrementar centenas

Muestra         movf   Cen,w               ;copiar Cen en W(la instruccion movf afecta al flag Z, por lo que si Cen vale cero, Z se pone en alto)
         btfsc   STATUS,Z         ;Z en bajo?(Hay al menos una centena?)
         goto   MuestraDec       ;No. entonces pasar a mostrar decenas

         addlw   0x30         ;Si. Entonces mostrar centenas
         call   LCD_DAT
         call   ADDRESS
                        movf Dec,w               ;Cargar decenas(arregla error previo)
                        goto  HayDecenas      ;Línea para arreglar el error previo. Si al menos exíste una Centena, obligar a mostrar decenas

MuestraDec   movf   Dec,w               ;copiar Dec en W(la instruccion movf afecta al flag Z, por lo que si Dec vale cero, Z se pone en alto)
         btfsc   STATUS,Z         ;Al menos una decena?
         goto   MuestraUni        ;No. Entonces pasar a mostrar unidades

HayDecenas
         addlw   0x30         ;Si. Mostrar Decenas
         call   LCD_DAT
         call   ADDRESS

MuestraUni   movf   Uni,w                ;Mostrar unidades(no es necesario verificarlas. Al menos siempre hay una medición)
         addlw   0x30
         call   LCD_DAT
         call   ADDRESS


Debería arreglar el error que mencionaste. El código que hice antes salió mal sin querer en eso. Es que por ejemplo, mi código se fijaba en si al menos existe una decena para ser mostrada pero 100 por ejemplo, no posee decenas pero si centenas. Mi codigo anterior solo revisaba si existia al menos una decena. Como 100 no posee ninguna decena, no las mostraba. El codigo nuevo lo que hace es que si al menos existe una centena, obliga a mostrar las decenas tambien(en cualquier numero mayor a 100 deberían mostarse siempre las decenas, no?). El error no se propagó a las unidades porque asumí que debían mostrarse siempre.
 El error iba a ocurrir(en realidad lo supongo porque imagino el comportamiento del programa mirando el código) siempre y cuando el número fuese del tipo X0Y con 0<X<10; 0<=Y<10.

Es decir, por ejemplo el error se iba a producir en los números 100,101,102,103,104...200,201,202...300....906,907,908,909.

Espero haya quedado claro.

Una variante que por ahí te gustaría probar para ver cuál te gusta como queda mejor en el LCD es la siguiente:

         incf   Uni,1         ;incremento unidades
         movlw   .10
         xorwf   Uni,W
         btfss   STATUS,Z
         goto   Muestra

         clrf   Uni
         incf   Dec,F
         movlw   .10
         xorwf   Dec,W
         btfss   STATUS,Z
         goto   Muestra

         clrf   Dec
         incf   Cen,F

Muestra             movf   Cen,w
         addlw   0x30
         call   LCD_DAT
         call   ADDRESS

MuestraDec   movf   Dec,w
         addlw   0x30
         call   LCD_DAT
         call   ADDRESS

MuestraUni   movf   Uni,w
         addlw   0x30
         call   LCD_DAT
         call   ADDRESS


Saludos.
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 15 de Noviembre de 2008, 13:18:48
Pos como dije anteriormente, el que sabe.... sabe..... :-/ :-/ :-/

Con esta modificación, la secuencia con los comentarios funcionó a la perfección.

Debo confesar que me costó un poco entender la lógica pero me dí cuenta que (y no lo sabia, perdon por mi ignorancia al respecto) que el XOR de dos números iguales da cero 10 XOR 10 = 0, 20 XOR 20 = 0 y puede ser usado en asm para comparar si dos números son iguales, entre otras..... y ya de ahí manejar los incrementos de la decenas y centenas....

BrunoF muchisimas gracias por la ayuda, como veras dado que soy netamente autodidacta y me faltan conocimientos y conceptos tu código me ha ayudado enormemente.

Nuevamente gracias a todos

Título: Re: Conversor A/D con PIC16F76
Publicado por: BrunoF en 15 de Noviembre de 2008, 14:14:00
Así es. Podrías usar una resta pero a mi me gusta la XOR para comparar numeros iguales. Vamos hombre, yo también he sido completamente autodidácta. Es cuestión de encontrarle la vuelta. Una vez logrado ya se ve todo más fácil.

Saludos.
Título: Re: Conversor A/D con PIC16F76
Publicado por: telojurito en 06 de Enero de 2009, 02:45:45
Estimados amigos del foro,

Nuevamente con una pequeña duda al respecto del conversor AD del 16F876A. Si de acuerdo a mis calculos del divisor de tension Vreal = [ (Vref+ - Vref-) / (2^8 - 1)  * Vadc * 6 = 0.117 * Vadc

cómo le hago para multiplicar por 0.117 ??????

Me explico, no sabia la cuestion de la nomenclatura o notacion decimal en assembler y pense que si ponia movlw .117 era como multiplicar por 0.117 pero ya vi que es como si multiplicara por 117. Ademas sucede que bueno aunque el proyecto ya va muy adelantado y ha cambiado en algunos aspectos estoy leyendo un valor que sale del PWM interno del PIC, lo rectifico con un 1N4003 y lo meto al canal analogico AN0, con un multimetro Fluke 189 me da un valor (en max y min) de casi siempre 4.22 vdc, pero con el ADC del PIC varia mucho cada que lo leo a comparación de la lectura del Fluke. Tenia en el ADCON0 un Clock Conversion de Fosc/8, lo cambie a Fosc/32 y no mejoro.

Podrian darme algunas ideas o sugerencias??????

Gracias nuevamente