;
;					EJEMPLO 10
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer 
;
;El TMR2. Generación de periodos y frecuencias
;
;El TMR2 provoca una interrupción cada vez que se alcance el valor de un periodo (P). La inte-
;rrupción hace bascular el estado lógico de la línea RB0, por lo que la frecuencia en esta 
;línea será 1/2P.
;
;El periodo P se establece mediante el valor binario que se introduce a través de los interrup-
;tores RA4-RA0 conectados a la puerta A, multiplicado por 8.
;
;Un osciloscopio conectado a RB0 permitirá medir el periodo o la frecuencia presente en esta 
;línea
		
		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Temporal	equ	0x20		;Variable temporal de propósito general
Copia		equ	0x21		;Estado de RA4-RA0

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		
		goto	Inter		;Vector de interrupción

;Programa de tratamiento de la interrupción que provoca el TMR2 cada vez que se alcanza el
;valor de un periodo

Inter		movf	PORTA,W
		subwf	Copia,W
		btfsc	STATUS,Z	;Ha habido cambio de estado en RA4-RA0 ??
		goto	Inter_Fin	;No
		movf	PORTA,W
		movwf	Copia
		movwf	Temporal	;Leer el nuevo estado de RA4-RA0
		bcf	STATUS,C	
		rlf	Temporal,F
		rlf	Temporal,F
		rlf	Temporal,W	;Multiplica por 8
		bsf	STATUS,RP0	;Selecciona página 1
		movwf	PR2		;Ajusta nuevo periodo
		bcf	STATUS,RP0	;Selecciona página 0
Inter_Fin	bcf	PIR1,TMR2IF	;Repone el flag del TMR2
		incf	PORTB,F		;RB0 cambia de estado
		retfie


;Programa principal

Inicio	        clrf	PORTB		;Desconecta salidas
		clrf	PORTA
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'00000110'
		movwf	ADCON1		;Puerta A E/S digitales
		clrf	TRISB		;Puerta B se configura como salida
		movlw	b'00011111'
		movwf	TRISA		;RA4-RA0 entradas
		movlw	b'11001111'
		movwf	OPTION_REG	;Preescaler de 128 asociado al WDT
		bsf	PIE1,1		;Habilita interrupción del TMR2	
		bcf	STATUS,RP0	;Selecciona banco 0

;El TMR2 emplea un preescaler y un postcaler de 1:1 (total 1:1). Trabajando a una
;frecuencia de 1 MHZ el TMR2 evoluciona cada 1uS (preescaler 1:1). La cuenta avanza hasta
;alcanzar el valor del registro de periodos que se carga con el estado de (RA4-RA0) * 8, 
;con lo que el tiempo transcurrido depende del estado de esas líneas. 

;Si el valor introducido por RA4-RA0 < 2 se obtiene un periodo menor que el que tarda en ser
;reconocida la propia interrupción. Las medidas en este caso serán incorrectas.
		
		movf	PORTA,W
		movwf	Copia		
		movwf	Temporal	;Lee el estado de RA4-RA3
		bcf	STATUS,C
		rlf	Temporal,F
		rlf	Temporal,F
		rlf	Temporal,W	;Multiplica por 8
		bsf	STATUS,RP0	;Selecciona el banco 1
		movwf	PR2		;Ajusta el registro de periodos
		bcf	STATUS,RP0	;Selecciona el banco 1
		movlw	b'00000100'
		movwf	T2CON		;TMR2 On, preescaler/postcaler = 1:1
		clrf	TMR2		;Inicia el TMR2

		movlw	b'11000000'
		movwf	INTCON		;Habilita interrupciones

Loop		clrwdt			;Refresca el WDT	
		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
