void remote488_device::update_signals_from_rem(uint8_t to_set , uint8_t to_clear) { uint8_t diff = m_in_signals; m_in_signals |= to_set; m_in_signals &= ~to_clear; diff ^= m_in_signals; m_out_signals = m_in_signals; //LOG("REM SIG %02x %02x\n" , m_in_signals , diff); m_no_propagation = true; uint8_t tmp = m_out_signals; if (BIT(diff , SIGNAL_ATN_BIT)) { m_bus->atn_w(this , BIT(m_in_signals , SIGNAL_ATN_BIT)); COPY_BIT(m_bus->atn_r() , tmp , SIGNAL_ATN_BIT); } if (BIT(diff , SIGNAL_IFC_BIT)) { m_bus->ifc_w(this , BIT(m_in_signals , SIGNAL_IFC_BIT)); COPY_BIT(m_bus->ifc_r() , tmp , SIGNAL_IFC_BIT); } if (BIT(diff , SIGNAL_REN_BIT)) { m_bus->ren_w(this , BIT(m_in_signals , SIGNAL_REN_BIT)); COPY_BIT(m_bus->ren_r() , tmp , SIGNAL_REN_BIT); } if (BIT(diff , SIGNAL_SRQ_BIT)) { m_bus->srq_w(this , BIT(m_in_signals , SIGNAL_SRQ_BIT)); COPY_BIT(m_bus->srq_r() , tmp , SIGNAL_SRQ_BIT); } m_no_propagation = false; update_state(tmp); }
void remote488_device::update_signal(signal_bit bit , int state) { if (!m_no_propagation) { uint8_t tmp = m_out_signals; COPY_BIT(state , tmp , bit); update_state(tmp); } }
void soft_usart__rx__thread__run(void) { VT_BEGIN(soft_usart__rx__thread, soft_usart__rx__thread__ip); led_red__set(0); uint8_t pin_data0 = PIN_REG(SOFT_USART__RX__PORT); COPY_BIT(pin_data0, SOFT_USART__RX__PIN, soft_usart__rx__data, 0); VT_YIELD(soft_usart__rx__thread, soft_usart__rx__thread__ip); uint8_t pin_data1 = PIN_REG(SOFT_USART__RX__PORT); COPY_BIT(pin_data1, SOFT_USART__RX__PIN, soft_usart__rx__data, 1); VT_YIELD(soft_usart__rx__thread, soft_usart__rx__thread__ip); uint8_t pin_data2 = PIN_REG(SOFT_USART__RX__PORT); COPY_BIT(pin_data2, SOFT_USART__RX__PIN, soft_usart__rx__data, 2); VT_YIELD(soft_usart__rx__thread, soft_usart__rx__thread__ip); uint8_t pin_data3 = PIN_REG(SOFT_USART__RX__PORT); COPY_BIT(pin_data3, SOFT_USART__RX__PIN, soft_usart__rx__data, 3); VT_YIELD(soft_usart__rx__thread, soft_usart__rx__thread__ip); uint8_t pin_data4 = PIN_REG(SOFT_USART__RX__PORT); COPY_BIT(pin_data4, SOFT_USART__RX__PIN, soft_usart__rx__data, 4); VT_YIELD(soft_usart__rx__thread, soft_usart__rx__thread__ip); uint8_t pin_data5 = PIN_REG(SOFT_USART__RX__PORT); COPY_BIT(pin_data5, SOFT_USART__RX__PIN, soft_usart__rx__data, 5); VT_YIELD(soft_usart__rx__thread, soft_usart__rx__thread__ip); uint8_t pin_data6 = PIN_REG(SOFT_USART__RX__PORT); COPY_BIT(pin_data6, SOFT_USART__RX__PIN, soft_usart__rx__data, 6); VT_YIELD(soft_usart__rx__thread, soft_usart__rx__thread__ip); uint8_t pin_data7 = PIN_REG(SOFT_USART__RX__PORT); COPY_BIT(pin_data7, SOFT_USART__RX__PIN, soft_usart__rx__data, 7); VT_YIELD(soft_usart__rx__thread, soft_usart__rx__thread__ip); // In the middle of stop bit soft_usart__timer__stop(); int0__start(); led_red__set(1); if (soft_usart__rx__data == 42) { led_green__set(0); } else { led_green__set(1); } VT_UNREACHEABLE_END(soft_usart__rx__thread); }
void hp9845_printer_device::insert_char(uint8_t ch) { if (m_pos == 80) { crlf(); } COPY_BIT(m_current_big , m_attrs[ m_pos ] , ATTRS_BIG_BIT); COPY_BIT(m_current_u_l , m_attrs[ m_pos ] , ATTRS_U_L_BIT); if (ch == '_') { BIT_SET(m_attrs[ m_pos ] , ATTRS_U_L_BIT); } else { m_line[ m_pos ] = ch; // Check for redefined characters unsigned redef_idx; if (is_ch_redef(ch , redef_idx)) { m_attrs[ m_pos ] = (m_attrs[ m_pos ] & ~ATTRS_REDEF_NO_MASK) | (uint8_t)redef_idx | ATTRS_NEW_MASK; } else { BIT_CLR(m_attrs[ m_pos ] , ATTRS_NEW_BIT); } } m_pos++; }
// Check endstops - Called from ISR! void Endstops::update() { #define _ENDSTOP_PIN(AXIS, MINMAX) AXIS ##_## MINMAX ##_PIN #define _ENDSTOP_INVERTING(AXIS, MINMAX) AXIS ##_## MINMAX ##_ENDSTOP_INVERTING #define _ENDSTOP_HIT(AXIS) SBI(endstop_hit_bits, _ENDSTOP(AXIS, MIN)) #define _ENDSTOP(AXIS, MINMAX) AXIS ##_## MINMAX // UPDATE_ENDSTOP_BIT: set the current endstop bits for an endstop to its status #define UPDATE_ENDSTOP_BIT(AXIS, MINMAX) SET_BIT(current_endstop_bits, _ENDSTOP(AXIS, MINMAX), (READ(_ENDSTOP_PIN(AXIS, MINMAX)) != _ENDSTOP_INVERTING(AXIS, MINMAX))) // COPY_BIT: copy the value of COPY_BIT to BIT in bits #define COPY_BIT(bits, COPY_BIT, BIT) SET_BIT(bits, BIT, TEST(bits, COPY_BIT)) #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \ UPDATE_ENDSTOP_BIT(AXIS, MINMAX); \ if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \ _ENDSTOP_HIT(AXIS); \ stepper.endstop_triggered(_AXIS(AXIS)); \ } \ } while(0) #if ENABLED(COREXY) || ENABLED(COREXZ) // Head direction in -X axis for CoreXY and CoreXZ bots. // If DeltaA == -DeltaB, the movement is only in Y or Z axis if ((stepper.current_block->steps[CORE_AXIS_1] != stepper.current_block->steps[CORE_AXIS_2]) || (stepper.motor_direction(CORE_AXIS_1) == stepper.motor_direction(CORE_AXIS_2))) { if (stepper.motor_direction(X_HEAD)) #else if (stepper.motor_direction(X_AXIS)) // stepping along -X axis (regular Cartesian bot) #endif { // -direction #if ENABLED(DUAL_X_CARRIAGE) // with 2 x-carriages, endstops are only checked in the homing direction for the active extruder if ((stepper.current_block->active_extruder == 0 && X_HOME_DIR == -1) || (stepper.current_block->active_extruder != 0 && X2_HOME_DIR == -1)) #endif { #if HAS_X_MIN UPDATE_ENDSTOP(X, MIN); #endif } } else { // +direction #if ENABLED(DUAL_X_CARRIAGE) // with 2 x-carriages, endstops are only checked in the homing direction for the active extruder if ((stepper.current_block->active_extruder == 0 && X_HOME_DIR == 1) || (stepper.current_block->active_extruder != 0 && X2_HOME_DIR == 1)) #endif { #if HAS_X_MAX UPDATE_ENDSTOP(X, MAX); #endif } } #if ENABLED(COREXY) || ENABLED(COREXZ) } #endif #if ENABLED(COREXY) || ENABLED(COREYZ) // Head direction in -Y axis for CoreXY / CoreYZ bots. // If DeltaA == DeltaB, the movement is only in X or Y axis if ((stepper.current_block->steps[CORE_AXIS_1] != stepper.current_block->steps[CORE_AXIS_2]) || (stepper.motor_direction(CORE_AXIS_1) != stepper.motor_direction(CORE_AXIS_2))) { if (stepper.motor_direction(Y_HEAD)) #else if (stepper.motor_direction(Y_AXIS)) // -direction #endif { // -direction #if HAS_Y_MIN UPDATE_ENDSTOP(Y, MIN); #endif } else { // +direction #if HAS_Y_MAX UPDATE_ENDSTOP(Y, MAX); #endif } #if ENABLED(COREXY) || ENABLED(COREYZ) } #endif #if ENABLED(COREXZ) || ENABLED(COREYZ) // Head direction in -Z axis for CoreXZ or CoreYZ bots. // If DeltaA == DeltaB, the movement is only in X or Y axis if ((stepper.current_block->steps[CORE_AXIS_1] != stepper.current_block->steps[CORE_AXIS_2]) || (stepper.motor_direction(CORE_AXIS_1) != stepper.motor_direction(CORE_AXIS_2))) { if (stepper.motor_direction(Z_HEAD)) #else if (stepper.motor_direction(Z_AXIS)) #endif { // z -direction #if HAS_Z_MIN #if ENABLED(Z_DUAL_ENDSTOPS) UPDATE_ENDSTOP_BIT(Z, MIN); #if HAS_Z2_MIN UPDATE_ENDSTOP_BIT(Z2, MIN); #else COPY_BIT(current_endstop_bits, Z_MIN, Z2_MIN); #endif test_dual_z_endstops(Z_MIN, Z2_MIN); #else // !Z_DUAL_ENDSTOPS #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) if (z_probe_enabled) UPDATE_ENDSTOP(Z, MIN); #else UPDATE_ENDSTOP(Z, MIN); #endif #endif // !Z_DUAL_ENDSTOPS #endif // HAS_Z_MIN #if ENABLED(Z_MIN_PROBE_ENDSTOP) if (z_probe_enabled) { UPDATE_ENDSTOP(Z, MIN_PROBE); if (TEST_ENDSTOP(Z_MIN_PROBE)) SBI(endstop_hit_bits, Z_MIN_PROBE); } #endif } else { // z +direction #if HAS_Z_MAX #if ENABLED(Z_DUAL_ENDSTOPS) UPDATE_ENDSTOP_BIT(Z, MAX); #if HAS_Z2_MAX UPDATE_ENDSTOP_BIT(Z2, MAX); #else COPY_BIT(current_endstop_bits, Z_MAX, Z2_MAX); #endif test_dual_z_endstops(Z_MAX, Z2_MAX); #else // !Z_DUAL_ENDSTOPS UPDATE_ENDSTOP(Z, MAX); #endif // !Z_DUAL_ENDSTOPS #endif // Z_MAX_PIN } #if ENABLED(COREXZ) } #endif old_endstop_bits = current_endstop_bits; } // Endstops::update()
// Check endstops inline void update_endstops() { #ifdef Z_DUAL_ENDSTOPS uint16_t #else byte #endif current_endstop_bits = 0; #define _ENDSTOP_PIN(AXIS, MINMAX) AXIS ##_## MINMAX ##_PIN #define _ENDSTOP_INVERTING(AXIS, MINMAX) AXIS ##_## MINMAX ##_ENDSTOP_INVERTING #define _AXIS(AXIS) AXIS ##_AXIS #define _ENDSTOP_HIT(AXIS) endstop_hit_bits |= BIT(_ENDSTOP(AXIS, MIN)) #define _ENDSTOP(AXIS, MINMAX) AXIS ##_## MINMAX // SET_ENDSTOP_BIT: set the current endstop bits for an endstop to its status #define SET_ENDSTOP_BIT(AXIS, MINMAX) SET_BIT(current_endstop_bits, _ENDSTOP(AXIS, MINMAX), (READ(_ENDSTOP_PIN(AXIS, MINMAX)) != _ENDSTOP_INVERTING(AXIS, MINMAX))) // COPY_BIT: copy the value of COPY_BIT to BIT in bits #define COPY_BIT(bits, COPY_BIT, BIT) SET_BIT(bits, BIT, TEST(bits, COPY_BIT)) // TEST_ENDSTOP: test the old and the current status of an endstop #define TEST_ENDSTOP(ENDSTOP) (TEST(current_endstop_bits, ENDSTOP) && TEST(old_endstop_bits, ENDSTOP)) #define UPDATE_ENDSTOP(AXIS,MINMAX) \ SET_ENDSTOP_BIT(AXIS, MINMAX); \ if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && (current_block->steps[_AXIS(AXIS)] > 0)) { \ endstops_trigsteps[_AXIS(AXIS)] = count_position[_AXIS(AXIS)]; \ _ENDSTOP_HIT(AXIS); \ step_events_completed = current_block->step_event_count; \ } #ifdef COREXY // Head direction in -X axis for CoreXY bots. // If DeltaX == -DeltaY, the movement is only in Y axis if ((current_block->steps[A_AXIS] != current_block->steps[B_AXIS]) || (TEST(out_bits, A_AXIS) == TEST(out_bits, B_AXIS))) { if (TEST(out_bits, X_HEAD)) #elif defined(COREXZ) // Head direction in -X axis for CoreXZ bots. // If DeltaX == -DeltaZ, the movement is only in Z axis if ((current_block->steps[A_AXIS] != current_block->steps[C_AXIS]) || (TEST(out_bits, A_AXIS) == TEST(out_bits, C_AXIS))) { if (TEST(out_bits, X_HEAD)) #else if (TEST(out_bits, X_AXIS)) // stepping along -X axis (regular Cartesian bot) #endif { // -direction #ifdef DUAL_X_CARRIAGE // with 2 x-carriages, endstops are only checked in the homing direction for the active extruder if ((current_block->active_extruder == 0 && X_HOME_DIR == -1) || (current_block->active_extruder != 0 && X2_HOME_DIR == -1)) #endif { #if HAS_X_MIN UPDATE_ENDSTOP(X, MIN); #endif } } else { // +direction #ifdef DUAL_X_CARRIAGE // with 2 x-carriages, endstops are only checked in the homing direction for the active extruder if ((current_block->active_extruder == 0 && X_HOME_DIR == 1) || (current_block->active_extruder != 0 && X2_HOME_DIR == 1)) #endif { #if HAS_X_MAX UPDATE_ENDSTOP(X, MAX); #endif } } #if defined(COREXY) || defined(COREXZ) } #endif #ifdef COREXY // Head direction in -Y axis for CoreXY bots. // If DeltaX == DeltaY, the movement is only in X axis if ((current_block->steps[A_AXIS] != current_block->steps[B_AXIS]) || (TEST(out_bits, A_AXIS) != TEST(out_bits, B_AXIS))) { if (TEST(out_bits, Y_HEAD)) #else if (TEST(out_bits, Y_AXIS)) // -direction #endif { // -direction #if HAS_Y_MIN UPDATE_ENDSTOP(Y, MIN); #endif } else { // +direction #if HAS_Y_MAX UPDATE_ENDSTOP(Y, MAX); #endif } #if defined(COREXY) } #endif #ifdef COREXZ // Head direction in -Z axis for CoreXZ bots. // If DeltaX == DeltaZ, the movement is only in X axis if ((current_block->steps[A_AXIS] != current_block->steps[C_AXIS]) || (TEST(out_bits, A_AXIS) != TEST(out_bits, C_AXIS))) { if (TEST(out_bits, Z_HEAD)) #else if (TEST(out_bits, Z_AXIS)) #endif { // z -direction #if HAS_Z_MIN #ifdef Z_DUAL_ENDSTOPS SET_ENDSTOP_BIT(Z, MIN); #if HAS_Z2_MIN SET_ENDSTOP_BIT(Z2, MIN); #else COPY_BIT(current_endstop_bits, Z_MIN, Z2_MIN); #endif byte z_test = TEST_ENDSTOP(Z_MIN) << 0 + TEST_ENDSTOP(Z2_MIN) << 1; // bit 0 for Z, bit 1 for Z2 if (z_test && current_block->steps[Z_AXIS] > 0) { // z_test = Z_MIN || Z2_MIN endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; endstop_hit_bits |= BIT(Z_MIN); if (!performing_homing || (z_test == 0x3)) //if not performing home or if both endstops were trigged during homing... step_events_completed = current_block->step_event_count; } #else // !Z_DUAL_ENDSTOPS UPDATE_ENDSTOP(Z, MIN); #endif // !Z_DUAL_ENDSTOPS #endif // Z_MIN_PIN #ifdef Z_PROBE_ENDSTOP #ifdef HAKANS_FSR if (hakans_fsr_endstop_active) { #endif UPDATE_ENDSTOP(Z, PROBE); if (TEST_ENDSTOP(Z_PROBE)) { endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; endstop_hit_bits |= BIT(Z_PROBE); } #ifdef HAKANS_FSR } #endif #endif } else { // z +direction #if HAS_Z_MAX #ifdef Z_DUAL_ENDSTOPS SET_ENDSTOP_BIT(Z, MAX); #if HAS_Z2_MAX SET_ENDSTOP_BIT(Z2, MAX); #else COPY_BIT(current_endstop_bits, Z_MAX, Z2_MAX) #endif byte z_test = TEST_ENDSTOP(Z_MAX) << 0 + TEST_ENDSTOP(Z2_MAX) << 1; // bit 0 for Z, bit 1 for Z2 if (z_test && current_block->steps[Z_AXIS] > 0) { // t_test = Z_MAX || Z2_MAX endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; endstop_hit_bits |= BIT(Z_MIN); if (!performing_homing || (z_test == 0x3)) //if not performing home or if both endstops were trigged during homing... step_events_completed = current_block->step_event_count; } #else // !Z_DUAL_ENDSTOPS UPDATE_ENDSTOP(Z, MAX); #endif // !Z_DUAL_ENDSTOPS #endif // Z_MAX_PIN #ifdef Z_PROBE_ENDSTOP #ifdef HAKANS_FSR if (hakans_fsr_endstop_active) { #endif UPDATE_ENDSTOP(Z, PROBE); if (TEST_ENDSTOP(Z_PROBE)) { endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; endstop_hit_bits |= BIT(Z_PROBE); } #ifdef HAKANS_FSR } #endif #endif } #if defined(COREXZ) } #endif old_endstop_bits = current_endstop_bits; } // __________________________ // /| |\ _________________ ^ // / | | \ /| |\ | // / | | \ / | | \ s // / | | | | | \ p // / | | | | | \ e // +-----+------------------------+---+--+---------------+----+ e // | BLOCK 1 | BLOCK 2 | d // // time -----> // // The trapezoid is the shape the speed curve over time. It starts at block->initial_rate, accelerates // first block->accelerate_until step_events_completed, then keeps going at constant speed until // step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset. // The slope of acceleration is calculated using v = u + at where t is the accumulated timer values of the steps so far. void st_wake_up() { // TCNT1 = 0; ENABLE_STEPPER_DRIVER_INTERRUPT(); } FORCE_INLINE unsigned long calc_timer(unsigned long step_rate) { unsigned long timer; if (step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; #if defined(ENABLE_HIGH_SPEED_STEPPING) if(step_rate > (2 * DOUBLE_STEP_FREQUENCY)) { // If steprate > 2*DOUBLE_STEP_FREQUENCY >> step 4 times step_rate = (step_rate >> 2); step_loops = 4; }
// Check endstops - Called from ISR! inline void update_endstops() { #if ENABLED(Z_DUAL_ENDSTOPS) uint16_t #else byte #endif current_endstop_bits = 0; #define _ENDSTOP_PIN(AXIS, MINMAX) AXIS ##_## MINMAX ##_PIN #define _ENDSTOP_INVERTING(AXIS, MINMAX) AXIS ##_## MINMAX ##_ENDSTOP_INVERTING #define _AXIS(AXIS) AXIS ##_AXIS #define _ENDSTOP_HIT(AXIS) SBI(endstop_hit_bits, _ENDSTOP(AXIS, MIN)) #define _ENDSTOP(AXIS, MINMAX) AXIS ##_## MINMAX // SET_ENDSTOP_BIT: set the current endstop bits for an endstop to its status #define SET_ENDSTOP_BIT(AXIS, MINMAX) SET_BIT(current_endstop_bits, _ENDSTOP(AXIS, MINMAX), (READ(_ENDSTOP_PIN(AXIS, MINMAX)) != _ENDSTOP_INVERTING(AXIS, MINMAX))) // COPY_BIT: copy the value of COPY_BIT to BIT in bits #define COPY_BIT(bits, COPY_BIT, BIT) SET_BIT(bits, BIT, TEST(bits, COPY_BIT)) // TEST_ENDSTOP: test the old and the current status of an endstop #define TEST_ENDSTOP(ENDSTOP) (TEST(current_endstop_bits, ENDSTOP) && TEST(old_endstop_bits, ENDSTOP)) #if ENABLED(COREXY) || ENABLED(COREXZ) #define _SET_TRIGSTEPS(AXIS) do { \ float axis_pos = count_position[_AXIS(AXIS)]; \ if (_AXIS(AXIS) == A_AXIS) \ axis_pos = (axis_pos + count_position[CORE_AXIS_2]) / 2; \ else if (_AXIS(AXIS) == CORE_AXIS_2) \ axis_pos = (count_position[A_AXIS] - axis_pos) / 2; \ endstops_trigsteps[_AXIS(AXIS)] = axis_pos; \ } while(0) #else #define _SET_TRIGSTEPS(AXIS) endstops_trigsteps[_AXIS(AXIS)] = count_position[_AXIS(AXIS)] #endif // COREXY || COREXZ #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \ SET_ENDSTOP_BIT(AXIS, MINMAX); \ if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && current_block->steps[_AXIS(AXIS)] > 0) { \ _SET_TRIGSTEPS(AXIS); \ _ENDSTOP_HIT(AXIS); \ step_events_completed = current_block->step_event_count; \ } \ } while(0) #if ENABLED(COREXY) || ENABLED(COREXZ) // Head direction in -X axis for CoreXY and CoreXZ bots. // If Delta1 == -Delta2, the movement is only in Y or Z axis if ((current_block->steps[A_AXIS] != current_block->steps[CORE_AXIS_2]) || (TEST(out_bits, A_AXIS) == TEST(out_bits, CORE_AXIS_2))) { if (TEST(out_bits, X_HEAD)) #else if (TEST(out_bits, X_AXIS)) // stepping along -X axis (regular Cartesian bot) #endif { // -direction #if ENABLED(DUAL_X_CARRIAGE) // with 2 x-carriages, endstops are only checked in the homing direction for the active extruder if ((current_block->active_extruder == 0 && X_HOME_DIR == -1) || (current_block->active_extruder != 0 && X2_HOME_DIR == -1)) #endif { #if HAS_X_MIN UPDATE_ENDSTOP(X, MIN); #endif } } else { // +direction #if ENABLED(DUAL_X_CARRIAGE) // with 2 x-carriages, endstops are only checked in the homing direction for the active extruder if ((current_block->active_extruder == 0 && X_HOME_DIR == 1) || (current_block->active_extruder != 0 && X2_HOME_DIR == 1)) #endif { #if HAS_X_MAX UPDATE_ENDSTOP(X, MAX); #endif } } #if ENABLED(COREXY) || ENABLED(COREXZ) } #endif #if ENABLED(COREXY) // Head direction in -Y axis for CoreXY bots. // If DeltaX == DeltaY, the movement is only in X axis if ((current_block->steps[A_AXIS] != current_block->steps[B_AXIS]) || (TEST(out_bits, A_AXIS) != TEST(out_bits, B_AXIS))) { if (TEST(out_bits, Y_HEAD)) #else if (TEST(out_bits, Y_AXIS)) // -direction #endif { // -direction #if HAS_Y_MIN UPDATE_ENDSTOP(Y, MIN); #endif } else { // +direction #if HAS_Y_MAX UPDATE_ENDSTOP(Y, MAX); #endif } #if ENABLED(COREXY) } #endif #if ENABLED(COREXZ) // Head direction in -Z axis for CoreXZ bots. // If DeltaX == DeltaZ, the movement is only in X axis if ((current_block->steps[A_AXIS] != current_block->steps[C_AXIS]) || (TEST(out_bits, A_AXIS) != TEST(out_bits, C_AXIS))) { if (TEST(out_bits, Z_HEAD)) #else if (TEST(out_bits, Z_AXIS)) #endif { // z -direction #if HAS_Z_MIN #if ENABLED(Z_DUAL_ENDSTOPS) SET_ENDSTOP_BIT(Z, MIN); #if HAS_Z2_MIN SET_ENDSTOP_BIT(Z2, MIN); #else COPY_BIT(current_endstop_bits, Z_MIN, Z2_MIN); #endif byte z_test = TEST_ENDSTOP(Z_MIN) | (TEST_ENDSTOP(Z2_MIN) << 1); // bit 0 for Z, bit 1 for Z2 if (z_test && current_block->steps[Z_AXIS] > 0) { // z_test = Z_MIN || Z2_MIN endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; SBI(endstop_hit_bits, Z_MIN); if (!performing_homing || (z_test == 0x3)) //if not performing home or if both endstops were trigged during homing... step_events_completed = current_block->step_event_count; } #else // !Z_DUAL_ENDSTOPS #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && ENABLED(HAS_Z_MIN_PROBE) if (z_probe_is_active) UPDATE_ENDSTOP(Z, MIN); #else UPDATE_ENDSTOP(Z, MIN); #endif #endif // !Z_DUAL_ENDSTOPS #endif #if ENABLED(Z_MIN_PROBE_ENDSTOP) && DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && ENABLED(HAS_Z_MIN_PROBE) if (z_probe_is_active) { UPDATE_ENDSTOP(Z, MIN_PROBE); if (TEST_ENDSTOP(Z_MIN_PROBE)) SBI(endstop_hit_bits, Z_MIN_PROBE); } #endif } else { // z +direction #if HAS_Z_MAX #if ENABLED(Z_DUAL_ENDSTOPS) SET_ENDSTOP_BIT(Z, MAX); #if HAS_Z2_MAX SET_ENDSTOP_BIT(Z2, MAX); #else COPY_BIT(current_endstop_bits, Z_MAX, Z2_MAX); #endif byte z_test = TEST_ENDSTOP(Z_MAX) | (TEST_ENDSTOP(Z2_MAX) << 1); // bit 0 for Z, bit 1 for Z2 if (z_test && current_block->steps[Z_AXIS] > 0) { // t_test = Z_MAX || Z2_MAX endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; SBI(endstop_hit_bits, Z_MIN); if (!performing_homing || (z_test == 0x3)) //if not performing home or if both endstops were trigged during homing... step_events_completed = current_block->step_event_count; } #else // !Z_DUAL_ENDSTOPS UPDATE_ENDSTOP(Z, MAX); #endif // !Z_DUAL_ENDSTOPS #endif // Z_MAX_PIN } #if ENABLED(COREXZ) } #endif old_endstop_bits = current_endstop_bits; }