
;*******************************************
;* Carlos Alberto Henao Baena              *
;* Foro de microcontroladores TODOPIC      *
;* Manejo de interrupcin extenta RB0/INT  *
;* 5 de agosto del 2009                    *
;* Pereira - Colombia                      *
;*******************************************


;******************************* Registro especiales *************************************

status		equ		03h
porta		equ		05h
portb		equ		06h
portc		equ		07h
portd		equ		08h
porte		equ		09h
intcon		equ		0bh

option_reg	equ		81h
trisa		equ		85h
trisb		equ		86h
trisc		equ		87h
trisd		equ		88h
trise		equ		89h
adcon1		equ		9fh
;******************************* Registro de usuario *************************************

bandera		equ		20h

;******************************* Empieza el programa *************************************

	list p = 16f877
	org	00
	goto	inicio

	org	04
	goto	inter




;****************************** Rutina de manejo de interrupciones ***********************

inter		btfsc		intcon,1
		goto		flanco_activo1		; si ha ocurrido la interrupcin 
							; voy a una rutina de atencin
		retfie					; si no retorno

flanco_activo1	movf		bandera,0		; paso bandera a W
		xorlw		d'0'
		btfss		status,2		; pregunto por la comparacin
		goto		flanco_activo2
		bsf		portb,1			; si es el primer flanco activo el led
		incf		bandera,1		; incremento bandera para que en el
							; otro flanco activo apague el led
		bcf		intcon,1		; limpio el sealizador de interrupcin
		retfie					; salgo de la interrupcin

flanco_activo2	movf		bandera,0		; paso bandera a W
		xorlw		d'1'
		btfss		status,2		; pregunto por la comparacin
		retfie
		bcf		portb,1			; si es el segundo flanco desactivo el led
		clrf		bandera			; limpio bandera para que en el
							; otro flanco activo prenda el led
		bcf		intcon,1		; limpio el sealizador de interrupcin
		retfie		

;****************************** Rutina principal de programa MAIN() **********************

inicio		bcf		status,6
		bsf		status,5		; banco 1
		movlw		b'11111111'
		movwf		trisa
		movwf		trisc
		movwf		trisd
		movwf		trise			; puerto a,c,d y e como entradas
							; digitales
		movlw		b'11111101'
		movwf		trisb			; configuro tal que RB0 sea entrada
							; digital
		movlw		b'01000000'		; configuro el flanco de interrupcin
		movwf		option_reg		; ascendente 
		movlw		b'00000110'
		movwf		adcon1			; configuro el adcon1 para los puertos
							; A y E sean entradas o salidas digitales
		bcf		status,5		; banco 0
		movlw		b'10010000'		; habilito la interrupcin global
							; y la de RB0/INT y desactivo las 
		movwf		intcon			; dems por timer0 etc
		clrf		portb
		clrf		porta
		clrf		portc
		clrf		portd
		clrf		porte
		clrf		bandera			; inicializo todas la variable y los 
							; puertos
nada		goto		nada			; bucle infinito para esperar la 
		end					; la interrupcin