|
|
View previous topic :: View next topic |
Author |
Message |
jecottrell
Joined: 16 Jan 2005 Posts: 559 Location: Tucson, AZ
|
Porting Single HW UART Code to Dual HW & SW UART |
Posted: Tue Sep 05, 2006 8:25 pm |
|
|
Hello All,
Working on some code for an 18F2525 that previously only used the HW UART. Now I need to have a software UART also. I've been reading up on the posts concerning this and had some specific questions.
I'm assuming I need a second ring buffer for the incoming data on the new SW UART? With that, I'll need a unique set of variables, functions, etc., to deal with the second UART? (bkbhit, etc.)
To convert the hardware ISR/ring buffer to work with the new stream setup, all I'll I need to do is:
Code: | int t;
buffer[next_in]=fgetc(STREAM); <------- Changed
t=next_in;
next_in=(next_in+1) % BUFFER_SIZE;
if(next_in==next_out)
next_in=t; // Buffer full !! |
Any other tips or tricks?
Thanks,
John |
|
|
asmallri
Joined: 12 Aug 2004 Posts: 1635 Location: Perth, Australia
|
|
Posted: Wed Sep 06, 2006 1:10 am |
|
|
Short answer: Conceptually you are right however you do not normally need a receive ring buffer for the CCS software UART.
Long answer: With the hardware UART the ring buffer is typically used by the receive ISR used to hold received characters until your main thread can process then. The mainthread would typically periodically extract characters from the buffer and, depending on the application, build a command or data sequence into a linear buffer until a terminating character has been found at which point the main thread will pass control to a handler to parse the sequence.
If you are using the CCS software UART code then this code typically does not use interrupts (although it is possible to use an interrupt to detect the start bit condition assuming the receive pin is one of the PICs interrupt input). The software UART then has 100% control of the CPU unit the character has been serialized into the PIC. While serializing in the bits the PIC can do nothing else (including process the HW UARTs interrupts) without affecting the bit timing of the software UART. This is a long winded way of saying you typically do not need a ring buffer with the CCS software UART as you would bypass this phase and go straight to the linear buffer.
Alternatively you could implement your own software UART that functions more along the lines of the hardware UART. This generally requires two timer interrupts per software UART (tx bit and rx bit) although there are techniques at lower bt rates to use a single timer. With this scenario you would expect to see a ring buffer implemented for the receive data. _________________ Regards, Andrew
http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!! |
|
|
|
|
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
|