Interrompe com NRF24LE1
Em nossa vida diária muitas vezes somos distraídos ou interrompidos por outras pessoas. Nessa condição suspendemos o nosso trabalho contínuo e prestamos atenção ao que os outros têm a dizer. Somente retomamos nosso trabalho anteriormente suspenso após a conclusão da tarefa interrompida. O mestre que controla o processamento dos pensamentos em nós é o nosso cérebro. O cérebro para de processar os pensamentos em andamento quando somos interrompidos e começa a processar a outra tarefa. Ele retoma o processamento anterior em andamento quando a tarefa é concluída. O controlador funciona de maneira semelhante. Aqui estudaremos as interrupções associadas à nossa NRF.
Fig. 1: Protótipo de Demonstração de Interrupção NRF24LE1
Todos nós conhecemos a tarefa das interrupções em qualquer controlador. Ele diz ao microcontrolador para suspender a execução atual do código, salvar o estado atual e processar a solicitação de interrupção. O controlador processa a solicitação de interrupção saltando para a Rotina de Serviço de Interrupção (ISR) ou o Manipulador de Interrupção. ISR é uma função ou procedimento definido no código que é executado quando ocorre uma interrupção. O mesmo acontece com a NRF.
No NRF24LE1, há um total de 18 fontes de interrupções, das quais 4 são baseadas em hardware e as demais são baseadas em software. Cada fonte de interrupção possui um endereço de vetor no qual o ISR deve ser escrito. Essas interrupções podem ser acionadas por nível (baixo/alto) ou acionadas por borda (ascensão/queda).
A imagem anexada consiste em diferentes fontes, endereço vetorial, polaridade e sua descrição.
No pacote de 32 pinos, existem 2 interrupções de hardware externas: INT0 e INT1. O pino de interrupção para INT0 é P0.5 e para INT1 é P0.6.
Figura 2: Imagem da demonstração de interrupção NRF24LE1
As interrupções podem ser controladas através de vários registros detalhados abaixo:
• Registro Interrupt Enable 0 (IEN0) – Um registro de 8 bits usado para ativar/desativar interrupções globais e interrupções individuais de Timer0, Timer1, Timer2, Porta 0 e Porta Serial.
• Registro de ativação de interrupção 1 (IEN1) – Um registro de 8 bits usado para ativar/desativar interrupções de RF, SPI e Timer2.
• INTEXP – Este registro habilita/desabilita interrupções SPI de 2 fios, mestre e escravo. Este registro também é utilizado para escolher entre INT0, INT1 e INT2.
• IP0 e IP1 (Prioridade de interrupção) – Dois registradores de 8 bits usados para definir os níveis de prioridade entre diferentes fontes.
• Registro de controle de solicitação de interrupção (IRCON) – Um registro de 8 bits que contém sinalizadores de solicitação de interrupção.
Para interrupções de software, precisamos habilitá-los de acordo com as funcionalidades que estamos utilizando. Por exemplo, se estivermos usando Timers então habilitaremos a interrupção do Timer que está associada aos timers internos do nosso módulo.
Atualmente estamos focados em discutir interrupções de hardware INT0. Algumas etapas simples através das quais podemos configurar o INT0 são:
• Primeiro escreva 1 no bit7 do IEN0 para habilitar interrupções globais e 1 no bit0.
• Escreva 1 no bit3 do INTEXP para selecionar INT0.
Também escrevemos um código para explicar o funcionamento da interrupção INT0. Além disso, um programa de piscamento de LED foi escrito em nossa rotina de serviço de interrupção. Portanto, o LED piscará sempre que ocorrer uma interrupção.
Confira o código comentado para mais detalhes. Fique ligado para mais artigos da série.
#include"hal_delay.h" // arquivo de cabeçalho contendo funções de atraso
#include"isrdef24le1.h" //arquivo de cabeçalho contendo definição de rotina de serviço de interrupção para NRF24LE1
// Código principal
vazio principal
{
P0DIR = 0xf0; //torna os 4 bits superiores de Port0 como entrada
P1DIR = 0; //define a porta1 como saída
P1=0x00; // torna todos os pinos da Porta1 baixos
IEN0 = 0x81; // habilita a interrupção do pino
INTEXP = 0x08; // habilita INT0
enquanto(1); //loop infinito, espera pela interrupção
}
// Rotina de serviço de interrupção
EXT_INT0_ISR
{
P1 = 0xff; //torna todos os pinos da Port1 altos
atraso_ms(1000); //atraso de 1 segundo
P1=0x00; //faz com que todos os pinos da Port1 sejam baixos
atraso_ms(1000); //atraso de 1 segundo
}