;
;					EJEMPLO 9
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer 
;
;El TMR2. Temporización simple, segundero
;
;El TMR2 provoca una interrupción cada 50 mS. Transcurridas 20 interrupciones, el tiempo total
;obtenido es de 1 segundo.
;
;El display conectado a la puerta B, cuenta intervalos de 1 segundo.
		
		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Delay		equ	0x20		;Variable de temporización
Contador	equ	0x21		;Variable del contador

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		
		goto	Inter		;Vector de interrupción

;**********************************************************************************
;Tabla: Esta rutina convierte el código binario presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El código 7 segmentos retorna también
;en el reg. W

Tabla:		addwf	PCL,F		;Desplazamiento sobre la tabla
		retlw	b'00111111'	;Dígito 0
		retlw	b'00000110'	;Dígito 1
		retlw	b'01011011'	;Dígito 2
		retlw	b'01001111'	;Dígito 3
		retlw	b'01100110'	;Dígito 4
		retlw	b'01101101'	;Dígito 5
		retlw	b'01111101'	;Dígito 6
		retlw	b'00000111'	;Dígito 7
		retlw	b'01111111'	;Dígito 8
		retlw	b'01100111'	;Dígito 9

;Programa de tratamiento de la interrupción que provoca el TMR2 cada 50mS.

Inter		decfsz	Delay,F		;Ha pasado un segundo ??
		goto	No_es_1_seg	;No
		incf	Contador,F	;Si, incrementa el contador
		movlw	.10
		subwf	Contador,W
		btfsc	STATUS,Z	;Contador > 9 ??
		clrf	Contador	;Si, ponerlo a 0
		movf	Contador,W
		call	Tabla		;Convierte a 7 segmentos
		movwf	PORTB		;Visualiza sobre el display
		movlw	.20
		movwf	Delay		;Reinicia variable delay
No_es_1_seg	bcf	PIR1,TMR2IF	;Repone el flag del TMR2
		clrf	TMR2		;Reinicia el TMR2
		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'11001111'
		movwf	OPTION_REG	;Preescaler de 128 asociado al WDT
		bsf	PIE1,1		;Habilita interrupción del TMR2
		movlw	.195
		movwf	PR2		;Carga registro de periodos con 195
		bcf	STATUS,RP0	;Selecciona banco 0

;El TMR2 emplea un preescaler y un postcaler de 1:16 (total 1:256). Trabajando a una
;frecuencia de 1 MHZ el TMR2 evoluciona cada 16uS (preescaler 1:16). La cuenta avanza hasta
;alcanzar el valor del registro de periodos (195), con lo que el tiempo transcurrido es de
;3120 uS. Este lapsus se repite 16 veces (postcaler 1:16) antes de provocar la interrupción
;(al de 49920 uS).

		movlw	b'01111111'
		movwf	T2CON		;TMR2 On, preescaler/postcaler = 1:16
		clrf	TMR2		;Inicia el TMR2

		movlw	.20
		movwf	Delay		;Inicia variable de delay

		movlw	b'11000000'
		movwf	INTCON		;Habilita interrupciones

		clrf	Contador	;Inicia el contador

Loop		clrwdt			;Refresca el WDT	
		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
