; ARCHIVO EJEMPLO1INTERRUPCIONES.ASM
; CODIGO FUENTE PARA EL MICROCONTROLADOR PIC16F84 

; PROGRAMA PARA GENERAR UNA BASE DE TIEMPO DE UN SEGUNDO
; POR INTERRUPCIONES. ENCIENDE Y APAGA EL BIT RB7 
; SE USA EL TEMPORIZADOR TMR0 Y SU PREESCALADOR PARA GENERAR 
; 65.536 MILISEGUNDOS POR CADA CICLO DE INTERRUPCION. 
; 15 CICLOS ES APROXIMADAMENTE 1 SEGUNDO.

; VERSION PARA OSCILADOR CRISTAL 4 MHZ

; CPU configuration
; 	(It's a 16F84, XT OSCILADOR
; 	watchdog timer off, power-up timer on)

	processor 16f84
	include	  <p16f84.inc> 

	__config  _XT_OSC & _WDT_OFF & _PWRTE_ON

#DEFINE	BANCO0	BCF	STATUS,RP0
#DEFINE	BANCO1	BSF	STATUS,RP0




CONT1	EQU	H'20'			;CONTADOR DE CICLOS DE 65.5 MILISEGUNDOS. 
							;15 CICLOS ES APROX. UN SEGUNDO


;aquí inicia el programa

		org	H'0'
inicio	goto	begin		;salta a inicio del programa

		org 	H'4'		;subrutina de interrupción en la dirección 4				
int		BANCO0		
		clrf	TMR0		;inicializa TMR0
		bcf		INTCON,T0IF	;apaga bandera de overflow del TMR0
		incf	CONT1,f		;incrementa contador de 65.5 ms.
		movlw	D'15'
		subwf	CONT1,w		;prueba si la cuenta es igual a 15
		btfss	STATUS,Z	;bandera Z encendida?
		retfie				;cuenta diferente a 15, regresa
		BTFSS	PORTB,7		;¿LED ENCENDIDO?
		GOTO	ENC		
		BCF		PORTB,7		;APAGA LED
		CLRF	CONT1
		retfie	
ENC		BSF		PORTB,7		;ENCIENDE LED
		CLRF	CONT1		
		retfie

begin	clrf	CONT1		;programa principal		
		BANCO1
		movlw	B'00011110'
		movwf	TRISA		;INICIALIZA ENTRADAS Y SALIDAS PUERTO A
		clrf	TRISB		;PUERTO B SON SALIDAS
		movlw	B'00000111'	;HABILITA TEMPORIZADOR Y CLOCK INTERNO					
		movwf	OPTION_REG	;PREESCALADOR DIVIDE ENTRE 256
		BANCO0
		clrf PORTB		
		BCF		PORTA,0
		movlw	D'00'
		movwf	TMR0			;INICIALIZA TEMPORIZADOR=00	
		bsf		INTCON,GIE		;habilita interrupciones global
		bsf		INTCON,T0IE		;habilita interrupción del temporizador.
sigue	goto	sigue
		end

