Está en la página 1de 10

UNIVERSIDAD NACIONAL DE INGENIERA

FACULTAD DE ELECTROTECNIA Y COMPUTACIN


ELECTRNICA DIGITAL II
DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Laboratorio 5: Interrupciones
1. Objetivos
o Comprender el uso de las interrupciones con que dispone el
microcontrolador.
o Usar las interrupciones INT_RB e INT_EXT

2. Introduccin

Las interrupciones permiten a cualquier suceso interior o exterior al interrumpir la


ejecucin del programa principal (main) en cualquier momento. En el momento de
producirse la interrupcin, el PIC ejecuta un salto a la rutina de atencin a la
interrupcin (ISR, Interrupt Service Routine), previamente definida, donde se
atender a la demanda de la interrupcin. Cuando se termina de ejecutar dicha
rutina, el PIC retorna a la ejecucin del programa principal en la misma posicin de
la memoria de programa donde se ejecut la interrupcin1. Mirar Figura 1.

Figura 1. Flujo de una interrupcin en la programacin2

El uso de las interrupciones es fundamental ya que el usuario no necesita consultar


continuamente en el programa si ha ocurrido un suceso determinado, sino ms bien
deja estipulado qu funcin realizar en tal caso.
1
2

Compilador C CCS y Simulador Proteus para Microcontroladores PIC, Eduardo Garca Breijo, Alfaomega
http://www.puntoflotante.net/INTERRUPCIONES-18F2550-TIMER-0.htm

UNIVERSIDAD NACIONAL DE INGENIERA


FACULTAD DE ELECTROTECNIA Y COMPUTACIN
ELECTRNICA DIGITAL II
DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Cada microcontrolador vara en la cantidad de interrupciones que dispone. El


16F877A posee 15. Mirar Figura 2.

Figura 2. Cantidad de interrupciones de la familia 16F87XA.

Los registros que controlan las interrupciones estn en la seccin Registros de


Funcin Especial (Special Function Registers, en ingls) del captulo 2 Organizacin
de la Memoria de Datos (Data Memory Organization, en ingls). Estos son:

OPTION_REG
INTCON
PIE1
PIR1
PIE2
PIR2

En la Figura 3 se muestran las interrupciones que el registro INTCON controla. Al


configurar los bits de los registros, se habilita o deshabilita una o varias
interrupciones. Al producirse una interrupcin determinada, sta afectar el bit de
flag, en el registro correspondiente, para indicar que la interrupcin ha ocurrido.

UNIVERSIDAD NACIONAL DE INGENIERA


FACULTAD DE ELECTROTECNIA Y COMPUTACIN
ELECTRNICA DIGITAL II
DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Figura 3. Interrupciones que controla el registro

En este laboratorio se aprender a utilizar las interrupciones INT_EXT e INT_RB, las


cuales responden a un cambio de nivel (de alto a bajo o de bajo a alto) en RB0 y un
cambio de estado en los pines RB4 RB7 del Puerto B, respectivamente.
3. Desarrollando el cdigo

Hardware:
La seccin 14.11, Interrupts, explica lo fundamental del manejo de las
interrupciones. Indica que el Bit de Habilitacin de Interrupcin Global (Global
Interrupt Enable Bit) GIE, ubicado en el Bit 7 del registro INTCON (INTCON < 7 >),
habilita (si est a 1) todas las interrupciones o deshabilita (si est a 0) todas las
interrupciones. Mirar Figura 4.

Figura 4. Eplicacin del Global Interrupt Enable.

En la seccin 14.11.1, INT Interrupt, se explica cmo funciona la interrupcin


externa en RB0. La interrupcin externa es activada por flanco, puede ser por flanco

UNIVERSIDAD NACIONAL DE INGENIERA


FACULTAD DE ELECTROTECNIA Y COMPUTACIN
ELECTRNICA DIGITAL II
DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

ascendente si el bit INTEDG (OPTION_REG < 6 >) est a 1, o por flanco


descendente si el bit INTEDG est a 0. Cuando un flanco vlido aparece en el pin
RB0, su bit de bandera INTF (INTCON < 1 >) es puesto a 1, indicando que la
interrupcin externa ha ocurrido. Mirar Figura 5.

Figura 5. Interrupcin Externa

En la seccin 4.2, PORTB and the TRISB register, se explica que 4 de los pines del
Puerto B, RB7: RB4, tienen una caracterstica de interrupcin al cambio. Slo los
pines configurados como entrada pueden causar que esta interrupcin ocurra. La
interrupcin funciona al comparar los pines de entrada con el valor almacenado en
la lectura previa del Puerto B. Al haber un estado diferente en cualquiera de los
pines de entrada se pone a 1 el bit de bandera RBIF (INTCON < 0 >). Mirar Figura
6.

Figura 6. Interrupcin RB

Cabe seala que al producirse un cambio en cualquiera de sus entradas, se activa la


interrupcin. El programador debe ser capaz de determina qu pin cambi de
estado.
Software:
La directiva utilizada en el manejo de las interrupciones es #INT_xxxx. Esta indica
que la funcin que le sigue es una funcin de interrupcin. El compilador generar el
cdigo para saltar a la funcin asociada a la interrupcin cuando sta ocurra.
Algunas directivas que soporta CCS se muestran en la Figura 7.

UNIVERSIDAD NACIONAL DE INGENIERA


FACULTAD DE ELECTROTECNIA Y COMPUTACIN
ELECTRNICA DIGITAL II
DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Figura 7. Algunas directivas con que dispone CCS.

No todas las directivas pueden ser usadas con todos los microcontroladores. Para
saber qu interrupciones dispone un microcontrolador es necesario abrir su archivo
de encabezado (. h) y observar sus constantes, como en la Figura 8.

Figura 8. Interrupciones definidas en

Las funciones utilizadas para el manejo de las directivas de interrupcin estn en la


Figura 9.

UNIVERSIDAD NACIONAL DE INGENIERA


FACULTAD DE ELECTROTECNIA Y COMPUTACIN
ELECTRNICA DIGITAL II
DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Figura 9. Funciones que controlan las directivas de interrupciones.

Las funciones ms utilizadas son:


enable_interrupts(nivel): nivel es una de las constantes definidas en la
Figura 5. Esta funcin pone a 1 el bit que habilita la interrupcin determinada.
disable_interrupts(nivel): nivel es una de las constantes definidas en la
Figura 5. Esta funcin pone a 0 el bit que deshabilita la interrupcin
determinada.
El programa DEBE llamar a enable_interrupts(INT_xxxx) para habilitar la
interrupcin, junto a enable_interrupt(GLOBAL) para activar las interrupciones
previamente habilitadas.
La funcin para configurar en qu flanco se activar la interrupcin externa en RB0
es:
ext_int_edge(H_TO_L): La interrupcin es por flanco de cada.
ext_int_edge(L_TO_H): La interrupcin es por flanco de subida.

Compilar el cdigo de la Tabla 1 y simular el circuito de la Figura 10.

UNIVERSIDAD NACIONAL DE INGENIERA


FACULTAD DE ELECTROTECNIA Y COMPUTACIN
ELECTRNICA DIGITAL II
DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES
#include <16F877A.h>
#fuses HS, NOWDT
#use delay (clock=4M)
#byte trisb=0x86 //Locacin en la memoria del registro de direccin de datos del puerto B
#INT_EXT
//Directiva Interrupcin Externa (INTF (INTCON<1>) est en 1)
void cambio() //ISR
{
output_toggle(PIN_B7); // Complementa el estado del Pin B7
}
void main()
{
trisb=0x01;
//B0 como entrada, el resto de pines como salida
output_high(PIN_B7);
enable_interrupts(INT_EXT); //Habilitacin interrupcin RB0 (Pone INTE (INTCON<4>) a 1)
ext_int_edge(L_TO_H);
//Activado por flanco de subida (Pone INTEDG (OPTION_REG<6>) a 1)
enable_interrupts(GLOBAL); //Habilitacin general
while(TRUE)
//Bucle infinito
{
}
}
Tabla 1

Figura 10. Circuito para la interrupcin externa.

UNIVERSIDAD NACIONAL DE INGENIERA


FACULTAD DE ELECTROTECNIA Y COMPUTACIN
ELECTRNICA DIGITAL II
DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

La interrupcin RB ocurre cuando haya cualquier cambio en los pines B4 B7. Slo
hay una interrupcin y el PIC no dice cul pin cambi. El programador debe
determinar el cambio basado en el valor previamente conocido del puerto 3. Adems,
una presin del botn puede causar diversas interrupciones debido al rebote en el
switch. Un algoritmo de antirebote debe ser usado.
Para elaborar el cdigo es necesario revisar el cdigo ejemplo EX_PBUTT. c, ubicado
en la carpeta Examples de PIC C. Dicho cdigo muestra cmo controlar la
interrupcin del puerto B en cambio de pin.
Compilar el cdigo de la Tabla 2 y simular el circuito de la Figura 11.
3

Manual del compilador CCS

UNIVERSIDAD NACIONAL DE INGENIERA


FACULTAD DE ELECTROTECNIA Y COMPUTACIN
ELECTRNICA DIGITAL II
DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES
#include <16F877A.h>
#fuses HS, NOWDT
#use delay (clock=4M)
#byte trisb=0x86 //Locacin en la memoria del registro de direccin de datos del puerto B
#INT_RB // Directiva Interrupcin Port B (RBIF (INTCON<0> est en 1)
void detect_rb_change() // ISR
{
int actual;
static int anterior=0; //Variable global es inicializada a 0
actual=input_b(); // Se almacena el valor del estado de los pines del puerto B en la variable actual
if ((!bit_test(anterior,4))&&(bit_test(actual,4))) // B4 cambi a 1
{
output_high(PIN_B0);
}
if ((!bit_test(anterior,5))&&(bit_test(actual,5))) // B5 cambi a 1
{
output_high(PIN_B1);
}
if ((!bit_test(anterior,6))&&(bit_test(actual,6))) // B6 cambi a 1
{
output_high(PIN_B2);
}
if ((!bit_test(anterior,7))&&(bit_test(actual,7))) // B7 cambi a 1
{
output_high(PIN_B3);
}
if ((!bit_test(actual,4))&&(bit_test(anterior,4))) // B4 cambi a 0
{
output_low(PIN_B0);
}
if ((!bit_test(actual,5))&&(bit_test(anterior,5))) // B5 cambi a 0
{
output_low(PIN_B1);
}
if ((!bit_test(actual,6))&&(bit_test(anterior,6))) // B6 cambi a 0
{
output_low(PIN_B2);
}
if ((!bit_test(actual,7))&&(bit_test(anterior,7))) // B7 cambi a 0
{
output_low(PIN_B3);
}
anterior=actual; // Se almacena el valor actual del puerto en la interrupcin en la variable anterior.
}
void main()
{
trisb=0xF0;
//B4-B7 como entrada, el resto de pines como salida
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
enable_interrupts(INT_RB); //Habilitacin interrupcin RB (Pone RBIE (INTCON<3>) a 1)
enable_interrupts(GLOBAL); //Habilitacin general
while(TRUE)
//Bucle infinito
{
}
}

Tabla 2. Cdigo Interrupcin RB.

UNIVERSIDAD NACIONAL DE INGENIERA


FACULTAD DE ELECTROTECNIA Y COMPUTACIN
ELECTRNICA DIGITAL II
DEPARTAMENTO SISTEMAS DIGITALES Y TELECOMUNICACIONES

Figura 11. Circuito para la interrupcin en el puerto B.

4. Trabajo a Entregar (Reporte)