Interrupciones

Guía completa sobre el uso de pulsantes, el problema de los rebotes y los procedimientos de entrada/salida, junto con el sistema de interrupciones del microcontrolador ATmega164P.

Explorar contenido

Uso de Pulsadores

Un pulsante (SW-SPST-MOM) se conecta entre masa y la entrada del microcontrolador. Una resistencia de pull-up R1 de 10 KΩ conectada a VCC garantiza un nivel lógico alto cuando el botón no está presionado. Al pulsar, la salida cae a nivel bajo.

Este esquema es el punto de partida para cualquier sistema de entrada digital basado en pulsadores.

Rebotes en Pulsadores

Al presionar un pulsante mecánico, los contactos no conmutan limpiamente: generan múltiples transiciones rápidas llamadas rebotes, visibles en el osciloscopio como picos estrechos. Existen dos soluciones principales:

1. Solución por hardware

Añadir un condensador C1 en paralelo con la carga. Con R = 10 KΩ y 0,01 µF < C < 0,1 µF, el RC filtra los rebotes.

2. Solución por software

Introducir un retardo por software tras detectar la primera transición, ignorando los cambios durante el período de rebote.

Procedimientos de E/S

Existen tres métodos para que el microcontrolador gestione la comunicación con periféricos como los pulsantes:

Bloqueo del proceso

El µP espera activamente a que el periférico responda. El bucle queda bloqueado en la pregunta «¿Pulsado?» hasta recibir respuesta afirmativa.

Consulta periódica (polling)

El µP consulta de forma periódica el estado del periférico. Si no está pulsado, continúa con el proceso principal sin bloquearse.

Por interrupción

El µP responde al periférico cuando éste le interrumpe. El proceso principal no se detiene; la interrupción lo desvía temporalmente.

¿Qué es una Interrupción?

Una interrupción es el desvío de la ejecución normal de un programa a petición de un periférico. El origen es un evento externo y, por tanto, asíncrono al programa. Si el microcontrolador la acepta, ejecuta una subrutina para atender al periférico.

Simplificación del control

Se atiende a los periféricos cuando lo requieren, sin necesidad de hacer polling continuo.

Bucle de espera

Un programa de control puede consistir en un bucle vacío que solo se activa al llegar interrupciones.

Factores y Gestión de Interrupciones

Factores a considerar

Petición

¿Cómo interrumpe el periférico?

Aceptación

¿Puede el micro atenderle?

Prioridad y niveles

¿Y si interrumpen dos o más a la vez?

Identificación

¿Cómo sabe el micro quién le interrumpe?

Servicio

¿Dónde salta el micro?

Al producirse una interrupción

  1. Terminar la instrucción pendiente
  1. Guardar el PC en el stack
  1. Guardar el resto de registros (automático o manual)
  1. Hacer el acknowledge (borrar bandera)
  1. Habilitar/deshabilitar interrupciones del mismo nivel

Al retornar de una interrupción

  1. Recuperar registros del stack
  1. Volver a habilitar interrupciones
  1. Recuperar el PC y volver al programa principal

Vectores de Interrupción — ATmega328P (Pág. 49)

El ATmega328P dispone de 31 vectores de interrupción, cada uno con una dirección de programa fija en la tabla de vectores:

Para habilitar cualquiera de las interrupciones se debe Habilitar además el BIT de las interrupciones globales del registro SREG, mediante el comando sei();


Registros de Interrupciones Externas (Pág. 53)

Las interrupciones externas INT0–INT1 se configuran mediante tres registros principales:

1

EICRA External Interrupt Control Register A. Habilita la forma de interrupción.

Control de INT1

Control de INT0


2

EIMSK External Interrupt Mask Register. Habilitan (1L) o deshabilitan (0L) cada interrupción externa individualmente.


3

EIFR External Interrupt Flag Register. Banderas INTF 1:0 se activan al detectar el evento y se borran automáticamente al ejecutar la rutina de servicio. Este no es un registro de control sino informativo.


Las rutinas ISR (Interrupt Service Routine) que responden a las direcciones de interrupción INT0 e INT1 son las siguientes:

ISR(INT0_vect){ }
ISR(INT1_vect){ }

Registros de Interrupciones Pin Change (PCINT)

Las interrupciones de tipo Pin Change se configuran por bloques, con los siguientes registros:

1

PCICR Pin Change Interrupt Control Register. Habilita interrupción por bloques.

PCIE2, habilita PCINT23 a PCINT16

PCIE1, habilita PCINT14 a PCINT8

PCIE0, habilita PCINT7 a PCINT0


2

PCMSK0-2 Pin Change Mask Register. Habilitan (1L) o deshabilitan (0L) cada interrupción PCINT individualmente.


3

PCIFR Pin Change Interrupt Flag Register. Banderas PCINTF0-2 se activan al detectar el evento y se borran automáticamente al ejecutar la rutina de servicio. Este registro es informativo.


Las rutinas (ISR) que responden a las direcciones de interrupción PCINT son las siguientes:

ISR(PCINT0_vect){ }
ISR(PCINT1_vect){ }
ISR(PCINT2_vect){ }

Nota: Dentro de cada rutina se debe buscar el pin que generó la interrupción correspondiente.

Ejercicio: Uso de interrupciones Externas y Pin change.



Entrada INT0, INT1, PCINT4


Salida Puerto D4-D7

PC0–PC7 con R1–R8 = 330 Ω cada un

Visualización

Led rotando