PDA

View Full Version : HSER baudrate



pedja089
- 12th June 2011, 00:11
Hello,
I'm not very familiar with the hardware serial port. So far I have used define.
But when I tried this:

HSerBaud var byte
IF HSerBaud=0 THEN
DEFINE HSER_BAUD 300
ENDIF
IF HSerBaud=1 THEN
DEFINE HSER_BAUD 2400
ENDIF
IF HSerBaud=$BD THEN
DEFINE HSER_BAUD 9600
ENDIF
I got an error, Redefininig symbor that can not be redefined...
I do not know what registers should be set to change the baud rate.
If you can help, so I would not read the whole datasheet. I'm using PIC18LF14K50.
Thanks;)

Archangel
- 12th June 2011, 00:37
That's is correct as far as I know, you cannot redefine it in running code, you can however select it in the beginning as your PIC starts. Look at the code example in the lower 1/2 of this article. I show you how to do it there.

http://www.picbasic.co.uk/forum/content.php?r=171-LCD-serial-backpacks (http://www.picbasic.co.uk/forum/content.php?r=171-LCD-serial-backpacks)

mackrackit
- 12th June 2011, 06:36
If you need to change the baud rate during run time do not use defines. Deal with the registers directly.

X VAR WORD
START:
RCSTA.4 = 0 : RCSTA.4 = 1
RCSTA=$90:TXSTA=$24:SPBRG=129
HSERIN [dec X]
HSEROUT [DEC X.7,13]
blah
blah

Archangel
- 12th June 2011, 11:14
:D or there's Dave's way . . .

mister_e
- 12th June 2011, 11:28
When changing baudrate on the fly, you want to turn off the USART before though.

RCSTA=0
SPBRG=xyz
TXSTA = whatever, assuming it's value change from baudrate to baudrate
RCSTA=$90

pedja089
- 12th June 2011, 12:17
Thanks, guys.
Both examples helped me. Just to see which registers should be set. Today I'll try ..

mister_e
- 12th June 2011, 15:25
Get the latest version of my PICMultiCalc on this forum, it will give you a good kick.

pedja089
- 12th June 2011, 16:53
Everything works great. The calculator has really helped me.
Here's the code if someone needs it.

IF HSerBaud=0 THEN
RCSTA = 0
SPBRG = 207 ' 300 Baud @ 4MHz, 0.0%
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $20 ' Enable transmit, BRGH = 0
endif
IF HSerBaud=1 THEN
RCSTA = 0
SPBRG = 25 ' 2400 Baud @ 4MHz, 0.17%
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $20 ' Enable transmit, BRGH = 0
endif
IF HSerBaud=$BD THEN
RCSTA = 0
SPBRG = 25 ' 9600 Baud @ 4MHz, 0.16%
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $24 ' Enable transmit, BRGH = 1
endif

mister_e
- 12th June 2011, 17:03
http://bravellir.com/gallery/d/5420-2/woohoo.gif
For safety sake, I would set RCSTA at the end, just after TXSTA.

pedja089
- 12th June 2011, 17:35
Done. But I don't see what difference it makes.
Can someone explain?

mister_e
- 12th June 2011, 17:43
It shouldn't make so much difference, but it's a bit more logical to me

1. You disable the USART
2. You set the baudrate and mode
3. You Enable the USART

Open the datasheet, and see what else you do when you write 0 or $90 to RCSTA, it does more than just enable/disable the USART.

pedja089
- 12th June 2011, 18:53
I looked into datasheet, and saw to change a bunch of thing. I just need to reset and set the seventh bit RCSTA to turn off and on UART
Is there a way to use the parity bit. Suppose 2400.8, E, 1, or 9600.8, E, 1 As I see hardware support and the ninth bit. The PBP I saw that there define the ninth bit.
If I add this to the beginning of the code
DEFINE HSER_EVEN 1
DEFINE HSER_BITS 9
How will changes in RCSTA, TXSTA,SPBRG registers affect hserin or serout.

mister_e
- 12th June 2011, 19:24
RCSTA, TXSTA, SPBRG will override the DEFINE and configure the PIC USART. It doesn't affect Serout, Serout2 or DEBUG. Those are software solution.

Again check out the USART section about Parity.

pedja089
- 6th August 2011, 22:58
I continue where I left off ...
This is code:


define OSC 4
OSCCON=%01010110

DEFINE HSER_CLROERR 1 'Hser clear overflow automatically
' SPBRG = 25 ' 9600 Baud @ 4MHz, 0.16%
' TXSTA = $24 ' Enable transmit, BRGH = 1
' RCSTA = $90 ' Enable serial port & continuous receive
DEFINE HSER_BAUD 9600 'Set Baud rate to 9600bps
DEFINE HSER_BITS 9 'Set to 9 bit mode
DEFINE HSER_EVEN 1 'Set Even Parity

TRISB.7 = 0 'Make Tx output
TRISB.5 = 1 'Make Rx input

main:
pause 1000
HSerOut ["Parity:)"]
goto main
Use this or not

DEFINE HSER_BITS 9 'Set to 9 bit mode
DEFINE HSER_EVEN 1 'Set Even Parity
Always get a 9600, N, 1. PIC never send parity bit.
I'm banging head all day, but I can't catch what I missed.

pedja089
- 7th August 2011, 19:46
Problem solved, thanks to Darrel.
I find solution in this (http://www.picbasic.co.uk/forum/showthread.php?t=12923&p=86970#post86970) topic.