View previous topic :: View next topic |
Author |
Message |
Prashant Patel
Joined: 19 Jul 2004 Posts: 33
|
How to get correct Pulse Width..?? |
Posted: Wed Sep 22, 2004 7:25 pm |
|
|
Hi..We are using 16F877.
I have two problems which are preventing me to produce
correct pulse width.
(1)
We are using Timer1 to produce continuos output pulses
according to Duty Cycle set. And Timer1 is set such a
way that it is interrupted every 0.2mSec.
While Timer1 is running some time we required to use
RTCC timer for 5 Secs. RTCC timer is set such a way that
it is interrupted 72 times per secs.
The problem is, when RTCC timer is ON, it is effected the
output pulses produced by Timer1. What I want that the
Timer1 interrupt should be run at highest proirity and
should be served at the time when ever it is interrupted.
(2)
As I have written some code in side Timer1 interrupt to
control the Duty Cycle of the output pulses. It is effected
the pulse width of the output signal.
It produces 20mSec pulses.
------------------------------------------------------------
#INT_TIMER1
void timer1_isr() {
count++;
if(count<=DCOnDuty)
output_high(PIN_D0);
else
output_low(PIN_D0);
set_timer1(PULSE_TIME); // to overflow every 0.2mSec
if(count>=100)
{
count=0;
// Some code goes here to control the DCOnDuty variable
//used above. It is for controlling duty cycle.
}
}
------------------------------------------------------------
Can anybody guide me with proper solution.
Thanks in advanced....
Regards
Prashant |
|
|
J_Purbrick
Joined: 16 Sep 2003 Posts: 9
|
|
Posted: Thu Sep 23, 2004 8:47 pm |
|
|
Hello again.
You're going to have a tough time with 2 interrupts. My suggestion would be to use only one of them, and it should clearly be the one that triggers most frequently, the Timer1 at 5000/sec.
There are some easy ways to produce the other signal. One is to simulate it by counting cycles of the 5000/sec counter; 69 cycles is approximately 1/72 seconds. Just do whatever the RTCC timer would have done, at these intervals.
Is that accurate enough? Maybe not. You could start the RTCC timer but not allow it to trigger an interrupt. Then either in a loop in your main() function, or in the 5000/sec interrupt, check the flag that gets set when RTCC wants to cause an interrupt, T0IF or intcon,2. If it's found to be set, do whatever the interrupt would have done and (important!) clear the flag.
Are you using a 20MHz crystal? Surely at the maximum prescaler value, your interrupt rate for Timer0 would be 5000000/(256*256) times a second, which works out to 76.3Hz--and that's only shown to one decimal place. So you certainly shouldn't object to using 5000/69! |
|
|
bdavis
Joined: 31 May 2004 Posts: 86 Location: Colorado Springs, CO
|
|
Posted: Fri Sep 24, 2004 12:27 am |
|
|
You may want to use the #priority directive to tell the CCS compiler to service Timer1 before Timer0(RTCC). I would think that would fix it if your RTCC ISR was very short as to not miss a Timer1 interrupt. |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Fri Sep 24, 2004 6:06 am |
|
|
Why don't you use the CCP module to generate the pulses?? You would only need an int each time the signal changed states! You would also get a much greater resolution without having to interrupt a zillion times. One trick that I have used in the past to help with interrupt latency is to clear the int flag myself and then insert a goto at the end of the int routine that goes back to the testing of the bits in the int handler. You will have to look at the lst file to figure this address out but it saves on back to back ints. The registers do not have to be restored and then resaved. |
|
|
|