![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
Allan
Joined: 20 Dec 2009 Posts: 23
|
CCP Compare timing errors |
Posted: Wed May 26, 2010 10:32 pm |
|
|
Hi Everybody,
I’m learning the CCP system on the 18F2321, and using version 4.105 compiler software.
On one pass through the ISR the hardware resets Timer3. I turn the output on and set how long the signal is high.
On the other pass through the ISR the hardware turns the output off and I set the time of the total waveform. I don’t reset Timer3 because I’m giving it a total time, not an ‘Off‘ time.
Code: |
#INT_CCP2
void SyncOutRoutine()
{
static int1 Mode;
if (Mode == 1)
{
CCP_2 = DurationTick;
setup_ccp2(CCP_COMPARE_CLR_ON_MATCH);
Mode = 0;
}
else
{
CCP_2 = TotalWaveformTick;
setup_ccp2(CCP_COMPARE_SET_ON_MATCH | CCP_COMPARE_RESET_TIMER);
Mode = 1;
}
}
|
Here's the relevant code form the rest of the program
Code: |
#use delay (Clock=10mHz, Oscillator=10mHz)
……………..
setup_timer_0(T0_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
setup_timer_2(T2_DISABLED, 0, 1);
setup_timer_3(T3_INTERNAL | T3_DIV_BY_8 | T3_CCP2 );
…………….
DurationTick = 2000;
TotalWaveformTick = 4000;
|
For testing purposes I set the on time to half the total time, expecting a square wave output. Here are several on time and total time inputs, and the actual times of the output.
Code: |
Tick Time inputs Resulting Times
Total / Duration Total Time On Time
4000 / 2000 12.8 mSec 6.3 mSec
2000 / 1000 6.4 mSec 3.16 msec
1000 / 500 3.20 mSec 1.56 mSec
500 / 250 1.60 mSec .770 mSec error with on time
250 / 125 .804 mSec .380 mSec error with both
100 / 50 324.0 uSec 140 uSec error with both
30 / 15 99.0 uSec 27.0 uSec error with both
20 / 10 The code crashes.
|
(I had to stick this in a code section because the forum software does not understand tabs and this was the only way to make the table readable)
Where is the error coming from? It can’t be interrupt latency, since the clearing of Timer3 and acting on the compare register = Timer3 condition is done in hardware, and finished long before the ISR is entered.
Any idea what’s going on? I’ve thoroughly been through Microchip’s data sheet on this part and I just can’t figure out what the circuitry is doing.
Thanks, Al |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19359
|
|
Posted: Thu May 27, 2010 4:41 am |
|
|
Big problem, is the value used for the CCP setup.
You can't 'or' these together.
If you look at the values for the VREF for example, you have the comment at the end of the entry:
// Or (with |) the above with a number 0-15
The CCP constants have no such entry.
The available values, are the only ones available. The list is in the data sheet...
You either need to use the set and reset functions seperately as you do, and clear the timer yourself, or reset the timer each time, and handle the pin toggling yourself. This would actually be the 'better' solution, since then the counter timing will be done by the hardware, and you just toggle the pin, 'interrupt latency' uSec after the hardware event. Since the latency will be nearly constant, the result should be OK.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
Allan
Joined: 20 Dec 2009 Posts: 23
|
|
Posted: Thu May 27, 2010 6:02 pm |
|
|
Quote: |
You can't 'or' these together.
|
D'oh!
Thanks for your help,
Al |
|
![](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
|