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
OCTLOOP:
INCF CONT_CYC,F
MOVLW .3
MOVWF CONT_BIT
BITLOOP:
RLF FREQ_IF_B1,F
RLF FREQ_IF_B2,F
RLF FREQ_IF_B3,F
MOVLW 0X2B ; APUNTA A IF_DEC_D1
MOVWF FSR
MOVFW CONT_CYC
MOVWF CONT_DEC
DECLOOP:
RLF INDF,F
MOVLW 0xF6
ADDWF INDF,0
BTFSC STATUS,0
MOVWF INDF
INCF FSR,F
DECFSZ CONT_DEC,F
GOTO DECLOOP
DECFSZ CONT_BIT,F
GOTO BITLOOP
DECFSZ CONT_DIG,F
GOTO OCTLOOP
RETURN
;----------------------------------------------------------
; RUTINA ENVIO DE DATOS A LCD
;----------------------------------------------------------
LCD_SEND
CLRF PORTB
CLRF CONT_LCD1
MOVLW .8 ; cantidad de caracteres a enviar
MOVWF CONT_LCD
MOVLW 0x23 ; Apunta a ASC_DIG1
MOVWF CONT_LCD1
LCD_SEND1
CLRF TEMP_LCD
; CALL PRUEBA ;<======= PRUEBA PARA FSR / INDIF
MOVF CONT_LCD1,W
MOVWF FSR
MOVF INDF,W
; MOVLW .49 ;<======= PRUEBA PARA LCD_CARACTER
CALL LCD_CARACTER
INCF CONT_LCD1,F
DECFSZ CONT_LCD,F
GOTO LCD_SEND1
RETURN
;----------------------------------------------------------
; RUTINA PRUEBA DE FSR / INDIF NO FORMARA PARTE DEL CODIGO
;----------------------------------------------------------
PRUEBA
CLRF ASC_DIG1
MOVLW .49
MOVWF ASC_DIG1
CLRF ASC_DIG2
MOVLW .48
MOVWF ASC_DIG2
CLRF ASC_DIG3
MOVLW .54
MOVWF ASC_DIG3
CLRF ASC_DIG4
MOVLW .57
MOVWF ASC_DIG4
CLRF ASC_DIG5
MOVLW .53
MOVWF ASC_DIG5
CLRF ASC_DIG6
MOVLW .46
MOVWF ASC_DIG6
CLRF ASC_DIG7
MOVLW .48
MOVWF ASC_DIG7
CLRF ASC_DIG8
MOVLW .48
MOVWF ASC_DIG8
CLRW
RETURN
;----------------------------------------------------------
END