;=================================================================================================================================
;		PROGRAMA QUE REALIZA UNA CONVERSION DE ANALOGICO A DIGITAL POR MEDIO DEL PIC 18F4550
;		CON ENTRADA ANALOGICA RA0 Y COMO PUERTOS DE SALIDA PUERTO B Y PUERTO C CON UNA CONF..
;		CON AUTOGUARDADO Y AUTORECUPERACION DEL CONTEXTO DE TRABAJO...
;		LA A/D CONVERTION SE REALIZARA POR INTERRUPCIONES DE ALTA PRIORIDAD PARA UNA POSTERIOR 
;		MODIFICACION. LA CONVERSION SE REALIZA POR EL METODO DE APROXIMACIONES SUCESIVAS SEGUN EL FABRICANTE
;		
;		DESIGN BY: OSCAR IVAN ALVARADO AGUIRRE  ID:0000009180  MATRICULA: 69357
;		SISTEMAS DIGITALES III       AGO-DIC 2009		PROTOTIPE 1
;		ASESORES: ING. OSWALDO GARCIA  Y ING. DARCY FLORES NIEBLAS
;==================================================================================================================================
;VERSION DE REVISION 1.1
;COPYRIGHT©.  TODOS LOS DERECHOS RESERVADOS.
;PROHIBIDA SU COPIA (SOLO USOS DIDACTICOS)

;==================================================================================================================================	
			LIST		P=18F4550		;DISPOSITVO A UTLIZAR EN EL CODIGO FUENTE
			INCLUDE		"P18F4550.INC"	;LIBRERIAS INCLUIDAS PARA EL CODIGO FUENTE

;==================================================================================================================================	
	;BITS DE CONFIGURACION PARA PICS DE LA FAMILIA HIGHT RANGE PIC18FXXXX (ONLY DEVISES)...
	;SU SINTAXIS ES: __CONFIG <ADDRESS>,<EXPRESSION>

		;CONFIG			LVP=ON,MCLR=ON,....
		__CONFIG		300000,0X00		;FULL SPEED USB CLOCK FROM (OSC1/OSC2) & CPU SYSTEM CLOCK POSTSCALER (SOURSE/1) & 96MHZ PLL PRESCALER (NO DIVIDE)
		__CONFIG		300001,0X0D		;OSCILLADTOR (HS: USB-HS 20 MHZ) & FAIL-SAFE CLOCK MONITOR ENABLE (OFF) & INTERNAL EXTERNAL SWITCH OVER MODE (OFF)
		__CONFIG		300002,0X07		;USB VOLTAJE REGULATOR (OFF) & POWER UP TIMER (OFF) & BOREN (ON IN HARDWARE,SBOREN OFF) & BOREN VOLTAJE (4.5V)
		__CONFIG		300003,0X00		;WATCHDOG TIMER (OFF-CONTROLLED BY SWDTEN BIT) & WATCHDOG POSTSCALER (1:1)
		__CONFIG		300005,0X81		;CCP2 MUX (RC1) & PORT A/D ENABLE (PORTB<4:0> CONFIGURED AS DIGITAL I/O ON RESET) & LOW POWER TMR1 OSC (OFF) & MCLR (ON, RE3 OFF)
		__CONFIG		300006,0X85		;STACK OVERFLOW RESET (ON) & LOW VOLTAE PROGRAM (ON) & DEDICATED IN CIRCUIT PORT [ICD/ICSP] (OFF) & EXTENDED CPU (OFF)
		__CONFIG		300008,0X0F		;CODE PROTECT OF 00800-07FFF (OFF)
		__CONFIG		300009,0XC0		;DATA EE READ PROTECT (OFF) & CODE PROTECT BOOT(OFF)
		__CONFIG		30000A,0X0F		;TABLE WRITE PROTECT OF 00800-07FFF (OFF) 
		__CONFIG		30000B,0XE0		;DATA EE WRITE PROTECT (OFF) & TABLE WRITE PROTECT BOOT(OFF)& CONFIG WRITE PROTECT (OFF)
		__CONFIG		30000C,0X0F		;TABLE READ PROTECT OF 00800-07FFF (OFF)
		__CONFIG		30000D,0X40		;TABLE READ PROTECT BOOT (OFF)

	;TAMBIEN SE PUEDE LOGRAR OBTENER LOS MISMOS RESULTADOS CON OTRA DIRECTIVA PARA PIC'S 18MCU'S
	;SU SINTAXIS ES: CONFIG (ESPACIO) SETTING=VALUE  [,SETTING=VALUE]

;==================================================================================================================================	
; VARIABLES A UTILIZAR EN EL VECTOR 0X80
			CBLOCK		0X080
			CUENTA						;REGISTRO ULTIZADO PARA RETARDO
			cuenta1						;REGISTRO ULTIZADO PARA RETARDO
			cuenta2						;REGISTRO ULTIZADO PARA RETARDO
			cuenta3						;REGISTRO ULTIZADO PARA RETARDO
			WTEMP						;REGISTRO ULTIZADO PARA CONTEXTO DE TRABAJO
			STATUS_TEMP					;REGISTRO ULTIZADO PARA CONTEXTO DE TRABAJO
			BSR_TEMP					;REGISTRO ULTIZADO PARA CONTEXTO DE TRABAJO
			ENDC
; VECTOR DE RESET Y DE INTERRUPCION
			ORG			0X0000			;VECTOR DE RESET QUE NOS DIRIGE 
			GOTO		INICIO			;AL PROGRAMA PRINCIPAL
; VECTORES DE INTERRUPCIONES
			ORG			0X0008			;VECTOR DE INTERRUPCION QUE NOS DIRIGE 
			GOTO 		RSI				;A LA SUBRUTINA RSI (ALTA PRIORIDAD).... LAS DE BAJA PRIORIDAD (0X0018) NO LAS USAREMOS
; PROGRAMA PRINCIPAL.....
INICIO
			CALL		CONF_PTOS		;CONFIGURAMOS LOS PUERTOS
LEE			CALL		CONF_MODULE		;CONFIGURACION DE MODULOS A/D
			CALL		CONF_INTERR		;CONFIGURA INTERRUPCIONES DEL ADC
			CALL		ADQUISICION		;ESPERA TIEMPO DE ADQUISICION
			CALL		START			;COMIENZA LA CONVERSION DEL ADC MODULE
			GOTO		LEE				;CICLO OSIOSO

;==================================================================================================================================	
;SUBRUTINAS A UTILIZAR EN EL CODIGO FUENTE COMENZAREMOS CNFIGURANDO LOS PUERTOS A, B, C, D Y E SOLO EL CANAL AN0 DEL PUERTO A QUEDA
;COMO PUERTO ANALOGICO LOS DEMAS PUERTOS Y SUS BITS CORRESPONDIENTES QUEDARAN CONFIGURADOS COMO ENTRADAS Y SALIDAS DIGITALES.......

CONF_PTOS								;AL CONFIGURAR EL PUERTO A SE CONFIGURAN LOS REGISTROS LATA, PORTA, TRISA, ADCON1 Y CMCON
			CLRF		PORTA			;INICIA LA SECUENCIA DE CONFIGURACION DEL PUERTO A
			CLRF		LATA			;LIMPIANDO LOS REGISTROS Y LATCHES DEL PUERTO A
			MOVLW		B'00001111'		;CONFIGURA EL RA0 COMO ENTRADA ANALOGICA Y LOS DEMAS COMO ENTRADA DIGITAL 
			MOVWF		ADCON1			;DEACUERDO AL REGISTRO ADCON 1, LOS VOLTAJES DE REFERENCIA QUEDAN DADOS 
			MOVLW		0X07			;POR EL VOLTAJE DE ALIMENTACION DEL PIC18F4550 ....
			MOVWF		CMCON			;MUEVE EL 07H AL CMCON PARA DESACTIVAR LOS COPARADORES CORRESPONDIENTES AL PUERTO A
			SETF		TRISA			;DECLARO EL PUERTO A COMO ENTRADA
										;EL PUERTO B SE MODIFICAN SOLO LOS REGISTROS: LATB, PORTB Y TRISB, Y ADCON1
			CLRF		PORTB			;INICIA LA SECUENCIA PARA CONFIGURAR EL PUERTO B COMO PUERTO DE SALIDA
			CLRF		LATB			;SOLAMENTE ...<<<COMO YA SE CONFIGURO EL ADCON 1 ANTERIORMENTE NO SE MODIFICA AQUI>>>
			CLRF		TRISB			;DECLARO EL PUERTO B COMO SALIDA SOLAMENTE...
										;PARA CONFIGURAR EL PUERTO 	C ES NECESARIO CONFIGURAR LOS REGISTROS: LATC, PORTC, TRISC
			CLRF		PORTC			;LIMPIO LOS REGISTROS Y LATCHES DEL PUERTO C
			CLRF		LATC			; Y ENSEGUIDA CONFIGURO EL PUERTO
			CLRF		TRISC			;COMO SALIDA DIGITAL
										;PARA CONFIGURAR EL PUERTO D ES NECESARIO CONFIGURAR LOS REGISTROS: LATD, PORTD, TRISD
			CLRF		PORTD			;LIMPIO LOS REGISTROS Y LATCHES DEL PUERTO D
			CLRF		LATD			; Y ENSEGUIDA CONFIGURO EL PUERTO
			CLRF		TRISD			;COMO SALIDA DIGITAL
										;AL CONFIGURAR EL PUERTO A SE CONFIGURAN LOS REGISTROS LATA, PORTA, TRISA, ADCON1 Y CMCON
			CLRF		PORTB			;INICIA LA SECUENCIA PARA CONFIGURAR EL PUERTO B COMO PUERTO DE SALIDA
			CLRF		LATB			;SOLAMENTE ...<COMO YA SE CONFIGURO EL ADCON 1  Y CMCON ANTERIORMENTE NO SE MODIFICA AQUI>
			CLRF		TRISB			;DECLARO EL PUERTO B COMO SALIDA SOLAMENTE...
			RETURN
;==================================================================================================================================EMPIEZA LA CONFIGURACION DE L
;COMIEZO LA SUBRUTINA PARA CONFIGURAR LOS MODULOS DEL ADC DE TAL MANERA QUE SE SOLO SE MODIFICAN LOS PUERTOS ANALOGOS, EL VOLTAJE
;DE REFERENCIA Y LAS ENTRADAS Y SALIDAS DIGITALES A UTILIZAR EN LA PROGRAMACION (REGISTROS USADOS: ADCON1, ADCON0, ADCON2)

CONF_MODULE
			MOVLW		0X0E			;CONFIGURA LOS VOLTAJES DE REFERNCIAS A TIERRA Y VCC DE ALIMENTACION DEL PIC
			MOVWF		ADCON1			; Y DEJA AN<12:1> COMO I/O DIGITALES Y AN<0> COMO ENTRADA DIGITAL
			CLRF		ADCON0			;SELECCIONO ENTRADA DEL ADC COMO AN0 (CH0) Y DESABILITO CUALQUIER CONVERSION POR ERROR
			MOVLW		B'10010101'		;CONFIGURO JUSTIFICACION A LA DERECHA, UN TIEMPO DE ADQUISICION DE 4 TAD (MINIMO SON 3 PARA
			MOVWF		ADCON2			;UNA CONVERSION SUCESIVA SIN RETRARSOS) Y UN RELOJ DE CONVERSION DE FOSC/16 POR EL OSC DE 20MHZ
			BSF			ADCON0,ADON		;HABILITO EL MODULO ADC PARA UNA FUTURA CONVERSION
			RETURN
;==================================================================================================================================
;EMPIEZA LA CONFIGURACION DE LAS INTERRUPCIONES Y SUS REGISTROS A UTILIZAR SON: ADIF(PIR1), ADIE(PIE1), GIE(INTCON) BITS
;PARA DECLARAR INTERRUPCIONES DE ALTO O BAJO NIVEL DEBEMOS PONER EN ALTO EL BIT (IPEN EN RCON REG.) Y CONFIGURAR IPR1, IPR2, INTCON2
;Y EL INTCON (ESTE ULTIMO SE UTILIZA PARA CONFIGURAR LAS PRIORIDADES HABILITADAS).....
CONF_INTERR
			BCF			PIR1,ADIF		;LIMPIA FLAG DE ADC CONVERSION Y CONFIGURA LAS INTERRUPCIONES SOLO POR ADC
			MOVLW		B'01000000'		;ENVIANDO 40H AL PIE1, DEABILITANDO EL EUSART, USB, PARALELO, TMR'S, SOBRECARGA, CCP, Y
			MOVWF		PIE1			;PUERTO SERIAL
			CLRF		PIE2
			BSF			IPR1,ADIP		;CONFIGURA LAS INTERRUPCIONES DEL ADC COMO ALTA PRIORIDAD Y EL IPR2 NO SE TOCA (ES DEL USB)
			BSF			RCON,IPEN		;CONFIGURA PRIORIDADES DESPUES DE OCURRIR UN RESET (CUALQUIERA)
			BCF			INTCON2,7		;DESABILITO LAS RESISTENCIAS PULL-UP QUE POR DEFAULT ESTAN ACTIVAS
			BSF			INTCON,GIE		;HABILITO LAS INTERRUPCIONES GENERALES... Y HA ESPERAR LA CONVERSION
			RETURN
;==================================================================================================================================
ADQUISICION
			CALL		RETARDO_15M		;RETARDO DE 15uS PARA UN TIEMPO DE ADQUISICION DE 4 TAD (CADA TAD =3uS)
			BSF			ADCON0,GO		;ESPERA CONVERSION...
ESPERA		BTFSC		ADCON0,GO		;AUN SE ESTA LLEVANDO ACABO LA CONVERSION??????
			GOTO		ESPERA			;SI, POR LO TANTO ESPERA ASTA QUE TERMINE DE CONVERTIR EL DATO
			RETURN						;NO, POR LO TANTO TERMINO Y REGRESO A PRINCIPAL
;==================================================================================================================================
START
			MOVFF		ADRESL,PORTC	;DESPLIEGO EL RESULTADO BAJO A/D
			MOVFF		ADRESH,PORTB	;DESPLIEGO EL RESULTADO ALTO A/D
			BCF			IPR1,ADIF		;LIMPIO BANDERA POR SI SE LLEVO A CABO LA CONVERSION MANUALMENTE (SIN INTERRUPCIONES)
			CALL		RETARDO_2S		;RETARDO DE 2 SEGUNDOS ANTES DE LA SIGUIENTE CONVERSION.
			RETURN
;==================================================================================================================================
;SUBRUTINA DE INTERRUPCION POR SI NO SE LLEGARA LLEVAR A CABO LA CONVERSION DE FORMA MANUAL....
RSI
			BTFSS		PIR1,ADIF		;ES UNA INTERRUPCION POR A/D??????
			RETFIE						;NO, PUES SALGO Y ESPERO
;			BTFSS		ADCON0,GO		;SEGURO QUE SE LLEVO ACABO LA CONVERSION?????
;			GOTO		SALIR			;NO, PUES SALGO Y ESPERO
		
	;GUARDO CONTEXTO DE TRABAJO.... 

			MOVWF		WTEMP			;WTEMP IS IN VIRTUAL BANK
			MOVFF		STATUS,STATUS_TEMP;STATUS_TEMP LOCATED ANYWHERE
			MOVFF		BSR,BSR_TEMP	;BSR_TEMP LOCATED ANYWHERE

	;CODIGO DE INTERRUPCION....

			BCF			INTCON,GIE		;SIGUE EN PIE LA CONVERSIÓN
			MOVFF		ADRESH,PORTC	;LE CARGA LA PARTE ALTA DE LA CONVERSIÓN Y LA MUESTRA POR EL PUERTOC
			MOVFF		ADRESL,PORTB	;LE CARGA LA PARTE BAJA DE LA CONVERSIÓN Y LA MUESTRA POR EL PUERTOB
			CALL		RETARDO

	;RECUPERO CONTEXTO DE TRABAJO....
 
			MOVFF		BSR_TEMP,BSR	;RESTORE BSR REGISTRER
			MOVFF		STATUS_TEMP,STATUS;RESTORE STATUS
			MOVF		WTEMP,W			;RESTORE W REGISTRER

			;TERMINA RECUPERACION DEL CONTEXTO DE TRABAJO
SALIR			
			BCF			PIR1,ADIF		;LIMPIA LA BANDERA PARA ESPERAR OTRA CONVERSIÓN
			BSF			INTCON,GIE		;HABILITO DE NUEVO LAS INTERRUPCIONES EN ESPERA DE ALGUNA
			RETFIE						;REGRESO DE INTERRUPCION			
						
;==================================================================================================================================
RETARDO_15M
			MOVLW		D'63'			;RETRARDO QUE BRINDA 5 MICROSEGUNDOS DE ESTABILIZACION.
			MOVWF		CUENTA			;A UNA FRECUENCIA DE OPERACION DE 20MHZ
BUCLE		DECFSZ		CUENTA,F
			GOTO		BUCLE
			RETURN

;==================================================================================================================================			
RETARDO
			MOVLW			.100		;RETARDO QUE BRINDA 10 SEGUNDOS PARA DESPLIEGUE
			MOVWF			cuenta3
ciclo3		
			MOVLW			.200
			MOVWF			cuenta2
ciclo2
			MOVLW			.100
			MOVWF			cuenta1
ciclo		
			DECFSZ			cuenta1
			GOTO			ciclo
			DECFSZ			cuenta2
			GOTO			ciclo2
			DECFSZ			cuenta3
			GOTO			ciclo3
			RETURN
			
;==================================================================================================================================			
RETARDO_2S
			MOVLW			.50		;RETARDO QUE BRINDA 2 SEGUNDOS PARA DESPLIEGUE
			MOVWF			cuenta3
ciclo_3		
			MOVLW			.100
			MOVWF			cuenta2
ciclo_2
			MOVLW			.100
			MOVWF			cuenta1
ciclo_		
			DECFSZ			cuenta1
			GOTO			ciclo_
			DECFSZ			cuenta2
			GOTO			ciclo_2
			DECFSZ			cuenta3
			GOTO			ciclo_3
			RETURN

			END
