Browse Source

code changes to implement G38 commands

1) modified 3 code files
Marlin.h
Marlin_main.cpp
endstops.cpp

2) modified config files so I could test on my machine

Testing was done on an AzteegX3pro based machine.

The probe was hooked to the Z_MIN endstop.

My controller doesn't have a dedicated Z_PROBE input so I couldn't test
that functionality.

Verified that a large file (without any G38 commands) executed the same
before and after the changes.

Verified that the head moves as expected when G38.2 and G38.3 commands
are issued. Single & multiple axis moves were tested along with + and -
directions.

Code was added to the main ISR. In normal operation only one extra IF
statement is evaluated. I didn't notice any performance degradation
because of the added code.

The G38 commands are expected to be issued manually by the operator
during machine setup. The G38 commands wait until the machine is idle
before proceeding. That way the other commands are minimally impacted
by the extra ISR overhead when a G38 command is in the queue.

The G38 commands are very similar to the G28 commands except 1) only the
Z_PROBE is used and movement can be in the + or - direction.

See issue 4677 for a discussion on adding G38 commands to Marlin.
Feature request: add ability to use G38.2 command (CNC)
MarlinFirmware/Marlin#4677
Bob-the-Kuhn 9 years ago
parent
commit
2911aa7ffa
5 changed files with 258 additions and 110 deletions
  1. 52
    107
      Marlin/Configuration.h
  2. 3
    3
      Marlin/Configuration_adv.h
  3. 6
    0
      Marlin/Marlin.h
  4. 177
    0
      Marlin/Marlin_main.cpp
  5. 20
    0
      Marlin/endstops.cpp

+ 52
- 107
Marlin/Configuration.h View File

86
 // User-specified version info of this build to display in [Pronterface, etc] terminal window during
86
 // User-specified version info of this build to display in [Pronterface, etc] terminal window during
87
 // startup. Implementation of an idea by Prof Braino to inform user that any changes made to this
87
 // startup. Implementation of an idea by Prof Braino to inform user that any changes made to this
88
 // build by the user have been successfully uploaded into firmware.
88
 // build by the user have been successfully uploaded into firmware.
89
-#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes.
89
+#define STRING_CONFIG_H_AUTHOR "Bob Kuhn, G2/G3 radius testing" // Who made the changes.
90
 #define SHOW_BOOTSCREEN
90
 #define SHOW_BOOTSCREEN
91
 #define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1
91
 #define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1
92
 #define STRING_SPLASH_LINE2 WEBSITE_URL         // will be shown during bootup in line 2
92
 #define STRING_SPLASH_LINE2 WEBSITE_URL         // will be shown during bootup in line 2
105
 //#define SHOW_CUSTOM_BOOTSCREEN
105
 //#define SHOW_CUSTOM_BOOTSCREEN
106
 // @section machine
106
 // @section machine
107
 
107
 
108
-/**
109
- * Select which serial port on the board will be used for communication with the host.
110
- * This allows the connection of wireless adapters (for instance) to non-default port pins.
111
- * Serial port 0 is always used by the Arduino bootloader regardless of this setting.
112
- *
113
- * :[0,1,2,3,4,5,6,7]
114
- */
108
+// SERIAL_PORT selects which serial port should be used for communication with the host.
109
+// This allows the connection of wireless adapters (for instance) to non-default port pins.
110
+// Serial port 0 is still used by the Arduino bootloader regardless of this setting.
111
+// :[0,1,2,3,4,5,6,7]
115
 #define SERIAL_PORT 0
112
 #define SERIAL_PORT 0
116
 
113
 
117
-#define BAUDRATE 250000
118
-/**
119
- * This setting determines the communication speed of the printer.
120
- *
121
- * 250000 works in most cases, but you might try a lower speed if
122
- * you commonly experience drop-outs during host printing.
123
- *
124
- * :[2400,9600,19200,38400,57600,115200,250000]
125
- */
114
+// This determines the communication speed of the printer
115
+// :[2400,9600,19200,38400,57600,115200,250000]
116
+#define BAUDRATE 115200
126
 
117
 
127
 // Enable the Bluetooth serial interface on AT90USB devices
118
 // Enable the Bluetooth serial interface on AT90USB devices
128
 //#define BLUETOOTH
119
 //#define BLUETOOTH
130
 // The following define selects which electronics board you have.
121
 // The following define selects which electronics board you have.
131
 // Please choose the name from boards.h that matches your setup
122
 // Please choose the name from boards.h that matches your setup
132
 #ifndef MOTHERBOARD
123
 #ifndef MOTHERBOARD
133
-  #define MOTHERBOARD BOARD_RAMPS_14_EFB
124
+  #define MOTHERBOARD BOARD_AZTEEG_X3_PRO     
134
 #endif
125
 #endif
135
 
126
 
136
 // Optional custom name for your RepStrap or other custom machine
127
 // Optional custom name for your RepStrap or other custom machine
178
 //#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis
169
 //#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis
179
 //#define HOTEND_OFFSET_Y {0.0, 5.00}  // (in mm) for each extruder, offset of the hotend on the Y axis
170
 //#define HOTEND_OFFSET_Y {0.0, 5.00}  // (in mm) for each extruder, offset of the hotend on the Y axis
180
 
171
 
181
-/**
182
- * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN
183
- *
184
- * 0 = No Power Switch
185
- * 1 = ATX
186
- * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC)
187
- *
188
- * :{0:'No power switch',1:'ATX',2:'X-Box 360'}
189
- */
190
-#define POWER_SUPPLY 0
172
+//// The following define selects which power supply you have. Please choose the one that matches your setup
173
+// 1 = ATX
174
+// 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC)
175
+// :{1:'ATX',2:'X-Box 360'}
176
+#define POWER_SUPPLY 1
191
 
177
 
192
-#if POWER_SUPPLY > 0
193
-  // Enable this option to leave the PSU off at startup.
194
-  // Power to steppers and heaters will need to be turned on with M80.
195
-  //#define PS_DEFAULT_OFF
196
-#endif
178
+// Define this to have the electronics keep the power supply off on startup. If you don't know what this is leave it.
179
+//#define PS_DEFAULT_OFF
197
 
180
 
198
 // @section temperature
181
 // @section temperature
199
 
182
 
239
 // 110 is Pt100 with 1k pullup (non standard)
222
 // 110 is Pt100 with 1k pullup (non standard)
240
 // 998 and 999 are Dummy Tables. They will ALWAYS read 25°C or the temperature defined below.
223
 // 998 and 999 are Dummy Tables. They will ALWAYS read 25°C or the temperature defined below.
241
 //     Use it for Testing or Development purposes. NEVER for production machine.
224
 //     Use it for Testing or Development purposes. NEVER for production machine.
242
-//#define DUMMY_THERMISTOR_998_VALUE 25
225
+#define DUMMY_THERMISTOR_998_VALUE 25
243
 //#define DUMMY_THERMISTOR_999_VALUE 100
226
 //#define DUMMY_THERMISTOR_999_VALUE 100
244
 // :{ '0': "Not used",'1':"100k / 4.7k - EPCOS",'2':"200k / 4.7k - ATC Semitec 204GT-2",'3':"Mendel-parts / 4.7k",'4':"10k !! do not use for a hotend. Bad resolution at high temp. !!",'5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)",'6':"100k / 4.7k EPCOS - Not as accurate as Table 1",'7':"100k / 4.7k Honeywell 135-104LAG-J01",'8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT",'9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1",'10':"100k / 4.7k RS 198-961",'11':"100k / 4.7k beta 3950 1%",'12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)",'13':"100k Hisens 3950  1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'",'20':"PT100 (Ultimainboard V2.x)",'51':"100k / 1k - EPCOS",'52':"200k / 1k - ATC Semitec 204GT-2",'55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)",'60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950",'66':"Dyze Design 4.7M High Temperature thermistor",'70':"the 100K thermistor found in the bq Hephestos 2",'71':"100k / 4.7k Honeywell 135-104LAF-J01",'147':"Pt100 / 4.7k",'1047':"Pt1000 / 4.7k",'110':"Pt100 / 1k (non-standard)",'1010':"Pt1000 / 1k (non standard)",'-3':"Thermocouple + MAX31855 (only for sensor 0)",'-2':"Thermocouple + MAX6675 (only for sensor 0)",'-1':"Thermocouple + AD595",'998':"Dummy 1",'999':"Dummy 2" }
227
 // :{ '0': "Not used",'1':"100k / 4.7k - EPCOS",'2':"200k / 4.7k - ATC Semitec 204GT-2",'3':"Mendel-parts / 4.7k",'4':"10k !! do not use for a hotend. Bad resolution at high temp. !!",'5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)",'6':"100k / 4.7k EPCOS - Not as accurate as Table 1",'7':"100k / 4.7k Honeywell 135-104LAG-J01",'8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT",'9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1",'10':"100k / 4.7k RS 198-961",'11':"100k / 4.7k beta 3950 1%",'12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)",'13':"100k Hisens 3950  1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'",'20':"PT100 (Ultimainboard V2.x)",'51':"100k / 1k - EPCOS",'52':"200k / 1k - ATC Semitec 204GT-2",'55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)",'60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950",'66':"Dyze Design 4.7M High Temperature thermistor",'70':"the 100K thermistor found in the bq Hephestos 2",'71':"100k / 4.7k Honeywell 135-104LAF-J01",'147':"Pt100 / 4.7k",'1047':"Pt1000 / 4.7k",'110':"Pt100 / 1k (non-standard)",'1010':"Pt1000 / 1k (non standard)",'-3':"Thermocouple + MAX31855 (only for sensor 0)",'-2':"Thermocouple + MAX6675 (only for sensor 0)",'-1':"Thermocouple + AD595",'998':"Dummy 1",'999':"Dummy 2" }
245
-#define TEMP_SENSOR_0 1
228
+#define TEMP_SENSOR_0 998
246
 #define TEMP_SENSOR_1 0
229
 #define TEMP_SENSOR_1 0
247
 #define TEMP_SENSOR_2 0
230
 #define TEMP_SENSOR_2 0
248
 #define TEMP_SENSOR_3 0
231
 #define TEMP_SENSOR_3 0
372
 #define EXTRUDE_MINTEMP 170
355
 #define EXTRUDE_MINTEMP 170
373
 
356
 
374
 // This option prevents a single extrusion longer than EXTRUDE_MAXLENGTH.
357
 // This option prevents a single extrusion longer than EXTRUDE_MAXLENGTH.
375
-// Note that for Bowden Extruders a too-small value here may prevent loading.
376
 #define PREVENT_LENGTHY_EXTRUDE
358
 #define PREVENT_LENGTHY_EXTRUDE
377
-#define EXTRUDE_MAXLENGTH 200
359
+#define EXTRUDE_MAXLENGTH (X_MAX_LENGTH+Y_MAX_LENGTH)
378
 
360
 
379
 //===========================================================================
361
 //===========================================================================
380
 //======================== Thermal Runaway Protection =======================
362
 //======================== Thermal Runaway Protection =======================
421
 #define USE_XMIN_PLUG
403
 #define USE_XMIN_PLUG
422
 #define USE_YMIN_PLUG
404
 #define USE_YMIN_PLUG
423
 #define USE_ZMIN_PLUG
405
 #define USE_ZMIN_PLUG
424
-//#define USE_XMAX_PLUG
425
-//#define USE_YMAX_PLUG
426
-//#define USE_ZMAX_PLUG
406
+#define USE_XMAX_PLUG
407
+#define USE_YMAX_PLUG
408
+#define USE_ZMAX_PLUG
427
 
409
 
428
 // coarse Endstop Settings
410
 // coarse Endstop Settings
429
 #define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
411
 #define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
440
 #endif
422
 #endif
441
 
423
 
442
 // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup).
424
 // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup).
443
-#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
444
-#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
445
-#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
446
-#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
447
-#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
448
-#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
449
-#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
425
+#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
426
+#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
427
+#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
428
+#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
429
+#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
430
+#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
431
+#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
450
 
432
 
451
 
433
 
452
 //=============================================================================
434
 //=============================================================================
454
 //=============================================================================
436
 //=============================================================================
455
 // @section motion
437
 // @section motion
456
 
438
 
457
-/**
458
- * Default Settings
459
- *
460
- * These settings can be reset by M502
461
- *
462
- * Note that if EEPROM is enabled, saved values will override these.
463
- */
464
-
465
-/**
466
- * Default Axis Steps Per Unit (steps/mm)
467
- * Override with M92
468
- */
469
-#define DEFAULT_AXIS_STEPS_PER_UNIT   { 80, 80, 4000, 500 }
470
-
471
-/**
472
- * Default Max Feed Rate (mm/s)
473
- * Override with M203
474
- */
475
-#define DEFAULT_MAX_FEEDRATE          { 300, 300, 5, 25 }
476
-
477
-/**
478
- * Default Max Acceleration (change/s) change = mm/s
479
- * Override with M201
480
- *
481
- * Maximum start speed for accelerated moves: { X, Y, Z, E }
482
- */
483
-#define DEFAULT_MAX_ACCELERATION      { 3000, 3000, 100, 10000 }
439
+#define DEFAULT_AXIS_STEPS_PER_UNIT   {8*24.8139,8*24.8139,8*24.8139,100}  
440
+#define DEFAULT_MAX_FEEDRATE          {35, 35, 25, 25}        // (mm/sec)
441
+#define DEFAULT_MAX_ACCELERATION      {3000,3000,100,10000}    // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot.
484
 
442
 
485
-/**
486
- * Default Acceleration (change/s) change = mm/s
487
- * Override with M204
488
- *
489
- *   M204 P    Acceleration
490
- *   M204 R    Retract Acceleration
491
- *   M204 T    Travel Acceleration
492
- */
493
-#define DEFAULT_ACCELERATION          3000    // X, Y, Z and E acceleration for printing moves
494
-#define DEFAULT_RETRACT_ACCELERATION  3000    // E acceleration for retracts
495
-#define DEFAULT_TRAVEL_ACCELERATION   3000    // X, Y, Z acceleration for travel (non printing) moves
443
+#define DEFAULT_ACCELERATION          3000    // X, Y, Z and E acceleration in mm/s^2 for printing moves
444
+#define DEFAULT_RETRACT_ACCELERATION  3000    // E acceleration in mm/s^2 for retracts
445
+#define DEFAULT_TRAVEL_ACCELERATION   3000    // X, Y, Z acceleration in mm/s^2 for travel (non printing) moves
496
 
446
 
497
-/**
498
- * Defult Jerk (mm/s)
499
- *
500
- * "Jerk" specifies the minimum speed change that requires acceleration.
501
- * When changing speed and direction, if the difference is less than the
502
- * value set here, it may happen instantaneously.
503
- */
504
-#define DEFAULT_XYJERK                20.0
505
-#define DEFAULT_ZJERK                  0.4
506
-#define DEFAULT_EJERK                  5.0
447
+// "Jerk" specifies the minimum speed change that requires acceleration.
448
+// When changing speed and direction, if the difference is less than the
449
+// value set here, it may happen instantaneously.
450
+#define DEFAULT_XYJERK                20.0    // (mm/sec)
451
+#define DEFAULT_ZJERK                  0.4    // (mm/sec)
452
+#define DEFAULT_EJERK                  5.0    // (mm/sec)
507
 
453
 
508
 
454
 
509
 //===========================================================================
455
 //===========================================================================
528
 //#define FIX_MOUNTED_PROBE
474
 //#define FIX_MOUNTED_PROBE
529
 
475
 
530
 // The BLTouch probe emulates a servo probe.
476
 // The BLTouch probe emulates a servo probe.
531
-// The default connector is SERVO 0. Set Z_ENDSTOP_SERVO_NR below to override.
532
 //#define BLTOUCH
477
 //#define BLTOUCH
533
 
478
 
534
 // Z Servo Probe, such as an endstop switch on a rotating arm.
479
 // Z Servo Probe, such as an endstop switch on a rotating arm.
665
 // @section machine
610
 // @section machine
666
 
611
 
667
 // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
612
 // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
668
-#define INVERT_X_DIR false
669
-#define INVERT_Y_DIR true
670
-#define INVERT_Z_DIR false
613
+#define INVERT_X_DIR true    // positive is away from the motor
614
+#define INVERT_Y_DIR false    // positive is towards the motor
615
+#define INVERT_Z_DIR true    // positive is away from the motor
671
 
616
 
672
 // @section extruder
617
 // @section extruder
673
 
618
 
695
 // @section machine
640
 // @section machine
696
 
641
 
697
 // Travel limits after homing (units are in mm)
642
 // Travel limits after homing (units are in mm)
698
-#define X_MIN_POS 0
699
-#define Y_MIN_POS 0
700
-#define Z_MIN_POS 0
701
-#define X_MAX_POS 200
702
-#define Y_MAX_POS 200
703
-#define Z_MAX_POS 200
643
+#define X_MIN_POS -100
644
+#define Y_MIN_POS -100
645
+#define Z_MIN_POS -100
646
+#define X_MAX_POS 375
647
+#define Y_MAX_POS 450
648
+#define Z_MAX_POS 450
704
 
649
 
705
 //===========================================================================
650
 //===========================================================================
706
 //========================= Filament Runout Sensor ==========================
651
 //========================= Filament Runout Sensor ==========================
1060
 // SD Card support is disabled by default. If your controller has an SD slot,
1005
 // SD Card support is disabled by default. If your controller has an SD slot,
1061
 // you must uncomment the following option or it won't work.
1006
 // you must uncomment the following option or it won't work.
1062
 //
1007
 //
1063
-//#define SDSUPPORT
1008
+#define SDSUPPORT
1064
 
1009
 
1065
 //
1010
 //
1066
 // SD CARD: SPI SPEED
1011
 // SD CARD: SPI SPEED
1077
 //
1022
 //
1078
 // Use CRC checks and retries on the SD communication.
1023
 // Use CRC checks and retries on the SD communication.
1079
 //
1024
 //
1080
-//#define SD_CHECK_AND_RETRY
1025
+#define SD_CHECK_AND_RETRY
1081
 
1026
 
1082
 //
1027
 //
1083
 // ENCODER SETTINGS
1028
 // ENCODER SETTINGS

+ 3
- 3
Marlin/Configuration_adv.h View File

244
 // Dual Y Steppers
244
 // Dual Y Steppers
245
 // Uncomment this option to drive two Y axis motors.
245
 // Uncomment this option to drive two Y axis motors.
246
 // The next unused E driver will be assigned to the second Y stepper.
246
 // The next unused E driver will be assigned to the second Y stepper.
247
-//#define Y_DUAL_STEPPER_DRIVERS
247
+#define Y_DUAL_STEPPER_DRIVERS
248
 #if ENABLED(Y_DUAL_STEPPER_DRIVERS)
248
 #if ENABLED(Y_DUAL_STEPPER_DRIVERS)
249
   // Set true if the two Y motors need to rotate in opposite directions
249
   // Set true if the two Y motors need to rotate in opposite directions
250
-  #define INVERT_Y2_VS_Y_DIR true
250
+  #define INVERT_Y2_VS_Y_DIR false
251
 #endif
251
 #endif
252
 
252
 
253
 // A single Z stepper driver is usually used to drive 2 stepper motors.
253
 // A single Z stepper driver is usually used to drive 2 stepper motors.
254
 // Uncomment this option to use a separate stepper driver for each Z axis motor.
254
 // Uncomment this option to use a separate stepper driver for each Z axis motor.
255
 // The next unused E driver will be assigned to the second Z stepper.
255
 // The next unused E driver will be assigned to the second Z stepper.
256
-//#define Z_DUAL_STEPPER_DRIVERS
256
+#define Z_DUAL_STEPPER_DRIVERS
257
 
257
 
258
 #if ENABLED(Z_DUAL_STEPPER_DRIVERS)
258
 #if ENABLED(Z_DUAL_STEPPER_DRIVERS)
259
 
259
 

+ 6
- 0
Marlin/Marlin.h View File

209
 
209
 
210
 #endif // !MIXING_EXTRUDER
210
 #endif // !MIXING_EXTRUDER
211
 
211
 
212
+#define G38_2_3
213
+#ifdef G38_2_3
214
+extern bool G38_flag ;   //flag to tell the interrupt handler that a G38 command is being run
215
+extern bool G38_flag_pass ;   //flag from the interrupt handler to indicate if the endstop went active
216
+#endif
217
+
212
 /**
218
 /**
213
  * The axis order in all axis related arrays is X, Y, Z, E
219
  * The axis order in all axis related arrays is X, Y, Z, E
214
  */
220
  */

+ 177
- 0
Marlin/Marlin_main.cpp View File

117
  * G30 - Single Z probe, probes bed at current XY location.
117
  * G30 - Single Z probe, probes bed at current XY location.
118
  * G31 - Dock sled (Z_PROBE_SLED only)
118
  * G31 - Dock sled (Z_PROBE_SLED only)
119
  * G32 - Undock sled (Z_PROBE_SLED only)
119
  * G32 - Undock sled (Z_PROBE_SLED only)
120
+ * G38 - Probe target - similar to G28 except it uses the Z_Probe for all three axis
120
  * G90 - Use Absolute Coordinates
121
  * G90 - Use Absolute Coordinates
121
  * G91 - Use Relative Coordinates
122
  * G91 - Use Relative Coordinates
122
  * G92 - Set current position to coordinates given
123
  * G92 - Set current position to coordinates given
276
   TWIBus i2c;
277
   TWIBus i2c;
277
 #endif
278
 #endif
278
 
279
 
280
+#ifdef G38_2_3
281
+bool G38_flag = false;   // init G38 flags
282
+bool G38_flag_pass = false;
283
+#endif
284
+
279
 bool Running = true;
285
 bool Running = true;
280
 
286
 
281
 uint8_t marlin_debug_flags = DEBUG_NONE;
287
 uint8_t marlin_debug_flags = DEBUG_NONE;
2325
 
2331
 
2326
 #endif // AUTO_BED_LEVELING_BILINEAR
2332
 #endif // AUTO_BED_LEVELING_BILINEAR
2327
 
2333
 
2334
+
2335
+#ifdef G38_2_3
2336
+
2337
+#define G38_minimum_move  0.0275   // minimum distance in mm that will produce a move (determined using the print statement in check_move)
2338
+
2339
+bool check_move()  //checks that at least one of the axis in the command line has an actual move
2340
+                   // motion planner only does moves of 0.001mm and larger
2341
+{
2342
+	
2343
+  bool move_flag = false;
2344
+  for(int8_t i=0; i < 3; i++) {
2345
+/* debug used to determine prints
2346
+		SERIAL_PROTOCOLPGM("axis: ");
2347
+		SERIAL_PROTOCOL(axis_codes[i]);
2348
+		SERIAL_PROTOCOLPGM("  code_seen :  ");
2349
+		SERIAL_PROTOCOL(code_seen(axis_codes[i]));
2350
+		SERIAL_PROTOCOLPGM("  destination : ");
2351
+		SERIAL_PROTOCOL(destination[i]);
2352
+		SERIAL_PROTOCOLPGM("  current : ");
2353
+		SERIAL_PROTOCOL(current_position[i]);
2354
+		SERIAL_PROTOCOLPGM("  dif x 1000 : ");
2355
+		SERIAL_PROTOCOLLN((destination[i] - current_position[i]) * 1000);
2356
+ */		
2357
+  if (code_seen(axis_codes[i]) && (fabs(destination[i] - current_position[i]) >= G38_minimum_move)) move_flag = true ;
2358
+/*
2359
+ ??  0.0275mm produced a move on my machine along with an updated current position. 
2360
+     0.0265mm did NOT produce a move and did NOT change the current position
2361
+     this is very different than the 0.001 in the planner.
2362
+       0.001" is .0254mm so maybe the 0.0275 observed comes from digital storage limitations/conversion/rounding
2363
+ */
2364
+  }
2365
+  return move_flag;
2366
+}
2367
+
2368
+
2369
+static void G38_run_probe(bool *G38_pass_fail) {
2370
+ 
2371
+  G38_flag = true;  //tell the interrupt handler that we're doing a G38 probe
2372
+  *G38_pass_fail = false;  
2373
+  
2374
+#ifdef X_HOME_BUMP_MM
2375
+#ifdef Y_HOME_BUMP_MM
2376
+#ifdef Z_HOME_BUMP_MM
2377
+  float G38_X_retract_mm = home_bump_mm(X_AXIS);
2378
+  float G38_Y_retract_mm = home_bump_mm(Y_AXIS);
2379
+  float G38_Z_retract_mm = home_bump_mm(Z_AXIS);
2380
+  
2381
+#else
2382
+    
2383
+  float G38_X_retract_mm = 5;
2384
+  float G38_Y_retract_mm = 5;
2385
+  float G38_Z_retract_mm = 2;
2386
+
2387
+#endif
2388
+#endif  
2389
+#endif  
2390
+  
2391
+  // only retract the axis if the axis is in the command
2392
+  if( (!code_seen('X') || (code_value_axis_units(X_AXIS) == 0)))  G38_X_retract_mm = 0;   
2393
+  if( (!code_seen('Y') || (code_value_axis_units(Y_AXIS) == 0)))  G38_Y_retract_mm = 0;
2394
+  if( (!code_seen('Z') || (code_value_axis_units(Z_AXIS) == 0)))  G38_Z_retract_mm = 0;
2395
+
2396
+  // change the direction of the retract if needed
2397
+  if ((destination[X_AXIS] - current_position[X_AXIS])>0) G38_X_retract_mm = -G38_X_retract_mm;
2398
+  if ((destination[Y_AXIS] - current_position[Y_AXIS])>0) G38_Y_retract_mm = -G38_Y_retract_mm;
2399
+  if ((destination[Z_AXIS] - current_position[Z_AXIS])>0) G38_Z_retract_mm = -G38_Z_retract_mm;
2400
+
2401
+  
2402
+  stepper.synchronize();  // wait until the machine is idle
2403
+  
2404
+  bool save_endstops = endstops.enabled;    //remember state of endstops so we can retore them at the end
2405
+  endstops.enable(true);
2406
+    
2407
+  // move until you reach the destination or hit an endstop or hit the target
2408
+  // it's an error unless have hit the target
2409
+  G38_flag_pass = false;
2410
+  *G38_pass_fail = false;
2411
+  
2412
+  planner.buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate_mm_s, active_extruder);
2413
+  stepper.synchronize();
2414
+
2415
+  // we have to let the planner know where we are right now as it is not where we said to go.
2416
+  //  and we need to update current_position[axis]
2417
+  current_position[X_AXIS] = stepper.get_axis_position_mm(X_AXIS);
2418
+  current_position[Y_AXIS] = stepper.get_axis_position_mm(Y_AXIS);
2419
+  current_position[Z_AXIS] = stepper.get_axis_position_mm(Z_AXIS);
2420
+  planner.set_position_mm(current_position[X_AXIS], current_position[Y_AXIS] , current_position[Z_AXIS] , current_position[E_AXIS]);
2421
+
2422
+  *G38_pass_fail = G38_flag_pass ;  // only care if hit target on the first move
2423
+    
2424
+  if (*G38_pass_fail) {  // no sense in doing the remaining moves if we didn't hit the endstop  
2425
+    // move away the retract distance
2426
+    float xPosition = current_position[X_AXIS] + G38_X_retract_mm;
2427
+    float yPosition = current_position[Y_AXIS] + G38_Y_retract_mm;
2428
+    float zPosition = current_position[Z_AXIS] + G38_Z_retract_mm;
2429
+     
2430
+
2431
+  
2432
+    // disable endstops on retract otherwise sometimes can't get away  
2433
+    endstops.enable(false);
2434
+    G38_flag = false; 
2435
+    
2436
+    planner.buffer_line(xPosition, yPosition , zPosition , current_position[E_AXIS], feedrate_mm_s/4, active_extruder);
2437
+    stepper.synchronize();
2438
+
2439
+
2440
+    // move back slowly
2441
+    xPosition -= G38_X_retract_mm * 2;
2442
+    yPosition -= G38_Y_retract_mm * 2;
2443
+    zPosition -= G38_Z_retract_mm * 2;
2444
+ 
2445
+
2446
+    // enable endstops on move back
2447
+    endstops.enable(true);
2448
+    G38_flag = true; 
2449
+    
2450
+    planner.buffer_line(xPosition, yPosition , zPosition , current_position[E_AXIS], feedrate_mm_s/4, active_extruder);
2451
+    stepper.synchronize();
2452
+
2453
+    // we have to let the planner know where we are right now as it is not where we said to go.
2454
+    //  and we need to update current_position[axis]
2455
+    current_position[X_AXIS] = stepper.get_axis_position_mm(X_AXIS);
2456
+    current_position[Y_AXIS] = stepper.get_axis_position_mm(Y_AXIS);
2457
+    current_position[Z_AXIS] = stepper.get_axis_position_mm(Z_AXIS);
2458
+    planner.set_position_mm(current_position[X_AXIS], current_position[Y_AXIS] , current_position[Z_AXIS] , current_position[E_AXIS]);
2459
+    
2460
+  }  
2461
+  
2462
+//  clean_up_after_endstop_move();
2463
+
2464
+  endstops.enable(save_endstops);   //restore endstops to same state as when we started
2465
+
2466
+  endstops.hit_on_purpose();
2467
+  G38_flag = false;  //tell the interrupt handler that we're done
2468
+  
2469
+}
2470
+
2471
+#endif  //G38_2_3
2472
+
2473
+
2328
 /**
2474
 /**
2329
  * Home an individual linear axis
2475
  * Home an individual linear axis
2330
  */
2476
  */
4160
 
4306
 
4161
 #endif // HAS_BED_PROBE
4307
 #endif // HAS_BED_PROBE
4162
 
4308
 
4309
+#ifdef G38_2_3
4310
+  inline void gcode_G38(float code_num) { 
4311
+  #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) || ENABLED(Z_MIN_PROBE_ENDSTOP)  //must have valid Z_MIN_PROBE definition for this command to work  
4312
+    if ((code_num == 38.2 || code_num == 38.3  ) && (code_seen('X') || code_seen('Y') || code_seen('Z'))) {
4313
+      gcode_get_destination(); // For X Y Z E F
4314
+      if (check_move()) {   // see if the commanded movement will result in a physical movement
4315
+		bool G38_pass_fail = false;
4316
+		G38_run_probe(&G38_pass_fail);
4317
+        if (!G38_pass_fail && (code_num == 38.2) ) SERIAL_PROTOCOLLNPGM(" ERROR - failed to reach target ");
4318
+      }
4319
+    }
4320
+  }
4321
+#else
4322
+ 
4323
+    SERIAL_PROTOCOLLNPGM(" ERROR - Z_MIN_PROBE must be enabled ");	
4324
+  }
4325
+#endif	
4326
+#endif //G38_2_3
4327
+
4328
+
4163
 /**
4329
 /**
4164
  * G92: Set current position to given X Y Z E
4330
  * G92: Set current position to given X Y Z E
4165
  */
4331
  */
7287
   bool code_is_good = NUMERIC(*cmd_ptr);
7453
   bool code_is_good = NUMERIC(*cmd_ptr);
7288
   if (!code_is_good) goto ExitUnknownCommand;
7454
   if (!code_is_good) goto ExitUnknownCommand;
7289
 
7455
 
7456
+#ifdef G38_2_3
7457
+  double codenum_float;
7458
+  codenum_float = atof(cmd_ptr);  //allow for decimal point in command
7459
+#endif
7460
+
7290
   // Get and skip the code number
7461
   // Get and skip the code number
7291
   do {
7462
   do {
7292
     codenum = (codenum * 10) + (*cmd_ptr - '0');
7463
     codenum = (codenum * 10) + (*cmd_ptr - '0');
7393
         #endif // Z_PROBE_SLED
7564
         #endif // Z_PROBE_SLED
7394
       #endif // HAS_BED_PROBE
7565
       #endif // HAS_BED_PROBE
7395
 
7566
 
7567
+      #ifdef G38_2_3
7568
+	   case 38:  //G38.2 & G38.3
7569
+	     gcode_G38(codenum_float);
7570
+          break;
7571
+	 #endif
7572
+ 
7396
       case 90: // G90
7573
       case 90: // G90
7397
         relative_mode = false;
7574
         relative_mode = false;
7398
         break;
7575
         break;

+ 20
- 0
Marlin/endstops.cpp View File

243
   // COPY_BIT: copy the value of COPY_BIT to BIT in bits
243
   // COPY_BIT: copy the value of COPY_BIT to BIT in bits
244
   #define COPY_BIT(bits, COPY_BIT, BIT) SET_BIT(bits, BIT, TEST(bits, COPY_BIT))
244
   #define COPY_BIT(bits, COPY_BIT, BIT) SET_BIT(bits, BIT, TEST(bits, COPY_BIT))
245
 
245
 
246
+ 
247
+#if defined(G38_2_3) && defined(Z_MIN_PIN) && Z_MIN_PIN > -1  // If G38 command then check Z_MIN for every axis and every direction  
248
+  #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \
249
+      UPDATE_ENDSTOP_BIT(AXIS, MINMAX); \
250
+      if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \
251
+        _ENDSTOP_HIT(AXIS); \
252
+        stepper.endstop_triggered(_AXIS(AXIS)); \
253
+      } \
254
+      if (G38_flag) {\
255
+        UPDATE_ENDSTOP_BIT(Z, MIN); \
256
+        if (TEST_ENDSTOP(_ENDSTOP(Z, MIN)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \
257
+          _ENDSTOP_HIT(AXIS); \
258
+          stepper.endstop_triggered(_AXIS(AXIS)); \
259
+		  G38_flag_pass = true;\
260
+        } \
261
+      } \
262
+    } while(0)
263
+#else	
246
   #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \
264
   #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \
247
       UPDATE_ENDSTOP_BIT(AXIS, MINMAX); \
265
       UPDATE_ENDSTOP_BIT(AXIS, MINMAX); \
248
       if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \
266
       if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \
250
         stepper.endstop_triggered(_AXIS(AXIS)); \
268
         stepper.endstop_triggered(_AXIS(AXIS)); \
251
       } \
269
       } \
252
     } while(0)
270
     } while(0)
271
+	
272
+#endif	  		
253
 
273
 
254
   #if ENABLED(COREXY) || ENABLED(COREXZ)
274
   #if ENABLED(COREXY) || ENABLED(COREXZ)
255
     // Head direction in -X axis for CoreXY and CoreXZ bots.
275
     // Head direction in -X axis for CoreXY and CoreXZ bots.

Loading…
Cancel
Save