list p=16f877a;Listar el microcontrolador
#include P16F877a.inc; Incluyo la libreria del micro
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
CBLOCK 0x20
Distancia ; Se expresará en centímetros.
Cont
W_TEMP
STATUS_TEMP
PCLATH_TEMP
ENDC
;........................................................
org 0x00; Direccion del Reset
goto INICIO
org 0x04
goto Interrupcion
; **** Configura los puertos*******************************
INICIO:
; Banco 1
bsf STATUS,RP0
clrf TRISB
BSF PIE1,TMR1IE ; HABILITO LA INTERRUPCIÓN POR TIMER1
bcf STATUS,RP0
;Banco 0
movlw b'00110000' ; Configuro preescaler sin activar el TMR1
movwf T1CON
movlw 0xDC ; Cargo el valor
movwf TMR1L
movlw 0x0B
movwf TMR1H
bsf T1CON,TMR1ON ; Activo el Timer1
clrf PORTB
bcf PIR1,TMR1IF ; Limpio flags antes de activar las interrupciones
BSF INTCON, PEIE ; Habilitamos interrupción por periféricos
BSF INTCON,GIE ; HABILITAMOS TODAS LAS INTERRUPCIONES
bsf PORTB,0
; Loop principal
Led
NOP
goto Led
Interrupcion:
; Guardo el contexto
MOVWF W_TEMP
SWAPF STATUS, W
CLRF STATUS
MOVWF STATUS_TEMP
MOVF PCLATH, W
MOVWF PCLATH_TEMP
CLRF PCLATH
; Aca el codigo de la interrupcion en si
; Limpio Bandera
bcf PIR1,TMR1IF
; Recargo Timer
movlw 0xDC
movwf TMR1L
movlw 0x0B
movwf TMR1H
; Incremento contador y reviso si pasaron las 2 veces
incf Cont, F
MOVF Cont, W
SUBLW 0x02
BTFSS STATUS,Z
GOTO SalirInterrupcion ; No paso asi que salgo
MOVLW 0x02 ; Sino invierto el bit y borro el contador
XORWF PORTB, F
clrf Cont
SalirInterrupcion:
;Retorno el contexto
MOVF PCLATH_TEMP, W
MOVWF PCLATH
SWAPF STATUS_TEMP, W
MOVWF STATUS
SWAPF W_TEMP, F
SWAPF W_TEMP, W
RETFIE
END