Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: lu8djr en 03 de Noviembre de 2017, 14:53:57
Título: Extraño comportamiento 16F628A con INDF
Publicado por: lu8djr en 03 de Noviembre de 2017, 14:53:57
Estoy desarrollando un frecuencimetro basado en el proyecto de IK3OIL originalmente corre en 16F84. Necesitaba hacerle varias reformas para que se ajuste a mis necesidades, entre ellas visualizar los datos en una LCD de 2x8 en lugar de la 2x16 original. Como no encontré el ASM use el programa PICDisasm para convertir el HEX a ASM. Claro el codigo resultante me fue muy duro de interpretar. Después de batallar bastante pude lograr hacer funcionar bien el código tanto en simulación de Proteus como en hardware real. Entonces emprendí la segunda etapa que seria pasar el código al 16f628a. Muchas pero muchas horas después pude simularlo perfectamente en Proteus. En el camino reescribi gran parte del código. En el hardware real no visualiza correctamente. Vuelta a cambiar rutinas y buscar y rebuscar. Finalmente encontre el problema pero no la solucion. a la hora de enviar los datos a la LCD uso las instrucciones FSR / INDF. Aqui la parte del codigo donde esta el problema:
MOVF CONT_LCD1,W ; En este registro se encuentra la posicion de memoria donde quiero tomar el dato Ej:0x20 MOVWF FSR ; Aqui pongo el 0x20 en el FSR para el direccionamiento indirecto MOVF INDF,W ; Aqui cargo en W el valor .49 que estaba el la posicion de memoria 0x20 CALL LCD_CARACTER ; Aqui salto a la rutina que toma el dato de W separa los nibles los envia al lcd etc.etc
Ahora bien el valor .49 corresponde al ASC 1. Como dije antes en la simulacion MPlab Sim y en Proteus funciona a la perfeccion. en el Hardware real en lugar de mostrarme un numero 1 la lcd me muestra el numero 6 Como sospeche del resto del cogido so sustitui por esto :
MOVWF .49 CALL LCD_CARACTER
De esta forma tanto en simulacion como en el hardware real me muestra el numero 1 como corresponde. Entiendo que el direccionamiento indirecto funciona distinto en el 16f84 que en el 16f628A, algo que la simulacion no se entera y por eso siempre simula bien. Que factor puede alterar el funcionamiento de INDF en 16F628A que no se manifiesta en 16f84 o en las simulaciones? GRACIAS por su tiempo!!!!
Título: Re:Extraño comportamiento 16F628A con INDF
Publicado por: KILLERJC en 03 de Noviembre de 2017, 15:47:56
Los problemas los cuales vas a tener que verificar son:
- En CONT_LCD1 sea correcto el 0x20 - En 0x20 sea correcto el valor decimal 49 o hexa 0x31.
Todo lo demas esta correcto, sino proba esto:
MOVLW .49 MOVWF CONT_LCD1 MOVF CONT_LCD1,W ; En este registro se encuentra la posicion de memoria donde quiero tomar el dato Ej:0x20 MOVWF FSR ; Aqui pongo el 0x20 en el FSR para el direccionamiento indirecto MOVF INDF,W ; Aqui cargo en W el valor .49 que estaba el la posicion de memoria 0x20 CALL LCD_CARACTER ; Aqui salto a la rutina que toma el dato de W separa los nibles los envia al lcd etc.etc
Si lo envia correctamente, entones quiere decir que el FSR/INDF funcionan bien.
Título: Re:Extraño comportamiento 16F628A con INDF
Publicado por: lu8djr en 04 de Noviembre de 2017, 16:03:06
Gracias por la celeridad de su respuesta.!!!! Introduje los cambios que recomendo y comprobe que INDF hace lo que corresponde. Mi problema viene heredado de otra parte del codigo. Realmente sigo desconcertado no se por que razon a pesar de ver correctamente los valores en FILE REGISTER al moverlos toman valores que consigo comprender. No quiero abusar , pero consideraria hecharle una mirada a mi codigo ?
Título: Re:Extraño comportamiento 16F628A con INDF
Publicado por: KILLERJC en 04 de Noviembre de 2017, 16:13:35
no hay problema, pone el codigo.
Título: Re:Extraño comportamiento 16F628A con INDF
Publicado por: lu8djr en 04 de Noviembre de 2017, 16:39:25
Bueno aqui va:
; **** Encabezado **** list p=16f628A ; Define el Microcontrolador a usar #include <P16F628A.inc> ; Libreria del micro que usamos ;-------------- FUSES ----------------------------------------------------------------------------------------- __CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_OFF &_CP_OFF & DATA_CP_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON
; ; _INTOSC_OSC_NOCLKOUT Oscilador interno sin salida ; _WDT_OFF DESACTIVADO WDT ( Perro Guardian ) ; _CP_OFF DESACTIVADO Proteccion de lectura de codigo ; DATA_CP_OFF DESACTIVADO Proteccion de lectura de memoria ; _LVP_OFF DESACTIVADO Programación en baja tensión ; _BODEN_ON DESACTIVADO Reset por descenso de voltaje de alimentación ; _PWRTE_ON ACTIVADO Retraso al reset ;-------------------------------------------------------------------------------------------------------------- ; VFO+IF 10.695 MHZ 0xBC -> 0xD4 ;------------------ Declaracion de Variables ------------------------ CBLOCK 0x20 IF_SPLIT1 IF_SPLIT2 IF_SPLIT3 ASC_DIG1 ASC_DIG2 ASC_DIG3 ASC_DIG4 ASC_DIG5 ASC_DIG6 ASC_DIG7 ASC_DIG8 IF_DEC_D1 IF_DEC_D2 IF_DEC_D3 IF_DEC_D4 IF_DEC_D5 IF_DEC_D6 IF_DEC_D7 IF_DEC_D8 FREQ_IF_B3 FREQ_IF_B2 FREQ_IF_B1 IF_SET_B3 IF_SET_B2 IF_SET_B1 FREQ_MED_B3 FREQ_MED_B2 FREQ_MED_B1 TICK_1 ORIGEN DESTINO PUNTO_HRZ CONT_ASC CONT_BIT CONT_CAR CONT_CHR CONT_DIG CONT_DIGI CONT_LCD CONT_LCD1 TEMP_ASC TEMP_CHR TEMP_LCD RET1 RET2 ASC1 ASC2 ASC3 ASC4 ASC5 ASC6 ASC7 ASC8 ENDC ;--------------------------------------------------------------- ; Program
Org 0x00
; Reset-Vector GOTO INICIO ; ADDLW 0xFF ; b'11111111' d'255' ; ADDLW 0xFF ; b'11111111' d'255' ; ADDLW 0xFF ; b'11111111' d'255' ;;--------------------------------------------------------------- INICIO CLRF PORTA ; !!Bank!! PORTA - TRISA CLRF PORTB ; !!Bank!! PORTB - TRISB BSF STATUS,RP0 ; !!Bank Select 1 MOVLW 0xF7 ; b'11110111' d'247' MOVWF PORTA ; !!Bank!! PORTA - TRISA MOVLW 0x00 ; b'00000000' d'000' MOVWF PORTB ; PORTB Todo como salida MOVLW 0x27 ; b'00100111' d'039' "'" MOVWF TMR0 ; !!Bank!! TMR0 - OPTION_REG BCF STATUS,RP0 ; !!Bank Select 0 ; CALL RETARDO_5mS CALL LCD_INIT PRINCIPAL CLRF TMR0 ; !!Bank!! TMR0 - OPTION_REG ; CLRF LRAM_0x4B BCF INTCON,T0IF BCF PORTA,3 ; !!Bank!! PORTA - TRISA MOVWF PORTA ; !!Bank!! PORTA - TRISA movlw d'7' ; carga en w el valor decimal 7 movwf CMCON ; pone 7 en el registro CMCOM para desactivar los comparadores ; CALL TOMA_MUESTRA CALL EEPROM_TRUCHA CALL SUMA_IF_FREC CALL BIN_DEC CALL ASCII_CONV CALL LCD_CONF CALL LCD_SEND ; GOTO PRINCIPAL SLEEP ;----------------------------------------------------------- ; RUTINA TOMA DE MUESTRA ;----------------------------------------------------------- TOMA_MUESTRA CLRF FREQ_MED_B2 CLRF FREQ_MED_B3 MOVF TMR0,W MOVWF FREQ_MED_B3 BTFSS INTCON,T0IF GOTO TM_1 INCF TICK_1,F BCF INTCON,T0IF TM_1 CLRF FREQ_MED_B1 DECF FREQ_MED_B1,F TM_2 BCF PORTA,3 ; PORTA RA3 (0) BSF PORTA,3 ; PORTA RA3 (1) MOVF TMR0,W ; TMR0 - OPTION_REG SUBWF FREQ_MED_B3,W BTFSC STATUS,Z GOTO TM_3 GOTO TM_4 TM_3 INCF FREQ_MED_B1,F GOTO TM_2 TM_4 COMF FREQ_MED_B1,W MOVWF FREQ_MED_B2 RETURN
;----------------------------------------------------------- ; HACE CONVERSION A ASCII Y PONE PUNTO DECIMAL ASCII_CONV ;----------------------------------------------------------- MOVLW 0x31 ; Posición de IF_DEC_D8 MOVWF ORIGEN MOVLW 0x23 ; Posición de ASC_DIG1 MOVWF DESTINO MOVLW .7 MOVWF CONT_CAR BSF PUNTO_HRZ,0 ASC_LOOP MOVF ORIGEN,W MOVWF FSR MOVF INDF,W MOVWF TEMP_CHR MOVF DESTINO,W MOVWF FSR MOVLW 0x30 ADDWF TEMP_CHR,F
;;---------------------------------------------------------- END
Fijese en la ultima rutina LCD_CONF que simplemente mueve registros de un sitio a otro. alli se pone de manifiesto el problema los valores de ...
ASC_DIG1 Corresponde al valor ASCII 49 es decir 1 ASC_DIG2 Corresponde al valor ASCII 48 es decir 0 ASC_DIG3 Corresponde al valor ASCII 54 es decir 6 ASC_DIG4 Corresponde al valor ASCII 57 es decir 9 ASC_DIG5 Corresponde al valor ASCII 53 es decir 5 ASC_DIG6 Corresponde al valor ASCII 46 es decir , ASC_DIG7 Corresponde al valor ASCII 48 es decir 0 ASC_DIG8 Corresponde al valor ASCII 48 es decir 0
la idea es q la rutina lcd_send tome los valores y los envia al LCD
Título: Re:Extraño comportamiento 16F628A con INDF
Publicado por: KILLERJC en 04 de Noviembre de 2017, 19:44:30
Citar
Fijese en la ultima rutina LCD_CONF que simplemente mueve registros de un sitio a otro. alli se pone de manifiesto el problema los valores de ...
No se si te equivocaste en lo que quisiste hacer... Por que esto:
Código: ASM
LCD_CONF
MOVLW ASC_DIG1
MOVWF ASC1
Con este CBLOCK:
Código: ASM
CBLOCK 0x20
IF_SPLIT1 ; 0x20
IF_SPLIT2 ; 0x21
IF_SPLIT3 ; 0x22
ASC_DIG1 ; 0x23
ASC_DIG2 ; 0x24
Se transforma en:
Código: ASM
LCD_CONF
MOVLW 0x23; o 35 decimal
MOVWF ASC1
Primero que CBLOCK define numeros constantes comenzando de un valor que uno define, es como un EQU, por lo tanto ASC_DIG1 en realidad es lo mismo que el valor constante 0x23. Si uno lo usa con un ADDWF 0x23, F se esta refiriendo al registro con esa direccion, pero si haces un MOVLW ( literal ) estas usando el valor 0x23, entonces tu programa hace:
W = 0x23 0x23 en W [ASC1] = W El contenido de W en el contenido apuntado por ASC1
Distinto si fuera con otra instruccion, como vos decis ahora si "mueve registros" con este codigo:
Código: ASM
MOVF ASC_DIG1, W
MOVWF ASC1
W = [0x23] El contenido de la direccion 0x23 a W [ASC1] = W Y luego W al contenido de la direccion apuntada por ASC1
En el cual ahora si estas pasando el valor de la direccion 0x23 a la direccion que tiene el valor ASC1.
----------------------------------------------
Veo que lo de arriba te causo confusion sino hubieras usado eso para simplificarte la vida. Ejemplo, en tu codigo:
Código: ASM
MOVLW 0x31; Posición de IF_DEC_D8
MOVWF ORIGEN
MOVLW 0x23; Posición de ASC_DIG1
MOVWF DESTINO
Tranquilamente podrias haber realizado:
Código: ASM
MOVLW IF_DEC_D8
MOVWF ORIGEN
MOVLW ASC_DIG1
MOVWF DESTINO
Título: Re:Extraño comportamiento 16F628A con INDF
Publicado por: lu8djr en 04 de Noviembre de 2017, 23:35:26
Si si completamente erre feo en LCD_conF. Ya me tiene mareado el tema. Podria enviarle la simulacion en proteus y el codigo compilado como un adjunto para explicarme mejor
Título: Re:Extraño comportamiento 16F628A con INDF
Publicado por: KILLERJC en 05 de Noviembre de 2017, 10:37:04
Yo no uso proteus, como para probarlo, el codigo compilado lo unico que voy a poder hacer es ponerlo en el MPLAB, que la diferencia es que le va a quitar todas las etiquetas y nombres de los registros.
Mejor es, si tenes algun problema ponerlo aca y lo resolvemos.
Título: Re:Extraño comportamiento 16F628A con INDF
Publicado por: lu8djr en 05 de Noviembre de 2017, 13:32:10
BIEN!!! Seguí trabajando con las pistas que me dio, pude finalmente identificar que la rutina que falla es la con conversión del binario a decimal (BIN_DEC). Esta rutina toma el numero binario guardado en los 24 bits correspondientes a "FREQ_IF_B1"," FREQ_IF_B2" y "FREQ_IF_B3", los transforma en decimal y el resultado se guarda en "IF_DEC_D1" al "IF_DEC_D8". Mas adelante pasa estos números a su correspondiente ASCII y se agrega el punto decimal (ASCII_CONV). Luego se envía a la LCD... etc. El problema entonces es que en la simulación todo sale bien y muestra correctamente el valor "10695.00". En el file register de MPlab se vera la salida en "IF_DEC_D1" al "IF_DEC_D8" y la conversión a ASC en "ASC_DIG1" al "ASC_DIG8" incluida la "," decimal. Lo curioso es que en el hardware real no lo hace correctamente. Como prueba si uno comenta la rutina (BIN_DEC) para que no se ejecute en el hardware se ve correctamente "00000.00" lo que implica que el resto de las rutinas funciona correctamente. Vuelvo a dejar el codigo completo : ; **** Encabezado **** list p=16f628A ; Define el Microcontrolador a usar #include <P16F628A.inc> ; Libreria del micro que usamos ;-------------- FUSES ----------------------------------------------------------------------------------------- __CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_OFF &_CP_OFF & DATA_CP_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON
; ; _INTOSC_OSC_NOCLKOUT Oscilador interno sin salida ; _WDT_OFF DESACTIVADO WDT ( Perro Guardian ) ; _CP_OFF DESACTIVADO Proteccion de lectura de codigo ; DATA_CP_OFF DESACTIVADO Proteccion de lectura de memoria ; _LVP_OFF DESACTIVADO Programación en baja tensión ; _BODEN_ON DESACTIVADO Reset por descenso de voltaje de alimentación ; _PWRTE_ON ACTIVADO Retraso al reset ;-------------------------------------------------------------------------------------------------------------- ; VFO+IF 10.695 MHZ 0xBC -> 0xD4 ;------------------ Declaracion de Variables ------------------------ CBLOCK 0x20 IF_SPLIT1 IF_SPLIT2 IF_SPLIT3 ASC_DIG1 ASC_DIG2 ASC_DIG3 ASC_DIG4 ASC_DIG5 ASC_DIG6 ASC_DIG7 ASC_DIG8 IF_DEC_D1 IF_DEC_D2 IF_DEC_D3 IF_DEC_D4 IF_DEC_D5 IF_DEC_D6 IF_DEC_D7 IF_DEC_D8 FREQ_IF_B3 FREQ_IF_B2 FREQ_IF_B1 IF_SET_B3 IF_SET_B2 IF_SET_B1 FREQ_MED_B3 FREQ_MED_B2 FREQ_MED_B1 TICK_1 ORIGEN DESTINO PUNTO_HRZ CONT_ASC CONT_BIT CONT_DIG CONT_CYC CONT_DEC CONT_CAR CONT_CHR CONT_LCD CONT_LCD1 TEMP_ASC TEMP_CHR TEMP_LCD RET1 RET2 ENDC ;--------------------------------------------------------------- ; Program Org 0x00 ; Reset-Vector GOTO INICIO ;--------------------------------------------------------------- INICIO CLRF PORTA ; !!Bank!! PORTA - TRISA CLRF PORTB ; !!Bank!! PORTB - TRISB BSF STATUS,RP0 ; !!Bank Select 1 ; MOVLW 0xF7 ; b'11110111' d'247' ; MOVWF PORTA ; !!Bank!! PORTA - TRISA MOVLW 0x00 ; b'00000000' d'000' MOVWF PORTB ; PORTB Todo como salida MOVLW 0x27 ; b'00100111' d'039' "'" MOVWF TMR0 ; !!Bank!! TMR0 - OPTION_REG BCF STATUS,RP0 ; !!Bank Select 0 ; CALL RETARDO_5mS CALL LCD_INIT PRINCIPAL CLRF TMR0 ; !!Bank!! TMR0 - OPTION_REG ; CLRF LRAM_0x4B BCF INTCON,T0IF BCF PORTA,3 ; !!Bank!! PORTA - TRISA MOVWF PORTA ; !!Bank!! PORTA - TRISA movlw d'7' ; carga en w el valor decimal 7 movwf CMCON ; pone 7 en el registro CMCOM para desactivar los comparadores ; CALL TOMA_MUESTRA CALL EEPROM_TRUCHA CALL SUMA_IF_FREC ; CALL BIN_DEC CALL ASCII_CONV CALL LCD_SEND ; GOTO PRINCIPAL SLEEP ;----------------------------------------------------------- ; RUTINA TOMA DE MUESTRA ;----------------------------------------------------------- TOMA_MUESTRA CLRF FREQ_MED_B2 CLRF FREQ_MED_B3 MOVF TMR0,W MOVWF FREQ_MED_B3 BTFSS INTCON,T0IF GOTO TM_1 INCF TICK_1,F BCF INTCON,T0IF TM_1 CLRF FREQ_MED_B1 DECF FREQ_MED_B1,F TM_2 BCF PORTA,3 ; PORTA RA3 (0) BSF PORTA,3 ; PORTA RA3 (1) MOVF TMR0,W ; TMR0 - OPTION_REG SUBWF FREQ_MED_B3,W BTFSC STATUS,Z GOTO TM_3 GOTO TM_4 TM_3 INCF FREQ_MED_B1,F GOTO TM_2 TM_4 COMF FREQ_MED_B1,W MOVWF FREQ_MED_B2 RETURN
;----------------------------------------------------------- ; HACE CONVERSION A ASCII Y PONE PUNTO DECIMAL ASCII_CONV ;----------------------------------------------------------- MOVLW 0x31 ; Posición de IF_DEC_D8 MOVWF ORIGEN MOVLW 0x23 ; Posición de ASC_DIG1 MOVWF DESTINO MOVLW .7 MOVWF CONT_CAR BSF PUNTO_HRZ,0 ASC_LOOP MOVF ORIGEN,W MOVWF FSR MOVF INDF,W MOVWF TEMP_CHR MOVF DESTINO,W MOVWF FSR MOVLW 0x30 ADDWF TEMP_CHR,F BTFSS PUNTO_HRZ,0 GOTO SIN_PUNTO GOTO VERIF_PUNTO CONTINUA DECFSZ CONT_CAR,F GOTO ASC_LOOP RETURN VERIF_PUNTO MOVLW .2 SUBWF CONT_CAR,W BTFSS STATUS,Z GOTO SIN_PUNTO MOVLW .46 MOVWF INDF INCF DESTINO,F BCF PUNTO_HRZ,0 INCF CONT_CAR,F GOTO CONTINUA SIN_PUNTO MOVF TEMP_CHR,W MOVWF INDF DECF ORIGEN,F INCF DESTINO,F GOTO CONTINUA ;----------------------------------------------------------- LCD_INIT ;----------------------------------------------------------- MOVLW 0x23 CALL LCD_INIT1 MOVLW 0x22 CALL LCD_INIT1 MOVLW 0x22 CALL LCD_INIT1 MOVLW 0x28 CALL LCD_INIT1 MOVLW 0x20 CALL LCD_INIT1 MOVLW 0x2C CALL LCD_INIT1 MOVLW 0x20 CALL LCD_INIT1 MOVLW 0x21 CALL LCD_INIT1 RETURN LCD_INIT1 MOVWF PORTB ; Mueve al PORTB nibble alto NOP BCF PORTB,5 ; RB5 PONE EN 0 ( E ) LCD Enabled CALL RETARDO_5mS RETURN ;----------------------------------------------------------- LCD_CARACTER ;----------------------------------------------------------- ; ----------------- NIBBLE ALTO ---------------- MOVWF TEMP_LCD BSF PORTB,4 NOP SWAPF TEMP_LCD,W IORLW 0x30 ; b'00110000' Agrega (RS)mas (E) MOVWF PORTB ; Mueve al PORTB NOP BCF PORTB,5 ; RB5 PONE EN 0 (E) CALL RETARDO_5mS ; Retardo para LCD MOVF TEMP_LCD,W ; Retoma el valor inicial ; ---------------- NIBBLE BAJO ---------------- IORLW 0x30 ; b'00110000' Agrega (RS)mas (E) MOVWF PORTB ; Mueve al PORTB NOP BCF PORTB,5 ; RB5 PONE EN 0 (E) CALL RETARDO_5mS ; Retardo para LCD RETURN ;----------------------------------------------------------- RETARDO_5mS ;----------------------------------------------------------- MOVLW .100 ;.26 MOVWF RET2 CLRF RET1 RETARDO_1 DECFSZ RET1,1 GOTO RETARDO_1 DECFSZ RET2,1 GOTO RETARDO_1 RETURN ;----------------------------------------------------------- EEPROM_TRUCHA ;----------------------------------------------------------- MOVLW .16 MOVWF IF_SET_B3 MOVLW .81 MOVWF IF_SET_B2 MOVLW .188 ; DECIA .188 MOVWF IF_SET_B1 RETURN ;---------------------------------------------------------- ; RUTINA DE SUMA FRECUENCIA MEDIDA MAS IF ;---------------------------------------------------------- SUMA_IF_FREC ; ----------------- SUMA BIT 3 -------------------------- BCF STATUS,C MOVF FREQ_MED_B3,W ;Carga en W dato de menos peso ADDWF IF_SET_B3,W ;Suma menos peso del dato B3 BTFSC STATUS,C ;Hubo acarreo anterior ?? GOTO OVER MOVWF FREQ_IF_B3 ;Almacena el resultado ; ----------------- SUMA BIT 2 -------------------------- MOVF FREQ_MED_B2,W ;Carga en W dato de Bit 2 ADDWF IF_SET_B2,W ;Suma Bit 2 BTFSC STATUS,C ;Hubo acarreo anterior ?? GOTO CARRY_B2 CONT_B2 MOVWF FREQ_IF_B2 ;Almacena el resultado GOTO SUMA_B1 CARRY_B2 BCF STATUS,C INCF FREQ_IF_B3,F BTFSC STATUS,C ;Hubo acarreo anterior ?? GOTO OVER BCF STATUS,C GOTO CONT_B2 ; ----------------- SUMA BIT 1 -------------------------- SUMA_B1 MOVF FREQ_MED_B1,W ;Carga en W dato de Bit 1 ADDWF IF_SET_B1,W ;Suma Bit 2 BTFSC STATUS,C ;Hubo acarreo anterior ?? GOTO CARRY_B1 CONT_B1 MOVWF FREQ_IF_B1 ;Almacena el resultado RETURN CARRY_B1 BCF STATUS,C INCF FREQ_IF_B2,F BTFSC STATUS,C ;Hubo acarreo anterior ?? INCF FREQ_IF_B3,F BCF STATUS,C GOTO CONT_B1 ; ------------------------------------------------------- OVER CLRF IF_DEC_D1 CLRF IF_DEC_D2 CLRF IF_DEC_D3 CLRF IF_DEC_D4 CLRF IF_DEC_D5 CLRF IF_DEC_D6 CLRF IF_DEC_D7 CLRF IF_DEC_D8 RETURN ;---------------------------------------------------------- ; RUTINA DE CONVERCION DE BINARIO A DECIMAL ;---------------------------------------------------------- BIN_DEC CALL OVER CLRF CONT_CYC MOVLW .8 MOVWF CONT_DIG