![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
frierray
Joined: 11 Nov 2008 Posts: 29
|
PWM1 and Timer1 problems |
Posted: Thu Aug 06, 2009 1:19 pm |
|
|
All,
I was wondering if I could get some input from the group. The following is a small part of some PWM code. The PWM users PWM1 and Timer 2.
Code: |
// Set up PWM
set_pwm1_duty(0); // This sets the on time
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_1, 127, 1); // Set Parms
|
I am also using Timer 1 to determine the time a switch is pressed.
Problem is; when I enable the interrupts (enable_interrupts(GLOBAL);) the PWM for loop runs the first time and then stops. Is it valid to use the PWM1 and Timer1 for two different functions?
I am using a 18f252 and compiler 4.073.
Thanks, Ray
The following is some of the code I have written.
Code: |
void main (void)
{
// Set up int for t1 for switch timer
// T1 timer used for key switch management
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // T1 clk = 20 MHz
set_timer1(TIMER1_PRESET);
//
// Main system loop
//
while(1)
{
if(!input(sw_left)) // look for Left Switch low
{
Miliseconds = 0;
clear_interrupt(INT_TIMER1);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
delay_ms(10); // debounce
if(!input(sw_left)) // look for Left Switch low
{
while(1)
{
if(input(sw_left)) // look for Left Switch high
{
move_back(); // move carirer to home
break;
}
if(Miliseconds > 500)
{
move_back(); // move carirer to home
while(!input(sw_left)){}
hard_stop(); // Stop now
break;
}
}
}
}
}
}
void move_back(void)
{
carrier_stat=1; // 0 = stop, 1 = moving home, 2 maving DR
// Set direction = back to home
output_bit(direction, back); // Set Direction = Back)
ramp_up();
}
void move_forward(void)
{
carrier_stat=1; //
// Set direction = back to home
output_bit(direction, forward); // Set Direction = Back)
ramp_up();
}
void ramp_up()
{
// Set up PWM
set_pwm1_duty(0); // This sets the on time
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_1, 127, 1); // Set Parms
ml=0; // reset ml counter
motor_speed=50; // motor speed start
for (ml=51;ml<=254;++ml) // loop for ramp up
{
motor_speed=((motor_speed*sp_factor)); // Set motor to x%
set_pwm1_duty(motor_speed); // This sets the on time
delay_ms(5); // loop timer 5 ms
motor_speed=motor_speed+1; // inc the loop 1
}
} |
|
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Aug 06, 2009 2:57 pm |
|
|
Quote: | clear_interrupt(INT_TIMER1);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL); |
You don't have (or didn't post) a #int_timer1 interrupt routine.
You need one. |
|
![](templates/subSilver/images/spacer.gif) |
frierray
Joined: 11 Nov 2008 Posts: 29
|
|
Posted: Thu Aug 06, 2009 3:14 pm |
|
|
PCM Programmer;
I forgot to include it with the post. Here it is:
#define TIMER1_PRESET (65536 - 5000) // Interrupt every 5000 counts
// t1 timer used for key switch management
#int_timer1
void timer1_isr(void)
{
set_timer1(TIMER1_PRESET);
{
miliseconds++;
}
}
I am using it to count milliseconds. In my code I need to know if a button is pressed and released or held down. If the count is > 500, it is assumed the button is held. There is a different action taken if it is pressed and released or held.
The PWM is controlled by a for loop. (If there is a better way to do this, please let me know) However, the for loop works great until I turn on the enable_interrupts(GLOBAL); After that the for loop only starts one pass and then stops. Control returns to my button code.
Any thoughts you have would be a big help.
Ray
void ramp_up()
{
// Set up PWM
set_pwm1_duty(0); // This sets the on time
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_1, 127, 1); // Set Parms
ml=0; // reset ml counter
motor_speed=50; // motor speed start
for (ml=51;ml<=254;++ml) // loop for ramp up
{
motor_speed=((motor_speed*sp_factor)); // Set motor to x%
set_pwm1_duty(motor_speed); // This sets the on time
delay_ms(5); // loop timer 5 ms
motor_speed=motor_speed+1; // inc the loop 1
}
} |
|
![](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
|