|
|
View previous topic :: View next topic |
Author |
Message |
petedd Guest
|
RS-232 headaches INT_EXT versus INT_RDA |
Posted: Thu Jan 17, 2008 7:13 pm |
|
|
I have set up a board, running at 20MHz, with two RS232 ports: one on the UART (C7/C6) and one to use the EXT interrupt (B0/B1). I am using CCS sample code basically. Receive data on one port, buffer, and retransmit on the same port. By changing the DEFINE at the top of the program, one can select between the UART and the S/W port.
The UART version works great. The S/W version does not. The output is jbberish.
By setting a breakpoint and watching the buffer data, I can see that the corruption of data seems to be happening upon receipt. The S/W output seems to mimic whatever is in the buffer.
I need both ports running at 4800 baud (GPS application). Eventually, once I solve this problem, I intend to use two RS-232 ports at once. The processor is the 16F737 and it is running on a crystal at 20MHz. (At least I think I have told the compiler to use the crystal)...
Can anyone see what is wrong here? THANKS!!!
/////////////////////////////////////////////////////////////////////////
//// Buffered Serial Input/output ////
//// ////
//// pick between software (IND_EXT) B0/B1 or UART (INT_RDA)C7,C7 ////
//// ////
//// CHARACTERS BEING CORRUPTED UPON RECEIPT DURING INT_EXT ////
//// RECEIPT -- WORKS PERFECTLY USING INT_RDA ////
//// ////
/////////////////////////////////////////////////////////////////////////
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// CHANGE MODES BY COMMENTING IN OR OUT THE FOLLOWING LINE
#define USE_EXT // use S/W RS232, comment out to use RDA (UART) port instead
//
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#include <16F737.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#if defined(USE_EXT)
#use rs232(baud=4800, xmit=PIN_B1, rcv=PIN_B0, parity=N, BITS = 8, stop=1) //, disable_ints)
#else // use RDA
#use rs232(baud=4800, xmit=PIN_C6, rcv=PIN_C7, parity=N, BITS = 8, stop=1)
#endif
// Initialize Buffer
#define BUFFER_SIZE 64
BYTE buffer[BUFFER_SIZE];
BYTE next_in = 0;
BYTE next_out = 0;
// Set up serial interrupt
#if defined (USE_EXT)
#int_ext
#else
#int_rda
#endif
void serial_isr() {
int t,x;
buffer[next_in]=getc();
t=next_in;
if (t==32) // just for breakpoint
x=t;
next_in=(next_in+1) % BUFFER_SIZE;
if(next_in==next_out)
next_in=t; // Buffer full !!
}
#define bkbhit (next_in!=next_out)
BYTE bgetc() {
BYTE c;
while(!bkbhit) ;
c=buffer[next_out];
next_out=(next_out+1) % BUFFER_SIZE;
return(c);
}
void main() {
#if defined (USE_EXT)
enable_interrupts(int_ext);
#else
enable_interrupts(int_rda);
#endif
enable_interrupts(global);
printf("\r\n\Running...\r\n");
do {
if(bkbhit) {
putc(bgetc());
}
} while (TRUE);
} |
|
|
peteD
Joined: 22 May 2006 Posts: 5
|
|
|
peteD
Joined: 22 May 2006 Posts: 5
|
definitely not a hardware problem... |
Posted: Thu Jan 17, 2008 8:05 pm |
|
|
If I remove the PIC from the board and jumper B1 and B0 pins together, the data moves through and the output is clean. This eliminates the MAX232 as a possible problem. All it could be in my mind is timing, but how come I can't get even the simplest of software rs232 repeaters to run without having the input corrupted???
such as this:
#include <16F737.h>
#fuses HS,NOWDT
#use delay(clock=20000000)
#use rs232(baud=4800, xmit=PIN_b1, rcv=PIN_b0, ERRORS)
//================================
void main(void)
{
char c;
while(1)
{
c = getc();
putc(c);
}
} |
|
|
Guest
|
No one has a clue? |
Posted: Fri Jan 18, 2008 8:29 am |
|
|
46 people have viewed this problem but not one person has a clue on the problem? |
|
|
SET
Joined: 15 Nov 2005 Posts: 161 Location: Glasgow, UK
|
|
Posted: Fri Jan 18, 2008 8:36 am |
|
|
Code: | void main(void)
{
char c;
while(1)
{
while(!kbhit()); // try adding this
c = getc();
putc(c);
}
} |
I've used the 'software UART' but wait for an incoming char with kbhit - CCS manul says getc *should* wait, but worth a try |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jan 18, 2008 11:51 am |
|
|
Quote: | 46 people have viewed this problem but not one person has a clue on the problem? |
A lot of these 46 people are students. Some of them are 'bots like
Google, scanning the board. While you are making this post, half the
board is still asleep or just getting up in the morning.
Quote: | #use rs232(baud=4800, xmit=PIN_b1, rcv=PIN_b0, ERRORS)
while(1)
{
c = getc();
putc(c);
}
I need both ports running at 4800 baud (GPS application).
The (hardware) UART version works great. The S/W version does not. The output is jibberish. |
Be aware that CCS is doing the most simple type of software UART.
Of the three methods listed on this webpage, CCS is doing #3:
http://www.8052.com/faqs.phtml?FAQ=124758
Iif you have a continuous stream of incoming bytes with no gap
between them, the CCS-type of software UART will fail. While it's
doing the putc(), it can't be doing the getc(). You will lose a character. |
|
|
SET
Joined: 15 Nov 2005 Posts: 161 Location: Glasgow, UK
|
|
Posted: Fri Jan 18, 2008 12:22 pm |
|
|
Quote: | Iif you have a continuous stream of incoming bytes with no gap
between them, the CCS-type of software UART will fail. While it's
doing the putc(), it can't be doing the getc(). You will lose a character. |
Very true - I should have added that I only use the software UART for human command interfaces, where the chars will come in slowly. |
|
|
|
|
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
|