Aula 14 – Interrupções do PIC
As interrupções permitem que o PIC responda rapidamente a eventos importantes, sem precisar ficar verificando tudo manualmente dentro do while(1).
1. O que é uma interrupção?
Uma interrupção é um evento que faz o microcontrolador pausar temporariamente o programa principal, executar uma rotina especial e depois voltar ao ponto onde estava.
Programa principal executando
↓
Acontece uma interrupção
↓
PIC executa a rotina de interrupção
↓
PIC volta ao programa principal
2. Exemplo do cotidiano
Imagine que você está estudando e o telefone toca. Você para o estudo, atende o telefone e depois volta ao que estava fazendo. A interrupção funciona de forma semelhante.
3. Por que usar interrupções?
Sem interrupções, o programa precisa ficar verificando repetidamente se algo aconteceu.
while(1)
{
verifica_botao();
verifica_timer();
verifica_serial();
verifica_sensor();
}
Com interrupções, o PIC executa o programa normalmente e reage automaticamente quando um evento importante acontece.
4. Tipos comuns de interrupções
| Interrupção | Aplicação |
|---|---|
| Externa | Botão, sensor, encoder ou pulso externo |
| Timer | Temporização precisa e contagem de tempo |
| UART | Recebimento de dados seriais |
| ADC | Fim de conversão analógica |
5. ISR – Rotina de Serviço de Interrupção
A rotina de interrupção é chamada de ISR, sigla de Interrupt Service Routine.
void __interrupt() minha_interrupcao()
{
// Código executado quando ocorre uma interrupção
}
6. Habilitando interrupções globais
INTCONbits.GIE = 1; // Habilita interrupções globais
INTCONbits.PEIE = 1; // Habilita interrupções periféricas
7. Interrupção externa RB0/INT
Em muitos PICs, o pino RB0 pode funcionar como entrada de interrupção externa.
TRISBbits.TRISB0 = 1; // RB0 como entrada
INTCONbits.INTE = 1; // Habilita interrupção externa
INTCONbits.INTF = 0; // Limpa a flag da interrupção
8. Flag de interrupção
A flag indica que a interrupção ocorreu. Depois de tratar o evento, ela deve ser limpa.
if(INTCONbits.INTF == 1)
{
// Interrupção externa ocorreu
INTCONbits.INTF = 0; // Limpa a flag
}
9. Exemplo completo: botão acionando LED por interrupção
#include <xc.h>
void __interrupt() interrupcao()
{
if(INTCONbits.INTF == 1)
{
PORTBbits.RB1 = !PORTBbits.RB1;
INTCONbits.INTF = 0;
}
}
void main()
{
TRISBbits.TRISB0 = 1; // RB0 entrada
TRISBbits.TRISB1 = 0; // RB1 saída
PORTBbits.RB1 = 0;
INTCONbits.INTE = 1; // Habilita interrupção externa
INTCONbits.INTF = 0; // Limpa flag
INTCONbits.GIE = 1; // Habilita interrupção global
while(1)
{
// Programa principal livre para outras tarefas
}
}
10. Interrupção por Timer0
O Timer0 também pode gerar interrupção quando ocorre overflow.
INTCONbits.TMR0IE = 1; // Habilita interrupção do Timer0
INTCONbits.TMR0IF = 0; // Limpa flag do Timer0
11. LED piscando com interrupção do Timer0
#include <xc.h>
void __interrupt() interrupcao()
{
if(INTCONbits.TMR0IF == 1)
{
PORTBbits.RB0 = !PORTBbits.RB0;
TMR0 = 0;
INTCONbits.TMR0IF = 0;
}
}
void main()
{
TRISBbits.TRISB0 = 0;
OPTION_REG = 0b00000111; // Prescaler 1:256
TMR0 = 0;
INTCONbits.TMR0IE = 1;
INTCONbits.TMR0IF = 0;
INTCONbits.GIE = 1;
while(1)
{
// Outras tarefas podem ser executadas aqui
}
}
12. Cuidados importantes
- A ISR deve ser curta e rápida.
- Não use delays longos dentro da interrupção.
- Sempre limpe a flag da interrupção.
- Evite cálculos pesados dentro da ISR.
- Use variáveis de controle para avisar o programa principal.
13. Aplicações industriais
Interrupções são usadas em contagem de pulsos, leitura de encoder, temporização precisa, comunicação serial, alarmes, sensores rápidos e sistemas em tempo real.
14. Exercícios
Exercício 1: Qual bit habilita as interrupções globais?
INTCONbits.GIE = 1;
Exercício 2: Qual flag indica interrupção externa no RB0?
INTCONbits.INTF
Exercício 3: Por que não devemos usar delay dentro da interrupção?
Porque a interrupção deve ser executada rapidamente. Um delay longo pode travar outras tarefas importantes.
15. Resumo da Aula
- Interrupção permite resposta rápida a eventos.
- ISR é a rotina que trata a interrupção.
GIEhabilita interrupções globais.- Flags indicam quando uma interrupção ocorreu.
- Interrupções de Timer permitem temporização sem delay.
Próxima Aula – Aula 15
Na próxima aula vamos estudar ADC – Conversor Analógico Digital, usado para leitura de sinais analógicos de sensores e potenciômetros.