;
;					EJEMPLO 2.10
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para simulación y/o MicroPIC Trainer
;
;La interrupción del TMR0.
;
;Se trata de comprobar la interrupción provocada por el TMR0. El programa
;lee el estado de los interruptores conectados a RA0 y RA4 para reflejarlo en
;los leds conectados a RB0 y RB4 respectivamente. Al mismo tiempo el TMR0
;genera una interrupción cada 0.05 seg. (50 mS) que se repetirá 5 veces con objeto 
;de hacer intermitencia de 250 mS sobre el led conectado a RB7.

	
		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos

Contador	equ	0x0c		;Variable para la temporización
                    
		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		;Vector de interrupción

Interrupcion   	bcf	INTCON,T0IF	;Repone flag del TMR0
		decfsz 	Contador,F	;Decrementa el contador
           	goto 	Seguir
Con_si_0   	movlw 	5
           	movwf 	Contador       	;Repone el contador nuevamente
           	btfsc 	PORTB,7        	;Testea último estado de RB7
           	goto 	RB7_ES_1	;Está a 1
           	bsf 	PORTB,7		;Está a 0, activa RB7
           	goto 	Seguir

RB7_ES_1   	bcf 	PORTB,7		;Desactiva RB7

Seguir    	movlw 	0x3c
           	movwf 	TMR0      	;Repone el TMR0 con 195
           	retfie			;Retorno 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'00000111'
		movwf	OPTION_REG	;Preescaler de 256 para el TMR0		
		bcf	STATUS,RP0	;Selecciona banco 0			                                                                         

;El TMR0 se incrementa cada 1 uS. Si se emplea un preescaler de 256, deberá sufrir 195
;incrementos para provocar una interrupción cada 50000 uS (50 mS). Si esta se repite 5
;veces, el tiempo total transcurrido es de 250000 uS (250 mS). El complemento del valor
;195 en hex. es 0x3c.

		movlw	0x3c
		movwf	TMR0		;Carga el TMR0 con 195
		movlw	0x05
		movwf	Contador	;Nº de veces a repetir la interrupción
		movlw	b'10100000'
		movwf	INTCON		;Activa la interrupción del TMR0

Loop		clrwdt			;Refresca el WDT
		btfsc 	PORTA,0        	;Testea el estado de RA0
           	goto 	RA0_ES_1
           	bcf 	PORTB,0		;Desactiva RB0
           	goto 	TEST_RB1
RA0_ES_1   	bsf 	PORTB,0		;Activa RB0
TEST_RB1   	btfsc 	PORTA,1        	;Testea el estado de RA1
           	goto 	RA1_ES_1
           	bcf 	PORTB,1		;Desactiva RB1
           	goto 	Loop
RA1_ES_1   	bsf 	PORTB,1		;Activa RB1
		goto 	Loop


		end			;Fin del programa fuente
