;----------------------------------------------------------
;
;----------------------------------------------------------  
	list      p=12f675   
   #include "p12f675.inc"  

	errorlevel -302 	

	__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

; -----------------------------------------------------------------
; 	Defines
; -----------------------------------------------------------------
   	#define LEDR 5
	#define LEDA 4
	#define LEDV 2
; -----------------------------------------------------------------
; 	Variables
; -----------------------------------------------------------------
   	cblock	0x20
	Inf
	Sup
	DIRE
	DAT_O
	ADC_ba
	ADC_al
	Bit
   	endc
; ------------------------------------------------------------------
; 	Initialisacion
; ------------------------------------------------------------------
   	org   	0
  	banksel ANSEL
   	movlw	11h       					; AN0 as analog input,conversion clock Fosc/8
   	movwf	ANSEL

   	bankseL CMCON
   	movlw   07h         					; comparators off
   	movwf   CMCON

   	movlw	0x81      					; ADC on, right justified
   	movwf	ADCON0

	banksel WPU
   	movlw	B'00000010'       	
   	movwf	WPU

	banksel OPTION_REG
   	bcf		OPTION_REG,	7

   	banksel TRISIO
   	movlw   B'00000011' 				; 
   	movwf	TRISIO
	clrf	Sup
	clrf	Inf
	banksel GPIO
	clrf	GPIO

Inicio:
	bsf		GPIO,	LEDV
	clrf   	DIRE
	movlw   0x20 						; 
   	movwf   FSR
	movlw   0x0A 						; 
   	movwf   DAT_O

	btfsc	GPIO,	1
   	goto    Ajust
	call	Leer_M
Volve:
	call	Leer_ADC
	call	Comp

	btfss	Bit,	1
	goto	$+3
	bcf		GPIO,	LEDA
	goto	$+2
	bsf		GPIO,	LEDA
	goto	Volve

;*****************************************************************************
; Lectura de EEPROM
;*****************************************************************************
Leer_M:
	movf	DIRE,	W					;dirección de EEPROM
	bsf 	STATUS,	RP0
	movwf 	EEADR
	bsf 	EECON1,	RD
	btfsc 	EECON1,	RD
	goto 	$-1
	movf 	EEDATA,	W
	movwf	INDF
	bcf 	STATUS,	RP0 			;EEADR posee la dirección a leer
	incf	DIRE,	F
	incf	FSR,	F
	btfss	FSR,	1	
	goto	Leer_M
	Return
; ---------------------------------------------------------------------
; 	Captura de valores analogicos con el ADC de 10 BIT
; ---------------------------------------------------------------------
Leer_ADC:
   	banksel 	ADCON0
   	bsf    	ADCON0,	1   				;start conversion

   	btfss	PIR1,	ADIF
   	goto	$-1      					;wait for ADC to finish
   	movf    ADRESH, W   				;get high byte
   	movwf	ADC_al
   	banksel ADRESL
   	movf    ADRESL, W   				;get low byte
   	movwf	ADC_ba
   	banksel PIR1
   	bcf		PIR1,	ADIF				;clear conversion fla
   	return

;*****************************************************************************
; Comparador de 16 Bit
;*****************************************************************************
Comp:
	movf	Inf,	W
   	subwf	ADC_ba,	W
	btfss   STATUS,	C
   	goto    a_menor_b
a_may_igu_b:
	bsf		Bit,	1
	goto	Salir
a_menor_b:
	bcf		Bit,	1
	goto	Salir
Salir:
	Return
;*****************************************************************************
; Rut. de ajute de valores de la EEPROM
;*****************************************************************************
Ajust:
	bsf		STATUS,	RP0
   	movlw	B'00000110'       	
   	movwf	WPU
   	movlw   B'00000111' 				; 
   	movwf	TRISIO
	bcf		STATUS,	RP0

Vol_aj
	bsf		GPIO,	LEDR
	btfsc	GPIO,	LEDV
   	goto    $-1

	clrf	DIRE
	call	Leer_ADC
	movf	ADC_ba,W
	movwf	DAT_O
	call	Grab_M
	movf	ADC_al,W
	movwf	DAT_O 
	incf	DIRE						; 
	call	Grab_M
	bsf		STATUS,RP0
   	movlw	B'00000010'       	
   	movwf	WPU
   	movlw   B'00000011' 				; 
   	movwf	TRISIO
	bcf		STATUS,	RP0
	bcf		GPIO,	LEDV
	bcf		GPIO,	LEDR

	btfsc	GPIO,	1
   	goto    $-1
	bsf		GPIO,	LEDR
	bsf		GPIO,	LEDV
	goto 	$-5
;*****************************************************************************
; Grabación de EEPROM
;*****************************************************************************
Grab_M:
	movf	DAT_O,	W
	bsf     STATUS,	RP0   				;cambiar a Banco 1 
	bsf		EECON1,	WREN				;habilitar grabación de EEPROM
	movwf	EEDATA					;poner dato en en EEDATA
	movf	DIRE,	W
	movwf	EEADR						;ponerla en EEADR
	movlw	h'55'		
	movwf	EECON2					;comando
	movlw	h'AA'
	movwf	EECON2					;comando
	bsf		EECON1,	WR				;agregar el dato en la EEPROM
	btfsc	EECON1,	WR				;esperar a que termine (10 ms)
	goto	$-1
	bcf     STATUS,	RP0  				;cambiar a Banco 0
	Return
	end
