commit
15071385f7
29
gcode.c
29
gcode.c
@ -123,8 +123,8 @@ uint8_t gc_execute_line(char *line)
|
|||||||
char letter;
|
char letter;
|
||||||
float value;
|
float value;
|
||||||
uint8_t int_value = 0;
|
uint8_t int_value = 0;
|
||||||
uint8_t mantissa = 0; // NOTE: For mantissa values > 255, variable type must be changed to uint16_t.
|
uint16_t mantissa = 0; // NOTE: For mantissa values > 255, variable type must be changed to uint16_t.
|
||||||
|
uint8_t probe_mode = 0;
|
||||||
|
|
||||||
while (line[char_counter] != 0) { // Loop until no more g-code words in line.
|
while (line[char_counter] != 0) { // Loop until no more g-code words in line.
|
||||||
|
|
||||||
@ -210,11 +210,22 @@ uint8_t gc_execute_line(char *line)
|
|||||||
case 3: gc_block.modal.motion = MOTION_MODE_CCW_ARC; break; // G3
|
case 3: gc_block.modal.motion = MOTION_MODE_CCW_ARC; break; // G3
|
||||||
case 38:
|
case 38:
|
||||||
switch(mantissa) {
|
switch(mantissa) {
|
||||||
case 20: gc_block.modal.motion = MOTION_MODE_PROBE; break; // G38.2
|
case 20: // G38.2
|
||||||
// NOTE: If G38.3+ are enabled, change mantissa variable type to uint16_t.
|
gc_block.modal.motion = MOTION_MODE_PROBE;
|
||||||
// case 30: gc_block.modal.motion = MOTION_MODE_PROBE_NO_ERROR; break; // G38.3 Not supported.
|
break;
|
||||||
// case 40: // Not supported.
|
case 30: // G38.3
|
||||||
// case 50: // Not supported.
|
gc_block.modal.motion = MOTION_MODE_PROBE;
|
||||||
|
probe_mode = PROBE_NO_ERROR;
|
||||||
|
break;
|
||||||
|
case 40: // G38.4
|
||||||
|
gc_block.modal.motion = MOTION_MODE_PROBE;
|
||||||
|
probe_mode = PROBE_AWAY;
|
||||||
|
break;
|
||||||
|
case 50: // G38.5
|
||||||
|
gc_block.modal.motion = MOTION_MODE_PROBE;
|
||||||
|
probe_mode = PROBE_AWAY | PROBE_NO_ERROR;
|
||||||
|
break;
|
||||||
|
|
||||||
default: FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); // [Unsupported G38.x command]
|
default: FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); // [Unsupported G38.x command]
|
||||||
}
|
}
|
||||||
mantissa = 0; // Set to zero to indicate valid non-integer G command.
|
mantissa = 0; // Set to zero to indicate valid non-integer G command.
|
||||||
@ -973,9 +984,9 @@ uint8_t gc_execute_line(char *line)
|
|||||||
// NOTE: gc_block.values.xyz is returned from mc_probe_cycle with the updated position value. So
|
// NOTE: gc_block.values.xyz is returned from mc_probe_cycle with the updated position value. So
|
||||||
// upon a successful probing cycle, the machine position and the returned value should be the same.
|
// upon a successful probing cycle, the machine position and the returned value should be the same.
|
||||||
#ifdef USE_LINE_NUMBERS
|
#ifdef USE_LINE_NUMBERS
|
||||||
mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, gc_block.values.n);
|
mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, probe_mode, gc_block.values.n);
|
||||||
#else
|
#else
|
||||||
mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate);
|
mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, probe_mode);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
gcode.h
2
gcode.h
@ -71,7 +71,7 @@
|
|||||||
#define MOTION_MODE_LINEAR 1 // G1
|
#define MOTION_MODE_LINEAR 1 // G1
|
||||||
#define MOTION_MODE_CW_ARC 2 // G2
|
#define MOTION_MODE_CW_ARC 2 // G2
|
||||||
#define MOTION_MODE_CCW_ARC 3 // G3
|
#define MOTION_MODE_CCW_ARC 3 // G3
|
||||||
#define MOTION_MODE_PROBE 4 // G38.2
|
#define MOTION_MODE_PROBE 4 // G38.2, G38.3, G38.4, G38.5
|
||||||
#define MOTION_MODE_NONE 5 // G80
|
#define MOTION_MODE_NONE 5 // G80
|
||||||
|
|
||||||
// Modal Group G2: Plane select
|
// Modal Group G2: Plane select
|
||||||
|
@ -287,9 +287,9 @@ void mc_homing_cycle()
|
|||||||
// Perform tool length probe cycle. Requires probe switch.
|
// Perform tool length probe cycle. Requires probe switch.
|
||||||
// NOTE: Upon probe failure, the program will be stopped and placed into ALARM state.
|
// NOTE: Upon probe failure, the program will be stopped and placed into ALARM state.
|
||||||
#ifdef USE_LINE_NUMBERS
|
#ifdef USE_LINE_NUMBERS
|
||||||
void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, int32_t line_number)
|
void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, uint8_t mode, int32_t line_number)
|
||||||
#else
|
#else
|
||||||
void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate)
|
void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, uint8_t mode)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
// TODO: Need to update this cycle so it obeys a non-auto cycle start.
|
// TODO: Need to update this cycle so it obeys a non-auto cycle start.
|
||||||
@ -298,9 +298,10 @@ void mc_homing_cycle()
|
|||||||
// Finish all queued commands and empty planner buffer before starting probe cycle.
|
// Finish all queued commands and empty planner buffer before starting probe cycle.
|
||||||
protocol_buffer_synchronize();
|
protocol_buffer_synchronize();
|
||||||
uint8_t auto_start_state = sys.auto_start; // Store run state
|
uint8_t auto_start_state = sys.auto_start; // Store run state
|
||||||
|
uint8_t perform_pull_off = 1;
|
||||||
|
|
||||||
// After syncing, check if probe is already triggered. If so, halt and issue alarm.
|
// After syncing, check if probe is already triggered. If so, halt and issue alarm.
|
||||||
if (probe_get_state()) {
|
if (probe_get_state(mode) && probe_errors_enabled(mode)) {
|
||||||
bit_true_atomic(sys.execute, EXEC_CRIT_EVENT);
|
bit_true_atomic(sys.execute, EXEC_CRIT_EVENT);
|
||||||
protocol_execute_runtime();
|
protocol_execute_runtime();
|
||||||
}
|
}
|
||||||
@ -314,7 +315,7 @@ void mc_homing_cycle()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Activate the probing monitor in the stepper module.
|
// Activate the probing monitor in the stepper module.
|
||||||
sys.probe_state = PROBE_ACTIVE;
|
sys.probe_state = PROBE_ACTIVE | mode;
|
||||||
|
|
||||||
// Perform probing cycle. Wait here until probe is triggered or motion completes.
|
// Perform probing cycle. Wait here until probe is triggered or motion completes.
|
||||||
bit_true_atomic(sys.execute, EXEC_CYCLE_START);
|
bit_true_atomic(sys.execute, EXEC_CYCLE_START);
|
||||||
@ -324,7 +325,15 @@ void mc_homing_cycle()
|
|||||||
} while ((sys.state != STATE_IDLE) && (sys.state != STATE_QUEUED));
|
} while ((sys.state != STATE_IDLE) && (sys.state != STATE_QUEUED));
|
||||||
|
|
||||||
// Probing motion complete. If the probe has not been triggered, error out.
|
// Probing motion complete. If the probe has not been triggered, error out.
|
||||||
if (sys.probe_state == PROBE_ACTIVE) { bit_true_atomic(sys.execute, EXEC_CRIT_EVENT); }
|
if (sys.probe_state & PROBE_ACTIVE) {
|
||||||
|
|
||||||
|
if (probe_errors_enabled(mode)) {
|
||||||
|
bit_true_atomic(sys.execute, EXEC_CRIT_EVENT);
|
||||||
|
} else {
|
||||||
|
perform_pull_off = 0;
|
||||||
|
probe_finalize(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
protocol_execute_runtime(); // Check and execute run-time commands
|
protocol_execute_runtime(); // Check and execute run-time commands
|
||||||
if (sys.abort) { return; } // Check for system abort
|
if (sys.abort) { return; } // Check for system abort
|
||||||
|
|
||||||
@ -332,24 +341,26 @@ void mc_homing_cycle()
|
|||||||
st_reset(); // Reest step segment buffer.
|
st_reset(); // Reest step segment buffer.
|
||||||
plan_reset(); // Reset planner buffer. Zero planner positions. Ensure probing motion is cleared.
|
plan_reset(); // Reset planner buffer. Zero planner positions. Ensure probing motion is cleared.
|
||||||
plan_sync_position(); // Sync planner position to current machine position.
|
plan_sync_position(); // Sync planner position to current machine position.
|
||||||
|
|
||||||
// Pull-off triggered probe to the trigger location since we had to decelerate a little beyond
|
|
||||||
// it to stop the machine in a controlled manner.
|
|
||||||
uint8_t idx;
|
|
||||||
for(idx=0; idx<N_AXIS; idx++){
|
|
||||||
// NOTE: The target[] variable updated here will be sent back and synced with the g-code parser.
|
|
||||||
target[idx] = (float)sys.probe_position[idx]/settings.steps_per_mm[idx];
|
|
||||||
}
|
|
||||||
#ifdef USE_LINE_NUMBERS
|
|
||||||
mc_line(target, feed_rate, invert_feed_rate, line_number);
|
|
||||||
#else
|
|
||||||
mc_line(target, feed_rate, invert_feed_rate);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Execute pull-off motion and wait until it completes.
|
if (perform_pull_off) {
|
||||||
bit_true_atomic(sys.execute, EXEC_CYCLE_START);
|
// Pull-off triggered probe to the trigger location since we had to decelerate a little beyond
|
||||||
protocol_buffer_synchronize();
|
// it to stop the machine in a controlled manner.
|
||||||
if (sys.abort) { return; } // Return if system reset has been issued.
|
uint8_t idx;
|
||||||
|
for(idx=0; idx<N_AXIS; idx++){
|
||||||
|
// NOTE: The target[] variable updated here will be sent back and synced with the g-code parser.
|
||||||
|
target[idx] = (float)sys.probe_position[idx]/settings.steps_per_mm[idx];
|
||||||
|
}
|
||||||
|
#ifdef USE_LINE_NUMBERS
|
||||||
|
mc_line(target, feed_rate, invert_feed_rate, line_number);
|
||||||
|
#else
|
||||||
|
mc_line(target, feed_rate, invert_feed_rate);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Execute pull-off motion and wait until it completes.
|
||||||
|
bit_true_atomic(sys.execute, EXEC_CYCLE_START);
|
||||||
|
protocol_buffer_synchronize();
|
||||||
|
if (sys.abort) { return; } // Return if system reset has been issued.
|
||||||
|
}
|
||||||
|
|
||||||
sys.auto_start = auto_start_state; // Restore run state before returning
|
sys.auto_start = auto_start_state; // Restore run state before returning
|
||||||
|
|
||||||
|
@ -58,9 +58,9 @@ void mc_homing_cycle();
|
|||||||
|
|
||||||
// Perform tool length probe cycle. Requires probe switch.
|
// Perform tool length probe cycle. Requires probe switch.
|
||||||
#ifdef USE_LINE_NUMBERS
|
#ifdef USE_LINE_NUMBERS
|
||||||
void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, int32_t line_number);
|
void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, uint8_t motion, int32_t line_number);
|
||||||
#else
|
#else
|
||||||
void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate);
|
void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, uint8_t motion);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Performs system reset. If in motion state, kills all motion and sets system alarm.
|
// Performs system reset. If in motion state, kills all motion and sets system alarm.
|
||||||
|
23
probe.c
23
probe.c
@ -41,19 +41,30 @@ void probe_init()
|
|||||||
|
|
||||||
|
|
||||||
// Returns the probe pin state. Triggered = true. Called by gcode parser and probe state monitor.
|
// Returns the probe pin state. Triggered = true. Called by gcode parser and probe state monitor.
|
||||||
uint8_t probe_get_state() { return((PROBE_PIN & PROBE_MASK) ^ probe_invert_mask); }
|
uint8_t probe_get_state(uint8_t mode) {
|
||||||
|
mode = ((mode >> PROBE_AWAY_BIT) & 1) << PROBE_BIT;
|
||||||
|
return mode ^ ((PROBE_PIN & PROBE_MASK) ^ probe_invert_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t probe_errors_enabled(uint8_t mode) {
|
||||||
|
return !(mode & PROBE_NO_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void probe_finalize(uint8_t probe_succeeded) {
|
||||||
|
sys.probe_state = PROBE_OFF;
|
||||||
|
sys.probe_succeeded = probe_succeeded;
|
||||||
|
memcpy(sys.probe_position, sys.position, sizeof(float)*N_AXIS);
|
||||||
|
bit_true(sys.execute, EXEC_FEED_HOLD);
|
||||||
|
}
|
||||||
|
|
||||||
// Monitors probe pin state and records the system position when detected. Called by the
|
// Monitors probe pin state and records the system position when detected. Called by the
|
||||||
// stepper ISR per ISR tick.
|
// stepper ISR per ISR tick.
|
||||||
// NOTE: This function must be extremely efficient as to not bog down the stepper ISR.
|
// NOTE: This function must be extremely efficient as to not bog down the stepper ISR.
|
||||||
void probe_state_monitor()
|
void probe_state_monitor()
|
||||||
{
|
{
|
||||||
if (sys.probe_state == PROBE_ACTIVE) {
|
if (sys.probe_state != PROBE_OFF) {
|
||||||
if (probe_get_state()) {
|
if (probe_get_state(sys.probe_state)) {
|
||||||
sys.probe_state = PROBE_OFF;
|
probe_finalize(1);
|
||||||
memcpy(sys.probe_position, sys.position, sizeof(float)*N_AXIS);
|
|
||||||
bit_true(sys.execute, EXEC_FEED_HOLD);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
12
probe.h
12
probe.h
@ -25,12 +25,22 @@
|
|||||||
#define PROBE_OFF 0 // No probing. (Must be zero.)
|
#define PROBE_OFF 0 // No probing. (Must be zero.)
|
||||||
#define PROBE_ACTIVE 1 // Actively watching the input pin.
|
#define PROBE_ACTIVE 1 // Actively watching the input pin.
|
||||||
|
|
||||||
|
// Probe direction and error modes
|
||||||
|
#define PROBE_AWAY 2 // G38.4, G38.5
|
||||||
|
#define PROBE_NO_ERROR 4 // G38.3, G38.5
|
||||||
|
|
||||||
|
#define PROBE_AWAY_BIT 1
|
||||||
|
#define PROBE_NO_ERROR_BIT 2
|
||||||
|
|
||||||
// Probe pin initialization routine.
|
// Probe pin initialization routine.
|
||||||
void probe_init();
|
void probe_init();
|
||||||
|
|
||||||
// Returns probe pin state.
|
// Returns probe pin state.
|
||||||
uint8_t probe_get_state();
|
uint8_t probe_get_state(uint8_t mode);
|
||||||
|
|
||||||
|
uint8_t probe_errors_enabled(uint8_t mode);
|
||||||
|
|
||||||
|
void probe_finalize(uint8_t probe_succeeded);
|
||||||
|
|
||||||
// Monitors probe pin state and records the system position when detected. Called by the
|
// Monitors probe pin state and records the system position when detected. Called by the
|
||||||
// stepper ISR per ISR tick.
|
// stepper ISR per ISR tick.
|
||||||
|
4
report.c
4
report.c
@ -235,7 +235,9 @@ void report_probe_parameters()
|
|||||||
print_position[i] = sys.probe_position[i]/settings.steps_per_mm[i];
|
print_position[i] = sys.probe_position[i]/settings.steps_per_mm[i];
|
||||||
printFloat_CoordValue(print_position[i]);
|
printFloat_CoordValue(print_position[i]);
|
||||||
if (i < (N_AXIS-1)) { printPgmString(PSTR(",")); }
|
if (i < (N_AXIS-1)) { printPgmString(PSTR(",")); }
|
||||||
}
|
}
|
||||||
|
printPgmString(PSTR(":"));
|
||||||
|
print_uint8_base10(sys.probe_succeeded);
|
||||||
printPgmString(PSTR("]\r\n"));
|
printPgmString(PSTR("]\r\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
system.h
1
system.h
@ -79,6 +79,7 @@ typedef struct {
|
|||||||
uint8_t auto_start; // Planner auto-start flag. Toggled off during feed hold. Defaulted by settings.
|
uint8_t auto_start; // Planner auto-start flag. Toggled off during feed hold. Defaulted by settings.
|
||||||
volatile uint8_t probe_state; // Probing state value. Used to coordinate the probing cycle with stepper ISR.
|
volatile uint8_t probe_state; // Probing state value. Used to coordinate the probing cycle with stepper ISR.
|
||||||
int32_t probe_position[N_AXIS]; // Last probe position in machine coordinates and steps.
|
int32_t probe_position[N_AXIS]; // Last probe position in machine coordinates and steps.
|
||||||
|
uint8_t probe_succeeded;
|
||||||
} system_t;
|
} system_t;
|
||||||
extern system_t sys;
|
extern system_t sys;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user