Interrupciones
Interrupciones
Interrupciones
VICERRECTORADO ACADÉMICO
DECANATO DE DOCENCIA
DEPARTAMENTO DE INGENIERIA ELECTRÓNICA
UNIDAD 4
Interrupciones
Interrupciones ......................................................................................................................... 3
Ejemplo 1................................................................................................................................ 7
Ejemplo 2.............................................................................................................................. 10
Problemas Propuestos ........................................................................................................... 11
Interrupciones
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.
Directiva Descripción
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_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.
Sintaxis Descripción
#include <18F4550.h>
#device high_ints=TRUE
#use delay (clock=4000000)
#use standard_io(B,D)
#include <lcd.c>
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
return;
}
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;
}
void main()
{
configurar();
while (1) Conteoascendente();
return;
}
Figura 1 (Inter3.dsn)
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