

;***********************************************************************************
;* Carlos Alberto Henao                                                            *
;* Interrupcin por desborde del timer0 con el pic 16f877 en modo contador TOCK1   *
;* Foro tcnico de microcontroladores "todopic"		                           *
;* 5 de febrero del 2010 Pereira - Colombia                                         *
;***********************************************************************************

;******************** Declaracin de registros especiales *********************************

tmr0		equ		01h
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 proposito especial ***************************************


contador	equ		20h


list p = 16f877

;***************** va a empezar el programa ***********************************************

	org	00
	goto	inicio
	
	org	04
	goto	inter

;***************** Manejo de interrupcin **************************************************

inter	btfsc	intcon,2
	goto	conta			; si hay desborde atiende la interrupcin
	retfie				; si no retorna

conta	incf	contador,1		; incremento contador
	movf	contador,0		; paso contador a w
	xorlw	d'1'			; comparo con 1
	btfss	status,2		; pregunta por el resultado lgico
	goto	apaga			; so no es cero va a apaga
	bsf	portb,0			; prende el primer led si el ciclo es impar
	movlw	d'250'
	movwf	tmr0			; cargo otra vez el timer con 250
	bcf	intcon,2		; limpio la bandera de interrupcin
	retfie				; salgo de la interrupcin

apaga	bcf	portb,0			; apago el led en el ciclo par
	movlw	d'250'
	movwf	tmr0			; cargo otra vez el timer con 250
	bcf	intcon,2		; limpio la bandera de interrupcin
	clrf	contador		; vuelve e inicia el ciclo
	retfie				; salgo de la interrupcin

;************* Inicia el programa **********************************************************

inicio	bcf	status,6
	bsf	status,5		; Banco 1 de memoria
	movlw	b'11111111'		
	movwf	trisa
	movwf	trisc
	movwf	trisd
	movwf	trise			; configuro puertos A,C,D,E como entrada
	movlw	b'11111110'
	movwf	trisb			; configuro el puerto restante
	movlw	b'11110000'
	movwf	option_reg		; configuro el timer a un predivisor de frecuancia de 1:2
					; y contador cada flanco ascendente por TOCK1
	movlw	b'00000110'
	movwf	adcon1			; configuro puerto A Y E como entradas digitales
	bcf	status,5		; me paso al banco 0
	movlw	b'10100000'
	movwf	intcon			; configuro el desborde por timer0
	clrf	contador
	clrf	porta
	clrf	portb
	clrf	portc
	clrf	portd
	clrf	porte			; limpio todos los puertos
	movlw	d'250'
	movwf	tmr0			; cargo al timer0 con 250 para que se me desborde cada
					; 12 pulsos de reloj

nada	goto	nada			; bucle infinito esperando desborde
	end
	

	
		