;-----CONVIERTE A/D ENVIA SERIE, RECIBE Y MUESTRA POR PORTD

				list p=16f877a
				#include <p16f877a.inc>
				TMR0_OPT	EQU		1H
				NUMERO_TRANSMISIONES EQU D'01'
				CBLOCK 0X20	
				PDel0 
 				PDel1 
				CONTAR   
				CONTA	 
				CONTADOR 
				DATO_ANTERIOR
				DATO
				W_TEMP
				STATUS_TEMP 
				ENDC

				ORG 0X00 ;Dirección del Vector Reset
				GOTO COMIENZO ;Comienzo del Programa
				ORG 0X04
				GOTO INTERRU ;Vector de Interrupción.			
				ORG 0X05
;*************************** TRANSMISION SERIE DE A/D *********************************************************************

SERIE			BCF		PIR1,TXIF
				MOVF 	ADRESH,W ; Leer los datos del PORTB
				MOVWF 	TXREG ; Comienzo de la transmisión de datos en Serie.
				BSF 	STATUS,RP0
SEG2 			BTFSS 	TXSTA,TRMT ; Preguntamos si se ha transmitido el dato.
				GOTO 	SEG2
				BCF 	STATUS,RP0
				BCF		PIR1,TXIF
				RETURN
;*********MANEJO DE LA INTERRUPCION******

INTERRU 		BTFSS PIR1,RCIF ; Detectamos si ha interrumpido la Recepción Serie.
				RETFIE
SALVAR 			MOVWF W_TEMP ; Salvamos Registros
				SWAPF STATUS,W
				MOVWF STATUS_TEMP
				MOVF RCREG,W ;Cargamos el dato del registro RCREG en el registro DATO.
				MOVWF DATO
				MOVWF PORTD
RECUPERAR 		SWAPF STATUS_TEMP,W ;Recuperamos Registros.
				MOVWF STATUS
				SWAPF W_TEMP,F
				SWAPF W_TEMP,W
				BCF PIR1,RCIF ;Borrar flag de recepción
				RETFIE ;Retorno de Interrupción.
;**************************** Vector de Interrupción *******************************************************
			
COMIENZO 		BSF STATUS,RP0 ;Ir al Banco 1
				BSF TRISA,0 ;Poner PORTA(0)como entrada.
				MOVLW 82H
				MOVWF TMR0_OPT
				CLRF TRISB ;Poner PORTB como salida de datos.
			    CLRF TRISE
				CLRF TRISD
				MOVLW B'00001111' ;Seleccionar PA0 como entrada analógica
				MOVWF ADCON1 ;Los 8 BIT mas significativos se quedan en ADRESH.
						 	 ;Los 2 BIT memos significativos se quedan en ADRESL.
				BCF STATUS,RP0 ;Ir al Banco 0
				MOVLW B'01000001' ;Elegimos PA0 y habilitamos el Conversor
				MOVWF ADCON0
				CLRF PORTD
				CLRF PORTE
;****************************CONFIG USART*************
ASINCRONICO		BSF 	STATUS,RP0 ;Banco 1
				MOVLW 	.25
				MOVWF 	SPBRG ; Cargar la Velocidad de Transmisión de Datos.
				MOVLW 	B'00100000'
				MOVWF 	TXSTA ; Configuración de la Transmisión Serie.
				BSF		PIE1,RCIE
				BCF 	STATUS,RP0
				MOVLW	b'10010000'	;configuracion del USART
				MOVWF	RCSTA		;PARA RECEPCION CONTINUA PUESTA EN ON
				MOVLW	b'11000000'	;habilitacion de las interrupciones en general
				MOVWF	INTCON	;INTERRUPCION EN GENERAL
				MOVLW B'00100000' ;Habilitar Interrupción Serie
				MOVWF PIE1
				BSF 	RCSTA,SPEN	 ;Activamos la Puerta Serie (TX).			
				
;*************************** INICION DE CONVERSION A/D *************************************************************************

AD	 			BSF ADCON0,GO_DONE ;inicio del Conversor
ESPERA 			CALL DEMORA ; Esperar un tiempo de adquisición de 20ms.
				CALL DEMORA
				BTFSC ADCON0,GO_DONE ;Si GO_DONE es 0 la muestra esta digitalizada.
				GOTO ESPERA
				MOVF ADRESH,W ;En ADRESH se depositan los 8 BIT mas significativos.
				MOVWF PORTB
				BSF STATUS,RP0
				BCF STATUS,RP0
			    CALL SERIE
				GOTO AD
				




;*********************** Subrutina 10mS *****************************************************************
DEMORA  movlw     .55       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1  
				RETURN
					

				END