|
@@ -131,6 +131,7 @@ uint8_t LastStepMask = 0;
|
|
|
|
|
|
#ifdef DEBUG_STEPPER_TIMER_MISSED
|
|
|
extern bool stepper_timer_overflow_state;
|
|
|
+extern uint16_t stepper_timer_overflow_last;
|
|
|
#endif /* DEBUG_STEPPER_TIMER_MISSED */
|
|
|
|
|
|
//===========================================================================
|
|
@@ -381,22 +382,25 @@ ISR(TIMER1_COMPA_vect) {
|
|
|
isr();
|
|
|
|
|
|
// Don't run the ISR faster than possible
|
|
|
-// if (OCR1A < TCNT1 + 16) OCR1A = TCNT1 + 16;
|
|
|
+ // Is there a 8us time left before the next interrupt triggers?
|
|
|
+ if (OCR1A < TCNT1 + 16) {
|
|
|
#ifdef DEBUG_STEPPER_TIMER_MISSED
|
|
|
- // Verify whether the next planned timer interrupt has not been missed already.
|
|
|
- // This debugging test takes < 1.125us
|
|
|
- // This skews the profiling slightly as the fastest stepper timer
|
|
|
- // interrupt repeats at a 100us rate (10kHz).
|
|
|
- if (OCR1A < TCNT1) {
|
|
|
- stepper_timer_overflow_state = true;
|
|
|
- WRITE_NC(BEEPER, HIGH);
|
|
|
- SERIAL_PROTOCOLPGM("Stepper timer overflow ");
|
|
|
- SERIAL_PROTOCOL(OCR1A);
|
|
|
- SERIAL_PROTOCOLPGM("<");
|
|
|
- SERIAL_PROTOCOL(TCNT1);
|
|
|
- SERIAL_PROTOCOLLN("!");
|
|
|
- }
|
|
|
+ // Verify whether the next planned timer interrupt has not been missed already.
|
|
|
+ // This debugging test takes < 1.125us
|
|
|
+ // This skews the profiling slightly as the fastest stepper timer
|
|
|
+ // interrupt repeats at a 100us rate (10kHz).
|
|
|
+ if (OCR1A + 40 < TCNT1) {
|
|
|
+ // The interrupt was delayed by more than 20us (which is 1/5th of the 10kHz ISR repeat rate).
|
|
|
+ // Give a warning.
|
|
|
+ stepper_timer_overflow_state = true;
|
|
|
+ stepper_timer_overflow_last = TCNT1 - OCR1A;
|
|
|
+ // Beep, the beeper will be cleared at the stepper_timer_overflow() called from the main thread.
|
|
|
+ WRITE(BEEPER, HIGH);
|
|
|
+ }
|
|
|
#endif
|
|
|
+ // Fix the next interrupt to be executed after 8us from now.
|
|
|
+ OCR1A = TCNT1 + 16;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
FORCE_INLINE void stepper_next_block()
|