TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado 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
-
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?
-
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
-
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
-
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
-
Saludos
Lo ùnico que tienes que hacer es multiplicar el valor del ADRES por la resolución del sistema
-
Tienes que convertir el valor de converison a ASCII
Y ese ascii ya lo puedes enviar al lcd.
Saludos
-
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
-
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
-
Ok, me queda claro, pero cómo hago la multiplicación?
-
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
-
De acuedo chenao, te lo voy a agradecer muchisimo:
telojurito@hotmail.com
Gracias
-
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
-
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
-
Saludos
Compañero cuanto es el valor máximo, de voltaje que deseas mostrar en los displays.
-
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
-
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
-
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.
-
Y aquí está el otro archivo
-
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
-
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.
-
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
-
:-/ :-/ :-/
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
-
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
-
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
-
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
-
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.
-
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
-
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
-
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.
-
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
-
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.
-
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