diff --git a/Firmware/stepper.cpp b/Firmware/stepper.cpp index c636ae39..3ac2ffc2 100644 --- a/Firmware/stepper.cpp +++ b/Firmware/stepper.cpp @@ -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() diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 29c0ed40..6a14a916 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -5182,14 +5182,21 @@ void stack_error() { #ifdef DEBUG_STEPPER_TIMER_MISSED bool stepper_timer_overflow_state = false; +uint16_t stepper_timer_overflow_max = 0; +uint16_t stepper_timer_overflow_last = 0; +uint16_t stepper_timer_overflow_cnt = 0; void stepper_timer_overflow() { - SET_OUTPUT(BEEPER); - WRITE(BEEPER, HIGH); - delay(1000); + char msg[28]; + sprintf_P(msg, PSTR("#%d %d max %d"), ++ stepper_timer_overflow_cnt, stepper_timer_overflow_last >> 1, stepper_timer_overflow_max >> 1); + lcd_setstatus(msg); + stepper_timer_overflow_state = false; + if (stepper_timer_overflow_last > stepper_timer_overflow_max) + stepper_timer_overflow_max = stepper_timer_overflow_last; + SERIAL_ECHOPGM("Stepper timer overflow: "); + MYSERIAL.print(msg); + SERIAL_ECHOLNPGM(""); + WRITE(BEEPER, LOW); - lcd_display_message_fullscreen_P(MSG_STEPPER_TIMER_OVERFLOW_ERROR); - //err_triggered = 1; - while (1) delay_keep_alive(1000); } #endif /* DEBUG_STEPPER_TIMER_MISSED */