;
;					EJEMPLO 27
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC I/O
;
;El módulo conversor ADC. Regulación en alterna. Detección del cruce por cero.
;
;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
;
;La tensión alterna senoidal suministrada por la red de abastecimiento tiene una frecuencia
;de 50 Hz. En la mayor parte de sistemas de regulación es necesario conocer el momento en que
;la tensión pasa por 0V para poder sincronizar el sistema. Esto ocurre cada 10mS.
;
;La tarjeta Micro'PIC I/O dispone de un circuito optoelectrónico de detección del paso por 0.
;En este ejemplo se propone provocar una interrupción externa por la línea RB0/INT cada vez 
;que esto ocurra, es decir, cada 10mS. Este intervalo constante puede servir, entre otras 
;cosas, para medir tiempo. Se trata de emitir por el piezo eléctrico de Micro'PIC I/O conectado
;a RB1, un tono cada 500mS.

		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Contador	equ	0x20		;Variable contadora

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		;Vector de interrupción

;Tratamiento de interrupción. Al de 50 interrupciones de 10mS (500mS) RB1 cambia de estado

Inter		clrwdt
		bcf	INTCON,INTF	;Repone flag de interrupción externa
		decfsz	Contador,F	;Han pasado 50 interrupciónes ?
		retfie			;No

		movlw	.50
		movwf	Contador	;Repone el contador
		movlw	b'00000010'
		xorwf	PORTB,F		;RB1 (piezoeléctrico) cambia de estado
		retfie

;Programa principal

Inicio	        clrf	PORTB		
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'11111101'
		movwf	TRISB		;RB0 entrada. RB1 salida
		movlw	b'11001111'
		movwf	OPTION_REG	;Preescaler de 128 asociado al WDT
		bcf	STATUS,RP0	;Selecciona banco 0

		movlw	.50
		movwf	Contador	;Carga el contador

		movlw	b'10010000'
		movwf	INTCON		;Habilita interrupción externa por RB0/INT

Loop		sleep			;Modo standby de bajo consumo
		goto	Loop

		end			;Fin del programa fuente
