Hola a todos. Cuanto tiempo
pero entre el trabajo y la familia no me queda mucho tiempo para los pics
Os cuento mis progresos:
He escrito la conversion a-d sin problemas. He conseguido una buena rutina para el LCD (recomendada por jorsss) y otra que convierte binario a bcd sin problemas.
Sigo a vueltas con las rutinas aritmeticas y todavia no consigo una rutina de division que funcione.
El caso es que leyendo por ahi he visto una forma diferente de hacerlo sin utilizar division, sino utilizando tablas con la instruccion "addwf PCL, F" y "retlw". Utilizando la conversion de 8 bits y no la de 10, de la conversion sale un numero entre 0~255, con ese numero llama a una tabla de 256 lineas (tarde tiempo en escribirla
). La tabla devuelve un numero de 0 a 100 que convertido y pasado a la pantalla seria mi deseado porcentaje.
El caso es que el programa (probado en proteus) no va mal pero cuando la entrada pasa de cierto nivel, la pantalla se resetea y hace cosas raras. Por lo que he leido puede ser un salto incontrolado por que la tabla se va de pagina y eso se soluciona accionando sobre PCL y PCLATH....... pero la verdad es que no entiendo muy bien este punto. Si alguien me puede ayudar se lo agradeceria porque esto de las tablas parece bastante interesante pero facil para equivocarse.
Les adjunto mi codigo.
Gracias por su atencion.
;*****************PROGRAMA PARA SACAR UNA SENAL DE 0~5 VOLTIOS EN PORCENTAJE POR UN LCD**********************
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_ALL & _DEBUG_OFF & _WRT_OFF & _CPD_ON & _LVP_OFF & _BODEN_ON & _HS_OSC & _WDT_OFF & _PWRTE_ON
CBLOCK
RESULTADO
ENDC
V_RESET ORG 0x000
GOTO main
ORG 0x004
RETFIE
main bcf STATUS, RP0
clrf PORTB
clrf PORTC
clrf PORTD
bsf STATUS, RP0
movlw b'00000001'
movwf PORTB
clrf PORTD
movlw b'11111111'
movwf PORTC
bcf OPTION_REG,INTEDG
bcf STATUS, RP0
;***********CONVERSION DE LA ENTRADA 1-5V A DIGITAL*****************************************************
Initad bsf STATUS, RP0
movlw b'00001110'
movwf ADCON1
bcf STATUS, RP0
movlw b'01000001'
movwf ADCON0
call Retardo_20micros
bsf ADCON0, 2
loop btfsc ADCON0, 2
goto loop
movf ADRESH, RESULTADO
;*******************************PROGRAMA PRINCIPAL*******************************************************
Main1 call LCD_Inicializa
call LCD_Linea1
call LCD_Output ;Saca la palabra "OUTPUT:" por el LCD
movfw RESULTADO
call Tabla1
call LCD_Dec ;Llama a la rutina que cambia binario a bcd
movf CENTENAS,0
addlw .48
call LCD_Caracter
movf DECENAS,0
addlw .48
call LCD_Caracter
movf UNIDADES,0
addlw .48
call LCD_Caracter
call LCD_Pc ;Saca "%" por el LCD
goto Initad
;**********TABLA DE SALIDAS DEL LCD. TIENE QUE HABER 256, UNA POR CADA NUMERO DIGITAL*****************************
;*************SALIDA 1 SE REFIERE AL POCENTAJE DE LA SENAL: 0 Voltios=0%, 5 Vol=100%**************************************
;**********ESTA RUTINA DEVUELVE UN NUMERO DE 0 A 100 QUE LUEGO HAY QUE CONVERTIR A BCD PARA SACARLO POR EL LCD****
Tabla1 addwf PCL, F
retlw D'0' ; adresh=0
retlw D'0' ; adresh=1
retlw D'0' ; adresh=2
retlw D'1' ; adresh=3
retlw D'1' ; adresh=4
retlw D'2' ; adresh=5
retlw D'2' ; adresh=6
retlw D'2' ; adresh=7
retlw D'3' ; adresh=8
esta parte la he suprimido para que no sea muy largo el mensaje pero creo que se puede entender.
retlw D'95' ;adresh=245
retlw D'96' ; adresh=246
retlw D'96' ;adresh=247
retlw D'96' ;adresh=248
retlw D'97' ;adresh=249
retlw D'97' ;adresh=250
retlw D'98' ;adresh=251
retlw D'98' ; adresh=252
retlw D'99' ;adresh=253
retlw D'99' ;adresh=254
retlw D'100' ;adresh=255
#INCLUDE <LCD_4BIT.INC>
#INCLUDE <RETARDOS.INC>
#INCLUDE <LCD_VARIOS.INC>
#INCLUDE <LCD_DEC.INC>
END