Este artículo presenta el concepto de interrupciones y los diferentes tipos de interrupciones en el microcontrolador AVR (ATmega16). Interrumpir como sugiere el nombre, interrumpe la rutina actual del microcontrolador. El microcontrolador ejecuta instrucciones en una secuencia de acuerdo con los programas. A veces puede ser necesario abordar instantáneamente eventos planificados de mayor prioridad que pueden ocurrir durante las operaciones normales. Para hacer frente a este tipo de eventos, los microcontroladores AVR están equipados con Sistemas de Interrupción.
Cuando ocurre una interrupción, el microcontrolador suspende el flujo normal de instrucciones y se ejecuta el código correspondiente a la interrupción que ocurrió. Una vez ejecutado por completo el código correspondiente a la interrupción, la ejecución se reanuda desde la misma instrucción donde fue interrumpida.
Lo siguiente es lo que sucede cuando ocurre una interrupción:
1. El microcontrolador normalmente completa la instrucción que se está ejecutando.
dos. El control del programa se transfiere a la Rutina de Servicio de Interrupción (ISR). Cada interrupción tiene un ISR asociado, que es un fragmento de código que le dice al microcontrolador qué hacer cuando ocurre una interrupción.
3. La ejecución de ISR se realiza cargando la dirección de inicio del ISR correspondiente en el contador del programa.
4. La ejecución de ISR continúa hasta que se encuentra la instrucción de interrupción de retorno (RETI).
5. Cuando se completa la ISR, el microcontrolador reanuda el procesamiento donde lo dejó antes de que ocurriera la interrupción, es decir, el control del programa vuelve al programa principal.
Todo el proceso se puede visualizar en el siguiente diagrama de flujo:
Fig. 2: Diagrama de bloques del proceso de interrupción común
Cortes de Atmega16
El número de interrupciones disponibles varía según los diferentes microcontroladores de la familia AVR. El Atmega16 tiene un total de veintiún (21) interrupciones disponibles. Las interrupciones disponibles se clasifican en dos clases:
1. Interrupciones externas: de las veintiuna interrupciones disponibles, cuatro están presentes directamente en los pines del controlador para hacer frente a las interrupciones generadas por fuentes externas, por lo que se denominan interrupciones externas. Las cuatro interrupciones disponibles y sus respectivos pines se muestran en la siguiente figura en orden de prioridad:
Fig. 3: Configuración del pin de interrupción externo en el AVR
dos. Interrupciones internas: las diecisiete (17) interrupciones restantes están disponibles para uso interno y admiten el funcionamiento preciso y eficiente de varios periféricos como ADC, temporizadores y USART, etc. La siguiente tabla describe las interrupciones internas disponibles en orden de prioridad:
S. No.
|
INTERRUMPIR
|
DEFINICIÓN
|
1
|
COMP. TEMPORIZADOR2
|
Temporizador/Contador2 Comparar interrupción de inicio
|
dos.
|
TIMER2 OVF
|
Interrupción de desbordamiento del temporizador 2
|
3.
|
CAPITÁN DEL TIMER1.
|
Interrupción de evento de captura del temporizador/contador1
|
4.
|
COMPA. TEMPORIZADOR
|
Temporizador/Contador1 Comparar Coincidencia Una interrupción
|
5.
|
TEMPORIZADOR COMPL.
|
Interrupción de la correspondencia de comparación temporizador/contador B
|
6.
|
TIMER1 OVF
|
Interrupción por desbordamiento del temporizador/contador1
|
7.
|
TIMER0 OVF
|
Interrupción por desbordamiento del temporizador/contador0
|
8.
|
SPI, STC
|
Interrupción completa de la transferencia en serie.
|
9.
|
USART, RXC
|
USART recibe una interrupción total
|
10.
|
USART, UDRE
|
Interrupción vacía del registro de datos USART
|
11.
|
USART, TXC
|
Interrupción completa de la transmisión USART.
|
12.
|
CAD
|
Detención completa de la conversión de ADC
|
13.
|
EE_RDY
|
Interrupción lista para EEPROM
|
14.
|
ANA_COMP
|
Interrupción del comparador analógico
|
15.
|
TWI
|
Interrupción de interfaz serie de dos cables
|
dieciséis.
|
TIMER0 COMP.
|
Interrupción de inicio de comparación de temporizador/countrt0
|
17.
|
SPM_RDY
|
Almacenar interrupción de lectura en la memoria del programa
|
Fig. 4: Configuración del pin de interrupción interna en el AVR
Las interrupciones internas se discutirán con sus respectivos periféricos. En este artículo se centra principalmente en las interrupciones externas.
Registros de configuración de interrupción externa:
Para configurar una interrupción externa INT0, INT1 o INT2, es necesario inicializar la interrupción respectiva realizando la configuración de bits adecuada de los siguientes 4 registros. El alcance de este documento se limita a la explicación de los bits correspondientes únicamente a las interrupciones, la descripción detallada de los demás bits de estos registros se puede encontrar en la hoja de datos de Atmega16.
1. MCUCR (Registro de control de MCU)
Fig. 5: Valor del bit de registro MCUCR para configurar la interrupción externa del AVR
Bit0, Bit1, Bit2 y Bit3 del registro MCUCR determinan la naturaleza de la señal en la que se producirán las interrupciones 0 (INT0) y 1 (INT1).
dos. MCUCSR (Registro de estado y control de MCU)
Fig. 6: Valor del bit de registro MCUCSR para configurar la interrupción externa del AVR
El bit6 del registro MCUCSR determina la naturaleza de la señal en la que debe ocurrir la interrupción externa 2 (INT2). INT2 solo se activa por flanco, no se puede utilizar para activación por nivel como INT0 e INT1.
3. GICR (Registro General de Control de Interrupciones)
Fig. 7: Valor de bit del registro GICR para habilitar/deshabilitar la interrupción respectiva en el AVR
Los registros GICR Bit5, Bit6 y Bit7, llamados máscaras de interrupción, se utilizan para habilitar/deshabilitar la interrupción respectiva. La interrupción se desactiva cuando el valor del bit se establece en 0 y se activa cuando el valor del bit se establece en 1. De forma predeterminada, todas las interrupciones están desactivadas.
Los tres registros mencionados anteriormente deben configurarse en consecuencia para inicializar una interrupción específica. También tenga en cuenta que, además de los registros mencionados anteriormente, el Ibit (Bit7, Global Interrupt Enable) del registro SREG también debe establecerse en 1. Si el bit de habilitación de interrupción global se establece en 0, ninguna de las interrupciones funcionará independientemente de otros registros. ajustes. La activación y borrado del bit I se realiza mediante instrucciones SEI y CLI.
Pasos de programación:
Para programar una interrupción se deben seguir los siguientes pasos:
1. Borre el bit de habilitación de interrupción global en el registro SREG.
dos. Inicialice la interrupción configurando correctamente los registros MCUCR, MCUCSR y GICR.
3. Establezca el bit de habilitación de interrupción global en el registro SREG.
4. Defina la rutina de servicio de interrupción (ISR) adecuada para la interrupción.
Hay dos formas de escribir ISR; por ejemplo, ISR para INT0 se puede escribir de las dos formas siguientes:
A. ISR (INT0_vector)
B. SEÑAL (SIG_INTERRUPT0)
Ejemplo: escribamos un código simple para hacer que una interrupción funcione. Inicialice INT0 para generar una interrupción en el disparador de flanco ascendente. La interrupción se genera a través de botones que alternan el estado de los LED conectados al PORTA. Las conexiones de los LED al controlador se muestran en el diagrama del circuito.
Por lo tanto, para habilitar INT0 es necesario configurar el Bit6 del registro GICR, es decir,
RCIC= (1<
Para el disparador de flanco ascendente INT0, el estado de Bit0 y Bit1 será:
ISC00 (Bit0) = 1
ISC01 (Bit1) = 1
ISC00 (Bit0) = 1
ISC01 (Bit1) = 1
Entonces, MCUCR=(3<
Código fuente del proyecto
###
//Programa para utilizar interrupciones externas (hardware) del microcontrolador AVR (ATmega16)
###
Diagramas de circuito
Diagrama de circuito de cómo utilizar interrupciones de hardware externas del microcontrolador AVR-ATmega16 |
Componentes del proyecto
- ATmega16