PIC24/dsPIC timer period is 1 clock too long

danlhenry wrote on Monday, August 23, 2010:

From the “Timers” Reference Manual sections for these devices (Example 11-1 and Figure 11-4 in all manuals) we can see that prvSetupTimerInterrupt() in port.c should be changed from:

const unsigned long ulCompareMatch = ( configCPU_CLOCK_HZ / portTIMER_PRESCALE ) / configTICK_RATE_HZ;

to:

const unsigned long ulCompareMatch = ( configCPU_CLOCK_HZ / portTIMER_PRESCALE ) / configTICK_RATE_HZ - 1;

rtel wrote on Monday, August 23, 2010:

Thanks for the feedback.  Its not the first time I have made that mistake, and I’m sure it won’t be the last.

However, I’m not sure your solution is completely accurate because of the operator precedence.  Should it not be:

const unsigned long ulCompareMatch = ( ( configCPU_CLOCK_HZ / portTIMER_PRESCALE ) / configTICK_RATE_HZ ) - 1;

If you agree with this I will change it in SVN straight away so it does not get lost in the crowds.

Regards.

danlhenry wrote on Monday, August 23, 2010:

Multiplicative operators, of which ‘/’ is one, have higher precedence than additive operators, so the added parentheses are unnecessary.  However, explicitness is always good in my book, so I say leave them in the way you have it.

rtel wrote on Monday, August 23, 2010:

… the SVN copy has been updated.

Regards.