- Por que precisamos interromper?
- Tipos de interrupção no MSP430
- Interromper controle de programa em MSP430
- Circuito MSP430 para testar interrupção GPIO
- Programando MSP430 para interrupções
- Carregando programa para MSP430 do CCS
- Programa de interrupção no MSP430
Considere um relógio digital simples que é programado apenas para mostrar as horas, agora imagine que você deseja alterar seu fuso horário. O que você faria? Basta pressionar um botão que muda para o menu que permite alterar o fuso horário. Aqui, o sistema não pode prever sua interrupção externa em seus processos de cronometragem e não pode pedir que você espere, pois está ocupado incrementando o valor dos segundos em seu relógio. É aqui que as interrupções são úteis.
As interrupções nem sempre precisam ser externas; pode ser interno também. Na maioria das vezes, uma interrupção incorporada também facilita a comunicação entre dois periféricos da CPU. Considere que um temporizador predefinido é reiniciado e uma interrupção é disparada quando o tempo atinge o valor no registro do temporizador. O manipulador de interrupção pode ser usado para iniciar os outros periféricos como o DMA.
Neste tutorial, usamos as interrupções externas no MSP430 para alternar diferentes LEDs. Quando uma interrupção externa é dada pela mudança de estado usando um botão de pressão, o controle é transferido (antecipado) para o ISR e ele faz o necessário. Para saber o básico, como a configuração do ambiente CCS para o launchpad MSP430G2, siga este link para começar a usar o MSP430 usando CCS, pois não entraremos em detalhes neste tutorial. Verifique também outros tutoriais baseados em MSP430 usando Energia IDE e CCS seguindo o link.
Por que precisamos interromper?
As interrupções são necessárias para economizar a sobrecarga da pesquisa em um sistema embarcado. Eles são chamados quando as tarefas com prioridade mais alta precisam ser executadas antecipando a tarefa em execução atual. Também pode ser usado para despertar a CPU dos modos de baixo consumo de energia. Quando é despertado por uma transição de borda de sinal externo através de uma porta GPIO, o ISR é executado e a CPU volta novamente ao Modo de Baixo Consumo.
Tipos de interrupção no MSP430
As interrupções no MSP430 vêm nos seguintes tipos -
- Reinicialização do sistema
- Interrupção Não Mascarável
- Maskable Interrupt
- Interrupções Vetorizadas e Não Vetorizadas
Reinicialização do sistema:
Pode ocorrer devido à tensão de alimentação (Vcc) e devido a um sinal baixo no pino RST / NMI com o modo Reset selecionado e também pode ocorrer devido a motivos como estouro do temporizador de watchdog e violação da chave de segurança.
Interrupção não mascarável:
Essas interrupções não podem ser mascaradas pelas instruções da CPU. Uma vez que a Interrupção Geral esteja habilitada, a interrupção não mascarável não pode ser desviada do processamento. Isso é gerado por fontes como falhas do oscilador e uma borda fornecida manualmente ao RST / NMI (no modo NMI).
Interrupção mascarável:
Quando ocorre uma interrupção e pode ser mascarada por uma instrução da CPU, é uma interrupção mascarável. Eles não precisam ser externos sempre. Eles também dependem de periféricos e de suas funções. As interrupções de porta externa usadas aqui estão nesta categoria.
Interrupções vetorizadas e interrupções não vetorizadas:
Vetorizada: neste caso, os dispositivos que interrompem nos fornecem a origem da interrupção, passando o endereço do vetor de interrupção. Aqui, o endereço do ISR é fixado e o controle é transferido para esse endereço e o ISR cuida do resto.
Não vetorial: aqui todas as interrupções têm ISR comum. Quando ocorre uma interrupção de uma fonte não vetorial, o controle é transferido para o endereço comum, ao qual compartilham todas as interrupções não vetorial.
Interromper controle de programa em MSP430
Quando a interrupção ocorre, MCLK é ligado e a CPU é chamada de volta do estado desligado. Como o controle do programa é transferido para o endereço ISR após a ocorrência da interrupção, os valores no contador do programa e o registrador de status são movidos para a pilha.
Consecutivamente, o registro de status é apagado, apagando assim o GIE e encerrando o modo de baixo consumo de energia. A interrupção com a prioridade mais alta é selecionada e executada colocando o endereço do vetor de interrupção no contador do programa. Antes de chegarmos ao nosso código de exemplo de interrupção GPIO MSP430, é importante entender o funcionamento dos registros de porta envolvidos nele.
Registros de porta para controle GPIO em MSP430:
PxDIR: É um registro de controle de direção de porta. Ele permite que o programador selecione especificamente sua função escrevendo 0 ou 1. Se um pino for selecionado como 1, ele atua como uma saída. Considere a porta 1 como uma porta de 8 bits e se os pinos 2 e 3 forem atribuídos como portas de saída, o registro P1DIR deve ser configurado com o valor 0x0C.
PxIN: É um registro somente leitura e os valores atuais na porta podem ser lidos usando este registro.
PxOUT: Este registro particular pode ser usado para escrever valores diretamente nas portas. Isso só é possível quando o registro pullup / pulldown está desabilitado.
PxREN: É um registro de 8 bits usado para habilitar ou desabilitar o registro pullup / pulldown. Quando um pino é definido como 1 em ambos os registradores PxREN e PxOUT, o pino específico é puxado para cima.
PxDIR |
PxREN |
PxOUT |
I / O Config |
0 |
0 |
X |
Entrada com resistores desativados |
0 |
1 |
0 |
Entrada com menu suspenso interno habilitado |
0 |
1 |
1 |
Entrada com pullup interno habilitado |
1 |
X |
X |
Saída - PxREN não tem efeito |
PxSEL e PxSEL2: Como todos os pinos no MSP430 são multiplexados, a função particular deve ser selecionada antes de usá-la. Quando ambos os registros PxSEL e PxSEL2 são configurados como 0 para um pino particular, então a E / S de propósito geral é selecionada. Quando o PxSEL é definido como 1, a função periférica primária é selecionada e assim por diante.
PxIE: Habilita ou desabilita interrupções para um determinado pino em uma porta x.
PxIES: Seleciona a borda na qual uma interrupção é gerada. Para 0, uma borda ascendente é selecionada e para 1, uma borda descendente é selecionada.
Circuito MSP430 para testar interrupção GPIO
O circuito MSP430 usado para testar nosso código de exemplo de interrupção MSP430 é mostrado abaixo.
O aterramento da placa é usado para aterrar o LED e o botão. Os lados diagonalmente opostos do botão de pressão são terminais normalmente abertos e são conectados quando o botão de pressão é pressionado. Um resistor é conectado antes do LED para evitar o alto consumo de corrente pelo LED. Normalmente, resistores baixos na faixa de 100 ohm - 220 ohm são usados.
Usamos 3 códigos diferentes para obter uma melhor compreensão das interrupções de porta. Os primeiros dois códigos usam o mesmo circuito do Diagrama de Circuito 1. Vamos mergulhar no código. Depois que as conexões foram feitas, minha configuração ficou assim.
Programando MSP430 para interrupções
O Programa de Interrupção MSP430 completo pode ser encontrado no final desta página, a explicação do código é a seguinte.
A linha abaixo interrompe a operação do cronômetro watchdog. O cronômetro de watchdog geralmente executa duas operações. Uma é evitar que o controlador de loops infinitos reiniciando o controlador e a outra é que ele dispara eventos periódicos usando o temporizador embutido. Quando um microcontrolador é reiniciado (ou ligado), ele está no modo temporizador e tende a reiniciar o MCU após 32 milissegundos. Esta linha impede o controlador de fazer isso.
WDTCTL = WDTPW + WDTHOLD;
Definir o registro P1DIR com o valor 0x07 define a direção do pino 0, pino 1 e pino 2 como saída. Definir o P1OUT como 0x30 configura uma entrada com resistores pullup internos habilitados no pino 4 e pino 5. Definir P1REN como 0x30 ativa o pullup interno nesses pinos. P1IE habilita a interrupção, onde P1IES seleciona a transição de alto para baixo como a borda de interrupção nesses pinos.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
A próxima linha habilita o modo de baixo consumo e habilita o GIE no registro de status para que as interrupções possam ser recebidas.
__bis_SR_register (LPM4bits + GIE)
O contador do programa é definido com o endereço do vetor da porta 1 usando a macro.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
O código a seguir alterna cada um dos LEDs conectados ao pino 0, pino 1, pino 2, um por um.
if (contagem% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; contagem ++; } else if (contar% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; contagem ++; } else { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; contagem ++; }
Diagrama de circuito 2:
Da mesma forma, vamos tentar um pino diferente para entender o conceito muito melhor. Portanto, aqui o botão de pressão está conectado ao pino 2.0 em vez do pino 1.5. o circuito modificado é o seguinte. Novamente, este circuito é usado para testar o programa de interrupção do botão MSP430.
Aqui, a porta 2 é usada para entrada. Portanto, um vetor de interrupção diferente deve ser usado. P1.4 e P2.0 recebem as entradas.
Como a porta 2 é usada apenas para entrada, P2DIR é definido como 0. Para definir o pin0 da porta 2 como entrada com resistores pull-up internos habilitados, os registros P2OUT e P2REN devem ser definidos com um valor de 1. Para habilitar o interrupção no pin0 da porta 2 e também para selecionar a borda da interrupção, P2IE e P2IES são configurados com um valor de 1. Para redefinir o sinalizador na porta 2, P2IFG é limpo, de modo que o sinalizador possa ser definido novamente no ocorrência da interrupção.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Quando a fonte de interrupção é da porta 1, o LED conectado ao pino 1 da porta 1 acende. Quando a fonte de interrupção pertence à porta 2, o LED conectado ao pino 2 da porta 1 acende.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; para (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; para (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Carregando programa para MSP430 do CCS
Para carregar o projeto na barra de ativação e depurá-lo, selecione o projeto e clique no ícone de depuração na barra de ferramentas. Alternativamente, pressione F11 ou clique em RunàDebug para entrar no modo de depuração.
Depois de entrar no modo de depuração, pressione o botão de execução de cor verde para executar livremente o código carregado no MCU. Agora, quando o botão é pressionado, a interrupção é acionada pela mudança na borda, solicitando assim a mudança no estado do LED.
Programa de interrupção no MSP430
Depois que o código for carregado com sucesso, podemos testá-lo simplesmente usando o botão de ação. O padrão do LED mudará de acordo com nosso programa sempre que uma interrupção for dada usando o botão.
O trabalho completo pode ser encontrado no vídeo no link abaixo. Espero que você tenha gostado do tutorial e aprendido algo útil. Se você tiver alguma dúvida, deixe-a na seção de comentários ou use nossos fóruns para outras questões técnicas.