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.
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.


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:
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.
Introducir un retardo por software tras detectar la primera transición, ignorando los cambios durante el período de rebote.
Existen tres métodos para que el microcontrolador gestione la comunicación con periféricos como los pulsantes:
El µP espera activamente a que el periférico responda. El bucle queda bloqueado en la pregunta «¿Pulsado?» hasta recibir respuesta afirmativa.
El µP consulta de forma periódica el estado del periférico. Si no está pulsado, continúa con el proceso principal sin bloquearse.
El µP responde al periférico cuando éste le interrumpe. El proceso principal no se detiene; la interrupción lo desvía temporalmente.

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.
Se atiende a los periféricos cuando lo requieren, sin necesidad de hacer polling continuo.
Un programa de control puede consistir en un bucle vacío que solo se activa al llegar interrupciones.
¿Cómo interrumpe el periférico?
¿Puede el micro atenderle?
¿Y si interrumpen dos o más a la vez?
¿Cómo sabe el micro quién le interrumpe?
¿Dónde salta el micro?
Al producirse una interrupción
Al retornar de una interrupción
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();

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

Control de INT1

Control de INT0



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){
}Las interrupciones de tipo Pin Change se configuran por bloques, con los siguientes registros:
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
PCMSK0-2 Pin Change Mask Register. Habilitan (1L) o deshabilitan (0L) cada interrupción PCINT individualmente.




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.
Interrupciones