|
|
View previous topic :: View next topic |
Author |
Message |
spom
Joined: 12 Jul 2007 Posts: 32
|
Problem with interrupt |
Posted: Wed Dec 12, 2007 5:05 am |
|
|
Hi,
I have a little problem with interrupts.
I use a stepping motor which should rotate right and after 168 steps rotate left. This works fine.
But now the motor should pause for 7 minutes and then starts again.
My Problem is, that the timer starts counting after the motor's rotation which takes approximately 15 seconds.
How can I handl this?
Thanks!
My code below:
Code: |
#include <16f818.h>
#use delay(clock=8000000)
#fuses NOWDT,HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP
int8 switchstate;
int16 seconds;
int8 int_count;
#define INTS_PER_SECOND 61
#int_rtcc
void clock_isr() {
if(--int_count==0) {
++seconds;
int_count=INTS_PER_SECOND;
}
}
#BYTE port_b = 6
#define FOUR_PHASE TRUE
#ifdef FOUR_PHASE
BYTE const POSITIONS[4] = {0b0101,
0b1001,
0b1010,
0b0110};
#else
BYTE const POSITIONS[8] = {0b0101,
0b0001,
0b1001,
0b1000,
0b1010,
0b0010,
0b0110,
0b0100};
#endif
drive_stepper(BYTE speed, char dir, BYTE steps)
{
static BYTE stepper_state = 0;
BYTE i;
for(i=0; i<steps; ++i) {
delay_ms(speed);
set_tris_b(0xf0);
port_b = POSITIONS[ stepper_state ];
if(dir!='R')
stepper_state=(stepper_state+1)&(sizeof(POSITIONS)-1);
else
stepper_state=(stepper_state-1)&(sizeof(POSITIONS)-1);
}
}
main()
{
BYTE speed, steps;
char dir;
int_count=INTS_PER_SECOND;
set_timer0(0);
setup_counters( RTCC_INTERNAL, RTCC_DIV_128 | RTCC_8_BIT);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
while(TRUE)
{
if(seconds == 420)
{
if(switchstate==0)
{
switchstate=1;
speed = 40;
steps = 168;
dir='F';
drive_stepper(speed,dir,steps);
delay_ms(1000);
speed = 40;
steps = 168;
dir='R';
drive_stepper(speed,dir,steps);
}
else
{
switchstate=0;
}
seconds = 0;
}
}
}
|
|
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Dec 12, 2007 7:08 am |
|
|
Quote: | My Problem is, that the timer starts counting after the motor's rotation which takes approximately 15 seconds.
How can I handl this? | The answer is already present in your question. Do not reset the seconds timer after you have activated the motor but do it before, i.e. direct after the 7 minutes test.
Note that your current code waits 7 minutes. Activates the motor. Waits again 7 minutes before repeating the sequence. There is a total pause of 14 minutes between the motor activations, is that as intended? |
|
|
rnielsen
Joined: 23 Sep 2003 Posts: 852 Location: Utah
|
|
Posted: Wed Dec 12, 2007 9:32 am |
|
|
One way is to place an if() statement in your ISR that will enable/disable your counting routine. You could have this variable set by your drive_stepper() routine when it reaches it's destination. It could be cleared by the ISR when your counter reaches 0.
One thing to note here, it is not a good idea to have key words as part of your variable names. int_count is an example. Bad things can happen when the mind sees this and is coasting in neutral.
Ronald |
|
|
|
|
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
|