;
;					EJEMPLO 2.18
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para simulación y/o MicroPIC Trainer
;
;El TMR0 como contador de eventos externos
;
;Un sensor optoelectrónico conectado a RA4 genera un pulso cada vez que un objeto se 
;iterpone entre el emisor y el receptor de luz. El TMR0 se encarga de contarlos 
;dependiendo del valor del preescaler. Dicho valor se ajusta mediante 3 interruptores
;(RA0-RA2) conectados a la Puerta A, existiendo así 8 pre-divisiones:
;
;			I2	I1	I0		División
;			--	--	--		--------
;			0	0	0		1:2
;			0	0	1		1:4
;			0	1	0		1:8
;			0	1	1		1:16
;			1	0	0		1:32
;			1	0	1		1:64
;			1	1	0		1:128
;			1	1	1		1:256
;
;	El contaje se va visualizando en binario sobre los leds conectado a la Puerta B y 
;debe multiplicarse por el valor del preescaler seleccionado, para determinar el número
;total de pulsos. El contador se resetea al poner RA3 a "1". Debe tenerse en cuenta el
;"efecto rebote" que se produce en el interruptor RA4 de la MicroPIC Trainer.

		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos
                    		
		org	0x00		;Vector de Reset
		goto	Inicio
		org	0x05		;Salva vector de interrupción

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		clrf	TRISB		;Puerta B se configura como salida
		movlw	b'00011111'		
		movwf	TRISA		;Puerta A se configura como entrada		
		movlw	b'00110000'
		movwf	OPTION_REG	;TMR0 contador sensible al descendente de RA4
		bcf	STATUS,RP0	;Selecciona banco 0			                                                                         					

Loop		clrf	TMR0		;Puesta a 0 del contador
Loop1:		clrwdt			;Refresca el WDT
		btfsc	PORTA,3		;Mira si I3 está activo (RESET)
		goto	Loop		;Si Cuenta detenida y puesta a 0					
		movf	PORTA,W         ;No, leer I2-I0 para formar el nuevo valor
		andlw	b'00000111'     ;del preescaler
		bsf	STATUS,RP0      ;Selecciona página 1
		iorwf	OPTION_REG,F	;Actualiza el nuevo valor del preescaler
		bcf	STATUS,RP0	;Selecciona página 0                                            
		movf	TMR0,W          ;Lee el valor del contador					
		movwf	PORTB		;Salida a leds
		goto	Loop1
		
		end			;Fin del programa fuente

