Está en la página 1de 8

Laboratorio 04

Las interrupciones

Introducción
Al realizar el procesamiento de datos en una estructura secuencial y la necesidad de procesar
las activaciones de eventos de forma aleatoria, se puede elegir hacer la consulta cada cierto
tiempo, cierto número de instrucciones o cada cierta posición en el algoritmo (consulta
permanente). Este proceso puede acarrear una pérdida de rendimiento en tiempo de
procesamiento.

La interrupción
Un recurso de los microprocesadores que resuelve este problema son las interrupciones, estas
pueden ser de distinta naturaleza, que pueden ser clasificadas en basicamente 2:
1. Por hardware
2. Por Software
3. Excepciones
Las interrupciones por hardware son aquellas que ocurren externas al microprocesador o
microcontrolador y causadas por sistemas independientes que solicitan generalmente una
atención para ser procesadas, como por ejemplo una activación de un sensor, el envío de un
mensaje por un puerto de comunicaciones, el nivel bajo de la alimentación, etc.
Las interrupciones por software son aquellas generadas por el procesamiento de datos u
operaciones tales como: una solicitud de atención por consulta (se obliga que se ejecute la rutina
de atención a una interrupción).
Las excepciones, son aquellas que ocurren por un evento predeterminado, el evento o
procesamiento de datos (llamadas a sistema), como la divisiòn por cero u otro tipo de evento no
contemplado (tipo de argumento).

Las rutinas de atención a una interrupción

Son funciones o algoritmos que tienen el objeto de atender un tipo específico de interrupción,
capturando la información, procesandola o no y estableciendo las condiciones iniciales antes de
retornar al punto exacto en la secuencia del programa principal donde ocurrió la interrupción.

el siguiente flujograma muestra este efecto.


Interrupciones en el PIC18f4550 y MikroC
El microcontrolador PI18f4550 tiene varios tipos de interrupciones, como dijimos por hardware y
software, como son las interrupciones externas IEX0, IEX1 (por el puerto B) y también las por los
temporizadores (Timer 0, Timer 1,..). además de poder ser clasificadas por su prioridad.
En muchas ocasiones los programas necesitan realizar varias tareas y algunas pueden ser más
importantes que otras, es por eso que cuando se con interrupciones se puede dar prioridad entre
ellas, entre más alta sea su prioridad más importante es la tarea a realizar, entonces si se activa
una interrupción de alta prioridad, no importa lo que esté realizando el programa (incluso aunque
esté realizando otra función de interrupción de baja prioridad) saltará a la función
correspondiente y después regresará a donde estaba. pero una función de alta prioridad no
puede ser interrumpida.

La notación siguiente se utiliza para especificar la llamada a la interrupción y su prioridad.

void IRQ_f() iv ​0x0008​ ics ​ICS_AUTO​ {


if (TMR0_flag) TMR0_ISR(); // ISR de la interrupción de TMR0
if (TMR1_flag) TMR1_ISR(); // ISR de la interrupción de TMR1
}

● IRQ_f se denomina ​de atención a la Interrupción.​Cualquier nombre de rutina válido


puede usarse como un nombre de rutina de interrupción.
● iv - palabra reservada que informa al compilador que es una rutina de servicio de
interrupción.
● ics - Ahorro de contexto de interrupción; El ahorro de contexto de interrupción se puede
realizar de varias maneras:
○ ICS_OFF - Sin guardar datos en la pila (sin guardar en la pila)
○ ICS_AUTO: El compilador elige si el ahorro de contexto se realizará o no.
● Tenga en cuenta que debe usarse la dirección de vector de interrupción apropiada (el
vector de interrupción de alta prioridad está en 0x000008, mientras que el vector de
interrupción de baja prioridad está en 0x000018) en cualquier otro caso el compilador
informará un error.

Configuración de las interrupciones.


El circuito asociado a las interrupciones se muestra a continuación
Los registros asociados al la interrupciones
Hay diez registros que se utilizan para controlar operaciones de las interrupciones . Estos
registros son:
● RCON
● INTCON
● INTCON2
● INTCON3
● PIR1, PIR2
● PIE1, PIE2
● IPR1, IPR2
Estos registros se estudiarán según los ejemplos.
Las interrupciones y temporizadores
El siguiente ejemplo incrementa el puerto B solo cuando ocurre una interrupción del
temporizador 0, mientra como programa principal realiza retardos del y con ello incrementa el
puerto D.

void Int_IRQ() iv 0x0018 ics ICS_AUTO {


INTCON.PEIE=0; // alternativamente se puede hacer INTCON.GIE =0;
if(INTCON.TMR0IF) // inspecciona que interrupción es (Timer 0)
{
INTCON.TMR0IF= 0; // por si borra la bandera
PORTB=PORTB+1; // procesa datos
}
INTCON.PEIE=1; // habilita la interrupción
}

void main() {
// Habilitación de puertos
TRISB=0x00;
PORTB=0;
TRISD=0x00;
PORTD=0;

//Habilitar las interrupciones

INTCON.TMR0IE = 1; // Enable TMR0 interrupt


RCON.IPEN=1; // habilitar los niveles de prioridad
INTCON2.TMR0IP=0; // Interrupción del timer 0 en baja prioridad
INTCON.PEIE=1; // habilita todas las interrupciones de baja prioridad
INTCON.GIE = 1; // Habilitador global de interrupciones
// Configuración Del temporizador
T0CON=0B00011000; //configuración del Timer 0
T0CON.TMR0ON=1; // Arranca el timer 0
while(1){
Delay_ms(10); // algoritmo principal
PORTD=PORTD+1; // algoritmo principal
}
}

Código 1 Ejemplo interrupción de del Temporizadores 0


Otro ejemplo:

Este ejemplo se configuran tres interrupciones, Temporizador 0, Interrupción Externa 1 y el


Convertidor ADC.

Características

Dos tipos de interrupciones

Alta prioridad: La atención al ADC está insertado en esta interrupción, cada vez que se
concluye con una conversión del ADC se tiene una interrupción, se recupera en la variable “dato”
y se reinicia la próxima conversión.

Baja Prioridad: Se instalan aquí dos tipos de interrupción una el temporizador 0 y otra es
la interrupción externa 1. Cada vez que el temporizador genera una interrupción, se incrementa
el valor del puerto D. En el caso de la interrupción externa 1, sucede cada vez que el Pin 34,
INT1 se complementa un bit señalización RC7, y se reinicia el puerto D (el contador del
temporizador).

en cuanto al programa principal la única tarea que realiza es actualizar el puerto B con el valor
de “dato” que es el valor del ADC.

short dato; // Variable Global


void Int_IRQ2() iv 0x0008 ics ICS_AUTO { // interrupción de alta prioridad
dato=ADRESH; //recupera la conversión
ADCON0.GO_DONE=1; // reinicia la conversión
PIR1.ADIF=0; // borra la bandera de interrup del ADC
}
void Int_IRQ() iv 0x0018 ics ICS_AUTO {
INTCON.GIE=0; // alternativamente se puede hacer INTCON.GIE =0;
if(INTCON.TMR0IF) // inspecciona que interrupción es (Timer 0)
{
INTCON.TMR0IF= 0; // por si borra la bandera
PORTD=PORTD+1; // procesa datos
}else if (INTCON3.INT1IF){
PORTD=0xFF;
PORTC.RC7=~PORTC.RC7;
INTCON3.INT1IF=0;
}
INTCON.GIE=1; // habilita la interrupción
}

void main() {
// Habilitación de puertos
TRISB=0b00000010; // configuración de la entrada del INT0 RB0 pin 33
PORTB=0; // inicializa Puerto B=0
TRISD=0x00; // Puerto D como salida
PORTD=0; // inicializa puerto D=0
TRISC.RC7=0; // Pin RC7 como salida de señalización de INT1
PORTC.RC7=1; // inicializa pin RC7=1
TRISA.RA0=1; // Pin RA0 como entrada
CMCON=0x07; // Desconecta Comparadores

//Habilitar las interrupciones


// Configura las Interrupciones de Temporizadores
INTCON.TMR0IE = 1; // Enable TMR0 interrupt
INTCON2.TMR0IP=0; // Interrupción del timer 0 en baja prioridad

// Configurar entradas de interrupción INT extern


INTCON.INT1IE = 1; // Habilita interrupción Externa INT0.
INTCON2.INTEDG1 = 1; // Interrupción por flanco de subida.
INTCON3.INT1IF = 0; // Borra el flag de INT1IF.
INTCON3.INT1IE = 1; // Habilita la interrupción externa 1
INTCON3.INT1IP = 0; // Configura la interrupción como baja prioridad
INTCON.RBIE=1;
INTCON2.RBIP=0; // interrupciones externas de baja prioridad
// Configurar ADC
ADCON0=0b00000001;
ADCON1=0b00001110;
ADCON2=0b00010001;
// habilitar las interrupciones del ADC
PIE1.ADIE=1; // habilita la interrupción del ADC
IPR1.ADIP=1; // configura la interrupción del ADC como alta prioridad
// Configuración de propiedades de interrupciones
RCON.IPEN=1; // habilitar los niveles de prioridad
INTCON.PEIE=1; // habilita todas las interrupciones de baja prioridad
INTCON.GIE = 1; // Habilitador global de interrupciones

// Configuración Del temporizador


T0CON=0B00011000; //configuración del Timer 0
T0CON.TMR0ON=1; // Arranca el timer 0
ADCON0.GO_DONE=1; // Inicia Conversión

while(1){
PORTB=dato; // algoritmo principal
}
}

Código 2 Varias interrupciones

En este caso el cálculo del tiempo que tarda en incrementar el valor de PORTB, si es evaluable y
constante independiente de algún proceso que realice el microcontrolador. Siempre y cuando el
ciclo no tarde más de un sobreflujo de timer 0.

Procedimiento
1. Desarrollar los experimentos de los códigos 1 y 2 copiando los códigos y simulando en
Proteus como muestran los videos.
2. Desarrollar un programa que crea un reloj controlado por el temporizador 1 desplegado
los segundos y décimas de segundo.
3. Desarrollar un programa de 5 interrupciones anidadas con las siguiente característica:
a. ADC baja prioridad
b. 3 interrupciones externas 2 de alta prioridad y 1 de baja
c. Con temporizador 2 que parpadee un led

Investigar
1. Cuantas fuentes de interrupción existen para el Pic18f4550
2. Cuantas fuentes de interrupción existen para el ATMEGA328
3. Que es la pila para las interrupciones
4. Haga un resumen de los Registros asociados a las interrupciones ver cap 9 del
manual del Pic18f4550

También podría gustarte