View Full Version : Serial Baudrate 115200
kblim
- 20th July 2005, 10:09
Hi all,
Could anyone guide me about setting up the serial communication to 115200 baudrate?
Thanks
kblim
Bruce
- 20th July 2005, 16:22
I use DEBUG & DEBUGIN. These commands produce much smaller code, and
you can get higher data-rates like 19200 with a 4MHz osc.
DEFINE OSC 20
DEFINE DEBUG_REG PORTC
DEFINE DEBUGIN_REG PORTC
DEFINE DEBUGIN_BIT 7
DEFINE DEBUG_BIT 6
DEFINE DEBUG_MODE 0 '1 = Inverted, 0 = true
DEFINE DEBUGIN_MODE 0
DEFINE DEBUG_BAUD 19200
X VAR BYTE[3]
MAIN:
DEBUGIN 6000,NoData,[WAIT("A"),str X\3]
DEBUG "Received: ",str X\3,13,10
GOTO MAIN
NoData:
DEBUG "Nada",13,10
GOTO Main
END
This example works with a max232 PIC-PC interface. If you need direct, then
just change mode to inverted.
kblim
- 21st July 2005, 04:44
Hi Bruce,
Just wonder how to use Serout2, Serin2 with 115200 baudrate.
From the formula :int(1000000/baudrate)-20,
if use 115200 i will have int(1000000/115200)-20 = -12
Please help.
kblim
Bruce
- 21st July 2005, 06:47
If the baud rate calc doesn't work out to a positive number, then I'm pretty
sure the data rate you need isn't supported by the command.
seinfield
- 27th July 2005, 04:11
Use this:
DEFINE HSER_SPBRG 21 'Configuración de velocidad de USART
DEFINE HSER_TXSTA 36 'a 115200 baudios.
Now you can use hserin and hserout at 115200 bauds
mister_e
- 27th July 2005, 04:24
Yeah but in synchronous mode... and all that imply too ;)
kblim
- 28th July 2005, 03:40
First of all thank you for all the kindness reply. However I still couldn't solve the problem. I think I must clearify something.
Actually I would like to use the Serin2 and Serout2 command to do the asynchronising on any of the hardware pin.
As I know the Hserout and Hserin only implemented on the certain hardware pins.
The command of the SerOut2:
SerOut2 ModemOut, ModemSpeed, ["ate0",13]
Where the
1. ModemOut = Pin to be used
2. ModemSpeed = A number from the calculation Of
[int(1000000/baudrate)-20]
3. ["ate0",13] = any string to send out to the pin
So I do not know the HSER setting will effect the SerOut2 and SerIn2 command or not.
Please help.
seinfield
- 29th July 2005, 03:18
The hserout instruction is for the hardware USART.
kblim
- 2nd August 2005, 10:21
I know the hserout instruction is for the hardware USART, but how about the SerIn2 and Serout2 command.
Do you guys use Serin2 and Serout2 command instead of hserout?
What is the main difference between Serin2/Serout2 and hserout?
How to set the 115200 baud rate for serin2/serout2 bcoz previously i was using these command to connect to a gsm module with 19200 baud rate?
Thanks
picnaut
- 5th August 2005, 21:06
Hi kblim,
As far as I know, you can't use baud rates higher than 38400 baud (I think) with the ser-type commands.
I'm sure you can't do 115200.
This is because the ser-type commands use a "bit-banging" approach as opposed to the hser-type commands which use the built-in usart and generate less code.
This was the first time that I heard that you can communicate at 115200 using debug though.
What are the pros and cons of that anyhow, Bruce?
Regards.
Bruce
- 5th August 2005, 21:51
The serin, serout type commands were originally designed to offer BASIC Stamp users similar commands. They all produce huge code when used because the command libraries have to cover so many various options to maintain Stamp compatibility.
Debug/Debugin produce much smaller code, and offer the higher data-rates because the library routines are much smaller.
Serin, serout commands can be used on any I/O-pins that support digital I/O. Data-rates & pins used can be changed on the fly. Debug/Debugin pins & data-rates are fixed with the DEFINE used to set them up, but offer much higher data-rates since the library routines are much smaller.
If you need higher baud rates with slower osc speeds, then use Debug and Debugin if you can live with fixed rates & pins you can use.
Of course you can use them all if needed, but I'll normally opt for the hardware USART or Debug/Debugin.
kblim
- 26th November 2005, 04:23
Hi all,
Just wonder how to define the debug to communicate with the open mode when receiving serial data from other device. Using the open mode because need to share the data line with few PICs.
It is possible to do Open mode for DebugIn, Non Open Mode for Debug?
Kindly share your expectise.
Thanks alot.
Regards
Melanie
- 26th November 2005, 11:26
There is one other possible unconventional solution... Set SERIN2/SEROUT2 to run at 11500 baud at 4MHz and then switch to 40MHz Oscillator (approipriate 18F PIC Series) WITHOUT telling PICBasic you've done so... everything works at x10 speed... so PAUSE 1000 will only give you 100mS instead of a Second. In theory it should work (I'd use 67 rather than 66 as the calculated Speed figure)...
kblim
- 5th December 2005, 07:09
Hi all,
I was previously using the SerOut2 to send data, but the data line was sharing by few PICs and I have used Open Mode.
Recently porting my code by replacing SerOut2 with the Debug command to save same space. But later found out that there are no way to setup the Debug in the open mode.
Please help! Is there neccessary to use Open mode to share the data? or the Debug doesn't need the Open mode even sharing the data line.
Regards
dhouston
- 12th February 2006, 14:34
I have an application where a PIC12F683 has to communicate with an external peripheral. I need SerIn/SerOut because the external device may be 4800 or 9600 bps.
The PIC12F683 also needs to communicate with a PIC16F876A.
Is there any advantage to using Debug/DebugIn for the PIC2PIC comms given that the PIC12F683 already uses SerIn/SerOut?
Dave
- 12th February 2006, 21:27
dhouston, Serin/out provide software type communications and can have the baudrate's and port's changed on the fly during program execution. Therefore the compiled code overhead is quite large, whereas Debigin/out commands after the compile are the smallest for software type usart emulation. The port and baudrate used for Debugin/out can not be changed during program execution therefor they must be DEFINE'd at the start of the source program. There are some other functions that are lost in the use of Debugin/out but for the most part it was designed for program debugging with a terminal. I have used Debugout for PIC micros that have no internal usart and still use it today for programming debug functions. The limitations of Debugin/out are covered in the manual. LOL
Dave Purola,
N8NTA
dhouston
- 12th February 2006, 21:45
Dave,
I understand all of that.
My question is, given that I have to use SerIn/SerOut for the external link, will I take another overhead hit if I also use it for the internal link or can I gain by using Debug for the internal link?
Dave
- 12th February 2006, 21:57
dhouston , If you are already using Serin/out on your program there is no need to add the extra code overhead in using Debugin/out unless you need the serial speed.
Dave Purola,
N8NTA
flotulopex
- 16th October 2011, 14:54
I'm having difficulties making my PIC's HSEROUT working at all. I need to get 115200bps.
I can reach 38400bps with the SEROUT2 command without any trouble.
For 115200bps, I go with HSEROUT. I use the MCS Serial Communicator and the PIC has a 20MHz crystal.
SEROUT2 is okay, HSEROUT is not working at all (not even @1200bps).
I've been trying to make it work for hours and hours, redoing the cabling (see picture) different ways as suggested in other threads, modifying the code also many times but no success until now. I just always get garbage on the serial terminal's screen.
' SEROUT2
' PIC 16F690 Fuses
@ __Config _FCMEN_OFF &_IESO_OFF &_BOR_OFF &_CPD_OFF &_CP_OFF &_MCLRE_OFF &_PWRTE_OFF &_WDT_OFF &_HS_OSC
OPTION_REG = 000000 'PORT A&B Pull-Ups (look WPUA & WPUB)
ADCON0 = 000000 'A/D Module
ANSEL = 000000 'Select analog inputs Channels 0 to 7
ANSELH = 000000 'Select analog inputs Channels 8 to 11
INTCON = 000000 'INTERRUPT Control
'WPUA = 000000 'Select PORTA weak pull-ups
'IOCA = 000000 'Interrupt On Change selection
CM1CON0 = 000000 'Comparator1 Module
CM2CON0 = 000000 'Comparator2 Module
TRISA = 000000 'Set Input/Output (0 to 5)
PORTA = 000000 'Ports High/Low (0 to 5)
TRISB = 000000 'Set Input/Output (4 to 7)
PORTB = 000000 'Ports High/Low (4 to 7)
TRISC = 000000 'Set Input/Output (0 to 7)
PORTC = 000000 'Ports High/Low (0 to 7)
'-------------------------------------------------------------------------------
' DEFINEs
DEFINE OSC 20
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
'-------------------------------------------------------------------------------
LED1 VAR PORTA.2
Counter VAR WORD
Counter = 0
TEST:
TOGGLE LED1
'serout2 PORTB.7,16416,[dec counter,13,10]'19200 DIN with MAX232
SEROUT2 PORTB.7,16390,[DEC Counter,13,10]'38400 DIN with MAX232
PAUSE 500
Counter = Counter + 1
GOTO TEST
END
' HSEROUT
' PIC 16F690 Fuses
@ __Config _FCMEN_OFF &_IESO_OFF &_BOR_OFF &_CPD_OFF &_CP_OFF &_MCLRE_OFF &_PWRTE_OFF &_WDT_OFF &_HS_OSC
OPTION_REG = 000000 'PORT A&B Pull-Ups (look WPUA & WPUB)
ADCON0 = 000000 'A/D Module
ANSEL = 000000 'Select analog inputs Channels 0 to 7
ANSELH = 000000 'Select analog inputs Channels 8 to 11
INTCON = 000000 'INTERRUPT Control
'WPUA = 000000 'Select PORTA weak pull-ups
'IOCA = 000000 'Interrupt On Change selection
CM1CON0 = 000000 'Comparator1 Module
CM2CON0 = 000000 'Comparator2 Module
TRISA = 000000 'Set Input/Output (0 to 5)
PORTA = 000000 'Ports High/Low (0 to 5)
TRISB = 000000 'Set Input/Output (4 to 7)
PORTB = 000000 'Ports High/Low (4 to 7)
TRISC = 000000 'Set Input/Output (0 to 7)
PORTC = 000000 'Ports High/Low (0 to 7)
'-------------------------------------------------------------------------------
' DEFINEs
DEFINE OSC 20
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_BAUD 19200
'DEFINE HSER_SPBRG 64
DEFINE HSER_CLOERR 1
'-------------------------------------------------------------------------------
LED1 VAR PORTA.2
Counter VAR WORD
Counter = 0
TEST:
TOGGLE LED1
HSEROUT [DEC Counter,13,10]
PAUSE 500
Counter = Counter + 1
GOTO TEST
END
There's a MAX232 close to the PIC making me think the lines are as short as possible. But is it enough on the hw side?
6060
Charles Linquis
- 16th October 2011, 16:22
Try changing
DEFINE HSER_TXSTA 24h to
DEFINE HSER_TXSTA 20h
flotulopex
- 16th October 2011, 16:55
I tried this already: no success.
Still looks like this:
6063
Charles Linquis
- 16th October 2011, 18:13
I was referring to you trying to run 19200. That was what your code above referenced.
If you want to run 115K baud -
From Mr. E's Multi-Calc:
RCSTA1 = $90 ' Enable serial port & continuous receive
TXSTA1 = $24 ' Enable transmit, BRGH = 1
SPBRG1 = 42 ' 115200 Baud @ 20MHz, 0.94%
SPBRGH1 = 0
BAUDCON1.3 = 1 ' Enable 16 bit baudrate generator
Some of these might change if you are using a 16F part.
You may have to remove the "1" after the register names if you are not using PBP 3
amgen
- 16th October 2011, 19:35
if serout2 was inverted, HSER is not inverted. 16416 in table shows inverted.
dhouston
- 16th October 2011, 20:48
Is there any way to set the DEBUG baud rate at runtime?
flotulopex
- 16th October 2011, 22:20
if serout2 was inverted, HSER is not inverted. 16416 in table shows inverted.Sorry, I don't understand what you want me to do?! I don't have any problems with SEROUT2 at this time.
I was referring to you trying to run 19200...I did try this at all available baudrates; never worked. Before you ask, yes, I tried with another PIC ;)
I do use a PIC16F690 and modified the code with your suggestion as it is herunder:
' HSEROUT
' PIC 16F690 Fuses
@ __Config _FCMEN_OFF &_IESO_OFF &_BOR_OFF &_CPD_OFF &_CP_OFF &_MCLRE_OFF &_PWRTE_OFF &_WDT_OFF &_HS_OSC
OPTION_REG = %10000000 'PORT A&B Pull-Ups (look WPUA & WPUB)
ADCON0 = %00000000 'A/D Module
ANSEL = %00000000 'Select analog inputs Channels 0 to 7
ANSELH = %00000000 'Select analog inputs Channels 8 to 11
INTCON = %00000000 'INTERRUPT Control
'WPUA = %00000000 'Select PORTA weak pull-ups
'IOCA = %00000000 'Interrupt On Change selection
CM1CON0 = %00000000 'Comparator1 Module
CM2CON0 = %00000000 'Comparator2 Module
TRISA = %00000000 'Set Input/Output (0 to 5)
PORTA = %00000000 'Ports High/Low (0 to 5)
TRISB = %00000000 'Set Input/Output (4 to 7)
PORTB = %00000000 'Ports High/Low (4 to 7)
TRISC = %00000000 'Set Input/Output (0 to 7)
PORTC = %00000000 'Ports High/Low (0 to 7)
'-------------------------------------------------------------------------------
' DEFINEs
DEFINE OSC 20
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $24 ' Enable transmit, BRGH = 1
SPBRG = 42 ' 115200 Baud @ 20MHz, 0.94%
BAUDCTL.3 = 1 'for PIC16F690 - BAUDCON1.3 = 1 ' Enable 16 bit baudrate generator
'-------------------------------------------------------------------------------
LED1 var PORTA.2
Counter var word
Counter = 0
TEST:
Toggle led1
HSEROUT [dec counter,13,10]
pause 500
Counter = counter + 1
goto test
end
As said, I tried also the lowest selectable baudrate 300bps; even so, I can't see any "good" data in the terminal.
mister_e
- 16th October 2011, 23:06
back to basic Roger... check your ANSEL(h) settings.. you're sending something on a analog configured pin.
amgen
- 17th October 2011, 00:48
are you using a USB to serial converter ?
flotulopex
- 17th October 2011, 08:23
if serout2 was inverted, HSER is not inverted.
Why didn't you SHOUT IT OUT LOUD!!??
You're absolutely right: the signal has to be inverted in the way I'm using it. I added a transistor to invert the signal going to the MAX232 chip and guess what: IT WORKS!!!!
The HSEROUT code example in one of my previous post (http://www.picbasic.co.uk/forum/showthread.php?t=2087&p=108763#post108763) is working fine, also with 115200bps.
I still have some transmission errors but I think this can be due to the small error rate - I'll try with a 18,432MHz crystal.
Thanks a lot and have a nice day.
flotulopex
- 17th October 2011, 10:46
Hi there,
I need to use a 18,432MHz crystal with this PIC16F690 project to achieve a clean 115200bps serial comm.
Looking at the OSC values in the DEFINEs list, I can't find the value "18".
Shall I simply define the OSC as, i.e., "20" while connecting a 18MHZ crystal?
The only drawback I can see is about timing in PAUSE commands or similar. I assume the HUSART will still run from the 18MHz osc; right?
Any other problems I wouldn't see?
amgen
- 17th October 2011, 13:14
Why didn't you SHOUT IT OUT LOUD!!??
I don't like to yell because I'm usually wrong.
Just a few thoughts, the Max232 chip inverts signal, if your using USB to serial adapter, that takes a non-inverted signal, so you may be inverting redundently. Also, have you tried OSC-Tune to adjust clock to good 115Kb, then you can use standard Xtal ?
Don
flotulopex
- 17th October 2011, 16:37
Yes, I do use a USB-to-serial interface (FTDI).
I now corrected the BAUDCTL register so as it sends data inverted (no need for a hw inverter anymore).
As far as I understand this register's function, OSCTUNE calibrates the internal oscillator so I don't think it will affect the baud rate generator (I don't know).
BTW, how do I measure a "good" 115200bps signal?
' HSEROUT
' PIC 16F690 Fuses
@ __Config _FCMEN_OFF &_IESO_OFF &_BOR_OFF &_CPD_OFF &_CP_OFF &_MCLRE_OFF &_PWRTE_OFF &_WDT_OFF &_HS_OSC
OPTION_REG = %10000000 'PORT A&B Pull-Ups (look WPUA & WPUB)
ADCON0 = %00000000 'A/D Module
ANSEL = %00000000 'Select analog inputs Channels 0 to 7
ANSELH = %00000000 'Select analog inputs Channels 8 to 11
INTCON = %00000000 'INTERRUPT Control
'WPUA = %00000000 'Select PORTA weak pull-ups
'IOCA = %00000000 'Interrupt On Change selection
CM1CON0 = %00000000 'Comparator1 Module
CM2CON0 = %00000000 'Comparator2 Module
TRISA = %00000000 'Set Input/Output (0 to 5)
PORTA = %00000000 'Ports High/Low (0 to 5)
TRISB = %00000000 'Set Input/Output (4 to 7)
PORTB = %00000000 'Ports High/Low (4 to 7)
TRISC = %00000000 'Set Input/Output (0 to 7)
PORTC = %00000000 'Ports High/Low (0 to 7)
'-------------------------------------------------------------------------------
' DEFINEs
DEFINE OSC 20
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $24 ' Enable transmit, BRGH = 1
SPBRG = 42 ' 115200 Baud @ 20MHz, 0.94%
BAUDCTL = 24 'Transmit INVERTED data to RB7, Enable 16 bit baudrate generator
'-------------------------------------------------------------------------------
LED1 var PORTA.2
Counter var word
Counter = 0
TEST:
Toggle led1
HSEROUT [dec counter,13,10]
pause 500
Counter = counter + 1
goto test
end
Charles Linquis
- 17th October 2011, 17:14
The baud rate generator will be accurate. If the formula says you will get 115KBaud with a 20Mhz oscillator, you will.
If you don't get 115K baud, then you aren't really running at 20Mhz, or the receiving device has an issue.
I mentioned in another post how to measure just how fast your chip is running - without an oscilloscope.
(Turn LED ON)
For X = 1 to 60
Pause 60000
Next X
(Turn LED OFF)
Wait one hour. If your LED goes off in exactly 60 minutes, your chip is running the speed you think it is. Using a
calculator, you can measure the actual frequency to about 0.1%
A useful tool is BRAY's TERMINAL program (Google it). Free, and it lets you set odd baud rates, like 113Kbaud.
or 120Kbaud.
flotulopex
- 24th October 2011, 09:09
I need to use a 18,432MHz crystal...
Looking at the OSC values in the DEFINEs list, I can't find the value "18".
Shall I simply define the OSC as, i.e., "20" while connecting a 18MHZ crystal?
Can anyone give some info about this please?
flotulopex
- 4th November 2011, 20:25
I need to use a 18,432MHz crystal...
Looking at the OSC values in the DEFINEs list, I can't find the value "18".
Shall I simply define the OSC as, i.e., "20" while connecting a 18MHZ crystal?
Does really nobody know something about that?
Charles Linquis
- 4th November 2011, 22:59
You are going to have to unless you change the libraries. Just remember that any PAUSE commands will be 8.5% longer than you think.
You can get around that by creating some variables.
For example: If your program needed 3 different delays 20ms, 50ms, 190ms
You would create 3 vars
delay20 con 18
delay50 con 46
delay190 con 175
Now, if you need a 20mSec delay, you can use the command
PAUSE delay20
It is not exact, but it is close.
flotulopex
- 9th November 2011, 18:42
Thanks Charles,
I thought this would happen. No problem then, for me ;-)
Powered by vBulletin® Version 4.1.7 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.