CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

1Mbps serial communication

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Robotan



Joined: 12 Jul 2008
Posts: 18
Location: Canada

View user's profile Send private message

1Mbps serial communication
PostPosted: Fri Aug 15, 2008 6:26 am     Reply with quote

This question has been asked before, but I'm asking again since it wasn't answered fully. I would like to use a 16f877 to control some dynamixel servo motors. The issue is that the default communication speed for these motors is 1Mbps. I certainly don't need such speed in my application, but I will need to communicate with them at this rate initially just to set them to a lower baud rate. After reading through the 16F877 data sheet, it would seem that I can achieve 1Mbps with a 10Mhz crystal. But the compiler complains when I try and set the baud rate this high. What can I do as a work around? There was mention of doing this via bit banging, but I'm not sure how to do this. I would much prefer to use the built in functions. If there is no other way, could someone post a little sample of how to achieve this baud rate via bit banging?
It would be much appreciated.

Rob
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Fri Aug 15, 2008 8:19 am     Reply with quote

Quote:
After reading through the 16F877 data sheet, it would seem that I can achieve 1Mbps with a 10Mhz crystal.
You are reading another data sheet than I have. The formula in my data sheet gives a maximum of 625kbaud at 10MHz.

Software bit banging would normally give you about the same maximum baudrate.
If you don't mind having the limited flexibility of a hard coded bit sequence you can achieve a higher baudrate of maximum Fosc/4 = 2.5MHz. Problem here is that your targeted baudrate is not an integer multiple of the clock frequency, so 1Mbaud is an impossible speed.

The easiest, fastest and most solid solution is to replace the crystal on your board by a 16MHz crystal. Than 1Mbaud is no problem for the hardware UART and you don't have to write software functions to set the motor controller to a lower baudrate.
Robotan



Joined: 12 Jul 2008
Posts: 18
Location: Canada

View user's profile Send private message

PostPosted: Fri Aug 15, 2008 11:40 am     Reply with quote

Right, my mistake. A 16Mhz crystal will give me the desired 1Mbps. I can change the crystal, but how do I get around the compiler limitation of the baud rate? The manual says of the set_uart_speed() function that "baud is a constant 100-115200 representing the number of bits per second"
What am I missing here?

Rob
newguy



Joined: 24 Jun 2004
Posts: 1909

View user's profile Send private message

PostPosted: Fri Aug 15, 2008 12:05 pm     Reply with quote

Set the baud manually by directly loading the proper register(s). The PIC's datasheet will list the register(s) that the USART uses, and the memory organization section (look for the section called Special Function Registers) will list the address of each register.

In your code you directly access any register you wish with the #byte directive. For instance, to declare "timer0_low_byte" and locate it at the memory address of the timer 0 low byte:

#byte timer0_low_byte = 0x____ (you'd include the actual hex address of that register where the underscores are - and I'm too lazy to look up the actual address - also note - no ;)

After the declaration, if you want to load that register with a certain value, just do this:

timer0_low_byte = 348;

The same goes for the baud rate generator register(s). Figure out what those registers should be loaded with, and then load them with the proper value(s).

To get around the compiler's objections to the speed, you may have to tell the compiler in the #use rs232 line to set any speed that won't cause an error. Later on, do your own speed setting. This will allow you to use the built-in rs232 functions but at your own speed, namely 1Mbps, and the compiler won't know the difference.
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Fri Aug 15, 2008 6:34 pm     Reply with quote

Quote:
The manual says of the set_uart_speed() function that "baud is a constant 100-115200 representing the number of bits per second"
What am I missing here?
The manual is outdated.
I just tested in both v3.249 and v4.057. With a 16MHz clock the compiler compiles without complaints and the generated code is correct for 1Mbaud.

I've sent a report to CCS.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group