|
|
View previous topic :: View next topic |
Author |
Message |
Leef_me
Joined: 14 Mar 2006 Posts: 45
|
18F26K20: Serial baud rate wrong, maybe OSC too |
Posted: Fri Jun 12, 2009 2:29 am |
|
|
I have started software design and debugging of a new project and a new (for me) PIC... the 18F26K20.
I am using the ICD-U40 and I can confirm that I am able to d/l code, single step and run a program. I am using PCWH 4.093. I am attempting to use the normal serial port for communications. Unfortunately the baud rate is wrong. For example, if I send a U (0x55) I can measure the lows and highs are about 400us long which is about 2500 baud, instead of the expected 2400.
And the above is at OSC frequency of 8mhz
Datasheet says (see below) I should be able to use 1mhz
I would like to run at 9600 baud, but believe I am either coding something wrong, or the part or compiler is not properly responding to my coding. Per the datasheet, it is supposed to be possible. I am using the internal oscillator.
Quote: | TABLE 18-5: BAUD RATES FOR ASYNCHRONOUS MODES (CONTINUED)
SYNC = 0, BRGH = 1, BRG16 = 1 or SYNC = 1, BRG16 = 1
FOSC = 1.000 MHz actual rate 9615 %error 0.16 SPBRGH (decimal) 25 |
Another piece of the puzzle is that, when stopped, the debugging window displays the phrase Ready MCU at 1.00 Mhz.
I am unsure, but I think that frequency should change when I change the OCS value and recompile. It does not.
I have in the main.c
Code: | void main()
{
setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF); |
Code: | WHILE (1)
{
fputc('+',CONSOLE);
} |
in the man.h file
Code: | #include <18F26K20.h>
#device ICD=TRUE
#use delay(clock=8000000)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=CONSOLE,errors)
|
Any suggestions/corrections appreciated, thanks in advance.
Leef_me |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jun 12, 2009 12:14 pm |
|
|
Try a simple test program like this:
Code: | #include <18F26K20.h>
#fuses INTRC_IO,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=8000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,ERRORS)
//=========================================
void main()
{
printf("Hello World\n\r");
while(1);
} |
Also, your posted code has no fuses. The fuses are important.
They tell the compiler how to setup the oscillator registers.
If you have INTRC_IO fuse, the compiler knows that you want to use
the internal oscillator. It also looks at the #use delay() frequency.
With that information, it programs the OSCCON register correctly
in the start-up code.
Let the compiler do it for you. |
|
|
Leef_me
Joined: 14 Mar 2006 Posts: 45
|
|
Posted: Fri Jun 12, 2009 4:12 pm |
|
|
Thanks PCM, the sample code you provided works fine.
I added in the putch 'U' loop, and measured the high and low pulse widths at approx 104us each,
which is the 9615 baud claimed in the datasheet
PCM programmer wrote: | If you have INTRC_IO fuse, the compiler knows that you want to use the internal oscillator. It also looks at the #use delay() frequency. With that information, it programs the OSCCON register correctly in the start-up code.
Let the compiler do it for you. |
I read in the thread "PIC18F2620 Oscillator configuration"
http://www.ccsinfo.com/forum/viewtopic.php?t=39199
Your comment to Simões, ___ Posted: Wed Jun 10, 2009 2:26 pm Quote: | If you have a modern version of the compiler, and if everything is
working correctly with it, then you don't even need a setup_oscillator()
statement. The compiler will look at your fuses and the #use delay()
frequency and it will set up everything correctly.
|
The thing is that the PIC Wizard put the "setup_oscillator() " in my code, I just changed the OSC_?? value.
Thanks again.
Leef_me |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jun 12, 2009 4:17 pm |
|
|
You don't need to use everything that the Wizard puts in. It puts in a lot
of lines that disable peripheral modules that are already disabled upon
power-up of the PIC. |
|
|
Leef_me
Joined: 14 Mar 2006 Posts: 45
|
|
Posted: Fri Jun 12, 2009 6:28 pm |
|
|
Ah yes, now I remember that from times past.
BTW, thanks as well for your patience.
You've probably given similar advice several times before.
And for the next several fellow users who forget to come back and say Eureka & thanks:
Thanks in advance!
Leef_me |
|
|
|
|
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
|