|
@@ -2323,20 +2323,34 @@ inline void gcode_G28() {
|
2323
|
2323
|
|
2324
|
2324
|
#elif defined(Z_RAISE_BEFORE_HOMING) && Z_RAISE_BEFORE_HOMING > 0
|
2325
|
2325
|
|
2326
|
|
- // Raise Z before homing any other axes
|
|
2326
|
+ // Consider the current Z-position as zero
|
|
2327
|
+ // !!WARNING!! If the machine has no physical z-max endstops then we
|
|
2328
|
+ // can move the axis more than it can physically travel.
|
|
2329
|
+ current_position[Z_AXIS] = 0;
|
|
2330
|
+ sync_plan_position();
|
|
2331
|
+
|
2327
|
2332
|
// (Does this need to be "negative home direction?" Why not just use Z_RAISE_BEFORE_HOMING?)
|
2328
|
2333
|
destination[Z_AXIS] = -Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS);
|
|
2334
|
+ feedrate = max_feedrate[Z_AXIS] * 60;
|
|
2335
|
+
|
2329
|
2336
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
2330
|
2337
|
if (marlin_debug_flags & DEBUG_LEVELING) {
|
2331
|
2338
|
SERIAL_ECHOPAIR("Raise Z (before homing) by ", (float)Z_RAISE_BEFORE_HOMING);
|
2332
|
2339
|
SERIAL_EOL;
|
|
2340
|
+ print_xyz("> (home_all_axis || homeZ) > current_position", current_position);
|
2333
|
2341
|
print_xyz("> (home_all_axis || homeZ) > destination", destination);
|
2334
|
2342
|
}
|
2335
|
2343
|
#endif
|
2336
|
|
- feedrate = max_feedrate[Z_AXIS] * 60;
|
|
2344
|
+
|
|
2345
|
+ // Raise Z-axis by Z_RAISE_BEFORE_HOMING before homing any other axis
|
2337
|
2346
|
line_to_destination();
|
2338
|
2347
|
st_synchronize();
|
2339
|
2348
|
|
|
2349
|
+ // Update the current Z position even if it currently not real from Z-home
|
|
2350
|
+ // otherwise each call to line_to_destination() will want to move Z-axis
|
|
2351
|
+ // by Z_RAISE_BEFORE_HOMING.
|
|
2352
|
+ current_position[Z_AXIS] = destination[Z_AXIS];
|
|
2353
|
+
|
2340
|
2354
|
#endif
|
2341
|
2355
|
|
2342
|
2356
|
} // home_all_axis || homeZ
|
|
@@ -2453,7 +2467,10 @@ inline void gcode_G28() {
|
2453
|
2467
|
|
2454
|
2468
|
if (home_all_axis) {
|
2455
|
2469
|
|
2456
|
|
- current_position[Z_AXIS] = 0;
|
|
2470
|
+ // At this point we already have Z at Z_RAISE_BEFORE_HOMING height
|
|
2471
|
+ // No need to move Z any more as this height should already be safe
|
|
2472
|
+ // enough to reach Z_SAFE_HOMING XY positions; just make sure the
|
|
2473
|
+ // planner is in sync.
|
2457
|
2474
|
sync_plan_position();
|
2458
|
2475
|
|
2459
|
2476
|
//
|
|
@@ -2463,23 +2480,21 @@ inline void gcode_G28() {
|
2463
|
2480
|
// then this may not work as expected.
|
2464
|
2481
|
destination[X_AXIS] = round(Z_SAFE_HOMING_X_POINT - X_PROBE_OFFSET_FROM_EXTRUDER);
|
2465
|
2482
|
destination[Y_AXIS] = round(Z_SAFE_HOMING_Y_POINT - Y_PROBE_OFFSET_FROM_EXTRUDER);
|
2466
|
|
- destination[Z_AXIS] = -Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS); // Set destination away from bed
|
2467
|
2483
|
feedrate = XY_TRAVEL_SPEED;
|
2468
|
2484
|
|
2469
|
2485
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
2470
|
2486
|
if (marlin_debug_flags & DEBUG_LEVELING) {
|
2471
|
|
- SERIAL_ECHOPAIR("Raise Z (before homing) by ", (float)Z_RAISE_BEFORE_HOMING);
|
2472
|
|
- SERIAL_EOL;
|
2473
|
|
- print_xyz("> home_all_axis > current_position", current_position);
|
2474
|
|
- print_xyz("> home_all_axis > destination", destination);
|
|
2487
|
+ print_xyz("> Z_SAFE_HOMING > home_all_axis > current_position", current_position);
|
|
2488
|
+ print_xyz("> Z_SAFE_HOMING > home_all_axis > destination", destination);
|
2475
|
2489
|
}
|
2476
|
2490
|
#endif
|
2477
|
2491
|
|
2478
|
|
- // This could potentially move X, Y, Z all together
|
|
2492
|
+ // Move in the XY plane
|
2479
|
2493
|
line_to_destination();
|
2480
|
2494
|
st_synchronize();
|
2481
|
2495
|
|
2482
|
|
- // Set current X, Y is the Z_SAFE_HOMING_POINT minus PROBE_OFFSET_FROM_EXTRUDER
|
|
2496
|
+ // Update the current positions for XY, Z is still at
|
|
2497
|
+ // Z_RAISE_BEFORE_HOMING height, no changes there.
|
2483
|
2498
|
current_position[X_AXIS] = destination[X_AXIS];
|
2484
|
2499
|
current_position[Y_AXIS] = destination[Y_AXIS];
|
2485
|
2500
|
|