Sistemas Embarcados - Interrupções
Uma interrupção é um sinal para o processador emitido por hardware ou software, indicando um evento que precisa de atenção imediata. Sempre que ocorre uma interrupção, o controlador completa a execução da instrução atual e inicia a execução de umInterrupt Service Routine (ISR) ou Interrupt Handler. ISR diz ao processador ou controlador o que fazer quando a interrupção ocorrer. As interrupções podem ser interrupções de hardware ou interrupções de software.
Interrupção de Hardware
Uma interrupção de hardware é um sinal de alerta eletrônico enviado ao processador a partir de um dispositivo externo, como um controlador de disco ou um periférico externo. Por exemplo, quando pressionamos uma tecla no teclado ou movemos o mouse, eles acionam interrupções de hardware que fazem com que o processador leia o pressionamento de tecla ou a posição do mouse.
Interrupção de software
Uma interrupção de software é causada por uma condição excepcional ou por uma instrução especial no conjunto de instruções que causa uma interrupção quando é executada pelo processador. Por exemplo, se a unidade lógica aritmética do processador executa um comando para dividir um número por zero, para causar uma exceção de divisão por zero, fazendo com que o computador abandone o cálculo ou exiba uma mensagem de erro. As instruções de interrupção de software funcionam de maneira semelhante às chamadas de sub-rotina.
O que é votação?
O estado de monitoramento contínuo é conhecido como polling. O microcontrolador verifica continuamente o status de outros dispositivos; e, ao fazer isso, não realiza nenhuma outra operação e consome todo o seu tempo de processamento para monitoramento. Este problema pode ser resolvido usando interrupções.
No método de interrupção, o controlador responde apenas quando ocorre uma interrupção. Portanto, o controlador não precisa monitorar regularmente o status (sinalizadores, sinais, etc.) dos dispositivos de interface e embutidos.
Interrompe a sondagem v / s
Aqui está uma analogia que diferencia uma interrupção de votação -
Interromper | Votação |
---|---|
Uma interrupção é como um shopkeeper. Se alguém precisa de um serviço ou produto, ele vai até ele e o informa de suas necessidades. Em caso de interrupções, quando os sinalizadores ou sinais são recebidos, eles notificam o controlador de que precisam de manutenção. | O método de votação é como um salesperson. O vendedor vai de porta em porta enquanto solicita a compra de um produto ou serviço. Da mesma forma, o controlador continua monitorando os sinalizadores ou sinais um por um para todos os dispositivos e fornece serviço para qualquer componente que precise de seu serviço. |
Interromper a rotina de serviço
Para cada interrupção, deve haver uma rotina de serviço de interrupção (ISR), ou interrupt handler. Quando ocorre uma interrupção, o microcontrolador executa a rotina de serviço de interrupção. Para cada interrupção, há um local fixo na memória que contém o endereço de sua rotina de serviço de interrupção, ISR. A tabela de localizações de memória separada para conter os endereços de ISRs é chamada de Tabela de Vetor de Interrupção.
Tabela de vetores de interrupção
Existem seis interrupções, incluindo RESET em 8051.
Interrupções | Localização ROM (Hex) | PIN |
---|---|---|
Interrupções | Localização ROM (HEX) | |
Serial COM (RI e TI) | 0023 | |
Interrupções do temporizador 1 (TF1) | 001B | |
Interrupção HW externa 1 (INT1) | 0013 | P3.3 (13) |
Interrupção HW externa 0 (INT0) | 0003 | P3.2 (12) |
Temporizador 0 (TF0) | 000B | |
Redefinir | 0000 | 9 |
Quando o pino de reinicialização é ativado, o 8051 salta para a localização de endereço 0000. Esta é a reinicialização da inicialização.
Duas interrupções são reservadas para os temporizadores: uma para o temporizador 0 e uma para o temporizador 1. As localizações de memória são 000BH e 001BH respectivamente na tabela de vetor de interrupção.
Duas interrupções são reservadas para interrupções externas de hardware. Pin no. 12 e pino no. 13 na porta 3 são para as interrupções de hardware externo INT0 e INT1, respectivamente. As localizações de memória são 0003H e 0013H respectivamente na tabela de vetor de interrupção.
A comunicação serial tem uma única interrupção que pertence tanto à recepção quanto à transmissão. O local de memória 0023H pertence a esta interrupção.
Etapas para executar uma interrupção
Quando uma interrupção fica ativa, o microcontrolador segue as seguintes etapas -
O microcontrolador fecha a instrução em execução no momento e salva o endereço da próxima instrução (PC) na pilha.
Ele também salva o status atual de todas as interrupções internamente (ou seja, não na pilha).
Ele salta para o local da memória da tabela de vetores de interrupção que contém o endereço da rotina de serviço de interrupções.
O microcontrolador obtém o endereço do ISR da tabela de vetores de interrupção e salta para ele. Começa a executar a sub-rotina do serviço de interrupção, que é RETI (retorno da interrupção).
Ao executar a instrução RETI, o microcontrolador retorna ao local onde foi interrompido. Primeiro, ele obtém o endereço do contador do programa (PC) da pilha, colocando os bytes superiores da pilha no PC. Então, ele começa a ser executado a partir desse endereço.
Edge Triggering vs. Level Triggering
Os módulos de interrupção são de dois tipos - disparados por nível ou disparados por borda.
Nível acionado | Edge Triggered |
---|---|
Um módulo de interrupção disparado por nível sempre gera uma interrupção sempre que o nível da fonte de interrupção é declarado. | Um módulo de interrupção disparado por borda gera uma interrupção apenas quando detecta uma borda de afirmação da fonte de interrupção. A borda é detectada quando o nível da fonte de interrupção realmente muda. Ele também pode ser detectado por amostragem periódica e detecção de um nível declarado quando a amostra anterior foi retirada. |
Se a fonte de interrupção ainda é afirmada quando o manipulador de interrupção do firmware trata a interrupção, o módulo de interrupção irá regenerar a interrupção, fazendo com que o manipulador de interrupção seja invocado novamente. | Módulos de interrupção acionados por borda podem ser acionados imediatamente, não importa como a fonte de interrupção se comporte. |
As interrupções disparadas por nível são complicadas para o firmware. | As interrupções acionadas por borda mantêm a complexidade do código do firmware baixa, reduzem o número de condições para o firmware e fornecem mais flexibilidade quando as interrupções são tratadas. |
Habilitando e desabilitando uma interrupção
Na reinicialização, todas as interrupções são desabilitadas, mesmo que sejam ativadas. As interrupções devem ser habilitadas usando um software para que o microcontrolador responda a essas interrupções.
O registro do IE (ativação de interrupção) é responsável por ativar e desativar a interrupção. IE é um registro bitaddressable.
Interromper Habilitar Registro
EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
---|
EA - Ativar / desativar global.
- - Indefinido.
ET2 - Habilite a interrupção do Timer 2.
ES - Habilite a interrupção da porta serial.
ET1 - Habilite a interrupção do Timer 1.
EX1 - Habilite a interrupção externa 1.
ET0 - Habilite a interrupção do Timer 0.
EX0 - Habilite a interrupção 0 externa.
Para habilitar uma interrupção, tomamos as seguintes etapas -
O bit D7 do registro IE (EA) deve ser alto para permitir que o restante do registro tenha efeito.
Se EA = 1, as interrupções serão habilitadas e respondidas, se seus bits correspondentes no IE forem altos. Se EA = 0, nenhuma interrupção responderá, mesmo se seus pinos associados no registro IE estiverem altos.
Interromper prioridade em 8051
Podemos alterar a prioridade de interrupção atribuindo a prioridade mais alta a qualquer uma das interrupções. Isso é feito programando um registro chamadoIP (prioridade de interrupção).
A figura a seguir mostra os bits do registro IP. Após a reinicialização, o registro IP contém todos os 0s. Para dar uma prioridade mais alta a qualquer uma das interrupções, tornamos o bit correspondente no registro IP alto.
- | - | - | - | PT1 | PX1 | PT0 | PX0 |
---|
- | IP.7 | Não implementado. |
- | IP.6 | Não implementado. |
- | IP.5 | Não implementado. |
- | IP.4 | Não implementado. |
PT1 | IP.3 | Define o nível de prioridade de interrupção do Timer 1. |
PX1 | IP.2 | Define o nível de prioridade da Interrupção externa 1. |
PT0 | IP.1 | Define o nível de prioridade de interrupção do Timer 0. |
PX0 | IP.0 | Define o nível de prioridade 0 de interrupção externa. |
Interromper dentro da interrupção
O que acontece se o 8051 estiver executando um ISR que pertence a uma interrupção e outro ficar ativo? Em tais casos, uma interrupção de alta prioridade pode interromper uma interrupção de baixa prioridade. Isso é conhecido comointerrupt inside interrupt. No 8051, uma interrupção de baixa prioridade pode ser interrompida por uma interrupção de alta prioridade, mas não por qualquer outra interrupção de baixa prioridade.
Disparando uma interrupção por software
Há momentos em que precisamos testar um ISR por meio de simulação. Isso pode ser feito com as instruções simples para definir a interrupção alta e, assim, fazer com que o 8051 salte para a tabela de vetores de interrupção. Por exemplo, defina o bit IE como 1 para o temporizador 1. Uma instruçãoSETB TF1 interromperá o 8051 em tudo o que estiver fazendo e o forçará a pular para a tabela de vetores de interrupção.