;
;					EJEMPLO 29
;
;				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 contínua 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, el TMR1 se incrementa/decrementa en intervalos de 100uS provocando que el
;disparo del TRIAC se retrase/adelante entre 0 y 10mS, provocando un efecto de disminución/
;aumento de potencia en la carga. El TMR0, cada 55mS provoca una interrupción gracias a la
;cual se relizan los incrementos/decrementos del TMR1.
;
;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.

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Contador	equ	0x20		;Variable contadora de incrementos/decrementos
Delay_L		equ	0x21
Delay_H		equ	0x22		;Variables de retraso en el disparo
Flag		equ	0x23		;Flag de señalización
W_Temp		equ	0x24		;Temporal para el reg. W
Status_Temp	equ	0x25		;Temporal para el reg. STATUS

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		;Vector de interrupción

;Tratamiento de interrupción. 

Inter		clrwdt
		movwf	W_Temp		;Salva el reg.W
		swapf	STATUS,W
		movwf	Status_Temp	;Salva el registro de estado

		btfsc	INTCON,T0IF	;Ha sido el TMR0 ??
		goto	Ajuste_Delay	;Si, ajustar el delay para variar el ángulo de disparo
		btfsc	INTCON,INTF	;Ha sido el cruce por cero ??
		goto	Cruce		;Si, disparar el TRIAC según el TMR1

Inter_Fin	swapf	Status_Temp,W
		movwf	STATUS		;Restaura el reg. STATUS
		swapf	W_Temp,F
		swapf	W_Temp,W	;Restaura el reg.W
		retfie

Ajuste_Delay	bcf	INTCON,T0IF	;Restaura el flag del TMR0
		bsf	INTCON,GIE	;Habilita interrupciones
		movlw	~.214
		movwf	TMR0		;Inicia el TMR0
		btfsc	Flag,0		;Incrementos ??
		goto	Decrementos	;No, decrementar delay para adelantar el disparo
		movlw	.100		;Si, incrementar delay para retrasar el disparo
		addwf	Delay_L,F	;Suma 100 al Delay_L
		btfsc	STATUS,C	;Hay llevada ??
		incf	Delay_H,F	;Si, incrementa el Delay_H
		decfsz	Contador,F	;Se han producido 100 incrementos de 100 unidades ??
		goto	Inter_Fin	;No
		movlw	.100		;Si
		movwf	Contador	;Restaura el contador de incrementos/decrementos
		incf	Flag,F		;A partir de ahora decrementos. Aumenta potencia
		goto	Inter_Fin

Decrementos	movlw	.100
		subwf	Delay_L,F	;Resta 100 a Delay_L
		btfss	STATUS,C	;Hay llevada ??
		decf	Delay_H,F	;Si, resta 1 a Delay_H
		decfsz	Contador,F	;Se han producido 100 decrementos de 100 unidades ??
		goto	Inter_Fin	;No
		movlw	.100		;Si
		movwf	Contador	;Restaura el contador de incrementos decrementos
		incf	Flag,F		;A partir de ahora incrementos. Disminuye potencia
		goto	Inter_Fin

Cruce		bcf	INTCON,INTF	;Restaura flag INTF
		bsf	INTCON,GIE	;Restaura interrupciones
		bcf	PORTB,1		;Triac en Off
		bcf	PIR1,TMR1IF	;Restaura el flag del TMR1
		comf	Delay_L,W
		movwf	TMR1L
		comf	Delay_H,W
		movwf	TMR1H		;Carga el TMR1 con el valor de retraso
Cruce_Loop	btfss	PIR1,TMR1IF	;Fin de retraso ??
		goto	Cruce_Loop
		bsf	PORTB,1		;Triac en ON
		goto	Inter_Fin

;Programa principal

Inicio	        clrf	PORTB		
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'11111101'
		movwf	TRISB		;RB0 entrada. RB1 salida
		movlw	b'11000111'
		movwf	OPTION_REG	;Preescaler de 258 asociado al TMR0
		bcf	STATUS,RP0	;Selecciona banco 0

		clrf	Delay_L
		clrf	Delay_H		;Retraso mínimo, máxima potencia
		clrf	Flag		;Delay ascendente, dsminuye la potencia
		movlw	.100
		movwf	Contador	;Se producen 100 incrementos/decrementos de 100uS
					;del Delay, para variar el retraso del disparo entre
					;0 y 10mS.

;A una frecuencia de 4MHZ el TMR0 evoluciona cada 1 uS. Con un preescaler de 256, habrá que
;cargarle con 214 para obtener una interrupción cada 55mS

		movlw	~.214
		movwf	TMR0		;Inicia el TMR0

		movlw	b'10110000'
		movwf	INTCON		;Habilita interrupción externa por RB0/INT y TMR0

;Con un preescaler de 1:1, el TMR1 se incrementa cada 1 uS en el modo temporizador

		movlw	b'000000001'
		movwf	T1CON		;TMR1 en On

Loop		nop
		goto	Loop

		end			;Fin del programa fuente
