Interrupciones

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 13

UNIVERSIDAD NACIONAL EXPERIMENTAL DEL TÁCHIRA

VICERRECTORADO ACADÉMICO
DECANATO DE DOCENCIA
DEPARTAMENTO DE INGENIERIA ELECTRÓNICA

UNIDAD 4
Interrupciones

Profesor:M. Sc. Ing. Rynaldo Salas Franco


Asignatura: Sistemas Digitales II
Contenido

Interrupciones ......................................................................................................................... 3
Ejemplo 1................................................................................................................................ 7
Ejemplo 2.............................................................................................................................. 10
Problemas Propuestos ........................................................................................................... 11
Interrupciones

Una interrupción es una suspensión temporal de la ejecución de un programa, que


ocurre como consecuencia de un evento externo o interno (fuente de interrupción). Cuando
esto ocurre se procede a ejecutar una rutina de tratamiento o atención a la interrupción.

El microcontrolador PIC18F4550 posee veinte fuentes de interrupción:

• Interrupción externa 0 (RB0/INT0)


• Interrupción externa 1 (RB1/INT1)
• Interrupción externa 2 (RB2/INT2)
• Interrupción por cambio de estado en las líneas RB4, RB5, RB6 ó RB7
• Interrupción por desbordamiento del temporizador 0 (TMR0)
• Interrupción por desbordamiento del temporizador 1 (TMR1)
• Interrupción por desbordamiento del temporizador 2 (TMR2)
• Interrupción por desbordamiento del temporizador 3 (TMR3)
• Interrupción por lectura o escritura en el canal de transmisión del puerto paralelo
esclavo (SPP)
• Interrupción por haber completado una conversión analógica a digital.
• Interrupción por recepción o transmisión de datos en el módulo transmisor
receptor síncrono/asíncrono universal mejorado (EUSART)
• Interrupción por recepción o transmisión del puerto serial síncrono maestro
(MSSP)
• Interrupción por colisión de bus en el MSSP.
• Interrupción del módulo 1 de captura, comparación y pulsos (CCP1)
• Interrupción del módulo 2 de captura, comparación y pulsos (CCP2)
• Interrupción por cambio en la entrada del Comparador
• Interrupción por fallo en el oscilador
• Interrupción por detección de tensión alta o baja
• Interrupción del puerto USB
• Interrupción por conclusión de la operación de escritura en las memorias
EEPROM/Flash

Todas las interrupciones cuentan con un “bit de habilitación”, para permitir o no cada
interrupción. Igualmente disponen de un “bit bandera” que se levanta (toma el valor 1)
cuando se produce la condición de la interrupción, independientemente de si está habilitada
o no. Esta “bandera” puede ponerse a 0 por software cuando se ha procesado la interrupción.

Existen dos niveles de prioridad para las interrupciones: alta y baja. La interrupción
externa 0 (RB0/INT0) siempre tiene alta prioridad, todas las demás interrupciones pueden
ser configuradas para cualquiera de los dos niveles de prioridad. Como se muestra en la figura
6, hay dos vectores de interrupción, uno para cada prioridad. Al producirse una interrupción
de alta prioridad, el contador de programa tomará el valor 8 H mientras que si se produce una
interrupción de baja prioridad, tomará el valor 18H, que respectivamente son las direcciones
de los vectores de interrupción. Las interrupciones de alta prioridad se diferencian de las de
baja prioridad en que las primeras pueden interrumpir el tratamiento de las segundas y las
segundas no pueden interrumpir el tratamiento de las primeras. Las interrupciones en el
mismo nivel de prioridad no pueden interrumpirse entre ellas.

En CCS, se debe incluir la directiva #device high_ints= TRUE, que indica al


compilador que el código contiene, interrupciones de alta y baja prioridad. Como podemos
observar en la tabla 1, se tienen tres directivas que se emplean para especificar el tipo de
prioridad e indicar que la función definida, a continuación de la directiva, es la que atiende a
la interrupción xxxx (xxxx son identificadores reservados para cada fuente de interrupción,
que se listan en la tabla 2).
Tabla 1: Directivas para Definición de Interrupciones

Directiva Descripción

Interrupción de baja prioridad. Guarda y restaura los registros


#int_xxxx
clave1, antes y después de atender la interrupción xxxx

Interrupción de alta prioridad. Guarda y restaura los registros clave1,


#int_xxxx HIGH
antes y después de atender la interrupción xxxx

Interrupción de alta prioridad rápida. No guarda ni restaura los


#int_xxxx FAST
registros clave1, antes y después de atender la interrupción xxxx

Tabla 2: Identificadores Reservados (xxxx) para cada fuente de interrupción

xxxx Descripción xxxx Descripción

AD Conversión A/D completa RB Cambio de estado en RB4 –RB7

BUSCOL Colisión de Bus RTCC Desbordamiento del TMR0

CCP1 Módulo 1 de CCP SPP Puerto Paralelo Esclavo

CCP2 Módulo 2 de CCP SSP Actividad en SPI ó I2C

COMP Comparador RDA Dato recibido (EUSART)

EEPROM Escritura EEPROM finalizada TBE Dato transmitido (EUSART)

EXT Interrupción Externa 0 TIMER0 Desbordamiento de TMR0

EXT1 Interrupción Externa 1 TIMER1 Desbordamiento de TMR1

EXT2 Interrupción Externa 2 TIMER2 Desbordamiento de TMR2

LOWVOLT Detectado bajo voltaje TIMER3 Desbordamiento de TMR3

OSCF Fallo en oscilador USB Interrupción USB

1
Registro de estado (STATUS), registro de trabajo (WREG) y registro selector de bancos (BSR)
Existen otras dos directivas para definir las rutinas de atención de las interrupciones:

#INT_DEFAULT : indica que la función escrita a continuación será llamada por


defecto si se dispara una interrupción y no se ha especificado ninguna función de tratamiento
a dicha interrupción.

#INT_GLOBAL : indica que la función que le sigue, sustituye todas las acciones que
realiza el compilador al producirse una interrupción, tomando el control de las interrupciones.

Algunas funciones predefinidas para gestionar interrupciones se resumen en la tabla


3. No se pretende en este curso estudiar las veinte fuentes de interrupción, eso comprendería
un trabajo completo referido a este tema. Aquí solo se aplicarán las interrupciones externas
(RB0/INT0, RB1/INT1, RB2/INT2) y las interrupciones por cambio en las líneas RB4, RB5,
RB6 y RB7.

Tabla 3: Funciones Predefinidas para Gestionar Interrupciones

Sintaxis Descripción

Activa la interrupción especificada por el identificador


enable_interrupts(INT_xxxx)
reservado xxxx (ver tabla 2)

Permite todas las interrupciones que estén habilitadas de


enable_interrupts(GLOBAL)
forma individual.

Desactiva la interrupción especificada por el identificador


disable_interrupts(INT_xxxx)
reservado xxxx (ver tabla 2)

disable_interrupts(GLOBAL) Prohíbe todas las interrupciones.

Coloca en cero, la bandera de la interrupción especificada


clear_interrupt(INT_xxxx)
por xxxx (ver tabla 2)

Configura la Interrupción Externa “n” para que ocurra en


ext_int_edge(n, H_TO_L)
flanco descendente (n=0,1,2)

Configura la Interrupción Externa “n” para que ocurra en


ext_int_edge(n, L_TO_H)
flanco ascendente (n=0,1,2)
Para explicar las interrupciones vamos a considerar los siguientes ejemplos.

Ejemplo 1: Normalmente en la primera línea de una LCD se muestra un contador


ascendente de 0 a 99, con intervalos unitarios de 1s. Si se produce un cambio de estado en el
pin RB4, el conteo ascendente se detendrá y en la segunda línea de la LCD se mostrará un
conteo descendente desde 5 hasta 0 en intervalos de 1 s. Al finalizar el conteo descendente,
el conteo ascendente continuará en el valor en que había quedado antes de producirse el
cambio de estado del pin RB4.

Obviamente para programar el microcontrolador con lo que se especifica


previamente, es necesario emplear una interrupción. Interrumpiremos el contador
ascendente, cuando se produzca un cambio en RB4. Para atender la interrupción mostraremos
el contador descendente. Una vez que atendamos la interrupción el contador ascendente
continuará normalmente.

Para comenzar a escribir el programa lo primero es incluir las directivas que


necesitaremos:

#include <18F4550.h>
#device high_ints=TRUE
#use delay (clock=4000000)
#use standard_io(B,D)
#include <lcd.c>

La novedad es la función #device high_ints=TRUE que como se dijo anteriormente


es la directiva necesaria para trabajar con interrupciones.

Luego de esto vamos a definir la rutina de atención a la interrupción. Para ello primero
busquemos en la tabla 2, en la columna de “descripción”, cuál de las interrupciones se
produce por un cambio en el estado de RB4. Encontramos una que corresponde a un “cambio
de estado en RB4-RB7” (Esta interrupción se produce cuando ocurre un cambio de estado en
cualquiera de las 4 líneas: RB4, RB5, RB6 ó RB7), esto quiere decir que la palabra reservada
(xxxx) para esta interrupción es “RB”. Ahora emplearemos una de las directivas de la tabla
1 colocando en el lugar de xxxx, la palabra RB. ¿Cuál de las 3 usaremos? Si revisamos el
enunciado, como es la única interrupción que se producirá, se presume que no hay ninguna
prioridad, y se puede usar cualquiera de las 3, en este caso emplearemos sencillamente:
#int_RB.

Luego de esta directiva escribiremos una función, que incluirá las instrucciones que
permitirán al micro atender la interrupción. Ya hemos dicho anteriormente que será un
contador descendente de uno en uno desde 5 hasta 0 con intervalos de 1s, pero, lo primero
que debe hacer la función que atiende a una interrupción es bajar la bandera de la interrupción
“RB”:

#int_RB
void cambio_en_RB()
{
clear_interrupt(INT_RB); // baja la bandera
int w=5; //declara la variable contador (w)
lcd_gotoxy(1,2); //cursor en primera posición de 2da línea
printf(lcd_putc," ");//borra la segunda línea
do
{
lcd_gotoxy(8,2); //Centro de la segunda línea
printf(lcd_putc,"%i",w); //muestra el valor de w
delay_ms(1000);
w--;
}while (w!=-1);
return;
}

Después de esta función podemos colocar los prototipos de las otras funciones que
normalmente incluimos para realizar las principales tareas que debe realizar main().
La función configurar() debe incluir como de costumbre, en primer término,
cuales puertos serán digitales o analógicos (en este caso particular no requerimos de puertos
analógicos), luego, la inicialización de la LCD y finalmente la habilitación de la interrupción
correspondiente (en este caso “RB”) así como el permiso de interrupciones:

void configurar()
{
setup_adc_ports(NO_ANALOGS);//todos los puertos digitales
lcd_init(); //inicializar la LCD

enable_interrupts (int_RB); //Habilitar interrupción por cambio en RB4-RB7

enable_interrupts(global);//Permitir interrupciones que se han habilitado

return;
}

Para mostrar en la primera línea de la LCD un contador ascendente de uno en uno


desde 0 hasta 99 con intervalos de 1s, podemos escribir la siguiente función:

void ConteoAscendente()
{
int j=0; //variable contador
lcd_gotoxy(1,1); //cursor en primera posición de 1ra línea
printf(lcd_putc," ");//borra la 1ra línea
do
{ lcd_gotoxy(7,1); //Centro de la primera línea
printf(lcd_putc,"%2i", j); //muestra el valor de j
delay_ms(1000);
j++;
}while (j<100)
return;
}

Finalmente el programa principal (la función main) podemos estructurarla como:

void main()
{
configurar();
while (1) Conteoascendente();
return;
}

Observe como no existe un enlace directo entre main() y la función de atención a la


interrupción, solo la habilitación y permiso de interrupciones.

Descargar del aula virtual: Inter1.C e Inter1.dsn. Compile el programa y


simúlelo con Proteus:
1. Al arrancar la simulación: ¿Qué observa en la primera línea de la LCD?
2. Cierre SW: ¿Qué observa? ¿Por qué?
3. Una vez que el contador descendente llega a cero ¿Qué ocurre con el
contador ascendente? ¿Por qué?
4. Abra SW: ¿Qué observa? ¿Por qué?
5. Una vez que el contador descendente llega a cero ¿Qué ocurre con el
contador ascendente? ¿Por qué?
6. Ahora vuelva a cerrar SW y antes de que el contador descendente
vuelva a cero, ábralo de nuevo. ¿Qué ocurre? ¿Por qué?

Ejemplo 2: Con este ejemplo se ilustra el uso de las prioridades.

En el aula virtual, descargar Inter2.c e Inter2.dsn. Lea el programa


detenidamente, observe con cuidado la forma de declarar las interrupciones y
la forma de emplear las funciones de interrupciones, compílelo, asígnelo al
PIC del diagrama y simule. Este ejemplo es el que se explica en el vídeo
tutorial incluido en el aula.
Problemas Propuestos:

1. Utilice interrupciones para diseñar con un PIC18F4550 un pequeño sistema de alarma


con: 4 sensores que detectan la apertura de 4 puertas, un zumbador, un pulsador y una
pantalla LCD, conectados como se muestra en la siguiente figura 1. Al activar el
sistema, en la LCD se observará el mensaje “Supervisando”. Al abrir una de las
puertas, se activará el zumbador y en la segunda línea de la LCD, un mensaje
indicando cual de las puertas fue abierta. Para apagar el zumbador y borrar la segunda
línea de la LCD se debe presionar el pulsador.

Figura 1 (Inter3.dsn)

2. Se dispone de un PIC18F4550 conectado a un teclado de 4 botones (A, B, C, D) y


una pantalla LCD, como se muestra en la figura 2. Al encender el sistema, en la
pantalla aparecerá un mensaje solicitando crear una contraseña, la cual estará
compuesta por 3 letras. Luego de lo cual se pedirá confirmación de la contraseña. Si
se produce un error en la confirmación, aparecerá en pantalla un mensaje indicando
lo sucedido por 2 s, luego de lo cual, solicitará otra contraseña y su confirmación. Si
no se produce error en la confirmación aparecerá el mensaje “Configuración Exitosa”.
Utilice interrupciones para crear esta aplicación.
Figura 2 (Inter4.dsn)

3. Se dispone de un sistema de alarma con: 4 sensores que detectan la apertura de 4


puertas, un control de cinco teclas (#, A, B, C y D), una pantalla LCD y un zumbador.
Se puede configurar una contraseña presionando la tecla #. En pantalla aparecerá un
mensaje solicitando la nueva contraseña, la cual estará compuesta por 4 letras. Luego
de lo cual se pedirá confirmación de la contraseña. Si se produce un error en la
confirmación, aparecerá en pantalla un mensaje indicando lo sucedido por 2 s, luego
de lo cual, solicitará otra contraseña y su confirmación. Una vez se establezca la
contraseña, aparecerá el siguiente mensaje: “Sistema Inactivo”. Para activarlo,
simplemente hay que introducir la contraseña. Una vez activo, en la LCD se observará
el mensaje “Supervisando”. Para desactivar el sistema, se introduce de nuevo la
contraseña. Si se desea cambiar la contraseña, se presiona la tecla #, luego de lo cual,
el sistema solicitará la contraseña anterior y si es correcta, procederá a solicitar y
confirmar la nueva contraseña. Estando activo el sistema, cuando una de las puertas
sea abierta, se activará un zumbador y aparecerá en una LCD un mensaje indicando
cual puerta ha sido abierta. Para detener la alarma se debe pulsar la tecla # y luego la
contraseña

4. Minipiano: Se dispone de una tecla por nota (Do, Re, Mi, Fa, Sol, La, Si) y un
zumbador. Utilice interrupciones para diseñar un programa que reproduzca cada nota
en el zumbador, con el fin de tocar una melodía musical básica. La frecuencia de cada
nota se presenta en la tabla 4
Tabla 4 Frecuencia de notas musicales
Nota Do Re Mi Fa Sol La Si
Frecuencia 262 Hz 294 Hz 330 Hz 349 Hz 392 Hz 440 Hz 494 Hz

También podría gustarte