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

arrow_back Aula 06 - Programação para Comunicação Serial

Utilizando Interrupções na USART

Ambas as formas de receber dados que vimos anteriormente apresentaram possíveis problemas. Uma forma de evitar tais problemas é utilizar as interrupções do PIC para receber os dados. Mas o que é uma interrupção? Como o próprio nome diz, é uma forma de "interromper" o processamento do PIC, e de fato é isso que acontece. Ao utilizar interrupções, o PIC não se preocupa em verificar a cada momento se chegaram novos dados. Quando os dados chegam, o sistema de interrupções avisa ao PIC e ele automaticamente desvia o processamento atual para o processamento da USART, que no caso da recepção é copiar o dado do RCREG para outra variável e, logo depois, ele volta para o que estava fazendo antes de ser interrompido. Ou seja, o dado vai ser processado sempre que chegar ao PIC, diminuindo assim a chance de um erro de overrun e, ao mesmo tempo, ele não vai parar as demais tarefas para ficar esperando um dado.

Mas, como você faz para utilizar as interrupções? Bem, primeiramente, você vai ter que configurar o PIC para tal. As interrupções da USART são controladas por 3 registradores: o INTCON, o PIE1 e o PIR1.

  • INTCON – Nesse registrador, estamos interessados nos bits GIE (de Global Interrupt Enable) e PEIE (de Peripheral Interrupt Enable). Ambos devem estar setados (valores em '1') para que as interrupções da USART aconteçam.
  • PIE1 – Esse registrador contém os bits TXIE e RCIE, que permitem habilitar independentemente as interrupções para a transmissão e recepção. Caso você deseje trabalhar somente com interrupções de transmissão, sete o TXIE e resete RCIE. Se deseja só interrupções de recepção, faça o contrário: resete o TXIE e sete o RCIE. Para trabalhar com ambas interrupções, sete ambos os bits
  • PIR1 – Nesse registrador ficam os bits que efetivamente acionam as interrupções: o TXIF para transmissão e RCIF para a recepção. Quando um desses bits for setado enquanto os bits relativos do INTCON e do PIE1 estiverem setados, uma interrupção vai ocorrer.
    • O bit RCIF é setado sempre que tem dados novos no registrador RCREG e é resetado quando não tiver mais dados na Fila de recepção. Ou seja, se você ler o RCREG, o bit RCIF vai ser automaticamente resetado se não existir nenhum outro dado para ser recebido na fila.
    • O bit TXIF é resetado sempre que um dado é escrito no TXREG e é setado quando o dado é movido para o registrador de deslocamento. Portanto, uma interrupção vai ocorrer sempre que um novo dado puder ser transmitido. Logo, se não existirem mais dados para serem escritos no TXREG (ou seja, nada mais para ser transmitido), você deve resetar o bit TXIF para evitar que novas interrupções aconteçam. As interrupções de transmissão podem ser habilitadas novamente quando existirem novos dados para serem transmitidos. Para tal, basta setar o TXIF e isso vai imediatamente causar uma interrupção.

Como você pode ver, também é possível utilizar interrupções para a transmissão de dados, apesar de ser bem mais comum utilizá-las na recepção.

Em termos de código, como você vai implementar a interrupção depende da linguagem que está utilizando para programar seu PIC. Geralmente, existem códigos exemplos que você pode utilizar como base para seu código. Utilize-os para entender o que está sendo feito e, então, alterar para a sua aplicação. O que vale a pena citar é que existem dois níveis de interrupção: de alta prioridade e de baixa prioridade. A diferença entre essas interrupções é que as de baixa prioridade podem ser interrompidas pelas interrupções de alta prioridade, caso as últimas ocorram enquanto o PIC está processando o código da de baixa prioridade. Caso você esteja programando um dispositivo que utilize o mesmo nível de interrupção para várias interrupções diferentes (como, por exemplo, tratar um dado de um sensor de distância) você vai precisar verificar as várias "flags" de interrupção para saber qual delas foi a geradora da interrupção.

Versão 5.3 - Todos os Direitos reservados