; LOS PROCEDIMIENTOS A CONTINUACION CORRESPONDEN AL RESPALDO Y RECUPERACION DE DATOS
; ENTRE LA MEMORIA DE DATOS Y LA MEMORIA EEPROM DE UN MICROCONTROLADOR MICROCHIP
; PIC16F84A Y SON LIGERAS VARIARIONES DEL CODIGO DE PRODUCCION DE LA LINEA DE
; CONTADORES INDUSTRIALES DIGICONT(R).

; AUTOR: BBMNet para COMPUTADORAS Y EQUIPOS ESPECIALES, MEXICO.
; FECHA: Septiembre 10 de 2013.

READER	EQU 01H			; Señal para recuperar los datos.
WRITER	EQU 02H			; Señal para respaldar los datos.

TOTREG	EQU .9			; 1 menos que el número de registros EEPROM usados.


; Transferir EEPROM a RAM.
; Nota: en el programa principal la activación de la señal PA<0> salta a
;       realizar este procedimiento.

RESTORE	MOVLW TOTREG		; Este es el número de registros a restaurar.
	MOVWF REGCNT
	MOVLW CNT0		; Fije el vector al primer valor a restaurar.
	MOVWF FSR
	CLRF EEADR		; Fije el vector al primer registro EE.

RDNXT	BSF STATUS, RP0		; Cambie al BANK-1.
	BSF EECON1, RD		; Lea el registro EE.
	BCF STATUS, RP0		; Cambie al BANK-0.
	MOVF EEDATA, W		; Transfiera el dato EE a W.
	MOVWF INDF		; Restablezca el registro de trabajo.
	INCF EEADR, F		; Incremente la dirección.
	INCF FSR, F		; Incremente el registro de datos.
	DECFSZ REGCNT, F	; Decremente el contador de registros.
	GOTO RDNXT		; No fué cero. Lea el siguiente.

WAITRD	MOVF PORTA, W		; Su A<0> aún alta espere a que baje y
	ANDLW READER		; entoces regrese.
	BTFSS STATUS, Z
	GOTO WAITRD
	RETURN


; Transferir RAM a EEPROM.
; En este procedimiento se compara el valor a salvar con el que ya se
; encuentra en el eeprom. Si son iguales no se reescribe. Esto ayuda a
; conservar la memoria eeprom.
; Nota: en el programa principal la activación de la señal PA<1> salta a
;       realizar este procedimiento.

BACKUP	BCF INTCON, GIE		; Desabilite las interrupciones.

	MOVLW TOTREG		; Este es el número de registros a salvar.
	MOVWF REGCNT
	MOVLW CNT0		; Fije el vector al primer valor a salvar.
	MOVWF FSR
	CLRF EEADR		; Fije el valor al primer registro EE.

WRNXT	BSF STATUS, RP0		; cambie al BANK-1.
	BSF EECON1, RD		; Lea el registro EE.
	BCF STATUS, RP0		; Cambie al BANK-0.
	MOVF EEDATA, W		; Transfiera el dato EE a W.
	XORWF INDF, W		; Compare el nuevo dato con el previo.
	BTFSC STATUS, Z		; Si es igual no reescriba.
	GOTO RDYNXT

	MOVF INDF, W		; Obtenga el nuevo dato.
	MOVWF EEDATA		; Cargue el registro de dato.
	BSF STATUS, RP0		; Selecione la página 1.
	BSF EECON1, WREN	; Habilite la operación de escritura.
	BCF STATUS, RP0		; Seleccione la página 0.

	CALL WRTONE		; Escriba a la locación.

RDYNXT	INCF EEADR, F		; Incremente la dirección.
	INCF FSR, F		; Incremente el vector.
	DECFSZ REGCNT, F	; Decremente el registro contador.
	GOTO WRNXT		; No fué cero. Vaya a escribir el siguiente.

	BSF STATUS, RP0		; Seleccione la página 1.
	BCF EECON1, WREN	; Desabilite la escritura.
	BCF STATUS, RP0		; Seleccione la página 0.

WAITWR	MOVF PORTA, W		; Su A<1> aún alta espere a que baje y
	ANDLW WRITER		; entoces regrese.
	BTFSS STATUS, Z
	GOTO WAITWR
	RETURN

; Este es un subprocedimiento de BACKUP y realiza el respaldo de un sólo
; registro.

WRTONE	BSF STATUS, RP0		; Seleccione la página 1.
	MOVLW 055H		; Haga la secuencia de escritura.
	MOVWF EECON2
	MOVLW 0AAH
	MOVWF EECON2
	BSF EECON1, WR		; Inicie la escritura.

CHKEND	BTFSC EECON1, WR	; ¿Escritura completa?
	GOTO CHKEND		; No, entonces siga verificando.
	BCF STATUS, RP0		; Se termino. Seleccione la página 0
	RETURN			; y regrese.

