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:
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
Última edición por un moderador: