Como usar interrupções externas (hardware) do microcontrolador AVR (ATmega16) – (Parte 22/46)

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:
Diagrama de blocos do processo de interrupção comum
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:
Configuração de pinos de interrupções externas no AVR
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)
Configuração de pinos de interrupções internas no AVR
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)
Valor de bit do registro MCUCR para configurar a interrupção externa do AVR
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)
Valor de bit do registro MCUCSR para configurar a interrupção externa do AVR
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

Então, MCUCR=(3<

Código-fonte do projeto

###


// Programa para usar interrupções externas (hardware) do microcontrolador AVR (ATmega16)
#incluir
#incluir #incluir /***** Função para inicializar portas*****/ void init_ports { DDRA = 0xFF; PORTA = 0x55; } /***** Função para inicializar interrupções*****/ vazio init_interrupts { cli ; //Desativa interrupções globais GICR =(1< //Defina o Bit6 do GICR para desmascarar a interrupção INT0. MCUCR =(3< //Configurando MCUCR para interrupção Rising Edge para INT0 sei ; //Ativar interrupções globais } /***** Rotina de serviço de interrupção para INT0*****/ ISR (INT0_vect) { PORTA = ~PORTA; _atraso_ms(100); } /***** Função principal *****/ int principal(vazio) { init_ports ; enquanto(1) { init_interrupts ; } }

###

Diagramas de circuito

Diagrama de circuito de como usar interrupções de hardware externo do microcontrolador AVR-ATmega16

Componentes do Projeto

  • ATmega16

Vídeo do projeto

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.