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.

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.

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).

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.


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.

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