Cálculo do baud rate para MCU PIC

balde_hates

Previamente, quero deixar claro que sou um amante de Arduino, o qual tive o prazer de dar os primeiros passos no mundo da eletrônica digital. E também quero deixar claro que não sou especialista nem em PIC nem em Arduino, mas certamente o entendimento que tive para a dissolução do problema que tive com o baud rate será útil para outras pessoas.

Há um post sendo escrito que tratará de vários recursos disponíveis em MCUs PIC e para reduzir a complexidade e tamanho, preferi antecipar essa parte.

Trata-se que ao utilizar uma MCU PIC, ainda que utilizando a MikroC IDE, o baud rate está diretamente relacionado à ferquência do clock. Logo, há uma fórmula para chegar aos valores possíveis conforme a MCU utilizada. Para o post POSTerior, a MCU utilizada é a mesma que deu origem a esse que vos escrevo agora, sendo o P16F883. Apesar de não utilizar nem 1/4 dos pinos disponíveis, fui obrigado a escolhê-lo pela falta de opção em tamanho de memória. Aí é fogo; tem modelo de PIC12F 8 pinos que serviria, mas não ajuda muito existir mais de 250 modelos de MCU se aqui na Banânia só chegam os mais populares. Enfim, o requisito mínimo para minha escolha de PIC é que tenha oscilador interno, assim ligo ele sem nenhum componente externo e fica bem mais agradável sua utilização, apesar de ainda assim não ser tão prático quanto um Arduino UNO.




Se você quiser praticidade, para Windows você encontra o PIC baud rate Calculator (mas ele roda tranquilo com Wine no Linux, já experimentei aqui).

O ideal é que a taxa de erro fique abaixo de 1%. Então você calcula e vê se o clock selecionado suporta o baud rate desejado. Por exemplo, estou utilizando o oscilador interno a 8MHz e queria fazer uma comunicação assincrona a 115200, mas não seria possível:

Baud rate a 115200
Baud rate a 115200

Testei com 57600 e também não estava bom, então cheguei ao ideal, que nesse caso é 38400, dando uma taxa de erro de 0.16%:

Baud rate a 38600
Baud rate a 38600

Se preferir, também pode utilizar um gerador online, mas de qualquer modo é bom saber como chegar ao valor desejado.

Registrador SPBRG




Nesse registrador defini-se o baud rate, quando todos os passos estão sendo feitos manualmente. Se utilizar o módulo UART da MikroC IDE, não será necessário ajustar esse registrador, nem os PORTs TX e RX, bastando configurar as interrupções posteriormente, caso deseje utilizá-las. Mas de qualquer modo, não basta utilizar UARTx_Init(BAUDRATE), pois as chances de não dar certo em valores altos pode ser grande.

O datasheet descreve o cálculo da taxa de erro de um modo muito simples:

Calculadora de baud rate
Calculadora de baud rate

O que é o BRG
Conforme o datasheet descreve, “o BRG (Baud Rate Generator) é um timer de 8 ou 16 bits didicado ao suporte sincrono e assincrono de operações EUSART”. O modo padrão é 8 bits, podendo ser modificado para 16 bits através do registrador BAUDCTL, no bit BRG16.

Os pares SPBRGH e SPBRG determinam o periodo do timer. Mais detalhes, leia o respectivo datasheet.

O cálculo permite determinar o bit mais conveniente para alcançar a menor taxa de erro. Normalmente, o BRG é utilizado para baixas velocidades utilizando osciladores de alta frequência. No datasheet tem uma boa tabela de fórmulas para determinar o baud rate:

Fórmula do baud rate
Fórmula do baud rate

E também tem uma tabela PRONTA pra utilizar o baud rate sem calcular nada, ou seja, não será necessário pensar, se você for do tipo preguiçoso.

Não estou passando código nenhum esse post porque no final das contas, será utilizado UARTx_Init(BAUDRATE), onde o importante é só calcular o baud rate ideal para passar à função, que fará a configuração dos registradores necessários, incluindo as portas TX e RX.

Outros recursos utilizados no meu projeto atual serão descritos em mais posts até chegarmos na “cereja desse bolo”.
Se gostou, acompanhe-nos no Do bit Ao Byte no facebook e até o próximo!




Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Deixe uma resposta