Manual

do

Maker

.

com

Cálculo do baud rate para PIC

Cálculo do baud rate para PIC

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 cálculo do 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 à frequê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 assíncrona a 115200, mas não seria possível:

0-baudRate115200-300x188.webp

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%:

1-baudRate38400-300x192.webp

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:

2-baudCalcError-250x300.webp

O que é o BRG

Conforme o datasheet descreve, "o BRG (Baud Rate Generator) é um timer de 8 ou 16 bits didicado ao suporte síncrono e assíncrono 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 período 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:

3-baudFormula-300x79.webp

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 nesse 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 Manual do Maker no facebook e até o próximo!

Cálculo do baud rate. "balde hates"; que coisa boba...

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.