;
;					EJEMPLO 30
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC I/O
;
;El módulo conversor ADC. Regulación en alterna. Variación controlada de potencia. 
;
;Los dispositivos PIC16F87X disponen de un convertidor A/D de 10 bits de resolución y 5 u 8 
;canales de entrada analógica. La tensión de referencia determina la resolución por bit:
;(Res. = Vref/1024). Con 5 Vref=4.86 mV/Bit; con 2.5 Vref=2.43 mV/Bit
;
;El ángulo de disparo del opto-triac de la tarjeta Micro'PIC I/O puede variarse y con ello
;la potencia aplicada a la carga (lámpara). Una vez sincronizada la alterna en su paso por
;0, el disparo del TRIAC se puede retrasar entre 0 (máxima potencia) y 10 mS (mínima 
;potencia).
;
;En el ejemplo, una tensión analógica aplicada por RA3, se convierte en un valor digital. 
;Dicho valor es el que determina el delay de retraso en el disparo del Opto-Triac y, regula 
;por tanto la potencia aplicada a la carga.
;
;La señal RB0/INT detecta el cruce por cero de la tensión alterna. RB1 se conecta al Opto-
;Triac para provocar el disparo o bloqueo del mismo. Por RA3/AN3 se aplica la tensión analó-
;gica a convertir. Esta procede del potenciómetro AN3 de la Trainer o de la célula LDR de la
;Micro'PIC Trainer I/O.

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Delay_L		equ	0x20
Delay_H		equ	0x21		;Variables de temporización

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		;Vector de interrupción

;Tratamiento de interrupción. 

Inter		bcf	PORTB,1		;Triac en Off
		bcf	INTCON,INTF	;Restaura flag de interrupción RB0/INT
		bsf	ADCON0,GO	;Inicia la conversión del canal RA3/AN3
		bcf	PIR1,ADIF	;Restaura flag del ADC
ADC_Wait	btfss	PIR1,ADIF	;Fin de conversión ??
		goto	ADC_Wait	;Todavía no

		bsf	STATUS,RP0	;Selecciona el banco 1
		movf	ADRESL,W
		bcf	STATUS,RP0
		movwf	Delay_L		;Salva los 8 bits de menos meso de la conversión
		movf	ADRESH,W
		movwf	Delay_H		;Salva los bits de más peso de la conversión
	
;El ADC de 10 bits genera un resultado mínimo de 0 y máximo de 1023. Si se multiplica por
;8 se obtiene un valor comprendido entre 0 y 8184. Si dicho valor expresa microsegundos,
;se obtiene un delay entre 0 y 8 mS para el retraso en el disparo del Triac. La carga no
;llegará nunca a desconectarse del todo. Esto sólo ocurriría con un retraso de 10 mS

		bcf	STATUS,C
		rlf	Delay_L,F
		rlf	Delay_H,F
		rlf	Delay_L,F
		rlf	Delay_H,F
		rlf	Delay_L,F
		rlf	Delay_H,F	;Multiplica por 8

		comf	Delay_L,W
		movwf	TMR1L
		comf	Delay_H,W
		movwf	TMR1H		;Carga el TMR1
		bcf	PIR1,TMR1IF	;Restaura el flag del TMR1
TMR1_Wait	btfss	PIR1,TMR1IF	;Ha finalizado la temporización para el disparo ??
		goto	TMR1_Wait	;Todavía no
		bsf	PORTB,1		;Ahora si, Triac On
		retfie

;Programa principal

Inicio	        clrf	PORTB		
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'11111101'
		movwf	TRISB		;RB0 entrada. RB1 salida
		movlw	b'10000000'
		movwf	ADCON1		;Puerta A analógica. Vref.=Vdd
		movlw 	b'00001111'
		movwf	TRISA		;RA3 entrada analógica
		movlw	b'11001111'
		movwf	OPTION_REG	;Preescaler de 128 asociado al WDT
		bcf	STATUS,RP0	;Selecciona banco 0

;Se seleciona el canal RA3/AN3. ADC con frecuencia Fosc./8

		movlw	b'01011001'
		movwf	ADCON0		;Módulo ADC en On

;Con un preescaler de 1:1, el TMR1 evoluciona cada 1 uS al trabajar a una frecuencia de 4MHz

		movlw	b'00000001'
		movwf	T1CON		;TMR1 en On

		movlw	b'10010000'
		movwf	INTCON		;Habilita interrupción externa por RB0/INT

Loop		clrwdt
		goto	Loop

		end			;Fin del programa fuente
