![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
strumpfm
Joined: 23 Nov 2003 Posts: 7 Location: Seattle, WA
|
16f877 rs232 problem and some Matlab |
Posted: Sun Nov 23, 2003 10:46 pm |
|
|
Hi all- I know this has been brought up a million times before, but it seems like there's one small barrier that everyone needs to get past, and I'm stuck at one.
I'm trying to eventually collect data in matlab to plot off my PIC, but for the time being I would just like to see something in HyperTerm or something. I'm using an 877 with the Tx on pin B7 (pin 2 of serial port) and Rx on B6 (pin 3 of serial port) connected to the computer with a 22k resistor, pin 5 of the serial port grounded, using the internal clock, not an external crystal, and attempting to use software USART. Here's the code that I've been trying:
#include <16F877.h>
#include <String.h>
#include <Math.h>
//#device PIC16F877
//#device adc=10
#FUSES HS,NOWDT,NOPROTECT,NOPUT,BROWNOUT,NOLVP,NOCPD,WRT
#USE DELAY(CLOCK=10000000)
#USE RS232 (BAUD=9600, xmit=PIN_B7, rcv=PIN_B6, PARITY=N, BITS=8,ERRORS, invert)
#byte port_b = 6
#byte port_c = 7
#byte port_d = 8
void output_int(int var);
void cycle();
void clear_out();
void main()
{
int temp;
int i=0;
int toggle=0;
set_tris_b(0x00); //set b as outputs
set_tris_d(0x00); //set d as outputs
delay_ms(50);
do{
for (i=0; i<1000; i++) {
printf( "Hello!" );
} //end for
}while(1);
}
I tried using HyperTerminal set up with 9600 baud, 8 data bits, no parity, stop bits of 1, and hardware flow control. The com port will open, but nothing comes out on the screen. I also tried writing a Matlab function to read in data from the serial port that looks like this:
ser_obj=serial('COM2','baudrate',9600);
fopen(ser_obj);
rctime=fscanf(ser_obj,'%s'); % receive sensor data
fclose(ser_obj);
y=rctime;
I don't know if any of you know Matlab serial interfacing well, but I just keep getting a message saying "Warning: The input buffer was filled before the Terminator was reached."
Am I overlooking something really basic? Any little bits of guidance would be greatly appreciated. Thanks,
Mike |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Nov 24, 2003 12:25 am |
|
|
Code: | using the internal clock, not an external crystal |
Just to clarify, does this statement refer to the A/D clock,
or are you actually running the 16F877 without any crystal
connected to it ? |
|
![](templates/subSilver/images/spacer.gif) |
strumpfm
Joined: 23 Nov 2003 Posts: 7 Location: Seattle, WA
|
|
Posted: Mon Nov 24, 2003 3:41 am |
|
|
PCM programmer wrote: |
Just to clarify, does this statement refer to the A/D clock,
or are you actually running the 16F877 without any crystal
connected to it ? |
All I had used a PIC for before was A/D, so that is what I'm referring to. As you can see, I'm not really familiar with using an external clock. Are there any frequencies or part numbers that people are fond of for rs232? Do you need extra code to set bits to use the external clock, or is it just expected in the #use command that an external clock is used. Is the XP type crystal/resonator the best to use (compared to a low power crystal, high speed crystal, or capacitor/resistor)? Thanks for the reply, I'll do some more forum searching.
Mike |
|
![](templates/subSilver/images/spacer.gif) |
Pete Smith
Joined: 17 Sep 2003 Posts: 55 Location: Chester, UK
|
Re: 16f877 rs232 problem and some Matlab |
Posted: Mon Nov 24, 2003 4:13 am |
|
|
strumpfm wrote: | Hi all- I know this has been brought up a million times before, but it seems like there's one small barrier that everyone needs to get past, and I'm stuck at one.
I'm trying to eventually collect data in matlab to plot off my PIC, but for the time being I would just like to see something in HyperTerm or something. I'm using an 877 with the Tx on pin B7 (pin 2 of serial port) and Rx on B6 (pin 3 of serial port) connected to the computer with a 22k resistor, pin 5 of the serial port grounded, using the internal clock, not an external crystal, and attempting to use software USART.
I tried using HyperTerminal set up with 9600 baud, 8 data bits, no parity, stop bits of 1, and hardware flow control. The com port will open, but nothing comes out on the screen. I also tried writing a Matlab function to read in data from the serial port that looks like this:
Am I overlooking something really basic? Any little bits of guidance would be greatly appreciated. Thanks,
Mike |
What does your PC end of the cable look like?
I always connect together pins 7 & 8 on the D type shell I plug into the serial port (or serial port extension), otherwise the flow control gets a bit messed up. For some reason, I also seem to connect pins 5 & 9 and 1 & 6. Can't think why though!
I would also (personally) use a hardware UART and use a hardware level switcher. I find the hardware UART much more reliable than the software ones.
Finally, I never touch Hyperterm with someone elses 10 foot pole. I always use Teraterm instead.
HTH
Pete. |
|
![](templates/subSilver/images/spacer.gif) |
TSchultz
Joined: 08 Sep 2003 Posts: 66 Location: Toronto, Canada
|
|
Posted: Mon Nov 24, 2003 5:52 am |
|
|
For RS-232 to work reliably the baud rate has to be maintained within +/-3% at both ends. You should be using an external crystal, some of the ceramic resonators are OK as well. Then you need to pick a crystal frequency that minimizes the errors for the baud rate you want to use, a frequency easily divisible by powers of 2 are the best. Check the data sheet and read the section on the USART, you will find most of the details you need in there.
Next you should always use a hadware level shift device for the RS-232 signals, they are supposed to be bipolar 12V signals. Although many devices will accept unipolar low level signals you are not guaranteed of this. Use a MAX232 or one of the many equivalent parts and things will be much more reliable.
Also use the hardware USART on the PIC16F877, it will be much more reilable than the software one you are currently using. Most of the problems people encounter with the RS-232 is not understanding the interface. Using the hardware USART and the hardware level shifting takes most of the guesse work out.
Start of with a simple "Hello world" before you start sending data. If you can't send a simple string then you won't be able to send data.
If you search this forum you should find a great deal of information on the subject. |
|
![](templates/subSilver/images/spacer.gif) |
rwyoung
Joined: 12 Nov 2003 Posts: 563 Location: Lawrence, KS USA
|
Re: 16f877 rs232 problem and some Matlab |
Posted: Mon Nov 24, 2003 8:39 am |
|
|
strumpfm wrote: | I tried using HyperTerminal set up with 9600 baud, 8 data bits, no parity, stop bits of 1, and hardware flow control. The com port will open, but nothing comes out on the screen. |
You don't have the CTS, RTS etc pins hooked up and driven in your connector so hardware flow control probably won't work. Flow control should be set to "none".
Also, just like all the other posts say, use the hardware USART and a level converter chip like the MAX232 or cousins or the DS1275. Some PCs work OK with the resistor trick but just as many or more won't. _________________ Rob Young
The Screw-Up Fairy may just visit you but he has crashed on my couch for the last month! |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Nov 24, 2003 12:55 pm |
|
|
Quote: | All I had used a PIC for before was A/D, so that is what I'm referring to. As you can see, I'm not really familiar with using an external clock. Are there any frequencies or part numbers that people are fond of for rs232? Do you need extra code to set bits to use the external clock, or is it just expected in the #use command that an external clock is used. Is the XP type crystal/resonator the best to use (compared to a low power crystal, high speed crystal, or capacitor/resistor)? Thanks for the reply, I'll do some more forum searching. |
Based on the above, I'll assume that you don't have a crystal on your
PIC.
You're running at 9600 baud. Probably the minimum crystal freq you
should use for that would be 4 MHz, at least with the hardware USART.
I mention that, because for some reason you're not using the hardware
USART. If possible, you should do so. It's on pins C6 and C7.
Here is the setup for that:
Code: | #include <16F877.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
#use rs232(baud = 9600, xmit=PIN_C6, rcv = PIN_C7, ERRORS) |
Note that XT mode is used with a 4 MHz crystal.
With regard to part numbers, you need a parallel resonant crystal.
Digikey p/n X405 would work. That's made by ECS.
I believe the recommended capacitors for a 4 MHz oscillator on the PIC
are 15 pf. If you only have 22 pf in stock, those would work OK.
Here is the Digikey page for that crystal. Click on Catalog / Technical
information to get the specs.
http://www.digikey.com/scripts/DkSearch/dksus.dll?Detail?Ref=90219&Row=382897&Site=US |
|
![](templates/subSilver/images/spacer.gif) |
strumpfm
Joined: 23 Nov 2003 Posts: 7 Location: Seattle, WA
|
|
Posted: Mon Nov 24, 2003 2:04 pm |
|
|
Thanks for all of your help, I certainly know more now. After realizing that using a resistor for driving the clock isn't accurate enough, I was able to get an XTAL-20MHz crystal. I've been coming up dry when searching for info on these crystals, though. Do these crystals have a polarity? I've seen designs that have both ends of a crystal tied to ground, and the inputs in OSC1 and OSC2. Most ranges that I've seen for capacitance were between 15 and 30 pf. I had some 22pF capacitors, so I connected them up, but wasn't able to get oscillation. Is that how you are supposed to connect up the oscillator? One should be able to hook up a scope and view the oscillation at OSC1, right? Thanks again,
Mike |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Nov 24, 2003 2:34 pm |
|
|
Look at the following schematic. Zoom in on the crystal circuit
on the left side of the 16F877. Do you have your board wired
in the same way ?
http://www.melabs.com/downloads/labx2sch.pdf
Also, since you're using a 20 MHz crystal, you need to use HS mode,
and you need to set the #use delay value to 20 MHz. Example:
#include <16F877.H>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 20000000)
#use rs232(baud = 9600, xmit=PIN_C6, rcv = PIN_C7, ERRORS) |
|
![](templates/subSilver/images/spacer.gif) |
strumpfm
Joined: 23 Nov 2003 Posts: 7 Location: Seattle, WA
|
|
Posted: Mon Nov 24, 2003 2:45 pm |
|
|
Thanks for the link, that is a great diagram. That is how I have my crystal set up. You can only view the output of a crystal if it has a load on it, right? Time for more snooping.
Mike |
|
![](templates/subSilver/images/spacer.gif) |
strumpfm
Joined: 23 Nov 2003 Posts: 7 Location: Seattle, WA
|
|
Posted: Mon Nov 24, 2003 4:24 pm |
|
|
I think that I'm confused about how the crystal operates. I had a basic led test working previously with just a resistor for the clock, but with the crystal set up as in the previous .pdf file, I'm not seeming to get any clock, so none of my program is working. Here is the code that i'm running, but I don't think the code really effects clock generation. Do I need to specify any bits set to use a crystal instead of a resistor?
Code: | #include <16F877.h>
#include <String.h>
#include <Math.h>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
#byte port_b = 6
#byte port_c = 7
#byte port_d = 8
void main()
{
int temp;
int i=0;
int toggle=0;
set_tris_b(0x00); //set b as outputs
set_tris_d(0x00); //set d as outputs
delay_ms(50);
do{
delay_ms(50);
for (i=0; i<30; i++)
{
toggle=!toggle;
output_bit(PIN_d0,toggle);
output_bit(PIN_d1,toggle);
output_bit(PIN_d2,toggle);
output_bit(PIN_d3,toggle);
output_bit(PIN_d4,toggle);
output_bit(PIN_d5,toggle);
output_bit(PIN_d6,toggle);
output_bit(PIN_d7,toggle);
}
}while(1);
} |
Thanks again,
Mike |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Nov 24, 2003 4:40 pm |
|
|
That isn't really a simple LED test. The following code is a simple
LED test.
Before, you said that you found a 20 MHz crystal, and some 22 pf
capacitors. But the code you posted is setup for a 4 MHz crystal.
Do you know why ?
If you have a 20 MHz crystal, please use the following code, verbatim.
Code: | #include <16F877.h>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 20000000)
void main()
{
while(1)
{
output_low(PIN_D0);
delay_ms(500);
output_high(PIN_D0);
delay_ms(500);
}
} |
|
|
![](templates/subSilver/images/spacer.gif) |
strumpfm
Joined: 23 Nov 2003 Posts: 7 Location: Seattle, WA
|
|
Posted: Mon Nov 24, 2003 11:22 pm |
|
|
PCM programmer wrote: |
Before, you said that you found a 20 MHz crystal, and some 22 pf
capacitors. But the code you posted is setup for a 4 MHz crystal.
Do you know why ?
|
That was a mistake on my part which I didn't realize until about an hour after posting, and I wasn't near a computer at the time. I had started typing up a response, and took a break from the computer to go get a 4 MHz crystal to see if it would respond in the same way as the 20 MHz crystal. So, I changed my code, and forgot to update.
I ran the code that you gave, but I don't think that my problem lies in the code, I think it is mostly a crystal problem. I can't seem to view any sort of waveform at the clock inputs on the PIC from the crystal, and I think this is causing the PIC to be non-functional. Here is a picture of my circuit setup: http://students.washington.edu/strumpfm/crystal_setup.GIF. I thought that I had it set up as in the link you sent before, but the crystal still seems to not be doing anything. Is using an oscillator with a TTL output advised against? Thanks again,
Mike |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Nov 25, 2003 2:06 am |
|
|
1. In your schematic, I don't see any connection to the MCLR pin.
That pin should be connected to VDD. In some cases a resistor
to VDD is recommended. What are you using as a programmer ?
2. Your schematic shows a battery as the power supply. What's the
voltage ?
If you're running at less than 5 volts, there are other issues
that become important. For example, say you're running
at 3.3 volts. Then you can't enable the Brownout feature.
That's because it triggers a reset if the voltage falls below
approximately 4.0 volts.
Also, there are limitations on the oscillator frequency, based on
the Vdd voltage. Vdd must be at least 4.5v for 20 MHz operation.
During these tests, you should be using a +5v regulated power
supply. It would make things a lot easier. |
|
![](templates/subSilver/images/spacer.gif) |
adrian
Joined: 08 Sep 2003 Posts: 92 Location: Glasgow, UK
|
|
Posted: Tue Nov 25, 2003 6:41 am |
|
|
If you have wired it as per your drawing, your LED is in back to front |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|