Cursos / Eletrônica / Projeto de Sistemas Microcontrolados / Aula

arrow_back Aula 09 - Roteiro Prático nº 2

Interrupções PIC18F45K20: INT0 e TIMER0

Interrupções PIC18F45K20: INT0 - Interrupção externa

As interrupções são utilizadas para executar um determinado trecho de código imediatamente após a ocorrência de um evento especificado. Por exemplo, se um botão for conectado ao pino RB0 e a interrupção externa INT0 estiver habilitada, um determinado trecho de código será executado sempre que o botão for pressionado, independente da sequência de instruções do código principal (main).

Para utilizar a interrupção externa INT0 é necessário configurar os bits de alguns registradores, como é indicado no datasheet do microcontrolador.

No caso do microcontrolador PIC18F45K20, os registradores INTCON, INTCON2 e RCON precisam ser configurados para utilizar a interrupção INT0. A seguir são descritos alguns bits desses registradores.

  • Registrador INTCON:
    • bit 7: GIE - Habilita a interrupção geral.
    • bit 4: INT0IE - Habilita a interrupção externa INT0 no pino RB0.
    • bit 1: INT0IF - Indica a ocorrência da interrupção INT0. Se o bit INT0IF estiver alto (‘1’), ocorreu uma interrupção no pino RB0. Caso contrário, não ocorreu.
  • Registrador INTCON2:
    • bit 6: INTEDG0 - Seleciona a borda de detecção do pino RB0. Se o bit INTEDG0 estiver baixo (‘0’), a interrupção será acionada quando houver uma borda de descida no pino do INT0. Caso contrário, na borda de subida do sinal.
  • Registrador RCON:
    • bit 7: IPEN - Habilita ou desabilita os níveis de prioridade nas interrupções. Se IPEN estiver baixo (‘0’), todas as interrupções estão no mesmo nível de prioridade.

O quadro abaixo apresenta um código exemplo que pode ser utilizado como base para configurar o pino RB0 para detectar interrupção externa INT0.

x
1
TRISB |= 0b00000001;            // Configurar o bit RB0 como entrada.
2
    
3
INTCONbits.INT0IE = 1;          // Habilitar interrupção externa INT0
4
INTCONbits.INT0IF = 0;          // Limpar flag da interrupção INT0
5
INTCON2bits.INTEDG0 = 0;    // Habilitar interrupção INT0 na borda de descida
6
RCONbits.IPEN = 0;                  // Desligar todas as prioridades na interrupção.
7
INTCONbits.GIE = 1;                 // Habilitar interrupção geral.
8

Além disso, é necessário limpar o bit de configuração PBADEN (PBADEN == ‘0’). Se o bit PBADEN estiver alto (‘1’), todos os bits da porta RB são configurados para receber sinais análogicos.

Quando a interrupção externa é detectada o microcontrolador executa as instruções indicadas no vetor de tratamento de interrupções. Para tratar as interrupções, independente do tipo de interrupção, o compilador XC8 da Microchip utilizar a instrução “__interrupt()”.

O trecho de código abaixo apresenta a forma de definir a função que trata as interrupções utilizando o compilador XC8.

4
1
void __interrupt() nomeFuncao(){
2
     ...
3
}
4

O desenvolvedor tem a permissão de escolher o nome da função (nomeFuncao). Dentro da função, é necessário verificar as flag de interrupção para identificar que tipo de interrupção foi acionada (interrupção externa, interrupção por temporizador, etc).

7
1
void __interrupt() nomeFuncao(){
2
     if (INTCONbits.INT0IF == 1) {
3
            PORTA |= 0b00001000;
4
            INTCONbits.INT0IF = 0;     \\ Limpar a flag para detectar uma nova interrupção
5
     }
6
}
7

No código mostrado no quadro acima, sempre que houver uma interrupção externa INT0 a instrução “PORTA |= 0b00001000” será executada e o bit INT0IF será limpado (‘0’) para possibilitar a detecção de uma nova interrupção.

Temporizadores PIC18F45K20: TIMER0

Configurar um temporizador é configurar uma interrupção. Os temporizadores são interrupções que são detectadas quando ocorre um estouro na contagem do tempo. Sempre que a contador alcançar o tempo predeterminado uma interrupção é gerada.

Para utilizar a interrupção o temporizador TIMER0 é necessário configurar os bits de alguns registradores, conforme indica o datasheet do microcontrolador.

No caso do microcontrolador PIC18F45K20, os registradores T0CON, INTCON, TMR0L e TMR0H são utilizados para configurar o temporizador TIMER0. A seguir são descritos alguns bits desses registradores.

O quadro abaixo apresenta um código exemplo que pode ser utilizado como base para configurar o TIMER0.

14
1
OSCCONbits.IRCF = 0b101; // Oscilador interno 4MHz
2
    
3
T0CONbits.TMR0ON = 0; // Parar o contador TIMER0
4
T0CONbits.T08BIT = 0; // Selecionar o modo 16-bits
5
T0CONbits.T0CS = 0; // Selecionar o clock interno
6
T0CONbits.PSA = 0; // Selecionar o prescaler
7
T0CONbits.T0PS = 0; // Prescaler: dividir 1:2
8
INTCONbits.TMR0IE = 1; // Habilitar o TIMER0
9
INTCONbits.TMR0IF = 0; // Limpar a flag do TIMER0
10
T0CONbits.TMR0ON = 1; // Iniciar o TIMER0
11
   
12
INTCONbits.GIE = 1; // Habilitar a interrupção geral
13
INTCONbits.PEIE = 1; // Habilitar a interrupção de periferica; TIMER0 = Periférico.
14

Atenção

Acesse o datasheet do microcontrolador PIC18F45K20 para entender melhor cada bit de cada registrador utilizado.

A definição da função “__interrupt()” também pode ser utilizada para detectar o estouro do temporizador TIMER0. É necessário somente verificar o bit de detecção da interrupção TIMER0, bit TMR0IF do registrador INTCON.

9
1
void __interrupt() nomeFuncao(){
2
    if (INTCONbits.TMR0IF == 1){
3
            
4
5
            
6
            INTCONbits.TMR0IF = 0;     \\ Limpar a flag 
7
     }
8
}
9

Como saber o tempo de contagem do temporizador TIMER0? Veja o passo a passo a seguir!

Vamos utilizar o trecho de código apresentado anteriormente.

  1. Frequência do oscilador.
    • Fclk = 4MHz;
  2. Frequência do oscilador após uso do prescaler. Prescaler 1:2 (bits T0PS = 0).
    • Fclk = 4MHz / 2 = 2MHz;
  3. Período do cada instrução de contagem do TMR0 (Timer0).
    • Ttmr = 4 / Fclk = 4 / 2MHz = 2 µs.
  4. Período de estouro do temporizador configurado no modo 16-bits (0 a 65536).
    • T = (Ttmr) * 65536 = 2µs * 65536 = 131,072 ms.

Assim, diante das configurações apresentadas anteriormente, o temporizador gera uma interrupção a cada 131,072 ms.

Atenção

Supondo que foram realizadas as configurações do TIMER0 descritas anteriormente e que o programador precisa executar um trecho de código a cada 525ms, uma solução é executar o código após 4 estouros do TMR0.

(4 * 131,072 ms) é aproximadamente 525 ms.

Ou seja, após quatro detecções de interrupção, através do bit INTCONbits.TMR0IF, o trecho de código deve ser executado.

Versão 5.3 - Todos os Direitos reservados