You are on page 1of 7

Escuela Profesional de Ingeniera Electrnica y Telecomunicaciones

Curso: Microprocesadores y Microcontroladores

2017-I

Grupo: 1.5.1 1.5.2


Fecha: 9 de mayo de 2017
Profesor: Roxana Flores Quispe
Nombre y Apellidos del
alumno______________________________________________________
________________________________________________________________________________

Gua de Prctica VI

Nota:
PROGRAMACION EN MPLAB

INTERRUPCIONES
A) Interrupcin Externa por el RB0
Cdigo de interrupcin por el RB0
list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;**** Definicion de variables ****


Contador1 equ 0x0C
Contador2 equ 0x0D

Pulsador equ 0 ; pin RB0


Led equ 1 ; pin RB1

;**** Inicio del Micro ****


Reset org 0x00 ; Aqui comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion.-
goto ISR

; **** Programa Principal ****


;**** Configuracion de puertos ***
org 0x05 ; Origen del codigo de programa.-
Inicio bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
movlw b'11111101' ; RB0 como entrada y RB1 como salida.-
movwf TRISB
movlw b'01000000' ; Config. Por flanco Ascendente.-
movwf OPTION_REG
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
bcf PORTB,Led ; El Led comienza apagado.-
movlw b'10010000' ; Habilitamos GIE y INTE (interrupcin por RB0)
movwf INTCON
;**** Bucle infinito ****
Bucle
nop ;
goto Bucle ;
;.............................................
;**** Rutina de servicio de Interrupcion ****
;**** Interrupcion por RB0 ****
ISR
btfss INTCON,INTF ; Consultamos si es por RB0.-
retfie ; No, Salimos de interrupcin.-
call Demora_20ms ; Comprueba si es rebote.-
btfss PORTB,Pulsador
goto Fin_ISR ; Es rebote, entonces salimos.-
btfss PORTB,Led ; Si esta prendido, lo apagamos.-
goto Prender_Led
bcf PORTB,Led ; Apagamos Led
goto Fin_ISR
Prender_Led
bsf PORTB,Led ; Encendemos Led
Fin_ISR
bcf INTCON,INTF ; Limpiamos bandera.-
retfie ; Salimos de interrupcin.-
;..........................................
;**** Demora ****
Demora_20ms
movlw 0xFF ;
movwf Contador1 ; Iniciamos contador1.-
Repeticion1
movlw 0x19 ;
movwf Contador2 ; Iniciamos contador2
Repeticion2
decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.-
goto Repeticion2 ; Si no es 0 repetimos ciclo.-
decfsz Contador1,1 ; Decrementa Contador1.-
goto Repeticion1 ; Si no es cero repetimos ciclo.-
return ; Regresa de la subrutina.-
end
b) Interrupcin Interna por el temporizador
Cdigo de interrupcin por el TMR0

. ; **** Encabezado ****


list p=16F84A
#include P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
Contador equ 0x0C ; Contador para detectar 4 desbordes de TMR0.-
W_Temp equ 0x0D ; Registro para guardar temporalmente W.-
STATUS_Temp equ 0x0E ; Registro para guardar temporalmente en STATUS

Led equ 0 ;
Reset
org 0x00 ; Aqu comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion.-
goto Inicio_ISR

; **** Programa Principal ****


;**** Configuracion de puertos ***
org 0x05 ; Origen del cdigo de programa.-
Inicio
bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
movlw b'11111110' ; RB0 como salida.-
movwf TRISB
movlw b'00000111' ; Se selecciona TMR0 modo temporizador y preescaler de
1/256.-
movwf OPTION_REG
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
bcf PORTB,Led ; El Led comienza apagado.-
movlw 0x3D ; Cargamos 61 en TMR0 para lograr aprox. 50ms.-
movwf TMR0
clrf Contador ; Iniciamos contador.-
movlw b'10100000' ; Habilitamos GIE y T0IE (interrupcin del TMR0)
movwf INTCON

;**** Bucle ****


Bucle
nop ; Aqui el micro puede ejecutar cualquier otra tarea
goto Bucle ; sin necesidad de utilizar tiempo en un bucle de demora.-
Inicio_ISR
movwf W_Temp ;
swapf STATUS, W ;
movwf STATUS_Temp ; Guardamos STATU temporal.-
;**** Interrupcion por TMR0 ****
ISR
btfss INTCON,T0IF ;
goto Fin_ISR ; No,
incf Contador ; Si,
movlw 0x04 ;
subwf Contador,0 ; para obtener 20
btfss STATUS,Z ;
goto Actualizo_TMR0 ; No, cargo TMR0
clrf Contador ; Si, reseteo Con
btfss PORTB,Led ; Si esta apagado
goto Prendo_led
bcf PORTB,Led ; Apago Led.-
Actualizo_TMR0 ; Actualizo TMR0 para obtener una temporizacion de 50 ms.-
movlw 0x3D ; d'61'
movwf TMR0
bcf INTCON,T0IF ; Borro bandera de control de nterrupcion.-
goto Fin_ISR ; Restauro valores.-
Prendo_led
bsf PORTB,Led ; prendo Led.-
goto Actualizo_TMR0
; Restauramos los valores de W y STATUS.-
Fin_ISR
swapf STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp.-
movwf STATUS
swapf W_Temp, f ; Invertimos los nibles y lo guardamos el mismo registro.-
swapf W_Temp,W ; Invertimos los nibles nuevamente y lo guarda en W.-
retfie ; Salimos de interrupcin.-
;..........................................
end

You might also like