Os materiais didáticos aqui disponibilizados estão licenciados através de Creative Commons Atribuição-SemDerivações-SemDerivados CC BY-NC-ND. Você possui a permissão para visualizar e compartilhar, desde que atribua os créditos do autor. Não poderá alterá-los e nem utilizá-los para fins comerciais.
Atribuição-SemDerivações-SemDerivados
CC BY-NC-ND
Cursos / Eletrônica / Projeto de Sistemas Microcontrolados / Aula
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.
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.
TRISB |= 0b00000001; // Configurar o bit RB0 como entrada.
INTCONbits.INT0IE = 1; // Habilitar interrupção externa INT0
INTCONbits.INT0IF = 0; // Limpar flag da interrupção INT0
INTCON2bits.INTEDG0 = 0; // Habilitar interrupção INT0 na borda de descida
RCONbits.IPEN = 0; // Desligar todas as prioridades na interrupção.
INTCONbits.GIE = 1; // Habilitar interrupção geral.
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.
void __interrupt() nomeFuncao(){
...
}
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).
void __interrupt() nomeFuncao(){
if (INTCONbits.INT0IF == 1) {
PORTA |= 0b00001000;
INTCONbits.INT0IF = 0; \\ Limpar a flag para detectar uma nova interrupção
}
}
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.
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.
OSCCONbits.IRCF = 0b101; // Oscilador interno 4MHz
T0CONbits.TMR0ON = 0; // Parar o contador TIMER0
T0CONbits.T08BIT = 0; // Selecionar o modo 16-bits
T0CONbits.T0CS = 0; // Selecionar o clock interno
T0CONbits.PSA = 0; // Selecionar o prescaler
T0CONbits.T0PS = 0; // Prescaler: dividir 1:2
INTCONbits.TMR0IE = 1; // Habilitar o TIMER0
INTCONbits.TMR0IF = 0; // Limpar a flag do TIMER0
T0CONbits.TMR0ON = 1; // Iniciar o TIMER0
INTCONbits.GIE = 1; // Habilitar a interrupção geral
INTCONbits.PEIE = 1; // Habilitar a interrupção de periferica; TIMER0 = Periférico.
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.
void __interrupt() nomeFuncao(){
if (INTCONbits.TMR0IF == 1){
…
INTCONbits.TMR0IF = 0; \\ Limpar a flag
}
}
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.
Assim, diante das configurações apresentadas anteriormente, o temporizador gera uma interrupção a cada 131,072 ms.
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