Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?
11/03/2014 #1


Problema con el P16f876
Buenas tardes, he realizado un programa en asm, con el PIC16F873-04 lo grabo y no tengo ningún problema, pero el mismo programa con el PIC16F876-04 no me funciona bien.

Es raro porque son compatibles, ¿no?

El programa consiste en realizar una resta (valor actual del TMR1 en formato mm:ss - valor grabado en la flash del pic)
El resultado de la resta se visualiza en una pantalla LCD 2x16.

Muchas gracias.

Saludos.

Aquí esta el programa:
Código:
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC & _LVP_OFF
    LIST P=16F876
    INCLUDE <P16F876.INC>
 
    CBLOCK 0x20 
    Lcd_Temp_1            ;Rutina lcd_cxx1.inc
    Lcd_Temp_2            ;Rutina lcd_cxx1.inc
    BCD_Centenas
    BCD_Decenas
    BCD_Unidades
    BCD_Centenas_Min        ;BIN_BCD_MIN.INC    
    BCD_Decenas_Min        ;BIN_BCD_MIN.INC            
    BCD_Unidades_Min        ;BIN_BCD_MIN.INC
    BCD_Centenas_Seg        ;BIN_BCD_SEG.INC
    BCD_Decenas_Seg        ;BIN_BCD_SEG.INC    
    BCD_Unidades_Seg        ;BIN_BCD_SEG.INC
    BCD_Centenas_Seg_        ;BIN_BCD_SEG.INC
    BCD_Decenas_Seg_        ;BIN_BCD_SEG.INC    
    BCD_Unidades_Seg_        ;BIN_BCD_SEG.INC    
    Segundos            
    Minutos            
    MinutosSegundos_TiempoH    
    MinutosSegundos_TiempoL
    ACCaHI        ;SUSTRAENDO HI 
    ACCaLO        ;SUSTRAENDO LO
    ACCbHI        ;MINUENDO HI
    ACCbLO        ;MINUENDO LO    
    CONTADOR            
    TEMPORAL            
    AUX
    PUNTO
    ADDRH
    ADDRL
    DATO_H
    DATO_L
    ;Dato
    ENDC
 
 
 
    #DEFINE    SETT        PORTC,1
    #DEFINE    MEM        PORTC,2
    #DEFINE    COPI        PORTC,5
    #DEFINE    VISUAL    PORTC,6
    #DEFINE    PROGRUN    PORTC,7
 
 
 
    ORG     0X00 
    goto    INICIO
    ORG    0x05
 
 
INICIO        
            clrf    PORTB        ; Limpiar salidas B
            clrf    PORTA
            clrf    PORTC        ; Limpiar salidas C
            bsf    STATUS,RP0    ; Acceso al banco 1
            bcf    STATUS,RP1
            movlw    b'00000110'    ; Puerta A E/S Digitales
            movwf    ADCON1    
            clrf    TRISA    
            clrf    TRISB        ; Puerta B como salida
            movlw    0XFF
            movwf    TRISC        ; Puerta C como entrada    
            ;movlw    b'10000000'    ; Velocidad estandar con niveles I2C
            ;movwf    SSPSTAT
            ;movlw    .9        ; Velocidad de BUS I2C 100KHz
            ;movwf    SSPADD        
            bcf    STATUS,RP0    ; Banco 0
 
            ;movlw    b'00101000'    ; Módulo MSSP en On
            ;movwf    SSPCON
            call    UP_LCD    ; Configuración lineas para LCD
            call    LCD_INI    ; Inicialización LCD
            movlw    b'00001110'    ;
            call    LCD_REG    ;
            movlw    b'00000011'    ; Activa el TMR1 y selecciona entrada 
            movwf    T1CON        ;de pulsos externos en la entrada RC0 
            clrf    TMR1L
            clrf    TMR1H
 
 
            btfss    VISUAL    ; VISUAL=1 salta y va a M1R
            goto    T1_M1R_V_INIC
            btfsc    PROGRUN
            goto    T1_M1R_R_INIC
            goto    T1_M1R_P_INIC
 
T1_M1R_V_INIC    movlw    b'00000100'
            movwf    ADDRH
            movlw    b'00000000'
            movwf    ADDRL
 
            movlw    .0        ; Al pulsar MEM por primera vez saldra P01
            movwf    PUNTO    
            movf    PUNTO,W
            call     BIN_a_BCD
            clrf    BCD_Decenas_Seg_
            clrf    BCD_Unidades_Seg_        
 
T1_M1R_V        call    VISUALIZAR_POS
            call    T1_
            call    M1R_
            ;btfss    SETT
            ;goto    T1_M1L_V_INIC            
            btfsc    MEM        ; Si pulsamos MEM=0 salta
            goto    T1_M1R_V
 
E_T1_M1R_V        btfss    MEM        ; Espera a dejar de pulsar MEM para saltar
            goto    E_T1_M1R_V
            call    LEE_FLASH_V
 
            movf    PUNTO,W
            call     BIN_a_BCD
 
            btfsc    DATO_L,7    ; Si el 7=1 (negativo) del DATO_L sigue 
            goto    SN_T1_M1R_V
            movf    DATO_L,W
            call    BIN_a_BCD_SEG_
            call    VISUALIZAR_POS
            call    T1_
            call    M1R_
            call    SIGNO_MA
            goto    T1_M1R_V
 
SN_T1_M1R_V    bcf    DATO_L,7
            movf    DATO_L,W
            call     BIN_a_BCD_SEG_
            call    VISUALIZAR_POS
            call    T1_
            call    M1R_
            call    SIGNO_MENO
            goto    T1_M1R_V                
 
 
T1_M1R_P_INIC    movlw    .1
            movwf    PUNTO
            movlw    b'00000100'
            movwf    ADDRH
            movlw    b'00000000'
            movwf    ADDRL
T1_M1R_P        btfss    MEM        ; Si pulsamos MEM (RC2=0) sigue
            call    MEM_PUNTO    ; Memoriza el punto en la primera dirección
                        ; FLASH de M1R y pasa al siguiente punto 
E_T1_M1R_P        btfss    MEM        ; Si MEM=0 sigue pulsado : sigue
            goto    E_T1_M1R_P
 
            movf    PUNTO,W
            call    BIN_a_BCD
 
            movf    TMR1L,W
            movwf    MinutosSegundos_TiempoL
            movf    TMR1H,W
            movwf    MinutosSegundos_TiempoH
            call    MINUTOSSEGUNDOS_16BITS
            movf    Segundos,W
            call     BIN_a_BCD_SEG
            call    VISUALIZAR
            call    T1_
            call    M1R_
            movf    Minutos,W
            call    BIN_a_BCD_MIN
            call    VISUALIZAR
            call    T1_
            call    M1R_
 
            ;btfsc    SETT
            goto    T1_M1R_P
            ;goto    T1_M1L_P_INIC
 
 
T1_M1R_R_INIC    movlw    b'00000100'
            movwf    ADDRH
            movlw    b'00000000'
            movwf    ADDRL
 
            movlw    .0        ; Al pulsar COPI por primera vez saldra P01
            movwf    PUNTO    
            movf    PUNTO,W
            call     BIN_a_BCD
            clrf    BCD_Decenas_Seg_
            clrf    BCD_Unidades_Seg_
 
T1_M1R_R        call    TIEMP
            call    VISUALIZAR_POS
            call    T1_
            call    M1R_
            ;btfss    SETT
            ;goto    T1_M1L_R_INIC            
            btfsc    COPI        ; Si pulsamos COPI=0 salta
            goto    T1_M1R_R
 
E_T1_M1R_R        btfss    COPI        ; Espera a dejar de pulsar COPI para saltar
            goto    E_T1_M1R_R
            call    LEE_FLASH
 
            movf    PUNTO,W
            call     BIN_a_BCD
 
            movf    TMR1L,W    ; Minuendo
            movwf    ACCbLO
            movf    TMR1H,W
            movwf    ACCbHI
            movf    DATO_H,W    ; Sustraendo
            movwf    ACCaHI
            movf    DATO_L,W
            movwf    ACCaLO
 
            call    RESTA
 
            btfss    STATUS,C    ; Si el C=0 (negativo) del ACCbHI sigue 
            goto    signo_negativo
            movf    ACCbLO,W
            call    BIN_a_BCD_SEG_
            call    VISUALIZAR_POS
            call    T1_
            call    M1R_
            call    SIGNO_MA
            call    MEM_PUNTO_MAS
            ;movf    ACCbLO,W
            ;call    I2C_DISPLAY_7
            goto    T1_M1R_R
 
signo_negativo    comf    ACCbLO,F    ; Como la resta es negativa, complemento a 1
            incf    ACCbLO,F        ; Sumar 1
            movf    ACCbLO,W
            call     BIN_a_BCD_SEG_
            call    VISUALIZAR_POS
            call    T1_
            call    M1R_
            call    SIGNO_MENO
            call    MEM_PUNTO_MENOS
            ;movf    ACCbLO,W
            ;call    I2C_DISPLAY_7
            goto    T1_M1R_R
 
            ;btfsc    SET        ; Si pulsamos SET (RC1=0) salta
            ;goto    M1R
 
        INCLUDE <lcd_cxx1.inc>
        ;INCLUDE <RETARDOS.INC>
        INCLUDE <VISUALIZAR2x16_RALLY.INC>
        ;INCLUDE <VISUALIZAR2x16_RALLY_NEG.INC>
        INCLUDE <VISUALIZAR2x16_RALLY_POS.INC>
        INCLUDE <VISUALIZAR2x16_RALLY_TIEMPO.INC>
        INCLUDE <MINUTOSSEGUNDOS_16BITS.INC>
        INCLUDE <BIN_BCD_SEG.INC>
        INCLUDE <BIN_BCD_MIN.INC>
        INCLUDE <BIN_BCD.INC>
        INCLUDE <MEMORIZA_PUNTO.INC>
        INCLUDE <SUMA_RESTA16bits.inc>
        INCLUDE <LEER_FLASH.INC>
        INCLUDE <TIEMPO.INC>
        INCLUDE <SIGNO_MAS.INC>
        INCLUDE <SIGNO_MENOS.INC>
        INCLUDE <MEMORIZA_PUNTO_MAS.INC>
        INCLUDE <MEMORIZA_PUNTO_MENOS.INC>
        INCLUDE <T1.INC>
        INCLUDE <M1R.INC>
        INCLUDE <LEER_FLASH_V.INC>
        ;INCLUDE <I2C_DISPLAY_7S.INC>
        ;INCLUDE <BINARIO_A_7SEGMENTOS.INC>
        ;INCLUDE <I2C_PIC16F873.INC>
 
 
            END
11/03/2014 #2
Moderador general

Avatar de Fogonazo

1) Publica tu programa
2) Publica la lista de errores
3) Publica una descripción sobre lo que se supone realizará tu programa


Reglas generales de uso del foro

03) Cuando preguntes, danos la máxima información posible. ¡ No somos adivinos !

15) Cuando abras un tema (Post) ponéle un poco de "CONTENIDO", agrega alguna descripción, comentario, reflexión, NO tires un esquema o una pregunta sin ningún agregado.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.