??? 10/18/06 03:27 Modified: 10/18/06 03:32 Read: times |
#126622 - Now try this! Responding to: ???'s previous message |
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 inside 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 } |