 <font face="courier new" size="2">
Hey Yu,

There are two things wrong with your program.

1.  Suppose you want to step the motor every 200 microseconds, but
    suppose the "RS232 processing" and "other stuff" takes a total
    of 500 microseconds.  That means that you might get two or
    three timer interrupts while the program is in the while loop,
    before it has a chance to check 't' and step the motor.  This
    is probably why you are missing steps.

2.  Now suppose that you still want to step the motor every 200
    microseconds, but now the "RS232 processing" and "other stuff"
    only takes 100 microseconds.  Everything is okay now, right?
    No!!!  There is still a big problem.  Here's why:

    If you get a timer interrupt when the CPU is just starting to do
    the RS232 processing, there will be a delay of 100
    microseconds before the loop goes back to the top to check 't'
    and actually move the motor.  However, if the timer interrupt
    happens just before the end of the loop, then the delay before
    stepping the motor will be just a few microseconds.

    This means that the timing of each motor pulse will be delayed
    by some unknown amount.  The delay depends on where the
    program happens to be within the while loop when the timer
    interrupt occurs, and it could be different for each pulse.

To fix both of these programs, I think you should move the motor
by one step <b>inside</b> the ISR (see below).  Doing that will
make the motor pulse timing much more precise, and it will also
solve your "missing steps" problem, even if the while loop becomes
very long.

I know that everyone says, "Keep your ISRs simple."  That is good
advice most of the time.  In this case, however, you need to step
the motor inside the ISR in order to time the motor step pulses
precisely.

-- Russ

////////////////////////////////////////////////////////////////// 

main()
{
    Initialization();
    Timer0Init();
    while (1)
    {
        // RS232 processing
        // Other stuff ...
    }
}

////////////////////////////////////////////////////////////////// 

Timer0ISR
{
    // Move one step
}
</font> 