¿Cómo y cuándo puedo usar la interrupción en el microcontrolador AVR?

¿Cuándo usar la interrupción?

Respuesta:

Tomando un ejemplo, supongamos que una aplicación construida alrededor del microcontrolador tiene la siguiente estructura:

Toma entrada de dispositivos como teclado, ADC, etc. procesa la entrada y genera una salida que se muestra usando dispositivos como siete segmentos, LCD o más para operar otros dispositivos como motores, etc.

En tales diseños, los controladores interactúan con los dispositivos incorporados como temporizadores y otros periféricos conectados como sensores, puerto serie, etc. El programador necesita monitorear su estado regularmente, como si el sensor está dando salida, si se ha recibido o transmitido una señal, si el temporizador ha terminado de contar, o si un dispositivo con interfaz necesita servicio del controlador, y así sucesivamente. Este estado de monitoreo continuo se conoce como sondeo.

En las encuestas, el microcontrolador sigue verificando el estado de otros dispositivos; y mientras lo hace, no realiza ninguna otra operación y consume todo su tiempo de procesamiento para el monitoreo.

Este problema puede abordarse mediante interrupciones. En el método de interrupción, el controlador responde solo cuando ocurre una interrupción. Por lo tanto, en el método de interrupción, no se requiere que el controlador monitoree regularmente el estado (indicadores, señales, etc.) de los dispositivos conectados e integrados.

Para comprender mejor la diferencia, considere lo siguiente:

El método de votación es muy similar al de un vendedor. El vendedor va de puerta en puerta solicitando comprar su producto o servicio. Al igual que el controlador, monitorea las banderas o señales una por una para todos los dispositivos y abastece a cualquiera que necesite su servicio.

La interrupción, por otro lado, es muy similar a la de un comerciante. Quien necesite un servicio o producto se dirige a él y le informa de sus necesidades. En nuestro caso, cuando se reciben las banderas o señales, notifican al controlador que necesitan su servicio.

¿Cómo usar la interrupción en AVR?

Respuesta:

Los microcontroladores AVR tienen dos categorías de interrupciones, son interrupciones internas y externas . Teniendo en cuenta las interrupciones externas del microcontrolador AVR de 8 bits. Tomando ATMega8515.

Las interrupciones externas ATMega8515
Hay cuatro (4) interrupciones externas asociadas con el microcontrolador ATMega8515 AVR de Atmel. A saber: RESET , Interrupción externa 0 ( INT0 ), Interrupción externa 1 ( INT1 ) e Interrupción externa 2 ( INT2 ). Los pines asociados con estas interrupciones se muestran en la figura a continuación.

La interrupción RESTAURACIÓN ATMega8515 se activa cuando se aplica un voltaje bajo (aproximadamente 0V) para restablecer el pin. Esto hace que el microcontrolador se reinicie, es decir, reiniciar. Como tal, el pin de reinicio debe mantenerse en o cerca del voltaje Vcc para el funcionamiento normal de sus circuitos.

Las otras tres (3) interrupciones de hardware son activadas por eventos que pueden configurarse utilizando los registros de E / S que se describen a continuación. Si alguna de estas interrupciones está habilitada y activada, son atendidas por una Rutina de servicio de interrupción (ISR) o un Controlador de interrupción escrito por el programador.

Los registros de E / S asociados de interrupciones externas AVR
Existen varios registros de E / S asociados con la función de interrupción externa del microcontrolador ATMega8515. Estos registros almacenan las banderas de interrupción, los bits de habilitación de interrupción. Estos registros se describen a continuación:

  1. GIFR – Registro de bandera de interrupción general

El registro GIFR contiene las banderas de interrupción para todas las interrupciones externas ATMega8515. Cada uno de estos bits se establece individualmente en la lógica 1 cuando se produce el evento de interrupción para la interrupción especificada. Tenga en cuenta que el bit indicador de una interrupción se establece, independientemente de si la interrupción está habilitada o no, una vez que se produce el evento de interrupción.

Para el ATMega8515 solo se utilizan tres bits del GIFR, los otros están reservados:
Bit 7 – Indicador de interrupción externa 1 (INTF1),
Bit 6 – Indicador de interrupción externa 0 (INTF0) y
Bit 5 – Indicador de interrupción externa 2 (INTF2).

2. GICR – Registro general de control de interrupciones

El registro GICR contiene el bit de interrupción habilitada para todas las interrupciones externas del ATMega8515. Escribir un 1 en la ubicación específica que representa cada interrupción habilitará esa interrupción.

Importante: además de habilitar una interrupción específica, las interrupciones globales DEBEN estar habilitadas para que el microcontrolador reaccione al evento de interrupción.

Las siguientes líneas de código habilitarán la Interrupción externa 0, así como el bit de Interrupciones globales del ATMega8515 en C:

GICR | = 1 << INT0; // Habilitar interrupción externa 0
sei (); // Habilitar interrupción global

3. MCUCR – Registro de control de MCU

El MCUCR contiene bits de configuración que indican qué señales activarán INT0 e INT1. Las tablas a continuación muestran los posibles valores para escribir en los bits ISCxy y cuáles son los desencadenantes correspondientes que activarán un evento de interrupción.

Extendido – EMCUCR

En cuanto a ATMega8515, solo hay un bit en el EMCUCR utilizado para las interrupciones externas. Bit 0 – Control de detección de interrupción 2 (ISC2). Este bit se usa para configurar qué evento desencadena INT2. Escribir un 1 en esta ubicación activará INT2 en un borde ascendente y un 0 activará INT2 en un borde descendente.

Durante el uso de interrupciones, se deben tener en cuenta los siguientes puntos:

  • La interrupción debe habilitarse configurando su bit habilitado en el registro de E / S apropiado.
  • El bit de interrupción global, el bit I , en el registro de estado del microcontrolador (SREG) también debe estar habilitado.
  • La pila debe ser inicializada. Cuando se está dando servicio a una interrupción, el microcontrolador debe almacenar información crítica en la pila y, por lo tanto, debe inicializarse.
  • La rutina de servicio de interrupción (ISR) debe finalizar con la instrucción RETI , que indica el final de la ISR. El microcontrolador necesita saber cuándo llega al final del ISR para poder regresar a su tarea anterior.

Tomando un ejemplo:

La siguiente figura muestra un diagrama de circuito en el que ocho (8) LED están conectados al puerto C de un microcontrolador ATMega8515 AVR. También hay un interruptor de botón pulsador conectado entre tierra y el pin de Interrupción externa 0 (INT0) (pin 31) del ATMega8515.

La tarea
La tarea es escribir un programa en C, utilizando la interrupción externa del ATMega8515, que cuando se descarga al ATMega8515 en la figura a continuación realiza una (1) de dos (2) operaciones. En el arranque, la OPERACIÓN 1 se ejecuta y continúa indefinidamente. Si se presiona el interruptor de botón, la OPERACIÓN 1 está en pausa y la OPERACIÓN 2 se lleva a cabo después de lo cual se reanuda la OPERACIÓN 1.

OPERACIÓN 1 : se realiza una acción de desplazamiento utilizando los LED. El primer LED se enciende y baja hasta el último LED y luego vuelve al primer LED. Esta operación se realiza de forma continua.

OPERACIÓN 2 : TODOS los LED parpadean cinco (5) veces.

Importante: El oscilador interno para el microcontrolador debe estar habilitado para que el circuito funcione como se describe. De lo contrario, el circuito debe modificarse para incluir un oscilador / cristal externo para registrar el microcontrolador.

Solución de código
A continuación se muestra el programa AVR C para este tutorial. Tenga en cuenta que este código fue escrito en AVR Studio 5 .

Cosas a tener en cuenta:
1 – Se deben incluir los archivos “avr / interrupt.h” para usar las interrupciones.

2 – La función ISR () es una rutina general de servicio de interrupción para todas las interrupciones. Esto significa que puede tener varias funciones ISR () en un programa AVR C. El argumento “INT0_vect” indica que este ISR es para la interrupción externa 0.

/ *
* Escrito en AVR Studio 5 / AVR Studio 6
* Compilador: Compilador AVR GNU C (GCC)
* *
* Autor: Tutoriales AVR
* Sitio web: www.AVR-Tutorials.com
* /

#include
#include

#define F_CPU 4000000UL
#include

#define DataPort PORTC // Usando PortC como nuestro Dataport
#define DataDDR DDRC

// Rutina de servicio de interrupción para INT0
ISR (INT0_vect)
{
sin firmar char i, temp;

_delay_ms (500); // Control antirrebote del software

temp = puerto de datos; // Guardar el valor actual en DataPort

/ * Esto para LED de parpadeo en bucle en Dataport 5 veces * /
para (i = 0; i <5; i ++)
{
Puerto de datos = 0x00;
_delay_ms (500); // Espera 5 segundos
Puerto de datos = 0xFF;
_delay_ms (500); // Espera 5 segundos
}

Puerto de datos = temp; // Restaurar el valor anterior a DataPort
}

int main (nulo)
{
DDRD = 1 << PD2; // Establecer PD2 como entrada (Utilizando para interupt INT0)
PORTD = 1 << PD2; // Habilita la resistencia pull-up PD2

DataDDR = 0xFF; // Configurar Dataport como salida
Puerto de datos = 0x01; // Inicializa el puerto de datos a 1

GICR = 1 << INT0; // Habilitar INT0
MCUCR = 1 << ISC01 | 1 << ISC00; // Activar INT0 en el borde ascendente

sei (); // Habilitar interrupción global

mientras que (1)
{
if (Puerto de datos> = 0x80)
Puerto de datos = 1;
más
DataPort = DataPort << 1; // Desplazarse a la izquierda

_delay_ms (500); // Espera 5 segundos
}
}