;------------------------------------------------------------
;
;------------------------------------------------------------
	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 TRISIO
   	movlw  	B'00000011' 	; 
   	movwf	TRISIO

	banksel OPTION_REG
   	bcf		OPTION_REG,	7

	banksel WPU
   	movlw  	B'00000010' 	; 
   	movwf	WPU

	clrf	Sup
	clrf	Inf
	banksel GPIO
	clrf	GPIO

Inicio:
	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
	bsf		GPIO,	LEDA
	goto	$+2
	bcf		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	Sup,	W
   	subwf	ADC_al,	W

   	btfsc   STATUS,	Z
   	goto    Cont

   	btfsc   STATUS,	C	
	goto	$+3
	bcf		Bit,	1
	goto	Salir
	bsf		Bit,	1
	goto	Salir

Cont:
	movf	Inf,	W
   	subwf	ADC_ba,	W

   	btfsc   STATUS,	Z
	goto	$+2
	goto	$+3
   	bsf		Bit,	1
	goto	Salir

   	btfsc   STATUS,	C
	goto	$+3
	bcf		Bit,	1
	goto	Salir
	bsf		Bit,	1
Salir:
	Return
;******************************************
;   Rut. de ajute de valores de la EEPROM
;******************************************
Ajust:
	call	Leer_ADC
	movf	ADC_ba,	W
	movwf	DAT_O
	movlw   0x00
	movwf	DIRE			; 
	call	Grab_M
	movf	ADC_al,	W
	movwf	DAT_O
	movlw   0x01 
	movwf	DIRE			; 
	call	Grab_M
	bsf		GPIO,	LEDR
	btfsc	GPIO,	1
   	goto   	Ajust
	bcf		GPIO,	LEDR
	bsf		GPIO,	LEDV
	Goto 	$
;******************************************
;   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
