You are on page 1of 5

Práctica No.7 Interrupción Externa INTRB0 (ASM).

Objetivo: Desarrollar una rutina de servicio para la interrupción externa INTRB0 en Lenguaje Ensamblador

Introducción:
Con el desarrollo de esta práctica el alumno comprenderá como el programa se interrumpe cuando se provoca
una interrupción por el pin RB0 (un cambio de estado en el pin RB0) y brincará a la localidad 04H de la
memoria de programa para ejecutar la rutina de servicio que atiende dicha interrupción. La rutina de servicio
de interrupción invierte el estado del bit RC0 cada vez que se presione el push botton (dispositivo que
provoca la interrupción), dicho cambio de estado se mostrará por el pin RC0 a través de un Led.

Esta practica se correlaciona con el Tema 2.2 y principalmente con el subtema 2.2.5.4 de la Unidad 2.

Material y Equipo utilizado:


1 Microcontrolador PIC16F874
1 Cristal 4 Mhz
2 capacitores de 22pf o 15pf
1 Led
2 Push Button
1 Resistencia de 10k
1 Resistencia de 220 Ohms
1 Resistencia de 1 Mhoms
1 Fuente de +5 VDC (Opcional: 1 Pila Cuadrada de +9Vdc, 1 Reg. 7805)
-------------------------------------
1 Software de MPLAB
1 Grabador de Pics

Metodología:
1- Utilice el software MPLAB para editar el programa intrb0.asm que se muestra mas adelante.
2- Ensamble, simule y entienda el funcionamiento del programa.
3- Grabe el archivo (.HEX obtenido en el ensamble) en el PIC
4- Arme el circuito de acuerdo al diagrama de conexión.
5- Pruebe el buen funcionamiento del programa.
6- Ahora modifique el programa para que realice una tarea diferente en la rutina de servicio de
interrupción puede ser alguna de las siguientes:
a) Que vaya incrementando un contador cada vez que se presione el push botton y que dicha cuenta
la muestre en binario por el puerto C a través de 8 leds.
b) Que vaya incrementando un contador cada vez que se presione el push botton y que dicha cuenta
la muestre en BCD a través de un display doble de 7 segmentos conectados por el puerto C.
c) Que realice una rotación hacia la izquierda de unos leds conectados por el puerto C cuando se
presione por primera vez el push botton y que cambie el sentido las siguientes veces que se
vuelva a presionar el push boton.
d) Se puede dejar libre al alumno para que utilice su creatividad.
e) Dejar que el maestro ponga una opción diferente a estas.
7- Reporte sus resultados.

NOTA: Para utilizar el programa fuente con el PIC18F4455 sustituya las siguientes directivas:
LIST P=PIC18F4455
#include p18f4455.inc
CONFIG FOSC = XT_XT,PWRT = OFF, WDT = OFF, LVP=OFF
Cambiar la dirección de la rutina de servicio de interrupción : (ORG 04H) por (ORG 08H)

Puesto que el pin RB0 es por default canal análogo AN12 ponga las siguientes instrucciones para hacerlo
digital:
MOVLW 0FH ;Estas 2 instrucciones Solo poner para el
MOVWF ADCON1 ;PIC18F4455 (Pone todos los ANx a Digitales)

43
Programa fuente:

;*******************************************
;* intrb0.asm *
;* Este programa invierte el estado del pin RC0 cada *
;* vez que se modifica el estado del pin RB0 *
;* Para ello se habilita la interrupción INTRB0 *
;* Rev A: By Ing. Jorge Aguirre *
;*******************************************
LIST P=PIC16F874
#include p16f874.inc

__config _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF & _LVP_OFF & _WRT_ENABLE_OFF

ACUM EQU 20H ;Variable localizada en la dirección 20H


STAT EQU 21H ;Variable localizada en la dirección 21H

F EQU 1
w EQU 0
#DEFINE BANCO0 BCF STATUS,5
#DEFINE BANCO1 BSF STATUS,5

ORG 00H
GOTO INICIO ;ponemos este GOTO al principio para poder poner
;el subprograma de las interrupciones a partir de
;la dirección 04h
;Comienza la interrupción:
;=========================

ORG 04H ;El pic salta a esta dirección cuando se produce


;una interrupción
BCF INTCON,1 ;bit que indica un cambio en RB0, recuerda que
;hay que ponerlo a "0" por programa
;comenzamos guardando el contenido del acumulador
;y del STATUS para restaurarlos antes de salir de
;la interrupción (es recomendable hacer esto
;siempre que se usen interrupciones)

MOVWF ACUM ;Copia el acumulador W al registro ACUM


MOVF STATUS, W ;Guarda STATUS en el acumulador
;programa principal salta la interrupción
BANCO0 ;Por si acaso, nunca se sabe en que parte de
;programa principal salta la interrupción
MOVWF STAT ;Copia el acumulador al registro STAT

;============================

BTFSC PORTC,0 ;si RC0 es "0" se salta la siguiente instrucción


GOTO ESUNO ;brinca a la etiqueta “ESUNO”
BSF PORTC,0 ;Pon a "1" RC0 (porque era "0")

44
GOTO HECHO ;ya está invertido RC0, brinca a “HECHO”

ESUNO
BCF PORTC,0
;Pone un "0" en RC0 (Porque era "1")
;Ya se ha invertido el estado de RC0
;===================================

;ahora hay que restaurar los valores del STATUS y


;del acumulador antes de salir de la interrupción:

HECHO MOVF STAT, W ;Guarda el contenido de STAT en el acumulador


MOVWF STATUS ;Restaura el STATUS
SWAPF ACUM, F ;Da la vuelta al registro ACUM
SWAPF ACUM, W ;Vuelve a dar la vuelta al registro ACUM y restaura
;el acumulador (Con la instrucción SWAPF para no
;alterar el STATUS, la instrucción MOVF altera el
;bit 2 del STATUS)
RETFIE ;fin de la interrupción

;======================

INICIO
BANCO1
MOVLW 00H ;Todos los bits del acumulador a "0"
MOVWF TRISC ;Configuramos todo el puerto C como salidas

MOVLW 0FFH ;Todos los bits del acumulador a "1"


MOVWF TRISB ;Configuramos todo el puerto B como entradas
BANCO0
;MOVLW 0FH ;Estas 2 instrucciones Solo poner para el
;MOVWF ADCON1 ;PIC18F4455 (Pone todos los ANx a Digitales)
;====================================
;Configuración de las interrupciones:

BSF INTCON,7 ;Habilita las interrupciones globalmente


BSF INTCON,4 ;Habilita la interrupción por cambio en RB0

;====================================
;ya están configuradas las interrupciones, a
;partir de ahora cuando haya un cambio en RB0
;saltará a la dirección 04h del programa

NADA GOTO NADA ;En este ejemplo no se hace nada en el programa


;principal, simplemente se espera a que salte la
;interrupción.

END ;FIN DE PROGRAMA

45
Diagrama de conexión:

+5vdc +5vdc

R1
10k

11,32
S1
1
13 MCLR
OSC1

VDD
sw1 14 40
OSC2 RB7 39
2 RB6 38
C1 22pf 3 RA0/AN0 RB5 37
4 RA1/AN1 RB4 36
5 RA2/AN2 RB3 35 +5vdc
Y1 6 RA3/AN3 RB2 34 S1
7 RA4 RB1 33
4MHZ 8 RA5/AN4 RB0/INT
9 RE0/AN5 sw1
C2 22pf 10 RE1/AN6 1Mohms R3
R2 RE2/AN7
+5vdc 15 30
16 RC0 RD7 29
220 D? 17 RC1 RD6 28
18 RC2 RD5 27
23 RC3 RD4 22
24 RC4 RD3 21
25 RC5 RD2 20
26 RC6 RD1 19
RC7 RD0
VSS

U?
PIC16F874
12,31

Sugerencias Didácticas:
1.- Se le sugiere al maestro de ensamblar y correr el programa de prueba junto con el alumno en la sala de
computo. Aproveche para seguir enseñando al alumno mas opciones del simulador (MPLABSIM). Correr
el programa paso a paso y ver como se genera la interrupción al cambiar el estado del pin RB0, como
brinca a la dirección 04H de la memoria de programa y enfatizar que lo primero que hay que hacer es borrar
la bandera que indica que hubo en cambio en RB0 (bit 1 del registro INTCON). Indicar la importancia de
guardar el acumulador(W) y el registro de estado en memoria RAM antes de hacer algo en la rutina de
interrupción y después antes de regresarse de la interrupción recuperar nuevamente lo que tenia el
acumulador(W) y el registro de estado antes de la interrupción.
2.- Formar equipos de trabajo.
3.- Estimular al alumno al desarrollo de su pensamiento lógico y creativo.
4.- Propiciar la investigación.
5.- Estimular la participación en las prácticas.

Reporte:
1.- El diagrama de flujo.
2.- El diagrama de conexión.
3.- El programa fuente obtenido.
4.- Conclusiones del Equipo.

Bibliografía Preliminar:

[1] Microchip Technology Inc., “PIC16F873/874/876/877 Data Sheet”, 2003


[2] Microchip Technology Inc., “PIC18F2455/2550/4455/4550 Data Sheet”, 2009
[3] Tópicos del Help en el MPLAB(MPLAB-IDE, MPLAB- Editor, MPLAB-SIM)

46
[4] E. Martín Cuenca. Microcontroladores PIC. Diseño práctico de aplicaciones Ed. Mc. Graw Hill
[5] Apuntes del Maestro.
[6] http://www.microchip.com

47