Autor Tema: Extraño comportamiento 16F628A con INDF  (Leído 218 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado lu8djr

  • PIC10
  • *
  • Mensajes: 9
Extraño comportamiento 16F628A con INDF
« 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!!!!

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6121
Re:Extraño comportamiento 16F628A con INDF
« Respuesta #1 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.

Desconectado lu8djr

  • PIC10
  • *
  • Mensajes: 9
Re:Extraño comportamiento 16F628A con INDF
« Respuesta #2 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 ?

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6121
Re:Extraño comportamiento 16F628A con INDF
« Respuesta #3 en: 04 de Noviembre de 2017, 16:13:35 »
no hay problema, pone el codigo.

Desconectado lu8djr

  • PIC10
  • *
  • Mensajes: 9
Re:Extraño comportamiento 16F628A con INDF
« Respuesta #4 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

   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
    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   RET1
;   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   BIN2DEC
BRK1
   RETURN

BIN2DEC
   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
   MOVLW   .24      ;24 BITS TO DO
   MOVWF   CONT_BIT
BITLP
   RLF      FREQ_IF_B1,F      ;SHIFT MSB INTO CARRY
   RLF      FREQ_IF_B2,F
   RLF      FREQ_IF_B3,F
   MOVLW   0x2B   ; Apunta a IF_DEC_D1
   MOVWF   FSR      ; PUNTERO DE DIGITOS
   MOVLW   .8      ; 8 DIGITOS DE TRABAJO
   MOVWF   CONT_DIG
ADJLP
   RLF      INDF,F      ; SHIFT DIGIT 1 BIT LEFT
   MOVLW   -.10
   ADDWF   INDF,W   ; COMPRUEBA Y AJUSTA EL DESBORDAMIENTO DECIMAL
   SKPNC
   MOVWF   INDF
   INCF   FSR,F      ; SIGUIENTE DIGITO
   DECFSZ   CONT_DIG,F
   GOTO   ADJLP
   DECFSZ   CONT_BIT,F   ; SIGUIENTE BIT
   GOTO   BITLP
   RETURN

;----------------------------------------------------------
;         RUTINA ENVIO DE DATOS A LCD
;----------------------------------------------------------
LCD_SEND
    CLRF   PORTB
   CLRF   CONT_LCD1
;   MOVLW   0x01      ; Primera linea HOME
;   CALL   LCD_CARACTER
   MOVLW   .8         ; cantidad de caracteres a enviar
   MOVWF   CONT_LCD
   MOVLW    0x23      ;   Apunta a ASC_DIG1
    MOVWF   CONT_LCD1
LCD_SEND1
   CLRF   TEMP_LCD
   MOVF   CONT_LCD1,W
   MOVWF    FSR
   MOVF   INDF,W

   CALL   LCD_CARACTER
   INCF   CONT_LCD1,F
   DECFSZ   CONT_LCD,F
   GOTO   LCD_SEND1
   RETURN


LCD_CONF
   MOVLW   ASC_DIG1
   MOVWF   ASC1
   MOVLW   ASC_DIG2
   MOVWF   ASC2
   MOVLW   ASC_DIG3
   MOVWF   ASC3
   MOVLW   ASC_DIG4
   MOVWF   ASC4
   MOVLW   ASC_DIG5
   MOVWF   ASC5
   MOVLW   ASC_DIG6
   MOVWF   ASC6
   MOVLW   ASC_DIG7
   MOVWF   ASC7
   MOVLW   ASC_DIG8
   MOVWF   ASC8
   RETURN


;;----------------------------------------------------------
   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
« Última modificación: 04 de Noviembre de 2017, 17:04:43 por lu8djr »

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6121
Re:Extraño comportamiento 16F628A con INDF
« Respuesta #5 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
  1. LCD_CONF
  2.    MOVLW   ASC_DIG1
  3.    MOVWF   ASC1

Con este CBLOCK:

Código: ASM
  1.    CBLOCK   0x20
  2. IF_SPLIT1          ; 0x20
  3. IF_SPLIT2          ; 0x21
  4. IF_SPLIT3          ; 0x22
  5. ASC_DIG1          ; 0x23
  6. ASC_DIG2          ; 0x24

Se transforma en:

Código: ASM
  1. LCD_CONF
  2.    MOVLW   0x23               ; o 35 decimal
  3.    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
  1.    MOVF      ASC_DIG1, W
  2.    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
  1.    MOVLW   0x31      ;   Posición de IF_DEC_D8
  2.    MOVWF   ORIGEN
  3.    MOVLW   0x23      ;   Posición de ASC_DIG1
  4.    MOVWF   DESTINO

Tranquilamente podrias haber realizado:

Código: ASM
  1.    MOVLW   IF_DEC_D8
  2.    MOVWF   ORIGEN
  3.    MOVLW   ASC_DIG1
  4.    MOVWF   DESTINO

« Última modificación: 04 de Noviembre de 2017, 19:49:42 por KILLERJC »

Desconectado lu8djr

  • PIC10
  • *
  • Mensajes: 9
Re:Extraño comportamiento 16F628A con INDF
« Respuesta #6 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

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6121
Re:Extraño comportamiento 16F628A con INDF
« Respuesta #7 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.

Desconectado lu8djr

  • PIC10
  • *
  • Mensajes: 9
Re:Extraño comportamiento 16F628A con INDF
« Respuesta #8 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

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

Desconectado lu8djr

  • PIC10
  • *
  • Mensajes: 9
Re:Extraño comportamiento 16F628A con INDF
« Respuesta #9 en: 05 de Noviembre de 2017, 16:42:36 »
SI !!!!!   :-/

FINALMENTE ENCONTRE EL PROBLEMA !!!!

Error de princiante que soy  :(

Solo me debía falta inicializar correctamente los registros en (SUMA_IF_FREC). Claro el error estaba mas adelante en el código.

   CLRF   FREQ_MED_B1
   CLRF   FREQ_MED_B2
   CLRF   FREQ_MED_B3

Soluciono el dilema.
Mil gracias por su colaboración, no hubiese llegado a esa conclusión sin tu guia.
MIL GRACIAS  :-/

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6121
Re:Extraño comportamiento 16F628A con INDF
« Respuesta #10 en: 05 de Noviembre de 2017, 17:21:42 »
Felicidades por encontrar el error!