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

Setting Baud rate for Pic18f4550
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
Krazzy7434



Joined: 21 Aug 2014
Posts: 39
Location: India

View user's profile Send private message

Setting Baud rate for Pic18f4550
PostPosted: Sun Oct 19, 2014 4:56 am     Reply with quote

Hello guys....
Today i m having a new Problem.....

Here is my code::

Code:


#include <18f4550.h>
#use delay(clock=16000000)
#fuses HS, PLL4, CPUDIV1, USBDIV, NOWDT, NOPROTECT, BROWNOUT, NOLVP, PUT, MCLR,PUT
#use rs232(baud=9600,xmit=PIN_C6,parity=N,rcv=PIN_C7,bits=8,ERRORS)
#include <flex_lcd216.c>

void main()             
{                 
delay_ms(500);
lcd_init();                             
lcd_setcursor_vb(1,1);
printf(lcd_putc,"\f ");
lcd_gotoxy(1,1);
delay_ms(10);
printf(lcd_putc,"WELCOME");
delay_ms(10);
int Val=0x55;
for(;;)
{
delay_ms(200);
printf("%x",Val);
delay_ms(1700);
output_toggle(PIN_E1);
delay_ms(100);
}

}



I want to transmit 0x55 serially to my pc...i m using teal term in my pc..
But instead of getting binary 01010101, i m getting output like this::



I m using a Crystal of 16 Mhz....i also set the fuses in such a way that controller has a 16 Mhz clock...

I dont know what is my problem...plz help....

Thank You...
_________________
Krazzy7434
temtronic



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

View user's profile Send private message

PostPosted: Sun Oct 19, 2014 5:17 am     Reply with quote

obvious question
.... do you have a 'MAX232' interface chip between the PIC and the PC if using a real RS232 comport ?
Proper 3 wire connections from MAX232 to PC.DE-2 is PC rcv, DE-3 is xmt,DE-5 is ground.

You should tell us what hardware you're using.

Need a bit more info here.

I do use Real Term and 4550s so I know is will work....

Jay
Krazzy7434



Joined: 21 Aug 2014
Posts: 39
Location: India

View user's profile Send private message

PostPosted: Sun Oct 19, 2014 6:05 am     Reply with quote

temtronic wrote:
obvious question
.... do you have a 'MAX232' interface chip between the PIC and the PC if using a real RS232 comport ?
Proper 3 wire connections from MAX232 to PC.DE-2 is PC rcv, DE-3 is xmt,DE-5 is ground.

You should tell us what hardware you're using.

Need a bit more info here.

I do use Real Term and 4550s so I know is will work....

Jay


Hello Temtronic..
Sorry for missing that...i dont use max232 chip....instead i use a transistor based rs232 for communication...

Thank You...
_________________
Krazzy7434


Last edited by Krazzy7434 on Sun Oct 19, 2014 6:09 am; edited 1 time in total
dyeatman



Joined: 06 Sep 2003
Posts: 1934
Location: Norman, OK

View user's profile Send private message

PostPosted: Sun Oct 19, 2014 6:08 am     Reply with quote

Another comment, the Fuses line should always be above the #use delay so it should look like this:

Code:
#include <18f4550.h>
#fuses HS, PLL4, CPUDIV1, USBDIV, NOWDT, NOPROTECT, BROWNOUT, NOLVP, PUT, MCLR,PUT
#use delay(clock=16000000)
#use rs232(baud=9600,xmit=PIN_C6,parity=N,rcv=PIN_C7,bits=8,ERRORS)

You are setting your use delay value before you establish your clock source and multiplier.
_________________
Google and Forum Search are some of your best tools!!!!
Krazzy7434



Joined: 21 Aug 2014
Posts: 39
Location: India

View user's profile Send private message

PostPosted: Sun Oct 19, 2014 6:18 am     Reply with quote

dyeatman wrote:
Another comment, the Fuses line should always be above the #use delay so it should look like this:

Code:


include <18f4550.h>
#fuses HS, PLL4, CPUDIV1, USBDIV, NOWDT, NOPROTECT, BROWNOUT, NOLVP, PUT, MCLR,PUT
#use delay(clock=16000000)
#use rs232(baud=9600,xmit=PIN_C6,parity=N,rcv=PIN_C7,bits=8,ERRORS)

You are setting your use delay value before you establish your clock source and multiplier.


That was careless mistake by me...i now corrected my code:

Code:

#include <18f4550.h>
#fuses HS, PLL4, CPUDIV1,NOWDT, NOPROTECT, BROWNOUT, NOLVP, PUT, MCLR,PUT
#use delay(clock=16000000)
#use rs232(baud=9600,xmit=PIN_C6,parity=N,rcv=PIN_C7,bits=8,ERRORS)
#include <flex_lcd216.c>

void main()             
{                 
delay_ms(500);
lcd_init();                             
lcd_setcursor_vb(1,1);
printf(lcd_putc,"\f ");
lcd_gotoxy(1,1);
delay_ms(10);
printf(lcd_putc,"WELCOME");
delay_ms(10);
int Val=0x55;
for(;;)
{
delay_ms(200);
printf("%x",Val);
delay_ms(1700);
output_toggle(PIN_E1);
delay_ms(100);
}

}





but still no change output...also i have random delay between each byte reception ...some times long...sometimes short....
_________________
Krazzy7434
ezflyr



Joined: 25 Oct 2010
Posts: 1019
Location: Tewksbury, MA

View user's profile Send private message

PostPosted: Sun Oct 19, 2014 6:23 am     Reply with quote

Hi,

Have you actually read the 'oscillator configuration! Section of the PIC 18F4550 datasheet?

Repeat after me "always do a 1Hz LED flasher test anytime you suspect your PIC is not running at the correct speedy"

Do that, and come back and tell us your results! Engage your brain, and then we'll help you try to solve this issue.

BTW, there are many threads on the forum covering this exact issue! Did you spend any time looking?

John
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Sun Oct 19, 2014 9:09 am     Reply with quote

He has two separate issues:

1) The printf specifier is wrong for what he wants to send. %c needed not %x.
2) Clock rate. As ezflyr says, always test your actual clock rate _first_.
I'd actually suspect you may have a problem with the crystal not starting, so the chip is intermittently running off the internal oscillator.

Separately, stick to the C standard of declaring variables at the start of code sections. Though CCS 'allows' mid code declarations, it has the habit of causing problems...
Krazzy7434



Joined: 21 Aug 2014
Posts: 39
Location: India

View user's profile Send private message

PostPosted: Sun Oct 19, 2014 11:50 am     Reply with quote

Ttelmah wrote:
He has two separate issues:

1) The printf specifier is wrong for what he wants to send. %c needed not %x.
2) Clock rate. As ezflyr says, always test your actual clock rate _first_.
I'd actually suspect you may have a problem with the crystal not starting, so the chip is intermittently running off the internal oscillator.

Separately, stick to the C standard of declaring variables at the start of code sections. Though CCS 'allows' mid code declarations, it has the habit of causing problems...


Hi Ttelmah..

I change %x to %c....
I didn't get what do you mean by 1 Hz led flasher....
Are you saying that i should flash an led for 1 sec and turn it off...and measure the time...if so should i set my clock using trial and error method..???

Thank You....
_________________
Krazzy7434
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Sun Oct 19, 2014 11:56 am     Reply with quote

The flash an LED test, is the most basic way of checking that your oscillator s running at the speed you think it is. The xx50 chips are more critical than their older brethren on crystals being the right type to actually work. Often a parallel resistor is needed to make them start properly.
Key is that when you have a timing problem, always start by checking the chip is running at the speed you expect, before wasting time on other things.
Krazzy7434



Joined: 21 Aug 2014
Posts: 39
Location: India

View user's profile Send private message

PostPosted: Sun Oct 19, 2014 12:32 pm     Reply with quote

Ttelmah wrote:
The flash an LED test, is the most basic way of checking that your oscillator s running at the speed you think it is. The xx50 chips are more critical than their older brethren on crystals being the right type to actually work. Often a parallel resistor is needed to make them start properly.
Key is that when you have a timing problem, always start by checking the chip is running at the speed you expect, before wasting time on other things.


hi Ttelmah..
I got it. But i dont know what is this led flasher..
Are you saying than i should turn on and off an led with 1000ms delay with different clock frequency.....
Also my board comes with an inbuilt 16mhz crystal...i bought it from a local store...so i don't have it version also...
Are you saying that i should edit the board...???

Thank You...
_________________
Krazzy7434
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Sun Oct 19, 2014 1:46 pm     Reply with quote

The flash an LED test, has been mentioned here literally thousands of times. It is a _test_. If you put 'delay_ms(1000)' in your code, that delay is dependant on the actual clock settings and crystal. It is a way of checking that the chip is running at the speed you expect. If it doesn't, the actual result, will often tell you what is wrong. If (for instance) it gives a 2 second delay, then you are looking at finding 'how' the chip can get 8MHz, not the 16 you expect.

Do a search. You'll find it mentioned here many times. It is so common and important, that the CCS 'wizard' even has an option to generate the code....
Krazzy7434



Joined: 21 Aug 2014
Posts: 39
Location: India

View user's profile Send private message

PostPosted: Tue Oct 21, 2014 7:34 am     Reply with quote

Hello friends....
Sorry for the late reply...
I tried Led Flash test....here is the code i used for led test..I hope it correct...make me corrected if wrong

Code:


#include <18F4550.h>
#fuses HS, PLL4, CPUDIV1, NOWDT, PUT ,BROWNOUT, NOLVP
#use delay(clock=32000000)

//============================
void main()
{
int i;
for(i=0;i<=9;i++)
  {
   output_high(PIN_E1);
   delay_ms(500);
   output_low(PIN_E1);
   delay_ms(500);
  }

}



for 16Mhz clock it takes 10.01 seconds from i=0 to i=9 ....,
i used a stopwatch to measure the time.....
now what should i do to calculate the exact baud rate plzz help....
Thank You...
_________________
Krazzy7434
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Tue Oct 21, 2014 7:44 am     Reply with quote

Er. CLOCK=32MHz, is an impossible value for the HS oscillator.
Maximum this supports is 25MHz.

If this is giving the correct times, it implies your chip is not running as you think it is. This is not a software fix, but says something is wrong with your hardware.

We did not want you to fiddle around changing the clock value, but just report what the routine gives.

However, you speak about your crystal being fitted by a local supplier, Does the board you have, have a part number, or a data sheet somewhere?.
If not, a good photograph of the board?.

The behaviour you have is classic for the crystal being too high gain, and overdriven by the PIC. It can be fixed by adding a serial resistor to the crystal to reduce the drive, but if this is a supplied board, you should not be having to do this.
Krazzy7434



Joined: 21 Aug 2014
Posts: 39
Location: India

View user's profile Send private message

PostPosted: Tue Oct 21, 2014 8:52 am     Reply with quote

Ttelmah wrote:
Er. CLOCK=32MHz, is an impossible value for the HS oscillator.
Maximum this supports is 25MHz.

If this is giving the correct times, it implies your chip is not running as you think it is. This is not a software fix, but says something is wrong with your hardware.

We did not want you to fiddle around changing the clock value, but just report what the routine gives.

However, you speak about your crystal being fitted by a local supplier, Does the board you have, have a part number, or a data sheet somewhere?.
If not, a good photograph of the board?.

The behaviour you have is classic for the crystal being too high gain, and overdriven by the PIC. It can be fixed by adding a serial resistor to the crystal to reduce the drive, but if this is a supplied board, you should not be having to do this.


Very sorry Ttelmah...actually that was a careless mistake by me...
actually its works very well on 16Mhz clock..i accidently post the wrong code...
This is my actual code::

Code:


#include <18F4550.h>
#fuses HS, CPUDIV1, NOWDT, PUT ,BROWNOUT, NOLVP
#use delay(clock=16000000)

//============================
void main()
{
int i;
for(i=0;i<=9;i++)
  {
   output_high(PIN_E1);
   delay_ms(500);
   output_low(PIN_E1);
   delay_ms(500);
  }

}



i was checking with each clock frequency..and accidently posted wrong code..sorry for that....
_________________
Krazzy7434
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Tue Oct 21, 2014 9:24 am     Reply with quote

In which case it should work. With %c, instead of %x, it should send the 55 byte as expected. If it doesn't you need to be looking at the serial connection, not at the PIC clock.
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