Este artigo apresenta o conceito de interrupções e os diferentes tipos de interrupções no microcontrolador AVR (ATmega16). Interromper como o nome sugere, interrompe a rotina atual do microcontrolador. O microcontrolador executa instruções em uma sequência de acordo com os programas. Às vezes, pode haver necessidade de lidar instantaneamente com eventos planejados e de maior prioridade que podem ocorrer durante as operações normais. Para lidar com este tipo de eventos os microcontroladores AVR são equipados com Sistemas de Interrupção.
Quando ocorre uma interrupção, o fluxo normal de instruções é suspenso pelo microcontrolador e o código correspondente à interrupção ocorrida é executado. Uma vez executado completamente o código correspondente à interrupção, a execução recomeça a partir da mesma instrução onde foi interrompida.
A seguir está o que acontece quando ocorre uma interrupção:
1. O microcontrolador normalmente completa a instrução que está sendo executada.
2. O controle do programa é transferido para a Rotina de Serviço de Interrupção (ISR). Cada interrupção possui um ISR associado, que é um trecho de código que informa ao microcontrolador o que fazer quando ocorrer uma interrupção.
3. A execução do ISR é realizada carregando o endereço inicial do ISR correspondente no contador do programa.
4. A execução do ISR continua até que o retorno da instrução de interrupção (RETI) seja encontrado.
5. Quando o ISR é concluído, o microcontrolador retoma o processamento de onde parou antes de ocorrer a interrupção, ou seja, o controle do programa é revertido para o programa principal.
Todo o processo pode ser visualizado pelo seguinte fluxograma:
Fig. 2: Diagrama de blocos do processo de interrupção comum
Interrupções Atmega16
O número de interrupções disponíveis varia de acordo com os diferentes microcontroladores da família AVR. O Atmega16 tem no total vinte e uma (21) interrupções disponíveis. As interrupções disponíveis são categorizadas em duas classes:
1. Interrupções Externas- Das vinte e uma interrupções disponíveis, quatro interrupções estão presentes diretamente nos pinos do controlador para lidar com as interrupções geradas por fontes externas, por isso são chamadas de interrupções externas. As quatro interrupções disponíveis e seus respectivos pinos são mostrados na figura abaixo em ordem de prioridade:
Fig. 3: Configuração de pinos de interrupções externas no AVR
2. Interrupções internas- As dezessete (17) interrupções restantes estão disponíveis para uso interno e suportam a operação precisa e eficiente de vários periféricos como ADC, temporizadores e USARTs, etc. A tabela abaixo descreve as interrupções internas disponíveis em ordem de prioridade:
S. Não.
|
INTERROMPER
|
DEFINIÇÃO
|
1
|
COMP. TEMPORIZADOR2
|
Timer/Counter2 Compare interrupção de partida
|
2.
|
TEMPORIZADOR2 OVF
|
Interrupção de estouro do Timer2
|
3.
|
TEMPORIZADOR1 CAPT.
|
Interrupção de evento de captura do temporizador/contador1
|
4.
|
COMPA. TEMPORIZADOR
|
Timer/Counter1 Compare Match Uma interrupção
|
5.
|
TEMPORIZADOR COMPB.
|
Interrupção da correspondência B de comparação do temporizador/contador
|
6.
|
TEMPORIZADOR1 OVF
|
Interrupção de estouro do temporizador/contador1
|
7.
|
TEMPORIZADOR0 OVF
|
Interrupção de estouro do temporizador/contador0
|
8.
|
SPI, STC
|
Interrupção completa da transferência serial
|
9.
|
USART,RXC
|
USART recebe interrupção completa
|
10.
|
USART, UDRE
|
Interrupção vazia do registro de dados USART
|
11.
|
USART, TXC
|
Interrupção completa de transmissão USART
|
12.
|
ADC
|
Interrupção completa da conversão ADC
|
13.
|
EE_RDY
|
Interrupção pronta para EEPROM
|
14.
|
ANA_COMP
|
Interrupção do Comparador Analógico
|
15.
|
TWI
|
Interrupção de interface serial de dois fios
|
16.
|
TEMPORIZADOR0 COMP.
|
Interrupção de partida de comparação de timer/countrt0
|
17.
|
SPM_RDY
|
Armazenar interrupção de leitura na memória do programa
|
Fig. 4: Configuração de pinos de interrupções internas no AVR
As interrupções internas serão discutidas com seus respectivos periféricos. As interrupções externas são focadas principalmente neste artigo.
Registros de configuração de interrupções externas:
Para configurar uma interrupção externa INT0, INT1 ou INT2, é necessário inicializar a respectiva interrupção fazendo configurações de bits apropriadas dos 4 registros a seguir. O escopo deste documento se limita à explicação dos bits correspondentes apenas às interrupções, a descrição detalhada sobre os demais bits destes registradores pode ser encontrada no datasheet do Atmega16.
1. MCUCR (Registro de controle MCU)
Fig. 5: Valor do bit do registro MCUCR para configurar a interrupção externa do AVR
Os Bit0, Bit1, Bit2 e Bit3 do registro MCUCR determinam a natureza do sinal no qual a interrupção 0 (INT0) e a interrupção 1 (INT1) devem ocorrer.
2. MCUCSR (Controle MCU e registro de status)
Fig. 6: Valor do bit do registro MCUCSR para configurar a interrupção externa do AVR
O Bit6 do registro MCUCSR determina a natureza do sinal no qual a interrupção externa 2 (INT2) deve ocorrer. INT2 é acionado apenas por borda, não pode ser usado para acionamento de nível como INT0 e INT1.
3. GICR (Registro Geral de Controle de Interrupção)
Fig. 7: Valor do bit do registro GICR para desabilitar/habilitar a respectiva interrupção no AVR
Os registros GICR Bit5, Bit6 e Bit7 chamados máscaras de interrupção são usados para desabilitar/habilitar a respectiva interrupção. A interrupção é desabilitada quando o valor do bit é definido como 0 e habilitada quando o valor do bit é definido como 1. Por padrão, todas as interrupções estão desabilitadas.
Os três registros mencionados acima devem ser configurados de acordo para inicializar uma interrupção específica. Observe também que além dos registros mencionados acima, o Eu mordo (Bit7, Habilitação de interrupção global) de SREG o registro também deve ser definido como 1. Se o bit de ativação da interrupção global for definido como 0, nenhuma das interrupções funcionará, independentemente das outras configurações do registro. A ativação e limpeza do bit I é feita por instruções SEI e CLI.
Etapas de programação:
Para programar uma interrupção, devem ser seguidos os seguintes passos:
1. Limpe o bit de ativação da interrupção global no registro SREG.
2. Inicialize a interrupção configurando adequadamente os registros MCUCR, MCUCSR e GICR.
3. Defina o bit Global Interrupt Enable no registro SREG.
4. Defina a rotina de serviço de interrupção (ISR) apropriada para a interrupção.
Existem duas maneiras de escrever ISR, por exemplo, ISR para INT0 pode ser escrito das seguintes duas maneiras:
A. ISR (INT0_vect)
B. SINAL (SIG_INTERRUPT0)
Exemplo: Vamos escrever um código simples para fazer uma interrupção funcionar. Inicialize INT0 para gerar interrupção no disparo da borda ascendente. A interrupção é gerada através de botões que alternam o status dos LEDs conectados ao PORTA. As conexões dos LEDs com o controlador são mostradas no diagrama de circuito.
Portanto para habilitar o INT0 é necessário setar o Bit6 do registrador GICR, ou seja,
GICR= (1<
Para o disparo de borda ascendente de INT0, o status Bit0 e Bit1 será-
ISC00 (Bit0) = 1
ISC01 (Bit1) = 1
ISC00 (Bit0) = 1
ISC01 (Bit1) = 1
Então, MCUCR=(3<
Código-fonte do projeto
###
// Programa para usar interrupções externas (hardware) do microcontrolador AVR (ATmega16)
###
Diagramas de circuito
Diagrama de circuito de como usar interrupções de hardware externo do microcontrolador AVR-ATmega16 |
Componentes do Projeto
- ATmega16