; ARCHIVO BOLT-INTERRUPCIONES-TIMER0-VERSION-2.ASM
; CODIGO FUENTE PARA EL MICROCONTROLADOR PIC18F2550 
; PROGRAMA PARA GENERAR UNA BASE DE TIEMPO DE UN SEGUNDO
; POR INTERRUPCIONES. ENCIENDE Y APAGA EL BIT RB7 
; SE USA EL TEMPORIZADOR TMR0 A 8 BITS Y SU PREESCALADOR (256)
; PARA GENERAR 5.46 MILISEGUNDOS POR CADA CICLO DE INTERRUPCION. 
; 183 CICLOS ES APROXIMADAMENTE 1 SEGUNDO.
; EN EL PROGRAMA PRINCIPAL, REALIZA UNA CUENTA BINARIA
; EN LOS 4 BITS MENOS SIGNIFICATIVOS DEL PUERTO B.

	processor 18F2550
	include	  <p18F2550.inc>
	include	 "KEYBOLT.inc"	;ARCHIVO AUXILIAR CONTIENE MACRO Y DIRECTIVAS DEFINE

CONT1	EQU	H'60'			;CONTADOR DE CICLOS DE 65.5 MILISEGUNDOS. 
J		EQU	H'61'
K		EQU	H'62'
L		EQU	H'63'
SALVAW	EQU H'64'			;guarda registro w
SALVAST	EQU H'65'			;guarda bandera Z

;aquí inicia el programa
org 	0X800
		goto 	begin			;SALTA AL PROGRAMA PRINCIPAL	
			
		org 	0x808			;subrutina de interrupción en la dirección 0x808				
		clrf	TMR0L			;inicializa TMR0
		movwf	SALVAW
		swapf	STATUS,w
		movwf	SALVAST
		bcf		INTCON,TMR0IF	;apaga bandera de overflow del TMR0
		incf	CONT1,f			;incrementa contador de 65.5 ms.
		movlw	D'183'
		subwf	CONT1,w			;prueba si la cuenta es igual a 183
		btfss	STATUS,Z		;bandera Z encendida?
		goto	salida					;cuenta diferente a 183, regresa
		BTFSS	LED7			;¿LED ENCENDIDO?
		GOTO	ENC		
		BCF		LED7			;APAGA LED
		CLRF	CONT1	
		goto	salida	
ENC		BSF		LED7			;ENCIENDE LED
		CLRF	CONT1
salida	swapf	SALVAST,w
		movwf	STATUS
		swapf	SALVAW,f
		swapf	SALVAW,w		
		retfie

;PROGRAMA PRINCIPAL
begin	PUERTOS					;inicializa puertos.
		clrf	CONT1			;programa principal			
		movlw	B'11000111'		;HABILITA TEMPORIZADOR A 8 BITS Y CLOCK INTERNO					
		movwf	T0CON			;PREESCALADOR DIVIDE ENTRE 256
		movlw	D'00'
		movwf	TMR0L			;INICIALIZA TEMPORIZADOR=0	
		bsf		INTCON,GIE		;habilita interrupciones global
		bsf		INTCON,TMR0IE	;habilita interrupción del temporizador.

;TAREA 2 CUENTA EN BINARIO EN RB0...RB3
	
increment:	incf	PORTB,F	
			call	retrobolt
			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


;SUBRUTINA DE RETRASO APROX DE 1 SEGUNDO.SE PUEDE MODIFICAR A (16.4 x L) MILISEGUNDOS

retrobolt:	movlw	D'10'	;valor de L. Modifique para cambiar el valor del retraso.
			movwf	L
lloop		movlw	D'255'	; w := 200 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
			decfsz	L,f
			goto	lloop
			return

			end