|
|
View previous topic :: View next topic |
Author |
Message |
syamin0712
Joined: 23 Aug 2015 Posts: 14
|
how to code 25ns delay in ccs |
Posted: Sat Jan 30, 2016 8:33 pm |
|
|
Hi,
Does anybody know how to code the delay of 25ns each in ccs? So that, I can get the 20MHz for 1 cycle.
I use the crystal 10MHz and use HSPLL so that I can get 40MHz clock.
I have tried to use the fraction, but when I burn the code into PIC18F4580 and test in real probe...not pulse appeared. But, when I change into low frequency for example 500Hz or 50kHz..it was successfully appeared in the probe.
This is my code:
Code: | /// 20MHz pulse
#include <18F4580.h>
#fuses H4,NOWDT,NOLVP,BROWNOUT,PUT,NOPBADEN
#use delay(clock=40000000)
void main ()
{
while (TRUE)
{
output_high(PIN_B1);
delay_us(1/40); //set 25ns each
output_low(PIN_B1);
delay_us(1/40); //set 25ns each
}
} |
Is the code I used correct? Please help. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Sat Jan 30, 2016 9:52 pm |
|
|
re:
delay_us(1/40); //set 25ns each
You need to read the CCS C manual !
Press f11 when your project is open and read the section on
delay_us()
knowledge is power
jay |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Sun Jan 31, 2016 2:10 am |
|
|
None of the delay instructions can accept fractional delays. Int16 values for delay_us.
The shortest delay you can code, is delay_cycles(1);
Note 'cycles', not 'us'.
This gives a single machine instruction delay.
The processor at 40MHz clock, is executing 10mips. 100nSec/instruction. You cannot do anything faster than this. delay_cycles(1) gives 100nSec.
Then the output's each take an instruction, and the loop, two.
The processor cannot do a delay of 25nSec.
Even if you code immediately output_high, followed by output_low, there will be one machine cycle between the operations.
However you need to be using 'fast_io', or there will be two extra instructions inserted to control the TRIS.
Then the branch instruction to loop back, will take two instruction clocks, so the fastest possible for the processor is:
Code: |
/// 2MHz pulse
#include <18F4580.h>
#fuses H4,NOWDT,NOLVP,BROWNOUT,PUT,NOPBADEN
#use delay(clock=40000000)
#use fast_io(B)
void main ()
{
output_drive(PIN_B1); //need to set the TRIS to output
while (TRUE)
{
output_high(PIN_B1);
delay_cycles(1); //single machine cycle
output_low(PIN_B1);
} //the branch back will take 2 machine cycles
}
|
This will give 5 instruction times per loop (one output, one cycle delay, one output, then the loop back which takes two instruction times) _2Mhz_.
You could get rid of the delay and have 2.5Mhz with just 100nSec high.
This is the fastest the processor can manage.
You are an order of magnitude below performance to output 20MHz.
The hardware PWM, can generate clocks up to 1 instructions per clock (so 10MHz).
Understand that this is not a CCS 'limitation', it's just how fast the processor actually is. Even if you were using a processor that was executing 40mips, you'd not get 20MHz output. Instructions all take time. |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Sun Jan 31, 2016 8:52 am |
|
|
You could use the PWM to generate either 25ns high or 25ns low pulses.
As Mr T. has already said the maximum frequency will be 10MHz.
To get your 20MHz, 50% duty ratio signal, you'll need an 80MHz clock.
Mike |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Mon Feb 01, 2016 6:47 am |
|
|
Thinking 'outside the PIC' you could use a 'crystal clock module'. Just buy one of the correct frequency. Simple, cheap and it works.
We don't know your application..continous pulses or clocked?
Using the module, frees up the PIC (even a lower-end one) to do other tasks.....
Jay |
|
|
|
|
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
|