; ARCHIVO EJEMPLO2INTERRUPCIONES.ASM
; CODIGO FUENTE PARA EL MICROCONTROLADOR PIC16F84 
; EL PROGRAMA REALIZA 2 TAREAS
; 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.
; ADICIONALMENTE, DESDE EL PROGRAMA PRINCIPAL, SE REALIZA
; UNA CUENTA BINARIA EN LOS LEDS RB0...RB3, CON UN PERIODO
; APROXIMADO DE 100 MS.

; 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
SALVAW	EQU	H'21'			;REGISTRO PARA GUARDAR W
SALVAST	EQU	H'22'			;REGISTRO PARA GUARDAR STATUS
J		EQU	H'23'
K		EQU	H'24'

;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
		bcf		INTCON,T0IF	;apaga bandera de overflow del TMR0					
int		BANCO0		
		clrf	TMR0		;inicializa 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 sin modificar CONT1
		BTFSS	PORTB,7		;¿LED 7 ENCENDIDO?
		GOTO	ENC		
		BCF		PORTB,7		;APAGA LED		
		CLRF	CONT1
		retfie	
ENC		BSF		PORTB,7		;ENCIENDE LED		
		CLRF	CONT1				
		retfie				;FIN DE LA RUTINA DE INTERRUPCION

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.

;TAREA 2 CUENTA EN BINARIO EN RB0...RB3
	
increment:	incf	PORTB,F	
			call	retro
			MOVF	PORTB,W
			ANDLW	H'7F'
			SUBLW	H'0F'
			BTFSS	STATUS,Z
			GOTO	NOCERO
SICERO:		MOVF	PORTB,W
			ANDLW	H'80'		;NO CAMBIES EL VALOR DEL BIT 7
			MOVWF	PORTB					
NOCERO		goto	increment

	; RETRASO DE 0.1 SEGUNDOS

retro:		movlw	D'255'	; w := 100 decimal
			movwf	J	; J := w
jloop:		movwf	K	; K := w
kloop:		decfsz	K,f	; K = K-1, skip next if zero
			goto 	kloop
			decfsz	J,f	; J = J-1, skip next if zero
			goto	jloop
			return

			end

