|
@@ -83,7 +83,7 @@ block_t* Stepper::current_block = NULL; // A pointer to the block currently bei
|
83
|
83
|
// private:
|
84
|
84
|
|
85
|
85
|
uint8_t Stepper::last_direction_bits = 0; // The next stepping-bits to be output
|
86
|
|
-uint16_t Stepper::cleaning_buffer_counter = 0;
|
|
86
|
+int16_t Stepper::cleaning_buffer_counter = 0;
|
87
|
87
|
|
88
|
88
|
#if ENABLED(X_DUAL_ENDSTOPS)
|
89
|
89
|
bool Stepper::locked_x_motor = false, Stepper::locked_x2_motor = false;
|
|
@@ -381,8 +381,8 @@ void Stepper::isr() {
|
381
|
381
|
|
382
|
382
|
uint16_t ocr_val;
|
383
|
383
|
|
384
|
|
- #define ENDSTOP_NOMINAL_OCR_VAL 3000 // check endstops every 1.5ms to guarantee two stepper ISRs within 5ms for BLTouch
|
385
|
|
- #define OCR_VAL_TOLERANCE 1000 // First max delay is 2.0ms, last min delay is 0.5ms, all others 1.5ms
|
|
384
|
+ #define ENDSTOP_NOMINAL_OCR_VAL 3000 // Check endstops every 1.5ms to guarantee two stepper ISRs within 5ms for BLTouch
|
|
385
|
+ #define OCR_VAL_TOLERANCE 1000 // First max delay is 2.0ms, last min delay is 0.5ms, all others 1.5ms
|
386
|
386
|
|
387
|
387
|
#if DISABLED(LIN_ADVANCE)
|
388
|
388
|
// Disable Timer0 ISRs and enable global ISR again to capture UART events (incoming chars)
|
|
@@ -393,9 +393,13 @@ void Stepper::isr() {
|
393
|
393
|
|
394
|
394
|
#define _SPLIT(L) (ocr_val = (uint16_t)L)
|
395
|
395
|
#if ENABLED(ENDSTOP_INTERRUPTS_FEATURE)
|
|
396
|
+
|
396
|
397
|
#define SPLIT(L) _SPLIT(L)
|
397
|
|
- #else // sample endstops in between step pulses
|
|
398
|
+
|
|
399
|
+ #else // !ENDSTOP_INTERRUPTS_FEATURE : Sample endstops between stepping ISRs
|
|
400
|
+
|
398
|
401
|
static uint32_t step_remaining = 0;
|
|
402
|
+
|
399
|
403
|
#define SPLIT(L) do { \
|
400
|
404
|
_SPLIT(L); \
|
401
|
405
|
if (ENDSTOPS_ENABLED && L > ENDSTOP_NOMINAL_OCR_VAL) { \
|
|
@@ -407,33 +411,34 @@ void Stepper::isr() {
|
407
|
411
|
|
408
|
412
|
if (step_remaining && ENDSTOPS_ENABLED) { // Just check endstops - not yet time for a step
|
409
|
413
|
endstops.update();
|
410
|
|
- if (step_remaining > ENDSTOP_NOMINAL_OCR_VAL) {
|
411
|
|
- step_remaining -= ENDSTOP_NOMINAL_OCR_VAL;
|
412
|
|
- ocr_val = ENDSTOP_NOMINAL_OCR_VAL;
|
413
|
|
- }
|
414
|
|
- else {
|
415
|
|
- ocr_val = step_remaining;
|
416
|
|
- step_remaining = 0; // last one before the ISR that does the step
|
417
|
|
- }
|
418
|
414
|
|
|
415
|
+ // Next ISR either for endstops or stepping
|
|
416
|
+ ocr_val = step_remaining <= ENDSTOP_NOMINAL_OCR_VAL ? step_remaining : ENDSTOP_NOMINAL_OCR_VAL;
|
|
417
|
+ step_remaining -= ocr_val;
|
419
|
418
|
_NEXT_ISR(ocr_val);
|
420
|
|
-
|
421
|
419
|
NOLESS(OCR1A, TCNT1 + 16);
|
422
|
|
-
|
423
|
420
|
_ENABLE_ISRs(); // re-enable ISRs
|
424
|
421
|
return;
|
425
|
422
|
}
|
426
|
|
- #endif
|
427
|
423
|
|
|
424
|
+ #endif // !ENDSTOP_INTERRUPTS_FEATURE
|
|
425
|
+
|
|
426
|
+ //
|
|
427
|
+ // When cleaning, discard the current block and run fast
|
|
428
|
+ //
|
428
|
429
|
if (cleaning_buffer_counter) {
|
429
|
|
- --cleaning_buffer_counter;
|
430
|
430
|
current_block = NULL;
|
431
|
431
|
planner.discard_current_block();
|
432
|
|
- #ifdef SD_FINISHED_RELEASECOMMAND
|
433
|
|
- if (!cleaning_buffer_counter && (SD_FINISHED_STEPPERRELEASE)) enqueue_and_echo_commands_P(PSTR(SD_FINISHED_RELEASECOMMAND));
|
434
|
|
- #endif
|
435
|
|
- _NEXT_ISR(200); // Run at max speed - 10 KHz
|
436
|
|
- _ENABLE_ISRs(); // re-enable ISRs
|
|
432
|
+ if (cleaning_buffer_counter < 0)
|
|
433
|
+ ++cleaning_buffer_counter; // Count up for endstop hit
|
|
434
|
+ else {
|
|
435
|
+ --cleaning_buffer_counter; // Count down for abort print
|
|
436
|
+ #ifdef SD_FINISHED_RELEASECOMMAND
|
|
437
|
+ if (!cleaning_buffer_counter && (SD_FINISHED_STEPPERRELEASE)) enqueue_and_echo_commands_P(PSTR(SD_FINISHED_RELEASECOMMAND));
|
|
438
|
+ #endif
|
|
439
|
+ }
|
|
440
|
+ _NEXT_ISR(200); // Run at max speed - 10 KHz
|
|
441
|
+ _ENABLE_ISRs();
|
437
|
442
|
return;
|
438
|
443
|
}
|
439
|
444
|
|