Page 1 of 1

Incorrectly calculating UART Baud Rate

Posted: Thu Apr 18, 2019 4:09 pm
by Neon27
MCU: PIC18F67K22-I/PT
FREQ: 64 MHz

It appears that Flowcode V7 is incorrectly calculating the UART (EUSART) Baud Rate when I compile code with a baud rate lower than 4 kHz.
I believe that the issue might stem from a possible Flowcode miscalculation of the 'SPBRGH2' register.
Here's the Microchip baud calculation...

Solving for SPBRGHx:SPBRGx:
X = ((FOSC/Desired Baud Rate)/64) – 1
= ((64000000/4000)/64) – 1
= 249

249 fits easily into the SPBRG2 register (with SPBRGH2 register set to 0)

If I use a baud rate lower than 4 kHz, I get random baud rates (measured by my o-scope).
For example...

Solving for SPBRGHx:SPBRGx:
X = ((FOSC/Desired Baud Rate)/64) – 1
= ((64000000/2400)/64) – 1
= 416

I'm assuming that rollover of 'SPBRG2' is occurring, and 'SPBRGH2' is not being updated within Flowcode.
I get a host of random (higher) baud rates if I choose anything lower than 4 kHz. Here are some examples of rates I captured with my o-scope:

Flowcode: O-Scope:
240 Hz = 14.0 KHz
600 Hz = 7.62 KHz
700 Hz = 6.72 KHz
800 Hz = 4.42 KHz
900 Hz = 11.5 KHz
1000 Hz = 4.31 KHz
1500 Hz = 6.49 KHz
2000 Hz = 4.10 KHz
2360 Hz = 5.95 KHz
2400 Hz = 6.22 KHz
2600 Hz = 7.81 KHz
3000 Hz = 12.8 KHz
3500 Hz = 33.3 KHz

4000 Hz = 4.00 KHz
4800 Hz = 4.79 KHz
240000 Hz = 236. KHz

Re: Incorrectly calculating UART Baud Rate

Posted: Thu Apr 18, 2019 4:21 pm
by Benj
Hello,

Please can you try the 1 second flasher test to see if everything is setup correctly.
https://www.matrixtsl.com/wikiv7/index. ... ED_flasher

Re: Incorrectly calculating UART Baud Rate

Posted: Thu Apr 18, 2019 4:35 pm
by Neon27
Thank you kindly for the assistance!

I appreciate the suggestion, buy my code is working 100% (I've attached a pic of my project)

My MCU is:
- driving an LCD display
- communicating with several I2c devices
- Driving 3 RGB LED's (WS2811)
- Converting an analog signal

As I mentioned, all baud rates above 4 kHz work 100%. I've verified this using my digital oscilloscope.

- I'm using Hardware UART Channel 1 (RC6, RC7) set to 9600 Hz (working fine. I measured it on my oscilloscope at exactly 9.6 kHz)
- I'm using Hardware UART Channel 2 (RG1, RG2) set to 2400 Hz (this one isn't working. It will only produce baud rates accurately above ~4 kHz)

Re: Incorrectly calculating UART Baud Rate

Posted: Thu Apr 18, 2019 4:47 pm
by Benj
Aha ok sorry I see. Yes slower baud rates will be tricky as we currently only use the 8-bit baud mode.

You should be able to modify the registers using a C code icon to allow the lower baud rates.

Call the C code after you have initialised the UART or the initialise will override the register values.

Replace xxx with the number of the UART peripheral.

Code: Select all

TXSTAxxxbits.BRGH = 0;          //Low speed Baud rate
BAUDCONxxxbits.BRG16 = 1;    //Switch to 16-bit BAUD
Then do a quick calc to get the value for the baud registers. FOSC / (16 x BAUD)

Code: Select all

SPBRGxxx = CALCVAL;
SPBRGHxxx = CALCVAL >> 8;

Re: Incorrectly calculating UART Baud Rate

Posted: Thu Apr 18, 2019 6:01 pm
by Neon27
Thanks Ben! :mrgreen:
I uploaded the code and it works like a charm!

Here's what I ended up using:

TXSTA2bits.BRGH = 0;
BAUDCON2bits.BRG16 = 1;
SPBRG2 = 129;
SPBRGH2 = 6;

With my 4xPLL OSC running at 64MHz, I'm getting a Baud rate of 2403 kHz (0.12% error)