??? 04/11/09 10:28 Read: times |
#164533 - Still not full ISR shown - and debounce? Responding to: ???'s previous message |
Note that your switch statement has a hard-coded "next" state - did you make use of an else together with the if statement to have a second switch statement for backwards mode?
By having more states in a single switch statement, your switch could handle both forward and backwards motion and stopped by just processing the current state and moving to a new state. You might define: 1) You should consider defining all states in forward and direction mode, i.e. enum { FWD_STOP_S1, FWD_STOP_S2, FWD_STOP_S3, FWD_STOP_S4, BKW_STOP_S1, BKW_STOP_S2, BKW_STOP_S3, BKW_STOP_S4, FWD_S1, FWD_S2, FWD_S3, FWD_S4, BKW_S1, BKW_S2, BKW_S3, BKW_S4 }; The two least significant bits (0x01 and 0x02) of the state is then used to store the current phase. The next bit (0x04) is forward (0) or backward (1) The next bit (0x08) is stopped (0) or running (1). If the variable is bit-mapped, then the main loop may clear the 0x08 bit and the ISR will then step forwards or backwards (depending on the state of the 0x04 bit) until it reaches a full step, and then park there. Setting the 0x08 bit will get the motor to start again, using the same direction as before. 1ms is used to scan a key/switch or what? You did not post the full ISR source. Note that keys do not need to be scanned with 1ms frequency, and besides the scanning frequency, you must also properly debounce the key/switch or you may get several rotation reversals before the state of key/switch settles down to open or closed. |