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

PIC 18LF45K22 , UART2 is not working properly

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



Joined: 23 Nov 2010
Posts: 2

View user's profile Send private message

PIC 18LF45K22 , UART2 is not working properly
PostPosted: Tue Nov 23, 2010 1:00 am     Reply with quote

Hi all

I am using the PIC18LF45K22 with UART1 and UART2. The UART1 is connected with my PC, UART2 is used to read the GPS data. I'm using the crystal 16M.
The setting is as below:
Code:

#include <18F45K22.h>   
#include <stdio.h>
#include "string.h"

#fuses HS,INTRC_IO,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=16M)

#use rs232(baud=9600,UART1,parity=N,bits=8,timeout=5,stream=PC)
#use rs232(baud=9600,UART2,parity=N,bits=8,timeout=5,stream=GPS)

#use FAST_IO(A)
#use FAST_IO(B)
#use FAST_IO(C)
#use FAST_IO(D)
#use FAST_IO(E)

//manual setting for the UART2 since it's not working properly
#byte BAUDCON2 = 0xF70
#bit BRG16 = BAUDCON2.3
#bit ABDEN = BAUDCON2.0

#byte RCSTA2 = 0xF71
#bit CREN = 0xF71.5
#bit SPEN = 0xF71.7

#byte TXSTA2 = 0xF72
#bit BRGH = TXSTA2.2
#bit SYNC = TXSTA2.4
#byte SPBRG2 = 0xF75

void main()
{
   char gps_string[200]={0};
   delay_ms(10);
   
   setup_oscillator(OSC_4MHZ | OSC_PLL_ON);
   
   //setup the UART2 manually
   SYNC = 0;
   BRGH = 0;   
   BRG16 = 0;
   SPBRG2 = 25; //baud=9600

   CREN = 0;
   SPEN = 0;
   
   delay_us(100);
   CREN = 1;
   SPEN = 1;
   
   while(1)
  {
     fgets(gps_string,GPS);
     fputs(gps_string,PC);
   }
}


My compiler: PCWHD 4.110
MPLAB 8.56

The UART2 is working but sometimes i get the garbage, for example:
//expected
$GPRMC,064840.00,A,0116.99533,N,10348.84593,E,0.100,,231110,,,A*71
//garbage
$GÂb’ÂbŠ‚b‚ÊbŠšb‚¢b‚ªbbbŠr¢ºb‚ršbŠr’ŠR‚šj
//wrong, not as expected
$G011,22,12,15,320,15,13,09,070,12*7B

However, when I move to use the software-UART by selecting the GPIO pin D4 and D6 (don't use the UART2 anymore), there're no more garbage
Code:
#use rs232(baud=9600,xmit=PIN_D6,rcv=PIN_D4,parity=N,bits=8,timeout=5,ERRORS,stream=GPS)  //test with the IO


The result is very good:
$GPRMC,051009.00,A,0116.99713,N,10348.85047,E,0.187,,231110,,,A*70
$GPGSV,4,2,14,08,31,179,25,09,01,303,,10,59,185,31,13,11,115,25*73
$GPRMC,051010.00,A,0116.99710,N,10348.85045,E,0.106,,231110,,,A*70
...

Anyone got this problem before ?
Or would you please help me to solve this.

Thanks
Andy
temtronic



Joined: 01 Jul 2010
Posts: 9245
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Tue Nov 23, 2010 1:20 pm     Reply with quote

First. add ERRORS to both use RS232(....) functions....

Second. be sure to use MAX232 or equal on serial pins.
andyhuynh273



Joined: 23 Nov 2010
Posts: 2

View user's profile Send private message

PostPosted: Tue Nov 23, 2010 8:07 pm     Reply with quote

Thanks for your reply temtronic. I did try to add ERRORS but no change.
Code:
#use rs232(baud=9600,UART1,parity=N,bits=8,timeout=5,ERRORS,stream=PC)
#use rs232(baud=9600,UART2,parity=N,bits=8,timeout=5,ERRORS,stream=GPS)

I'm using the MAX232 for serial pins. I am so sure about the hardware.
For UART1: xmit:C6, rcv:C7
For UART2: xmit:D6, rcv:D7
Douglas Kennedy



Joined: 07 Sep 2003
Posts: 755
Location: Florida

View user's profile Send private message AIM Address

PostPosted: Wed Nov 24, 2010 8:16 am     Reply with quote

You read data from the GPS into a string and then immediately output the data via a string. The characters in equal the characters out. RS232 is asynchronous. At any any any any time a character can be received! What happens if a character is received while you are transmitting the via fputs.
The PIC is busy sending chars so it can't receive chars. There is if you use a hardware uart a very very small buffer of two chars.
With Rs232 often very little of practical use can be done without an Isr on RDA and a circular buffer. This is especially true of a GPS which squawks long sentences whenever it sees fit.

There are times when a TBE isr is needed (with a circular buffer ) to resolve the blocking action that can occur for lengthy output.
peterpanic



Joined: 05 Apr 2010
Posts: 17
Location: UK

View user's profile Send private message

PostPosted: Sat Dec 04, 2010 11:39 am     Reply with quote

Yes, I have the same problem - just sent trivial "proof" code to support (wish I'd seen your post before spending all that time reducing it)
_________________
- peter -
andrewg



Joined: 17 Aug 2005
Posts: 316
Location: Perth, Western Australia

View user's profile Send private message Visit poster's website

PostPosted: Sat Dec 04, 2010 9:10 pm     Reply with quote

As Douglas Kennedy said above, fgets/fputs isn't going to work. fputs won't return until the entire received data has been transmitted. In that time data will have been received on the other port and been lost. What will probably work is fgetc/fputc:
Code:
fputc(fgetc(GPS),PC);

_________________
Andrew
peterpanic



Joined: 05 Apr 2010
Posts: 17
Location: UK

View user's profile Send private message

PostPosted: Sun Dec 05, 2010 5:24 am     Reply with quote

To clarify my post of 4th December; the problem I confirmed is that the compiler generates bad code for UART2. It accepts that there is a second UART, but doesn't know about the correct addresses, so in setting up the #use RS232 it writes the config data to low RAM (not insurmountable) but when Tx'ing data, it writes that data not to the Rx register but to register 0x02. Then it's crash-time.
_________________
- peter -
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