Uso el PIC12F629 puedo leer un valor en la EEPROM interna pero no soy capaz de almacenarlo en la misma dirección.
Este es el código.
Código:
;No olvidar que si GP2 detecta un un 0 en la entreda menor de 5 segundos,
;el PIC no actua, vuelve a lo suyo como si no pasara nada.
;
; Cuando detecte
;GP2|GP0 GP1 GP4 GP5
;---+----------------
;1) | 0 1 0 0
;2) | 1 0 1 0
;3) | 0 1 1 0
;4) | 1 0 0 1
;
;ZONA DE DATOS*****************************************************************
LIST P=12F629 ; Procesador usado.
INCLUDE <P12F629.INC> ; Fichero que definen las etiquetas.
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _FOSC_INTRCIO
ERRORLEVEL -302
#DEFINE Pulsador GPIO,2 ; Pulsador.
#DEFINE Leds GPIO ; Leds está conectado al GPIO.
VARIABLES UDATA_SHR
ContadorEstado RES 1
RAM_ret RES 1
RAM_ret_1 RES 1
Contador RES 1
;ContadorEstado equ 20h
;RAM_ret equ 21h
;RAM_ret_1 equ 22h
;Contador equ 23h
; ORG 0x2100 ; Corresponde a la dirección 0 de la zona EEPROM de datos.
; DE 0x00 ; El contador en principio a cero.
;ZONA DE CÓDIGOS***************************************************************
ORG 0
; El programa comienza en la dirección 0.
goto Inicio
Inicio
bsf STATUS,RP0 ; Selecciona banco 1.
call 0x3FF ; Lo el valor de la calibración que sera almacenada en W.
movwf OSCCAL ; Paso el valor de W a OSCCAL para calibrar el oscilador.
movlw b'00000100'
movwf TRISIO
movlw b'00001111'
movwf OPTION_REG ; Activa Pull Up.
movlw b'0000100'
movwf WPU ; Activada Pull Up del GP0.
bcf STATUS,RP0 ; Selecciona banco 0.
movlw b'00000111' ; Desactivar comparadores.
movwf CMCON
movlw .3
movwf Contador
clrf GPIO
;***************************************************************************
Principal
btfsc Pulsador ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto Principal ; No. Vuelve a leerlo.
; call Retardo_20ms ; Espera que se estabilicen los niveles de tensión.
btfsc Pulsador ; Comprueba si es un rebote.
goto Principal ; Era un rebote y sale fuera.
call IncrementaVisualiza ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
btfss Pulsador ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
goto EsperaDejePulsar ; No. Espera que deje de pulsar.
Fin goto Principal
;***************************************************************************
; Subrutina "IncrementaVisualiza" ---------------------------------------------------------
IncrementaVisualiza
call Lee_Dato_EEPROM
incf Contador,F ; Incrementa el contador y comprueba si ha
call Escribe_Dato_EERPOM
movlw d'4' ; llegado a su valor máximo mediante una
subwf Contador,W ; resta. (W)=(Contador)-4.
btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<4?
InicializaContador
clrf Contador ; No, era igual o mayor. Por tanto, resetea.
Visualiza
movf Contador,W
call Tabla ; Lo pasa a siete segmento para poder ser
movwf GPIO ; visualizado en el display.
return
Tabla
addwf PCL,F ; Sumo W al contador de programa. ;
retlw b'00000010' ;1
retlw b'00010001' ;2
retlw b'00010010' ;3 ; Retorno con el valor correspondiente.
retlw b'00100001' ;4
;Subrutina EEPROM ******************************************************************
Lee_Dato_EEPROM
bsf STATUS,RP0 ; Banco 1
movlw 0x00 ; Primera posición de la tabla
movwf EEADR ; Apunta ahí
; movf Contador,W ; Coge el contador
; addwf EEADR ; Suma el contador para apuntar al dato que nos interesa
bsf EECON1,RD ; Lee el valor de la tabla
movf EEDATA,W ; Pasa el valor a W para trabajar con él.
bcf STATUS,RP0
return
;Guarda en la EEPROM el valor del contador
Escribe_Dato_EERPOM
bsf STATUS,RP0 ; Banco 1.
movlw 0x00 ; Elijo esta dirección de la EEPROM y
movwf EEADR ; lo cargo en EEADR con el dato a escribir.
movlw Contador
movwf EEDAT ; Cargo el registro EEDAT con el dato a escribir.
bsf EECON1,WREN ; Habilitar
bcf INTCON,GIE ; Deshabilitar intercepciones.
movlw 0x55 ; Desbloquear escritura.
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR ; Inicie la escritura.
bsf INTCON,GIE ; Habilitar INTS.
bcf STATUS,RP0
return
;Subrutina Retardo_20ms ************************************************************
; Retardo = 0.02 segundos.
; Frecuencia Reloj = 4 MHz.
; Retardo actual = 0.02 segundos = 20000 ciclos.
Retardo_20ms
;19993 ciclos.
movlw 0x9E
movwf RAM_ret
movlw 0x10
movwf RAM_ret_1
Retardo_20ms_0
decfsz RAM_ret, f
goto $+2
decfsz RAM_ret_1, f
goto Retardo_20ms_0
;3 ciclos.
goto $+1
nop
;4 ciclos (incluyendo call).
return
END
Salu2.