This is an old revision of the document!
As interrupções externas são das funções periféricas mais simples. AVRs típicos têm 1 a 8 pinos especiais, que são utilizados para causar interrupções no programa quando o valor lógico destes muda ou quando se encontram num determinado estado. Uma vez que esta função é normalmente usada para monitorar sinais lógicos externos, estes pinos são designados como pinos de interrupção externos.
Para utilizar uma interrupção externa, o pino tem de ser configurado como uma entrada standard de IO (que também pode ser utilizada como uma saída, mas, neste caso, a interrupção só pode ser criada pelo próprio controlador). É necessário permitir a recepção de interrupções e especificar a condição que causa a interrupção para disparar o registo de configuração de interrupção externa. Há quatro condições possíveis:
Quando o modo for definido para o zero lógico, a interrupção irá disparar continuamente enquanto o pino tem um valor de zero. Durante este período, a execução do programa principal é interrompida.
Agrupados por princípio, existem dois tipos de interrupção: as sincronizadas com o relógio do controlador e as assíncronas. As interrupções sincronizadas funcionam gravando os valores das entradas, o que significa que as mudanças nos valores lógicos são encontradas ao comparar os valores lidos durante dois ciclos de relógio diferentes. Se as mudanças lógicas no sinal acontecerem mais rápidas do que ciclo de trabalho do controlador, as interrupções ou disparam incorretamente ou são ignoradas por completo. As interrupções assíncronas não dependem do relógio do controlador e permitem também a detecção de mudanças mais rápidas no sinal externo - o nível lógico deve ser constante durante pelo menos 50 ns. O ATmega128 tem 4 interrupções externas assíncronas e 4 síncronas.
Example
Task: Make ATmega128 pin number 9 (pin 7 on bus E) fire an interrupt if its value is changed. This pin corresponds to the INT7 external interrupt, which is synchronous.
#include <avr/interrupt.h> // The code of the external interrupt ISR(INT7_vect) { // Do something } int main() { // Change pin 7 on bus E to an input by changing bit 7 to zero DDRE &= ~(1 << PIN7); // Defining a pull-up resistor to to pin 7 on bus E // to prevent input floating PORTE |= (1 << PIN7); // Set the interrupt mode to logical change for interrupt 7 // in the external interrupt configuration register EICRB = (1 << ISC70); // Allow external interrupt 7 EIMSK |= (1 << INT7); // Allow global interrupts sei(); // Endless loop while (1) continue; }
In addition to interrupts fired by single pins, if the AVR has enough pins it is possible to use entire groups of pins to fire logical value change interrupts. These interrupts are simply called pin change interrupts. They fire when the value of at least one pin in the group is changed.