;
;					EJEMPLO 7
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo MicroPIC Trainer y Micro'PIC IO
;
;El TMR1 con oscilador externo. Segundero
;
;Conctando al TMR1 un cristal oscilador externo, es posible realizar temporizaciones aún
;con el microcontrolador en el modo sleep de bajo consumo. En el ejemplo se propone emplear
;el cuarzo de 32.768 KHz disponible en la tarjeta Micro'PIC I/O.
;
;Esta estratégica frecuencia dividida por un divisor de 1:15 (32768) proporciona una 
;interrupción por segundo (1Hz) con precisión.
;
;El ejemplo propone realizar un contador de intervalos de 1 segundo, que se visualiza sobre
;el display de la Micro'PIC Trainer.
		
		List	p=16F873	;Tipo de procesador
		include	"P16F873.INC"	;Definiciones de registros internos

Segundos	equ	0x20		;Contador de segundos

		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		;Vector de interrupción

Inter		movlw	low ~.32768
		movwf	TMR1L
		movlw	high ~.32768		
		movwf	TMR1H		;Restaura el TMR1 con el Nº de pulsos a contar
		bcf	PIR1,0		;Restaura el frag del TMR1		
		incf	Segundos,F
		movlw	.10
		subwf	Segundos,W
		btfsc	STATUS,Z	;Han pasado de 9 ??
		clrf	Segundos	;Si puesta a 0
		movf	Segundos,W
		call	Tabla		;Convierte a 7 segmentos
		movwf	PORTB		;Visualiza sobre el display
		retfie		
		
;**********************************************************************************
;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 principal

Inicio	        clrf	PORTB		;Desconecta salidas
		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
		movlw	b'11111110'
		movwf	TRISC		;RC0/T1OSO salida y RC1/T1OSI entrada
		bsf	PIE1,0		;Habilita interrupción del TMR1
		bcf	STATUS,RP0	;Selecciona banco 0

;El TMR1 actúa con cristal oscilador externo asíncrono y con un preescaler de 1:1

		movlw	b'00001111'
		movwf	T1CON
		clrf	Segundos	;Puesta a 0
		movlw	low ~.32768
		movwf	TMR1L
		movlw	high ~.32768
		movwf	TMR1H		;Carga el TMR1 con el Nº de pulsos a contar
		movlw	b'11000000'
		movwf	INTCON		;Habilita interrupciones

Loop		sleep			;Puesta en standby
		nop
		goto	Loop		;Bucle infinito		

		end			;Fin del programa fuente
