Buenas tardes, he realizado un programa en asm con el MPLAB IDE, con el PIC16F873-04/SP lo grabo y no tengo ningún problema, pero el mismo programa con el PIC16F876-04/SP no me funciona bien. Quiero cambiar al 16f876-04/SP para ampliar la memoria FLASH.
Es raro porque son compatibles, ¿no?, ¿tengo que cambiar algo a la hora de grabar el 16f876 o modificar la palabra de configuración?
El programa consiste en escribir diferentes tiempos en formato mm:ss en la memoria FLASH del pic16f873, el pic16f84A se encarga de dar un pulso por segundo (con los botones START/STOP) a la entrada RC0 del 16f873 configurada como TMR1
Una vez memorizados estos puntos en la FLASH del PIC pulsamos el botón de START del 16f84A, de esta manera iniciamos el cronometro.
Al pulsar el botón COPI se realiza la resta (valor actual del TMR1 en formato mm:ss - valor escrito en la flash del pic).
El resultado de la resta se visualiza en formato segundos en la pantalla LCD 2x16 con signo + o -.
El programa me funciona bien con el PIC16f873-04/SP, pero al grabarlo con el PIC16f876-04/SP ya que quiero ampliar la memoria FLASH, no me va bien, creo que puedo tener el fallo en el proceso de escritura de la memoria FLASH o en la palabra de configuración.
Utilizo el MPLAB IDE , WINPIC800 y el grabador GTP-USB (PLUS).
Os adjunto el esquema , el programa y la subrutina de escritura de la FLASH:
Muchas gracias.
Saludos.
Subrutina de escritura FLASH, INCLUDE :
Aquí esta el programa:
Es raro porque son compatibles, ¿no?, ¿tengo que cambiar algo a la hora de grabar el 16f876 o modificar la palabra de configuración?
El programa consiste en escribir diferentes tiempos en formato mm:ss en la memoria FLASH del pic16f873, el pic16f84A se encarga de dar un pulso por segundo (con los botones START/STOP) a la entrada RC0 del 16f873 configurada como TMR1
Una vez memorizados estos puntos en la FLASH del PIC pulsamos el botón de START del 16f84A, de esta manera iniciamos el cronometro.
Al pulsar el botón COPI se realiza la resta (valor actual del TMR1 en formato mm:ss - valor escrito en la flash del pic).
El resultado de la resta se visualiza en formato segundos en la pantalla LCD 2x16 con signo + o -.
El programa me funciona bien con el PIC16f873-04/SP, pero al grabarlo con el PIC16f876-04/SP ya que quiero ampliar la memoria FLASH, no me va bien, creo que puedo tener el fallo en el proceso de escritura de la memoria FLASH o en la palabra de configuración.
Utilizo el MPLAB IDE , WINPIC800 y el grabador GTP-USB (PLUS).
Os adjunto el esquema , el programa y la subrutina de escritura de la FLASH:
Muchas gracias.
Saludos.
Subrutina de escritura FLASH, INCLUDE :
Código:
MEM_PUNTO incf PUNTO,F
movf TMR1L,W
movwf DATO_L
movf TMR1H,W
movwf DATO_H
bsf STATUS,RP1
bcf STATUS,RP0 ;Selección de Banco 2 de memoria
movf ADDRL,W ;Se escribe en EEADRH la parte alta de la
movwf EEADR ;dirección a escribir
movf ADDRH,W ;Se escribe en EEADR la parte baja de la
movwf EEADRH ;dirección a escribir
movf DATO_L,W ;Se mete en EEI:)ATH la parte alta
movwf EEDATA ;del dato a escribir
movf DATO_H,W ;Se mete en EEDAL la parte baja
movwf EEDATH ;del dato a escribir
bsf STATUS,RP0 ;Selección del banco 3 de memoria
bsf EECON1,EEPGD ;Selección de acceso a la memoria FLASH
bsf EECON1,WREN ;Se habilita la escritura en la memoria FLASH
bcf INTCON,GIE ;Se prohíben las interrupciones
movlw 0x55 ;Se escriben los datos 55h y AAh en el registro
movwf EECON2 ;EECON2 tal y como recomienda el fabricante
movlw 0xAA
movwf EECON2
bsf EECON1,WR ;Se da la orden de escritura
nop ;El microcontrolador ignora estas dos instrucciones
nop
ESPERA_2 btfsc EECON1,WR
goto ESPERA_2
;bsf INTCON,GIE ;Se habilitan las interrupciones
bcf EECON1,WREN ;Se prohíbe la escritura de nuevos datos
bcf STATUS,RP1 ;Banco 0
bcf STATUS,RP0
incf ADDRL,F
;incf ADDRL,F
return
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 ; PROGRUN=0 salta
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 ;Convierte los 16 bits en Segundos y Minutos
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
;btfss SETT
;goto T1_M1L_R_INIC
btfsc COPI ; Si pulsamos COPI=0 salta
goto T1_M1R_R
call LEE_FLASH
;call VISUALIZAR_POS
;call T1_
;call M1R_
E_T1_M1R_R btfss COPI ; Espera a dejar de pulsar COPI para saltar
goto E_T1_M1R_R
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, complem. 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
INCLUDE
;INCLUDE
INCLUDE
;INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
INCLUDE
;INCLUDE
;INCLUDE
;INCLUDE
END
Adjuntos
Última edición: