## Incorrectly calculating UART Baud Rate

A forums to allow bugs and problems with Flowcode v7 to be reported and resolved.

Moderator: Benj

Neon27
Posts: 6
Joined: Mon Aug 02, 2010 9:18 pm
Contact:

### Incorrectly calculating UART Baud Rate

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
Attachments
003.jpg (87.45 KiB) Viewed 2117 times
002.jpg (115.09 KiB) Viewed 2117 times
001.jpg (42.29 KiB) Viewed 2117 times
Last edited by Neon27 on Thu Apr 18, 2019 4:25 pm, edited 1 time in total.

Benj
Matrix Staff
Posts: 14929
Joined: Mon Oct 16, 2006 10:48 am
Location: Matrix TS Ltd
Contact:

### Re: Incorrectly calculating UART Baud Rate

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

Neon27
Posts: 6
Joined: Mon Aug 02, 2010 9:18 pm
Contact:

### Re: Incorrectly calculating UART Baud Rate

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)
Attachments
001.jpg (169.65 KiB) Viewed 2113 times

Benj
Matrix Staff
Posts: 14929
Joined: Mon Oct 16, 2006 10:48 am
Location: Matrix TS Ltd
Contact:

### Re: Incorrectly calculating UART Baud Rate

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;``````

Neon27
Posts: 6
Joined: Mon Aug 02, 2010 9:18 pm
Contact:

### Re: Incorrectly calculating UART Baud Rate

Thanks Ben!
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)