Transformando a complexidade do desenvolvimento embarcado em conhecimento acessível. Explore como as interrupções tornam seus projetos mais eficientes e responsivos.
No coração do design de sistemas embarcados está uma escolha fundamental: verificar constantemente por eventos (Polling) ou ser notificado por eles (Interrupções). A escolha impacta diretamente a performance, o consumo de energia e a responsividade do seu sistema.
A CPU gasta seu tempo em um loop, perguntando repetidamente a cada periférico se algo aconteceu. É simples, mas ineficiente, como perguntar a cada segundo se uma carta chegou.
A CPU realiza outras tarefas ou economiza energia. O hardware a notifica apenas quando um evento ocorre. É a abordagem eficiente para o mundo real.
Quando um evento de interrupção ocorre, o ATmega328P segue uma sequência precisa e automatizada pelo hardware para garantir que o evento seja tratado de forma rápida e segura, sem corromper a tarefa principal. Passe o mouse sobre cada passo para ver os detalhes.
Um periférico (ex: Timer, ADC) ou pino externo sinaliza um evento.
CPU termina a instrução atual e suspende o programa principal.
O endereço de retorno é salvo na pilha (stack) para saber para onde voltar.
A CPU salta para a Rotina de Serviço de Interrupção (ISR) específica.
O código para tratar o evento é executado.
A ISR termina, o contexto é restaurado da pilha e o programa principal continua.
A interrupção `USART_RX_vect` é acionada assim que um byte chega, permitindo que seu loop principal execute outras tarefas. No código abaixo, passe o mouse sobre os nomes dos registradores em destaque para entender como configurar a USART para operação com interrupção.
Cada fonte de interrupção tem um nome de vetor único. Usar o nome correto na macro `ISR()` é crucial. Use a busca abaixo para encontrar rapidamente o vetor que você precisa.
| Prioridade | Fonte | Nome do Vetor para `ISR()` |
|---|