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

Serial comm baud 57600
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Vefa
Guest







Serial comm baud 57600
PostPosted: Mon Feb 05, 2007 5:15 pm     Reply with quote

Hi Everyone,

I am trying to communicate (serial) with an IMU. When I connect the IMU to hyperterminal I can see the menu and activate and use it. However when I use an 18F8722 pic to communicate with it I read a nonsense string.
IMU's baud rate is set to 57600. The crystal is 10MHz. I can't change the baud rate of the IMU. Below is my code.
Does anyone have an idea why I can't read the correct data?

Thanks,

#include <18F8722>
#include <24515.c>
#include <stdlib.h>
#include <math.h>

#define LED PIN_F0

#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP
#use delay(clock=10000000)
#use rs232(baud=57600, xmit=PIN_G1, rcv=PIN_G2, stream=imu, DISABLE_INTS)
#use rs232(baud=57600, xmit=PIN_A4, rcv=PIN_A5, stream=PC, DISABLE_INTS)


main()
{

while(1)
{
c = fgetc(imu);
fputc(c,PC);
}

} // end of main
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Mon Feb 05, 2007 5:57 pm     Reply with quote

You're using a soft UART for the PC stream. Your Tx pin is on pin A4,
which is an open-drain output. Do you have a pull-up resistor on that
pin ? You need one. Something between 1K and 4.7K will work.


Also, when you post code, select the tickbox to Disable HTML.
Notice how two of your #include files are missing ? That's because
HTML is enabled. Also, it's best to put the code in a Code block,
to preserve the formatting.
Vefa
Guest







PostPosted: Tue Feb 06, 2007 3:34 pm     Reply with quote

Even though I am still having problem, your information was very useful. I swithced to D1 and D2 instead of using A4 and A5. Thank you very much.
Vefa
Guest







Hardware interrupt
PostPosted: Wed Feb 07, 2007 9:08 am     Reply with quote

Ok. Now I can read meaningful data. However this time I am missing some data. In order not to miss data I tried hardware interrupt. Somehow I can't get it working. Does anyone have an idea why it does not work with hardware interrupt?

The code that works:

Code:
 
#include <18F8722.H>
#include <24515.c>
#include <stdlib.h>
#include <math.h>

#define LED PIN_F0

#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP
#use delay(clock=10000000)
#use rs232(baud=57600, xmit=PIN_G1, rcv=PIN_G2, stream=imu, DISABLE_INTS)
#use rs232(baud=57600, xmit=PIN_D1, rcv=PIN_D2, stream=PC, DISABLE_INTS)

main()
{
      
   char c;

   while(1)
   {
      
      c = fgetc(imu);
      fputc(c, PC);
      
   }

} // end of main



The code that does not work:



Code:


#include <18F8722.H>
#include <24515.c>
#include <stdlib.h>
#include <math.h>

#define LED PIN_F0

#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP
#use delay(clock=10000000)
#use rs232(baud=57600, xmit=PIN_G1, rcv=PIN_G2, stream=imu, DISABLE_INTS)
#use rs232(baud=57600, xmit=PIN_D1, rcv=PIN_D2, stream=PC, DISABLE_INTS)

#INT_RDA2 // RS232 interrupt
void dataRda_isr(void)
{
   char c;
   c = fgetc(imu);
   fputc(c,PC);

}


void main()
{

   enable_interrupts(GLOBAL);
   enable_interrupts(INT_RDA2);

   while(1)
   {
      output_high(LED);
      delay_ms(200);
      output_low(LED);
      delay_ms(200);
   }

} // end of main


I tried also the following:


enable_interrupts(INT_RDA2);
enable_interrupts(GLOBAL);

Thanks bunch

Vefa
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed Feb 07, 2007 12:44 pm     Reply with quote

Post your compiler version.
ckielstra



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

View user's profile Send private message

PostPosted: Wed Feb 07, 2007 1:02 pm     Reply with quote

Why do you continue to use a software UART when you have a chip with 2 hardware UARTS? Hardware UARTS will give a lot less problems than the software based UARTS, especially for the higher baudrates like 57600 you are using.

My suggestion is that you move the software UART on pins D1 and D2 to the hardware UART on C6 and C7.
Guest








was away
PostPosted: Sat Feb 10, 2007 12:41 pm     Reply with quote

My compiler version is 4.
I tried using C6 & C7 instead of D1 & D2 without doing any hardware interrupt. The code that worked with D1 & D2 now outputs some weird characters.
ckielstra



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

View user's profile Send private message

PostPosted: Sat Feb 10, 2007 5:49 pm     Reply with quote

Strange that you have these errors when using two hardware UARTS.
Try the program below and tell us if you still receive garbage. Note that I removed the DISABLE_INTS keyword as it has little use for hardware UARTS. I also added the ERRORS directive which will clear a possible hardware stall on receive buffer overflow.

Code:
#include <18F8722.H>
#fuses HS,NOWDT,NOPROTECT,PUT,NOLVP
#use delay(clock=10000000)

#use rs232(baud=57600, xmit=PIN_G1, rcv=PIN_G2, stream=imu, ERRORS)
#use rs232(baud=57600, xmit=PIN_C6, rcv=PIN_C7, stream=PC, ERRORS)

main()
{
   char c;

   while(1)
   {
      c = fgetc(imu);
      fputc(c, PC);
   }
}


Which terminal program are you using? Hyperterm has caused me a lot of headaches.
Vefa
Guest







PostPosted: Mon Feb 12, 2007 4:59 pm     Reply with quote

ckielstra, I tried your code. I also connected a pull up resistor to A4. Both give the following output:

Quote:


�������������K��}�����ege{���K��}���������������K��}���������������K��}���������
������K��}���������������K��}���������������K��}�������������K��}���������������
K��}���������������K��}���������������K��}�������������c��^���������������K��}��
�������������K��}���������������K��}���������������Ky_{�������������K��}��������
�������K��}���������������K��}���������������K��}�������������K��}��������������
�K��}���������������K��}���������������K��}����﫝������K��}���������������K��}�
��������������K��}���������������K��}�����egf{���K��}���������������K��}��������
�������K��}���������������K��}���������������K��}���������������K��}������������
�K��}���������������K��}���������������K��}���������������K��}��������������j�}�
��������������K��}���������������K��}���������������K��}���������������Ky



I am using a MAX235CPG
.
When I connect the IMU to a MAX233 directly and connect max233 to my serial port this is what I get:

Quote:

A 510 515 519Z
A 512 513 519Z
A 510 513 515Z
A 512 512 519Z
A 510 519 519Z
A 512 515 521Z
A 510 515 519Z
A 512 513 521Z
A 510 515 519Z
A 512 512 522Z
A 510 515 519Z
A 512 512 523Z


The funny thing is that when I connect the serial pins in reverse order, this is what I get

Quote:

A 512 513 524Z
A 510 MLMB*19Z
A 512 512 519Z
A 510 519 519Z
A 512 513 523Z
A 510 51B*19Z
A 512 521Z
A 508 515 519Z
A 512 513 524Z
A 510 519 519Z
B*12 512 519Z


I got the same result before when I was messing with a software UART and using "invert". So I guess, i need to invert the imu output or something.

Any comments?

How can I invert a hardware UART?

Thanks a lot
Vefa
Guest







PostPosted: Mon Feb 12, 2007 5:08 pm     Reply with quote

I was referring to the PC's serial pins for the last output.
ckielstra



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

View user's profile Send private message

PostPosted: Mon Feb 12, 2007 5:35 pm     Reply with quote

What is the (output) voltage of the IMU? 3.3V or 5V?
What voltage is your PIC running at?

Inverting the output of a hardware UART can only be done by adding an external hardware inverter. This shouldn't be nescessary.
Ttelmah
Guest







PostPosted: Tue Feb 13, 2007 4:06 am     Reply with quote

Are you sure the 'IMU', uses RS232?...
I have a strong suspicion, that it uses RS485 instead. This would explain the inverted data when the pins were swapped. A normal RS232 device should give _nothing_ in this condition. RS485, is the more common industrial bus.
RS485, is a differential 'pair', whch needs the following things to work:
1) Connection 'A', goes to connection 'A' on each device.
2) Connection 'B' goes to connection 'B' on each device. Reversing these will result in garbaged start bits, and semi 'inverted' data, which is what you are seeing...
3) Signal termination at each end of the wire pair (normally nominally 100R, depending on the impedance of the cable).
4) Signal _bias_ applied to the bus. Some driver chips do this automatically, but if this is not done, garbage will be received, when the bus is allowed to float between transmissions.

Best Wishes
Vefa
Guest







PostPosted: Tue Feb 13, 2007 9:32 am     Reply with quote

It is RS232.
I just used an oscilloscope to compare the TX and RX signal levels of the MAX233 and PIC+MAX235 circuits. When I use MAX233 alone the RX pin is a +/-10V pwm and TX pin is a -10V DC. When I use the circuit with the PIC and MAXIM235 RX is -6/+7V pwm, and TX is around -10V.
Vefa
Guest







PostPosted: Tue Feb 13, 2007 10:44 am     Reply with quote

Both PIC and IMU is 5V.
Ttelmah
Guest







PostPosted: Tue Feb 13, 2007 10:55 am     Reply with quote

What is the part number of the IMU?.
How is the ground connected?.
The fact that data is seen, when the RX and RX pins are swapped, says that something has to be wrong with the wiring somewhere....

Best Wishes
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
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