Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: juansanchezruiz05 en 10 de Octubre de 2016, 07:13:32
Título: Control de humedad y que lo muestre por la lcd
Publicado por: juansanchezruiz05 en 10 de Octubre de 2016, 07:13:32
Hola
Estoy haciendo una incubadora como proyecto de clase. Solo he hecho que el programa controle la humedad y que muestre por pantalla la humedad fijada y la real que mide el sensor sht11. Pero la pantalla no muestra ningún numero, sino caracteres desconocidos y siempre los mismo. Por lo que debo de tener algún fallo en la subrutina de conversión de binario a ascii (en el archivo adjunto se encuentra al final del programa, encima de los retardos).
el problema puede que este en la subrutina de conversion de binario a ascii:
LCDCONVERSOR clrf uni clrf dec clrf cen movwf temp ; muevo mi Dato a convertir a Temp goto Uni
BCD2 decfsz temp,F ; decremento Temp.... goto Uni goto ascii
Uni incf uni,F ; mientras "Temp" decrementa, "uni" crece uno a uno movf uni,W sublw d'10' btfss STATUS,Z ; Pregunto si "uni" llego a 10 goto BCD2 ; no sigo la misma secuencia clrf uni ; si entonces uni=0, luego debo i++ a dec
Dec incf dec,F movf dec,W sublw d'10' btfss STATUS,Z ; Pregunto si "dec" llego a 10 goto BCD2 ; no sigo la misma secuencia clrf dec ; si entonces dec=0, luego debo i++ a dec
Cen incf cen,F ; no hace falta verificar si desborda 10 goto BCD2
;Conversion bcd a ASCII
ascii movlw 0x30 addlw dec
movlw 0x30 addwf uni,1
movlw 0x30 addwf cen,1
RETURN
Si me podríais ayudar a encontrar el fallo, os lo agradecería mucho, por mas vueltas que le doy no lo encuentro.
Título: Re:Control de humedad y que lo muestre por la lcd
Publicado por: KILLERJC en 10 de Octubre de 2016, 12:16:48
Citar
Por lo que debo de tener algún fallo en la subrutina de conversión de binario a ascii
Creaste un programa simple con la rutina?
Y que en el loop principal sea:
Código: ASM
CLRF valor,F
Loop:
INCF valor,F
MOVF valor,W
CALL LCDCONVERSOR
GOTO Loop
Pone un breakpoint en el GOTO Loop y fijate los estados de los 3 registros, cada ves que pones Run, deberia aumentar en 1 y comenzar desde 0, sino es un error.
Algunos otros consejos:
Por que incrementar y decrementar de a 1, cuando podes hacerlo de a 10. Mirando el flag de carry para saber si el numero a restar es menor a 10, y eso va para las unidades directamente. El hacerlo de a 10 implica menos tiempo en eso, si tuvieras 255 como entrada tendrias 255 vueltas de tu codigo. En cambio de a 10 en 10 solo 26 vueltas
Mejor usar F y W , veo que estas mesclando y por ahi pones un 1 en ves de la F, la cual esta ultima es mas clara.
Para el 0 (cero) podes usar '0' en ves de 0x30, es mas simple de recordar :P.
Errores veo uno solo ( o 2 si es correcta mi duda), tengo una duda en que de el valor correcto. Ya que el decfsz primero decrementa y luego pregunta. Si pones 0 en W, pasaria a 255 y no daria el valor correcto. Si pones 1 imagino que tendrias como resultado 0. Una solucion rapida seria incrementar en 1 a W antes de comenzar con el decfsz. con un ADDLW 0x1
Tu error seria este:
Código: ASM
ascii movlw 0x30
addlw dec
movlw 0x30
addwf uni,1
movlw 0x30
addwf cen,1
Tenes un ADDLW DEC ... mal instruccion
Código: ASM
ascii movlw '0'
addwf dec, F
addwf uni, F
addwf cen, F
Asi estaria solucionado..
-------------
Como lo tenes un CALL podes aplicar el codigo que pase al principio y probar cada porcion de codigo en un programa aparte, esto te permite simularlo sin ningun problema y ver que funcion correctamente.
Título: Re:Control de humedad y que lo muestre por la lcd
Publicado por: juansanchezruiz05 en 10 de Octubre de 2016, 14:48:10
muchas gracias, con tu ayuda he solucionado un par de problemas. Pero aun no me muestra los valores por la LCD. Si no te importa volver a revisarme el código de la subrutina de conversión de binario a digital que adjunto. para estar seguro de que ahí no esta el problema.
Quiero mostrar un número binario de 8bits por la LCD, para eso utilizo una rutina de conversión de binario a ascii. Por lo que, el problema lo tengo que tener en esa rutina o al enviar el numero a la LCD, aunque esto último no creo porque el resto de texto lo escribe.
siempre me muestra donde debería ir un número un acento y una Y
Título: Re:Control de humedad y que lo muestre por la lcd
Publicado por: KILLERJC en 10 de Octubre de 2016, 16:04:53
Código: ASM
MOVLW dec;ESCRIBE LA HUMEDAD RELATIVA RH
CALL LETRA
MOVLW uni
CALL LETRA
Al hacer eso en el primer MOVLW estas poniendo el valor 0x60 en W, por esto:
Código: ASM
decEQU0x60
Lo mismo ocurre con la unidad y es por eso que ves caracteres raros, si queres pasar el valor de un registro a W tenes que usar MOVF xxxx, W
Código: ASM
MOVF dec, W ;ESCRIBE LA HUMEDAD RELATIVA RH
CALL LETRA
MOVF uni, W
CALL LETRA
Espero que se entienda la diferencia y donde esta el error.
Título: Re:Control de humedad y que lo muestre por la lcd
Publicado por: juansanchezruiz05 en 10 de Octubre de 2016, 17:59:39
Muchas gracias. Cada vez estoy más cerca de que funciona. Ya escribe la pantalla el número Adjunto una librería en ensamblador que pasa de binario a ascii y que funciona en principio
OTRA COSA QUE SIGNIFICA ESTO: movlw .0
Ahora tengo que solucionar el problema de que el sensor sht11 no me mide la humedad bien. El problema esta en alguna surutina
Para tranformar la humedad en un dato que se entienda hay que aplicar la seguiente formula al dato proporcionado por el sensor:
HR=(a*Lectura del sensor+b)/256
pero no se el valor de a ni de b. Bueno en realidad no se si es esa la formula