![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
weg22
Joined: 08 Jul 2005 Posts: 91
|
error using 2 interrupts |
Posted: Tue Aug 09, 2005 1:38 pm |
|
|
Hi all,
I am trying to generate 2 PWM signals using 2 interrupts (timer0 and timer1). The PWM signal on PIN_B0 works fine (timer0), but the PWM signal on PIN_B1 (timer1) has the correct period but with a 500 mV amplitude (should be 5V). I don't know why this is happening because it's the same exact code (see below).
Any help is much appreciated,
-weg
Code: |
#include <16F87.H>
#include <stdlib.h>
#include <math.h>
#define B0 PIN_B0
#define B1 PIN_B1
#fuses HS,NOWDT,NOPROTECT, PUT
#use delay(clock=10000000)
int rud_pwm, elev_pwm;
//Timer interrupt to generate PWM signals
#INT_TIMER0
void pwm_signal()
{
int i;
//One of the parameters used to cause the interrupt to occur every 22.5 msec
set_timer0(37); // 61 for 20 msec
/*--------RUDDER 0 (right), 255 (left) --------*/
output_high(B0); // generates initial high time ie 1 msec
delay_us(1000);
i=0;
for(i=0;i<rud_pwm;i++) // generates remaining high time, varied by variable "pwm"
{
//use this to tune duty cycle
delay_us(1);
}
output_low(B0);
}
//Timer interrupt to read PWM signals
#INT_TIMER1
void pwm_signal2()
{
int j;
//One of the parameters used to cause the interrupt to occur every 22.5 msec
set_timer1(37); // 61 for 20 msec
/*--------RUDDER 0 (right), 255 (left) --------*/
output_high(B1); // generates initial high time ie 1 msec
delay_us(1000);
j=0;
for(j=0;j<elev_pwm;j++) // generates remaining high time, varied by variable "pwm"
{
//use this to tune duty cycle
delay_us(1);
}
output_low(B1);
}
main()
{
long m;
delay_ms(1500);
while(1)
{
// enable timer interrupts
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER1);
//the other parameter used to cause interrupt to occur every 20 msec
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_timer_1(RTCC_INTERNAL|RTCC_DIV_256);
rud_pwm = 128;
elev_pwm = 128;
}
} // end of main
|
|
|
![](templates/subSilver/images/spacer.gif) |
kender
Joined: 09 Aug 2004 Posts: 768 Location: Silicon Valley
|
|
Posted: Tue Aug 09, 2005 2:09 pm |
|
|
It could be pure hardware problem rather then a firmware problem. Try the following:
* Make sure that your scope works as you expect. For example, you can have a 1x probe, while the scope expects a 10x probe.
* If you can, output_high(PIN_B1) for a short time. If it will still be 500mV instead of +5V, then you are probably grounding B1 somewhere. By the way, what is B1 connected to? Does your PIC get warm? |
|
![](templates/subSilver/images/spacer.gif) |
weg22
Joined: 08 Jul 2005 Posts: 91
|
|
Posted: Tue Aug 09, 2005 2:38 pm |
|
|
I don't think its hardware...here's why. If I change the timer0 loop to output the PWM signal on B1 and timer1 to B0 (just switching them), I see a signal on B1 and not B0. Whereas before, I saw a PWM signal on B0 and not B1. This comes back to the 2nd timer loop (timer1)...which I believe to be a software problem. Any suggestions?
Thanks,
-weg |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Aug 09, 2005 2:49 pm |
|
|
There are several things about your code that don't look very good,
but here, you've got an 8-bit counter (Timer0) and a 16-bit counter
(Timer1), and you're loading them with the same number and expecting
them to both interrupt every 22.5 ms.
Code: | set_timer0(37);
set_timer1(37); |
|
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah Guest
|
|
Posted: Tue Aug 09, 2005 2:56 pm |
|
|
It is never actually reaching the second interrupt.
Your 'correct' signal, is noise being picked up because of poor grounding, or a problem with the scope probe, from the other line.
Timer1, is a 16bit counter. It does not support a 256 prescale. The values give no error, because they are legitimate values for timer0. You are sending timer1, the initialisation value for timer0, which probably corresponds (from a quick glance on the data sheet), to 'system clock from another source' (not the internal oscillator), prescale 1:1, do not synchronise external clock, use external clock on RB6, enable timer.
Without the external clock, this timer will never trigger.
Best |
|
![](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
|