26#ifndef HOMING_AXIS_SEARCH_SCALAR
27 #define HOMING_AXIS_SEARCH_SCALAR 1.5
29#ifndef HOMING_AXIS_LOCATE_SCALAR
30 #define HOMING_AXIS_LOCATE_SCALAR 5.0
33#ifdef ENABLE_DUAL_AXIS
35 #define DUAL_AXIS_CHECK_DISABLE 0
36 #define DUAL_AXIS_CHECK_ENABLE bit(0)
37 #define DUAL_AXIS_CHECK_TRIGGER_1 bit(1)
38 #define DUAL_AXIS_CHECK_TRIGGER_2 bit(2)
43 LIMIT_DDR &= ~(LIMIT_MASK);
45 #ifdef DISABLE_LIMIT_PIN_PULL_UP
46 LIMIT_PORT &= ~(LIMIT_MASK);
48 LIMIT_PORT |= (LIMIT_MASK);
52 LIMIT_PCMSK |= LIMIT_MASK;
53 PCICR |= (1 << LIMIT_INT);
58 #ifdef ENABLE_SOFTWARE_DEBOUNCE
60 WDTCSR |= (1<<WDCE) | (1<<WDE);
69 LIMIT_PCMSK &= ~LIMIT_MASK;
70 PCICR &= ~(1 << LIMIT_INT);
79 uint8_t limit_state = 0;
80 uint8_t pin = (LIMIT_PIN & LIMIT_MASK);
81 #ifdef INVERT_LIMIT_PIN_MASK
82 pin ^= INVERT_LIMIT_PIN_MASK;
87 for (idx=0; idx<
N_AXIS; idx++) {
90 #ifdef ENABLE_DUAL_AXIS
91 if (pin & (1<<DUAL_LIMIT_BIT)) { limit_state |= (1 <<
N_AXIS); }
109#ifndef ENABLE_SOFTWARE_DEBOUNCE
119 #ifdef HARD_LIMIT_FORCE_STATE_CHECK
134 ISR(LIMIT_INT_vect) {
if (!(WDTCSR & (1<<WDIE))) { WDTCSR |= (1<<WDIE); } }
137 WDTCSR &= ~(1<<WDIE);
166 #ifdef USE_LINE_NUMBERS
173 #ifdef ENABLE_DUAL_AXIS
174 uint8_t step_pin_dual;
175 uint8_t dual_axis_async_check;
176 int32_t dual_trigger_position;
177 #if (DUAL_AXIS_SELECT == X_AXIS)
188 float max_travel = 0.0;
190 for (idx=0; idx<
N_AXIS; idx++) {
203 #ifdef ENABLE_DUAL_AXIS
204 step_pin_dual = (1<<DUAL_STEP_BIT);
208 bool approach =
true;
211 uint8_t limit_state, axislock, n_active_axis;
218 #ifdef ENABLE_DUAL_AXIS
219 sys.homing_axis_lock_dual = 0;
220 dual_trigger_position = 0;
221 dual_axis_async_check = DUAL_AXIS_CHECK_DISABLE;
224 for (idx=0; idx<
N_AXIS; idx++) {
230 int32_t axis_position = system_convert_corexy_to_y_axis_steps(
sys_position);
233 }
else if (idx ==
Y_AXIS) {
234 int32_t axis_position = system_convert_corexy_to_x_axis_steps(
sys_position);
245 if (approach) { target[idx] = -max_travel; }
246 else { target[idx] = max_travel; }
248 if (approach) { target[idx] = max_travel; }
249 else { target[idx] = -max_travel; }
252 axislock |= step_pin[idx];
253 #ifdef ENABLE_DUAL_AXIS
259 homing_rate *= sqrt(n_active_axis);
273 for (idx=0; idx<
N_AXIS; idx++) {
274 if (axislock & step_pin[idx]) {
275 if (limit_state & (1 << idx)) {
278 else { axislock &= ~(step_pin[A_MOTOR]|step_pin[B_MOTOR]); }
280 axislock &= ~(step_pin[idx]);
281 #ifdef ENABLE_DUAL_AXIS
282 if (idx ==
DUAL_AXIS_SELECT) { dual_axis_async_check |= DUAL_AXIS_CHECK_TRIGGER_1; }
289 #ifdef ENABLE_DUAL_AXIS
290 if (
sys.homing_axis_lock_dual) {
291 if (limit_state & (1 <<
N_AXIS)) {
292 sys.homing_axis_lock_dual = 0;
293 dual_axis_async_check |= DUAL_AXIS_CHECK_TRIGGER_2;
298 if (dual_axis_async_check) {
299 if (dual_axis_async_check & DUAL_AXIS_CHECK_ENABLE) {
300 if (( dual_axis_async_check & (DUAL_AXIS_CHECK_TRIGGER_1 | DUAL_AXIS_CHECK_TRIGGER_2)) == (DUAL_AXIS_CHECK_TRIGGER_1 | DUAL_AXIS_CHECK_TRIGGER_2)) {
301 dual_axis_async_check = DUAL_AXIS_CHECK_DISABLE;
311 dual_axis_async_check |= DUAL_AXIS_CHECK_ENABLE;
342 #ifdef ENABLE_DUAL_AXIS
343 }
while ((STEP_MASK & axislock) || (
sys.homing_axis_lock_dual));
345 }
while (STEP_MASK & axislock);
352 approach = !approach;
363 }
while (n_cycle-- > 0);
371 int32_t set_axis_position;
373 for (idx=0; idx<
N_AXIS; idx++) {
375 if (cycle_mask &
bit(idx)) {
376 #ifdef HOMING_FORCE_SET_ORIGIN
377 set_axis_position = 0;
388 int32_t off_axis_position = system_convert_corexy_to_y_axis_steps(
sys_position);
389 sys_position[A_MOTOR] = set_axis_position + off_axis_position;
390 sys_position[B_MOTOR] = set_axis_position - off_axis_position;
392 int32_t off_axis_position = system_convert_corexy_to_x_axis_steps(
sys_position);
393 sys_position[A_MOTOR] = off_axis_position + set_axis_position;
394 sys_position[B_MOTOR] = off_axis_position - set_axis_position;
#define N_HOMING_LOCATE_CYCLE
#define DUAL_AXIS_HOMING_FAIL_AXIS_LENGTH_PERCENT
#define DUAL_AXIS_HOMING_FAIL_DISTANCE_MIN
#define DUAL_AXIS_HOMING_FAIL_DISTANCE_MAX
#define HOMING_AXIS_LOCATE_SCALAR
#define HOMING_AXIS_SEARCH_SCALAR
uint8_t limits_get_state()
void limits_go_home(uint8_t cycle_mask)
void limits_soft_check(float *target)
int32_t sys_position[N_AXIS]
volatile uint8_t sys_rt_exec_alarm
volatile uint8_t sys_rt_exec_state
#define HOMING_CYCLE_LINE_NUMBER
void delay_ms(uint16_t ms)
#define bit_isfalse(x, mask)
#define bit_istrue(x, mask)
uint8_t plan_buffer_line(float *target, plan_line_data_t *pl_data)
#define PL_COND_FLAG_SYSTEM_MOTION
#define PL_COND_FLAG_NO_FEED_OVERRIDE
void protocol_execute_realtime()
uint8_t get_limit_pin_mask(uint8_t axis_idx)
uint8_t get_step_pin_mask(uint8_t axis_idx)
#define BITFLAG_HARD_LIMIT_ENABLE
#define BITFLAG_INVERT_LIMIT_PINS
float steps_per_mm[N_AXIS]
uint16_t homing_debounce_delay
void system_set_exec_state_flag(uint8_t mask)
void system_clear_exec_state_flag(uint8_t mask)
void system_set_exec_alarm(uint8_t code)
void system_convert_array_steps_to_mpos(float *position, int32_t *steps)
uint8_t system_check_travel_limits(float *target)
#define EXEC_ALARM_HOMING_FAIL_APPROACH
#define EXEC_ALARM_HOMING_FAIL_RESET
#define EXEC_ALARM_HOMING_FAIL_PULLOFF
#define EXEC_ALARM_HARD_LIMIT
#define STEP_CONTROL_EXECUTE_SYS_MOTION
#define EXEC_ALARM_SOFT_LIMIT
#define EXEC_ALARM_HOMING_FAIL_DUAL_APPROACH
#define EXEC_ALARM_HOMING_FAIL_DOOR
#define STEP_CONTROL_NORMAL_OP