
Se me atasca el PIC tanto en el simulador Proteus y físicamente, no graba en la su EEPROM interna del PIC16F88.
Lo que hace el PIC del programa principal es, con un pulsador en RA0 enciende y apaga un LEd en la salida RB0.
Hasta ahí todo bien. Solo que no es capaz de grabar nada en la EEPROM, cuando está encendido el Led o apagado, la EEPROM la función que hace es esa, mantener lo últimos valores del Led.
Siempre se me atasca por aquí.
;Guarda en la EEPROM el valor de la salida.
Escribe_Dato_EERPOM
BANKSEL EEADR
movlw 0x00 ; Dirección.
movwf EEADR ; Carga registro EEADR con la dirección a escribir.
movf Dato,W
movwf EEDATA ; Carga el registro EEDATA con el dato a escribir.
BANKSEL EECON1
bcf EECON1,EEPGD ; Selecciona acceso a memoria EEPROM de datos.
bsf EECON1,WREN ; Permiso de escritura.
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2 ; Secuencia de escritura según Mirochip.
bsf EECON1,WR ; Inicio del ciclo de escritura.
[COLOR="red"]Espera
btfsc EECON1,WR
goto Espera ; Esperar que finalice (WR=0).[/COLOR]
bcf EECON1,WREN ; Retira el permiso de escritura.
return
Código:
; Cada vez que presiona el pulsador conectado a la línea RA0 conmutará el estado de
; un LED conectado a la línea RB0.
;
; ZONA DE DATOS **********************************************************************
LIST P=16F88
INCLUDE <P16F88.INC>
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _FOSC_EC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
ERRORLEVEL -302
CBLOCK 0x20
RAM_ret
RAM_ret_1
ENDC
CBLOCK 0x110
Dato
ENDC
#DEFINE Pulsador PORTA,0 ; Pulsador conectado a RA0.
#DEFINE Led PORTB,0 ; Línea donde se conecta el diodo LED.
; ZONA DE CÓDIGOS ********************************************************************
ORG 0
Inicio
clrw
clrf PORTB ; Borra los latch de salida.
BANKSEL ANSEL
clrf ANSEL ; Puerto A digital.
BANKSEL TRISA
movlw b'11111111'
bsf Pulsador ; Pulsador activado como entrada.
clrf TRISB
bcf Led ; Activar como salida Led.
call Lee_Dato_EERPOM_2
BANKSEL PORTA ; Vuelve al banco 0.
Principal
btfsc Pulsador ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto Fin ; No. Vuelve a leerlo.
; call Retardo_20ms ; Espera que se estabilicen los niveles de tensión.
btfsc Pulsador ; Comprueba si es un rebote.
goto Fin ; Era un rebote y sale fuera.
btfsc Led ; Testea el último estado del LED.
goto EstabaEncendido
EstabaApagado
bsf Led ; Estaba apagado y lo enciende.
;movlw b'00000001'
BANKSEL Dato
movf Led
movwf Dato
call Escribe_Dato_EERPOM_2
BANKSEL PORTA ; Banco 0.
goto EsperaDejePulsar
EstabaEncendido
bcf Led ; Estaba encendido y lo apaga.
;movlw b'00000000'
movf Led
movwf Dato
call Escribe_Dato_EERPOM_2
BANKSEL PORTA ; Banco 0.
EsperaDejePulsar
btfss Pulsador ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
goto EsperaDejePulsar ; No. Espera que deje de pulsar.
Fin
goto Principal
;Subrutina EEPROM ******************************************************************
Lee_Dato_EEPROM
BANKSEL EEADR
movlw 0x00 ; Dirección.
movwf EEADR ; Carga el registro EEADR con la dirección que se desea leer.
BANKSEL EECON1
bcf EECON1,EEPGD ; Selecciona el acceso a memoria EEPROM.
bsf EECON1,RD ; Inicia el ciclo de lectura.
BANKSEL EEDATA
movf EEDATA,W ; Carga en W el dato recuén leído.
return
;Guarda en la EEPROM el valor de la salida.
Escribe_Dato_EERPOM
BANKSEL EEADR
movlw 0x00 ; Dirección.
movwf EEADR ; Carga registro EEADR con la dirección a escribir.
movf Dato,W
movwf EEDATA ; Carga el registro EEDATA con el dato a escribir.
BANKSEL EECON1
bcf EECON1,EEPGD ; Selecciona acceso a memoria EEPROM de datos.
bsf EECON1,WREN ; Permiso de escritura.
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2 ; Secuencia de escritura según Mirochip.
bsf EECON1,WR ; Inicio del ciclo de escritura.
Espera
btfsc EECON1,WR
goto Espera ; Esperar que finalice (WR=0).
bcf EECON1,WREN ; Retira el permiso de escritura.
return
END
¿Alguna idea?
Saludo.