

O maior inimigo do conhecimento não é a ignorância, mas sim a ilusão de que conhecemos. (Stephen Hawking)

INTERRUPÇÕES DAS PORTAS B - RB
As interrupções RB são interrupções que acontecem por meio das portas B e também são interrupções externas, ou seja, trabalham quando acontece algum evento externo nas portas do conjunto B. No entanto não são todas as portas do conjunto B que trabalham com este tipo de interrupção, apenas a portas B4 até a porta B7 (B4, B5, B6, B7). Por ter a mesma funcionalidade da interrupção externa, há um pequena diferença entre esta e a interrupção RB, é que enquanto na interrupção externa podemos ter a liberdade de trabalhar com três funções de interrupções diferentes, na interrupção RB qualquer evento externo nas portas B4, B5, B6 ou B7 acionará apenas uma função de interrupção, ou seja, a mesma função está para todas as portas disponíveis na RB. Além disso, a interrupção RB é acionada conforme a mudança de estado lógico (enquanto na externa é apenas nível alto), ou seja, se eu colocar um botão na porta B4, por exemplo, eu vou acionar a interrupção duas vezes pois estarei mudando o nível lógico de alto (apertado) para baixo (solto). Outra coisa que deve ser observada, essa interrupção é especial pelo seguinte: uma vez acionada o código que está dentro dela executará sem paradas. Se você quiser que haja alguma parada desta execução terá que gerar um tratamento dentro do seu código, ok?
Bom, vamos às nossas configurações de sempre com o PIC 18F2550. Logo após, clicamos na opção Interrupts no campo a esquerda e habilitamos a opção Port B any change on B4-B7 conforme figura:
Vamos clicar em OK e começar a programar.
Dentro da função de interrupção vamos digitar, como primeiro teste, o seguinte:
#int_RB
void RB_isr(void)
{
printf("teste\n\r");
}
Dentro do While não vamos digitar nada, vamos apenas deixa-lo vazio. Compile esse código mas não feche-o, vamos utilizá-lo ainda. Nosso circuito no ISIS 7 fica assim:
Carregue o primeiro teste neste esquema e dê o play. O LED é para o segundo e terceiro teste.
Observe que nesse primeiro teste vemos que após a mudança de nível lógico na porta B4, o código de interrupção roda infinitamente. Vamos fazer o mesmo com o LED?
Digite agora, dentro da função de interrupção, o seguinte:
#int_RB
void RB_isr(void)
{
Output_toggle(PIN_A0);
}
Compile, carregue e dê play na simulação. Você perceberá que o LED acenderá e apagará infinitas vezes sem parada, da mesma forma que aconteceu no terminal virtual com a palavra teste.
Agora nosso terceiro código consiste em fazer esse filtro: executar uma ação apenas quando houver nível lógico alto na porta B4. Para tanto devemos incluir um if() na função de interrupção. Assim:
#int_RB
void RB_isr(void)
{
If(Input(PIN_B4)) Output_toggle(PIN_A0);
}
Dessa forma nós ligamos um LED após deixarmos em nível lógico alto e só apagamos o LED depois de outro nível lógico alto na porta B4. Compile e carregue o código e dê play na simulação.
Testes realizados. Perceba que com este último teste você pode tranquilamente executar diferentes ações a partir de uma só função usando portas diferentes, com somente funções de condição!
Enfim, essa é a interrupção das portas B. Estudem mais a fundo sobre ela pois não é tão simples como imaginamos, podemos cair em algumas pegadinhas ao trabalharmos com ela. Bons estudos pessoal, até a próxima!

