PIC do Zero

Programação em C para Microcontroladores PIC

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çãoAplicação
ExternaBotão, sensor, encoder ou pulso externo
TimerTemporização precisa e contagem de tempo
UARTRecebimento de dados seriais
ADCFim 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.
  • GIE habilita 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.