
;*********************** Registro de control ***************************************

status		equ		03h
porta		equ		05h
portb		equ		06h
portc		equ		07h
portd		equ		08h
porte		equ		09h
intcon		equ		0bh
pir1		equ		0ch
sspbuf		equ		13h
sspcon		equ		14h
adcon0		equ		1fh
adresh		equ		1eh

trisa		equ		85h
trisb		equ		86h
trisc		equ		87h
trisd		equ		88h
trise		equ		89h
pie1		equ		8ch
sspstat		equ		94h
adresl		equ		9eh
adcon1		equ		9fh

;******************************* Registro de usuario *************************************

bandera		equ		20h
lectura		equ		21h
loop1		equ		22h
loop2		equ		23h

;******************************* Empieza el programa *************************************

	list p = 16f877

	org	00
	goto	inicio

	org	04
	goto	inter

;****************************** Rutina que controla las interrupciones ********************

inter	btfsc	pir1,6		; Pregunto si hubo interrupcin por fin de conversin A/D
	goto	convierte
	retfie			; Si no hubo conversin sale de la interrupcin

;**************************** Rutina de atencin de interrupcin de la conversin A/D *****

convierte
	 
	bcf	pir1,6		; Se limpia la bandera de interrupcin
	movlw	d'1'
	movwf	bandera		; Se pone bandera en 1 para indicar que hubo conversin A/D
	movf	adresh,0
	movwf	lectura		; Se le el valor de la conversin a 8 bits
	movwf	sspbuf		; Se traspasa el valor al registro SSPBUF para ser transmitido
	retfie			; Sale de la interrupcin

;***************************** Rutina de unos microsegundo ********************************

retar	movlw	d'255'
	movwf	loop1
	movlw	d'100'
	movwf	loop2
	decfsz	loop2,1
	goto	$-1
	decfsz	loop1,1
	goto	$-5
	return

;****************************** Rutina principal MAIN() ******************************************

inicio	bcf	status,6
	bsf	status,5	; Banco 1
	movlw	b'11111111'
	movwf	trisb		; Puerto B como entradas digitales
	movlw	b'11010111'
	movwf	trisc		; Se configura RC3/SCK como salida, RC4/SDI como entrada y
				; RC3/SDO como salida		
	movlw	b'11111111'
	movwf	trisa
	movwf	trisd
	movwf	trise		; Puertos A,C,D y E como entradas digitales	
	clrf	adresl		; Limpio inicialmente la conversin
	movlw	b'00000001'
	movwf	adcon1		; Se configura el adcon1 para que todas los canales sean
				; Entradas anlogas y RA3 como Vref+
	movlw	b'11000000'
	movwf	sspstat		; Se configura el modo SPI para muestrear al final del
				; Impulso del reloj
	movlw	b'01000000'	
	movwf	pie1		; activo la interrupcin por fin de conversin A/D
    	bcf	status,5	; Banco 0
	clrf	portb
	clrf	lectura
	clrf	adresh		; Se inicializan todos los registros que se van a trabajar
	movlw	b'11000000'
	movwf	intcon		; Activo la interrupcin Global y la de perifricos 
	movlw	b'00100000'
	movwf	sspcon		; Se activa el modo SPI en modo maestro con reloj Fosc/4
	movlw	b'10000001'	
	movwf	adcon0		; Configuro el canal 0 y activo el inicio de la conversin
	bsf	adcon0,2
repite	
	movf	bandera,0	; Paso bandera a W
	xorlw	d'1'		; Comparo si son iguales
	btfss	status,2
	goto	repite
	clrf	bandera
	call	retar		; Una pequea rutina de tiempo para volver a iniciar la conversin
	bsf	adcon0,2	; Inicio nuevamente la conversin	
	goto	repite		; Bucle infinito
	end