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

Oscillator timings

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



Joined: 09 Nov 2014
Posts: 26
Location: Ireland

View user's profile Send private message

Oscillator timings
PostPosted: Wed Dec 03, 2014 7:44 am     Reply with quote

Hi everyone, I am looking for a bit of help with internal/external oscillator timings. I done a few tests and I am a little confused with the speed my pic is running at. I am using a PIC25HJ128GP502 with PCD version 4.140 which according to the datasheet it can run at up to 80MHz/40MIPS. I am using the directive #use delay to set up the internal and external oscillators and didn't bother with setting any oscillator fuses. From the data sheet, it says that the instruction execution speed or device operating frequency, FCY = Fosc/2. I have setup a while(true) loop with output_toggle(pin_b5) inside to view the time on the oscilloscope so I can measure the frequency. So, a few test runs.

When i used;
#use delay(CLOCK=7370000) and #use delay(INTERNAL=4M) i got the same result, the high period on pin b5 was approx 0.5uS = 2MHz. This was nearly 4 times less than 7370000 and 2 times less than 4MHz.
When I used;
#use delay(internal=16M) and #use delay(CLOCK=16M, CRYSTAL=16M) i got the same result again with the high period on pin b5 approx 0.5uS = 2MHz for both. This now is a divide by 8 reduction for both.
With crystal set to 16MHz and clock set to 20M, 40M and 80M I got approx 2.5MHz, 5MHz and 10MHz respectively on pin b5 which is a divide by 8 reduction for each.
With internal set to 20M, 40M and 80M I got the same as above, approx 2.5MHz, 5MHz and 10MHz respectively on pin b5 which is a divide by 8 reduction.

What i thought would happen is for example when I used #use delay(CLOCK=80M, CRYSTAL=16M), there would be a divide by 2 reduction to 40MHz per instruction giving the 40MIPS. I tried reading Microchips data sheet regarding this PIC24 but I find it quite hard to read and understand at times. Can somebody please point me in the right direction because I am a little confused. Thanks in advance.
_________________
Liam Hanmore
Ttelmah



Joined: 11 Mar 2010
Posts: 19539

View user's profile Send private message

PostPosted: Wed Dec 03, 2014 8:22 am     Reply with quote

Seriously, to do timings, use longer times.

Problem is that turning a pin on, takes more than one instruction. The loop also takes time.
A loop like:
Code:

   while(TRUE)
      output_toggle(PIN_B5);

Codes as three instructions, taking four instruction times (on a DsPIC a jump takes two instruction times).
However on a PIC18 it takes six instruction times. etc..
Makes it very hard to work out what is happening.

You actually have to take the code apart to work out what timings to expect for a given instruction rate.
However:
Code:

    while(TRUE)
    {
        delay_ms(1);
        output_toggle(PIN_B5);
    }

Should give nice 1mSec long high and lows, which are easy to look at on a scope. The error becomes tiny.
Without a scope, using 1second delays or even more makes it possible to use a stopwatch.

Now your crystal frequencies are spot on. 16MHz, = 8MIPS. 4 instructions per loop = 2MHz.
Similarly with the 80MHz, you are then at 40MIPS, and the loop will be at 10MHz.

Now the only place things are failing is when you try to go slow. With 'Internal=4MHz', this can't be done, so the clock fails to the default 7.37MHz rate.
Liam_85



Joined: 09 Nov 2014
Posts: 26
Location: Ireland

View user's profile Send private message

PostPosted: Wed Dec 03, 2014 10:44 am     Reply with quote

Thanks Ttelmah, I was going on the advice of my lecturer with that method of delay. I think maybe i misinterpreted the meaning of MIPS. I assumed 1MIPS was a million instructions per second like output_low(pin_b5), output_high(pin_b5), output_toggle(pin_b5) etc.
Thank you for clarifying that up for me!!
_________________
Liam Hanmore
Ttelmah



Joined: 11 Mar 2010
Posts: 19539

View user's profile Send private message

PostPosted: Wed Dec 03, 2014 12:05 pm     Reply with quote

Very much no. Some things like say a sin, or a log, will involve thousands of processor instructions. A C 'instruction', is a massive construct in processor terms....
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