Code changes supporting up to 6 extruders

This commit is contained in:
Scott Lahteine
2018-09-13 01:35:55 -05:00
parent f5c210d33d
commit 1718eff54a
52 changed files with 848 additions and 191 deletions

View File

@ -37,7 +37,7 @@
*/
// Change EEPROM version if the structure changes
#define EEPROM_VERSION "V57"
#define EEPROM_VERSION "V58"
#define EEPROM_OFFSET 100
// Check the integrity of data offsets.
@ -213,7 +213,7 @@ typedef struct SettingsDataStruct {
//
// PIDTEMP
//
PIDC hotendPID[MAX_EXTRUDERS]; // M301 En PIDC / M303 En U
PIDC hotendPID[HOTENDS]; // M301 En PIDC / M303 En U
int16_t lpq_len; // M301 L
@ -244,14 +244,14 @@ typedef struct SettingsDataStruct {
// !NO_VOLUMETRIC
//
bool parser_volumetric_enabled; // M200 D parser.volumetric_enabled
float planner_filament_size[MAX_EXTRUDERS]; // M200 T D planner.filament_size[]
float planner_filament_size[EXTRUDERS]; // M200 T D planner.filament_size[]
//
// HAS_TRINAMIC
//
#define TMC_AXES (MAX_EXTRUDERS + 7)
uint16_t tmc_stepper_current[TMC_AXES]; // M906 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4
uint32_t tmc_hybrid_threshold[TMC_AXES]; // M913 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4
uint16_t tmc_stepper_current[TMC_AXES]; // M906 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
uint32_t tmc_hybrid_threshold[TMC_AXES]; // M913 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
int16_t tmc_sgt[XYZ]; // M914 X Y Z
//
@ -279,8 +279,8 @@ typedef struct SettingsDataStruct {
//
// ADVANCED_PAUSE_FEATURE
//
float filament_change_unload_length[MAX_EXTRUDERS], // M603 T U
filament_change_load_length[MAX_EXTRUDERS]; // M603 T L
float filament_change_unload_length[EXTRUDERS], // M603 T U
filament_change_load_length[EXTRUDERS]; // M603 T L
} SettingsData;
@ -629,29 +629,23 @@ void MarlinSettings::postprocess() {
EEPROM_WRITE(lcd_preheat_bed_temp);
EEPROM_WRITE(lcd_preheat_fan_speed);
for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) {
for (uint8_t e = 0; e < HOTENDS; e++) {
#if ENABLED(PIDTEMP)
if (e < HOTENDS) {
EEPROM_WRITE(PID_PARAM(Kp, e));
EEPROM_WRITE(PID_PARAM(Ki, e));
EEPROM_WRITE(PID_PARAM(Kd, e));
#if ENABLED(PID_EXTRUSION_SCALING)
EEPROM_WRITE(PID_PARAM(Kc, e));
#else
dummy = 1.0f; // 1.0 = default kc
EEPROM_WRITE(dummy);
#endif
}
else
#endif // !PIDTEMP
{
dummy = DUMMY_PID_VALUE; // When read, will not change the existing value
EEPROM_WRITE(dummy); // Kp
dummy = 0;
for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); // Ki, Kd, Kc
}
EEPROM_WRITE(PID_PARAM(Kp, e));
EEPROM_WRITE(PID_PARAM(Ki, e));
EEPROM_WRITE(PID_PARAM(Kd, e));
#if ENABLED(PID_EXTRUSION_SCALING)
EEPROM_WRITE(PID_PARAM(Kc, e));
#else
dummy = 1.0f; // 1.0 = default kc
EEPROM_WRITE(dummy);
#endif
#else
dummy = DUMMY_PID_VALUE; // When read, will not change the existing value
EEPROM_WRITE(dummy); // Kp
dummy = 0;
for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); // Ki, Kd, Kc
#endif
} // Hotends Loop
_FIELD_TEST(lpq_len);
@ -705,17 +699,15 @@ void MarlinSettings::postprocess() {
EEPROM_WRITE(parser.volumetric_enabled);
// Save filament sizes
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
if (q < COUNT(planner.filament_size)) dummy = planner.filament_size[q];
EEPROM_WRITE(dummy);
}
for (uint8_t q = 0; q < COUNT(planner.filament_size); q++)
EEPROM_WRITE(planner.filament_size[q]);
#else
const bool volumetric_enabled = false;
dummy = DEFAULT_NOMINAL_FILAMENT_DIA;
EEPROM_WRITE(volumetric_enabled);
for (uint8_t q = MAX_EXTRUDERS; q--;) EEPROM_WRITE(dummy);
for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummy);
#endif
@ -762,31 +754,48 @@ void MarlinSettings::postprocess() {
#else
0,
#endif
#if AXIS_IS_TMC(E0)
stepperE0.getCurrent(),
#else
0,
#endif
#if AXIS_IS_TMC(E1)
stepperE1.getCurrent(),
#else
0,
#endif
#if AXIS_IS_TMC(E2)
stepperE2.getCurrent(),
#else
0,
#endif
#if AXIS_IS_TMC(E3)
stepperE3.getCurrent(),
#else
0,
#endif
#if AXIS_IS_TMC(E4)
stepperE4.getCurrent()
#else
0
#endif
#if MAX_EXTRUDERS
#if AXIS_IS_TMC(E0)
stepperE0.getCurrent(),
#else
0,
#endif
#if MAX_EXTRUDERS > 1
#if AXIS_IS_TMC(E1)
stepperE1.getCurrent(),
#else
0,
#endif
#if MAX_EXTRUDERS > 2
#if AXIS_IS_TMC(E2)
stepperE2.getCurrent(),
#else
0,
#endif
#if MAX_EXTRUDERS > 3
#if AXIS_IS_TMC(E3)
stepperE3.getCurrent(),
#else
0,
#endif
#if MAX_EXTRUDERS > 4
#if AXIS_IS_TMC(E4)
stepperE4.getCurrent()
#else
0
#endif
#if MAX_EXTRUDERS > 5
#if AXIS_IS_TMC(E5)
stepperE5.getCurrent()
#else
0
#endif
#endif // MAX_EXTRUDERS > 5
#endif // MAX_EXTRUDERS > 4
#endif // MAX_EXTRUDERS > 3
#endif // MAX_EXTRUDERS > 2
#endif // MAX_EXTRUDERS > 1
#endif // MAX_EXTRUDERS
#else
0
#endif
@ -836,35 +845,69 @@ void MarlinSettings::postprocess() {
#else
Z3_HYBRID_THRESHOLD,
#endif
#if AXIS_HAS_STEALTHCHOP(E0)
TMC_GET_PWMTHRS(E, E0),
#else
E0_HYBRID_THRESHOLD,
#endif
#if AXIS_HAS_STEALTHCHOP(E1)
TMC_GET_PWMTHRS(E, E1),
#else
E1_HYBRID_THRESHOLD,
#endif
#if AXIS_HAS_STEALTHCHOP(E2)
TMC_GET_PWMTHRS(E, E2),
#else
E2_HYBRID_THRESHOLD,
#endif
#if AXIS_HAS_STEALTHCHOP(E3)
TMC_GET_PWMTHRS(E, E3),
#else
E3_HYBRID_THRESHOLD,
#endif
#if AXIS_HAS_STEALTHCHOP(E4)
TMC_GET_PWMTHRS(E, E4)
#else
E4_HYBRID_THRESHOLD
#endif
#if MAX_EXTRUDERS
#if AXIS_HAS_STEALTHCHOP(E0)
TMC_GET_PWMTHRS(E, E0),
#else
E0_HYBRID_THRESHOLD,
#endif
#if MAX_EXTRUDERS > 1
#if AXIS_HAS_STEALTHCHOP(E1)
TMC_GET_PWMTHRS(E, E1),
#else
E1_HYBRID_THRESHOLD,
#endif
#if MAX_EXTRUDERS > 2
#if AXIS_HAS_STEALTHCHOP(E2)
TMC_GET_PWMTHRS(E, E2),
#else
E2_HYBRID_THRESHOLD,
#endif
#if MAX_EXTRUDERS > 3
#if AXIS_HAS_STEALTHCHOP(E3)
TMC_GET_PWMTHRS(E, E3),
#else
E3_HYBRID_THRESHOLD,
#endif
#if MAX_EXTRUDERS > 4
#if AXIS_HAS_STEALTHCHOP(E4)
TMC_GET_PWMTHRS(E, E4)
#else
E4_HYBRID_THRESHOLD
#endif
#if MAX_EXTRUDERS > 5
#if AXIS_HAS_STEALTHCHOP(E5)
TMC_GET_PWMTHRS(E, E5)
#else
E5_HYBRID_THRESHOLD
#endif
#endif // MAX_EXTRUDERS > 5
#endif // MAX_EXTRUDERS > 4
#endif // MAX_EXTRUDERS > 3
#endif // MAX_EXTRUDERS > 2
#endif // MAX_EXTRUDERS > 1
#endif // MAX_EXTRUDERS
#else
100, 100, 3, // X, Y, Z
100, 100, 3, 3, // X2, Y2, Z2, Z3
30, 30, 30, 30, 30 // E0, E1, E2, E3, E4
100, 100, 3, // X, Y, Z
100, 100, 3, 3 // X2, Y2, Z2, Z3
#if MAX_EXTRUDERS
, 30 // E0
#if MAX_EXTRUDERS > 1
, 30 // E1
#if MAX_EXTRUDERS > 2
, 30 // E2
#if MAX_EXTRUDERS > 3
, 30 // E3
#if MAX_EXTRUDERS > 4
, 30 // E4
#if MAX_EXTRUDERS > 5
, 30 // E5
#endif
#endif
#endif
#endif
#endif
#endif
#endif
};
EEPROM_WRITE(tmc_hybrid_threshold);
@ -951,17 +994,13 @@ void MarlinSettings::postprocess() {
_FIELD_TEST(filament_change_unload_length);
#if ENABLED(ADVANCED_PAUSE_FEATURE)
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
if (q < COUNT(filament_change_unload_length)) dummy = filament_change_unload_length[q];
EEPROM_WRITE(dummy);
}
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
if (q < COUNT(filament_change_load_length)) dummy = filament_change_load_length[q];
EEPROM_WRITE(dummy);
for (uint8_t q = 0; q < COUNT(filament_change_unload_length); q++) {
EEPROM_WRITE(filament_change_unload_length[q]);
EEPROM_WRITE(filament_change_load_length[q]);
}
#else
dummy = 0;
for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_WRITE(dummy);
for (uint8_t q = EXTRUDERS * 2; q--;) EEPROM_WRITE(dummy);
#endif
//
@ -1271,9 +1310,9 @@ void MarlinSettings::postprocess() {
//
#if ENABLED(PIDTEMP)
for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) {
for (uint8_t e = 0; e < HOTENDS; e++) {
EEPROM_READ(dummy); // Kp
if (e < HOTENDS && dummy != DUMMY_PID_VALUE) {
if (dummy != DUMMY_PID_VALUE) {
// do not need to scale PID values as the values in EEPROM are already scaled
if (!validating) PID_PARAM(Kp, e) = dummy;
EEPROM_READ(PID_PARAM(Ki, e));
@ -1284,13 +1323,12 @@ void MarlinSettings::postprocess() {
EEPROM_READ(dummy);
#endif
}
else {
else
for (uint8_t q=3; q--;) EEPROM_READ(dummy); // Ki, Kd, Kc
}
}
#else // !PIDTEMP
// 4 x 4 = 16 slots for PID parameters
for (uint8_t q = MAX_EXTRUDERS * 4; q--;) EEPROM_READ(dummy); // Kp, Ki, Kd, Kc
for (uint8_t q = HOTENDS * 4; q--;) EEPROM_READ(dummy); // Kp, Ki, Kd, Kc
#endif // !PIDTEMP
//
@ -1359,16 +1397,15 @@ void MarlinSettings::postprocess() {
EEPROM_READ(parser.volumetric_enabled);
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
for (uint8_t q = 0; q < COUNT(planner.filament_size); q++) {
EEPROM_READ(dummy);
if (!validating && q < COUNT(planner.filament_size))
planner.filament_size[q] = dummy;
if (!validating) planner.filament_size[q] = dummy;
}
#else
EEPROM_READ(dummyb);
for (uint8_t q=MAX_EXTRUDERS; q--;) EEPROM_READ(dummy);
for (uint8_t q=EXTRUDERS; q--;) EEPROM_READ(dummy);
#endif
@ -1422,6 +1459,9 @@ void MarlinSettings::postprocess() {
#if AXIS_IS_TMC(E4)
SET_CURR(E4);
#endif
#if AXIS_IS_TMC(E5)
SET_CURR(E5);
#endif
}
#else
uint16_t val;
@ -1469,6 +1509,9 @@ void MarlinSettings::postprocess() {
#if AXIS_HAS_STEALTHCHOP(E4)
TMC_SET_PWMTHRS(E, E4);
#endif
#if AXIS_HAS_STEALTHCHOP(E5)
TMC_SET_PWMTHRS(E, E5);
#endif
}
#else
uint32_t thrs_val;
@ -1580,16 +1623,14 @@ void MarlinSettings::postprocess() {
_FIELD_TEST(filament_change_unload_length);
#if ENABLED(ADVANCED_PAUSE_FEATURE)
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
for (uint8_t q = 0; q < COUNT(filament_change_unload_length); q++) {
EEPROM_READ(dummy);
if (!validating && q < COUNT(filament_change_unload_length)) filament_change_unload_length[q] = dummy;
}
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
EEPROM_READ(dummy);
if (!validating && q < COUNT(filament_change_load_length)) filament_change_load_length[q] = dummy;
}
#else
for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_READ(dummy);
for (uint8_t q = EXTRUDERS * 2; q--;) EEPROM_READ(dummy);
#endif
eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET));
@ -2176,6 +2217,11 @@ void MarlinSettings::reset(PORTARG_SOLO) {
CONFIG_ECHO_START;
SERIAL_ECHOPAIR_P(port, " M200 T4 D", LINEAR_UNIT(planner.filament_size[4]));
SERIAL_EOL_P(port);
#if EXTRUDERS > 5
CONFIG_ECHO_START;
SERIAL_ECHOPAIR_P(port, " M200 T5 D", LINEAR_UNIT(planner.filament_size[5]));
SERIAL_EOL_P(port);
#endif // EXTRUDERS > 5
#endif // EXTRUDERS > 4
#endif // EXTRUDERS > 3
#endif // EXTRUDERS > 2
@ -2681,6 +2727,10 @@ void MarlinSettings::reset(PORTARG_SOLO) {
say_M906(PORTVAR_SOLO);
SERIAL_ECHOLNPAIR_P(port, " T4 E", stepperE4.getCurrent());
#endif
#if E_STEPPERS > 5 && AXIS_IS_TMC(E5)
say_M906(PORTVAR_SOLO);
SERIAL_ECHOLNPAIR_P(port, " T5 E", stepperE5.getCurrent());
#endif
SERIAL_EOL_P(port);
/**
@ -2748,6 +2798,10 @@ void MarlinSettings::reset(PORTARG_SOLO) {
say_M913(PORTVAR_SOLO);
SERIAL_ECHOLNPAIR_P(port, " T4 E", TMC_GET_PWMTHRS(E, E4));
#endif
#if E_STEPPERS > 5 && AXIS_IS_TMC(E5)
say_M913(PORTVAR_SOLO);
SERIAL_ECHOLNPAIR_P(port, " T5 E", TMC_GET_PWMTHRS(E, E5));
#endif
SERIAL_EOL_P(port);
#endif // HYBRID_THRESHOLD
@ -2871,6 +2925,12 @@ void MarlinSettings::reset(PORTARG_SOLO) {
say_M603(PORTVAR_SOLO);
SERIAL_ECHOPAIR_P(port, "T4 L", LINEAR_UNIT(filament_change_load_length[4]));
SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[4]));
#if EXTRUDERS > 5
CONFIG_ECHO_START;
say_M603(PORTVAR_SOLO);
SERIAL_ECHOPAIR_P(port, "T5 L", LINEAR_UNIT(filament_change_load_length[5]));
SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[5]));
#endif // EXTRUDERS > 5
#endif // EXTRUDERS > 4
#endif // EXTRUDERS > 3
#endif // EXTRUDERS > 2

View File

@ -1849,6 +1849,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
DISABLE_IDLE_E(3);
#if EXTRUDERS > 4
DISABLE_IDLE_E(4);
#if EXTRUDERS > 5
DISABLE_IDLE_E(5);
#endif // EXTRUDERS > 5
#endif // EXTRUDERS > 4
#endif // EXTRUDERS > 3
#endif // EXTRUDERS > 2
@ -1871,6 +1874,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
DISABLE_IDLE_E(3);
#if EXTRUDERS > 4
DISABLE_IDLE_E(4);
#if EXTRUDERS > 5
DISABLE_IDLE_E(5);
#endif // EXTRUDERS > 5
#endif // EXTRUDERS > 4
#endif // EXTRUDERS > 3
#endif // EXTRUDERS > 2
@ -1885,6 +1891,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
DISABLE_IDLE_E(3);
#if EXTRUDERS > 4
DISABLE_IDLE_E(4);
#if EXTRUDERS > 5
DISABLE_IDLE_E(5);
#endif
#endif
#endif
enable_E2();
@ -1897,6 +1906,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
DISABLE_IDLE_E(2);
#if EXTRUDERS > 4
DISABLE_IDLE_E(4);
#if EXTRUDERS > 5
DISABLE_IDLE_E(5);
#endif
#endif
enable_E3();
g_uc_extruder_last_move[3] = (BLOCK_BUFFER_SIZE) * 2;
@ -1907,9 +1919,23 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
DISABLE_IDLE_E(1);
DISABLE_IDLE_E(2);
DISABLE_IDLE_E(3);
#if EXTRUDERS > 5
DISABLE_IDLE_E(5);
#endif
enable_E4();
g_uc_extruder_last_move[4] = (BLOCK_BUFFER_SIZE) * 2;
break;
#if EXTRUDERS > 5
case 5:
DISABLE_IDLE_E(0);
DISABLE_IDLE_E(1);
DISABLE_IDLE_E(2);
DISABLE_IDLE_E(3);
DISABLE_IDLE_E(4);
enable_E5();
g_uc_extruder_last_move[5] = (BLOCK_BUFFER_SIZE) * 2;
break;
#endif // EXTRUDERS > 5
#endif // EXTRUDERS > 4
#endif // EXTRUDERS > 3
#endif // EXTRUDERS > 2
@ -1921,6 +1947,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
enable_E2();
enable_E3();
enable_E4();
enable_E5();
#endif
}

View File

@ -1982,6 +1982,9 @@ void Stepper::init() {
#if HAS_E4_DIR
E4_DIR_INIT;
#endif
#if HAS_E5_DIR
E5_DIR_INIT;
#endif
// Init Enable Pins - steppers default to disabled.
#if HAS_X_ENABLE
@ -2032,6 +2035,10 @@ void Stepper::init() {
E4_ENABLE_INIT;
if (!E_ENABLE_ON) E4_ENABLE_WRITE(HIGH);
#endif
#if HAS_E5_ENABLE
E5_ENABLE_INIT;
if (!E_ENABLE_ON) E5_ENABLE_WRITE(HIGH);
#endif
#define _STEP_INIT(AXIS) AXIS ##_STEP_INIT
#define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW)
@ -2088,6 +2095,9 @@ void Stepper::init() {
#if E_STEPPERS > 4 && HAS_E4_STEP
E_AXIS_INIT(4);
#endif
#if E_STEPPERS > 5 && HAS_E5_STEP
E_AXIS_INIT(5);
#endif
// Init Stepper ISR to 122 Hz for quick starting
HAL_timer_start(STEP_TIMER_NUM, 122);
@ -2524,6 +2534,10 @@ void Stepper::report_positions() {
SET_OUTPUT(E4_MS1_PIN);
SET_OUTPUT(E4_MS2_PIN);
#endif
#if HAS_E5_MICROSTEPS
SET_OUTPUT(E5_MS1_PIN);
SET_OUTPUT(E5_MS2_PIN);
#endif
static const uint8_t microstep_modes[] = MICROSTEP_MODES;
for (uint16_t i = 0; i < COUNT(microstep_modes); i++)
microstep_mode(i, microstep_modes[i]);
@ -2553,6 +2567,9 @@ void Stepper::report_positions() {
#if HAS_E4_MICROSTEPS
case 7: WRITE(E4_MS1_PIN, ms1); break;
#endif
#if HAS_E5_MICROSTEPS
case 8: WRITE(E5_MS1_PIN, ms1); break;
#endif
}
if (ms2 >= 0) switch (driver) {
case 0: WRITE(X_MS2_PIN, ms2); break;
@ -2577,6 +2594,9 @@ void Stepper::report_positions() {
#if HAS_E4_MICROSTEPS
case 7: WRITE(E4_MS2_PIN, ms2); break;
#endif
#if HAS_E5_MICROSTEPS
case 8: WRITE(E5_MS2_PIN, ms2); break;
#endif
}
}
@ -2638,6 +2658,11 @@ void Stepper::report_positions() {
SERIAL_PROTOCOL(READ(E4_MS1_PIN));
SERIAL_PROTOCOLLN(READ(E4_MS2_PIN));
#endif
#if HAS_E5_MICROSTEPS
SERIAL_PROTOCOLPGM("E5: ");
SERIAL_PROTOCOL(READ(E5_MS1_PIN));
SERIAL_PROTOCOLLN(READ(E5_MS2_PIN));
#endif
}
#endif // HAS_MICROSTEPS

View File

@ -482,11 +482,48 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE)
#define E4_STEP_READ READ(E4_STEP_PIN)
// E5 Stepper
#if AXIS_DRIVER_TYPE(E5, L6470)
extern L6470 stepperE5;
#define E5_ENABLE_INIT NOOP
#define E5_ENABLE_WRITE(STATE) do{ if (STATE) stepperE5.Step_Clock(stepperE5.getStatus() & STATUS_HIZ); else stepperE5.softFree(); }while(0)
#define E5_ENABLE_READ (stepperE5.getStatus() & STATUS_HIZ)
#define E5_DIR_INIT NOOP
#define E5_DIR_WRITE(STATE) stepperE5.Step_Clock(STATE)
#define E5_DIR_READ (stepperE5.getStatus() & STATUS_DIR)
#else
#if AXIS_DRIVER_TYPE(E5, TMC26X)
extern TMC26XStepper stepperE5;
#define E5_ENABLE_INIT NOOP
#define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE)
#define E5_ENABLE_READ stepperE5.isEnabled()
#else
#if AXIS_DRIVER_TYPE(E5, TMC2130)
extern TMC2130Stepper stepperE5;
#elif AXIS_DRIVER_TYPE(E5, TMC2208)
extern TMC2208Stepper stepperE5;
#endif
#define E5_ENABLE_INIT SET_OUTPUT(E5_ENABLE_PIN)
#define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE)
#define E5_ENABLE_READ READ(E5_ENABLE_PIN)
#endif
#define E5_DIR_INIT SET_OUTPUT(E5_DIR_PIN)
#define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,STATE)
#define E5_DIR_READ READ(E5_DIR_PIN)
#endif
#define E5_STEP_INIT SET_OUTPUT(E5_STEP_PIN)
#define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE)
#define E5_STEP_READ READ(E5_STEP_PIN)
/**
* Extruder indirection for the single E axis
*/
#if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index
#if EXTRUDERS > 4
#if EXTRUDERS > 5
#define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0)
#define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); case 5: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0)
#define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); case 5: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0)
#elif EXTRUDERS > 4
#define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0)
#define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE( INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE( INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); } }while(0)
#define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE( INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE( INVERT_E2_DIR); } }while(0)
@ -507,6 +544,10 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
#define NORM_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0)
#define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0)
#elif E_STEPPERS > 5
#define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); case 5: E5_STEP_WRITE(V); } }while(0)
#define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); case 5: E5_DIR_WRITE(!INVERT_E5_DIR); } }while(0)
#define REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE( INVERT_E0_DIR); break; case 1: E1_DIR_WRITE( INVERT_E1_DIR); break; case 2: E2_DIR_WRITE( INVERT_E2_DIR); break; case 3: E3_DIR_WRITE( INVERT_E3_DIR); break; case 4: E4_DIR_WRITE( INVERT_E4_DIR); case 5: E5_DIR_WRITE( INVERT_E5_DIR); } }while(0)
#elif E_STEPPERS > 4
#define E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; case 4: E4_STEP_WRITE(V); } }while(0)
#define NORM_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); } }while(0)

View File

@ -74,6 +74,7 @@ Temperature thermalManager;
(HOTENDS > 2 && (E) == 2) ? PSTR(MSG_E3 " " MSG) : \
(HOTENDS > 3 && (E) == 3) ? PSTR(MSG_E4 " " MSG) : \
(HOTENDS > 4 && (E) == 4) ? PSTR(MSG_E5 " " MSG) : \
(HOTENDS > 5 && (E) == 5) ? PSTR(MSG_E6 " " MSG) : \
PSTR(MSG_E1 " " MSG)
#else
#define TEMP_ERR_PSTR(MSG, E) \
@ -81,6 +82,7 @@ Temperature thermalManager;
(HOTENDS > 2 && (E) == 2) ? PSTR(MSG_E3 " " MSG) : \
(HOTENDS > 3 && (E) == 3) ? PSTR(MSG_E4 " " MSG) : \
(HOTENDS > 4 && (E) == 4) ? PSTR(MSG_E5 " " MSG) : \
(HOTENDS > 5 && (E) == 5) ? PSTR(MSG_E6 " " MSG) : \
PSTR(MSG_E1 " " MSG)
#endif
@ -149,7 +151,7 @@ int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 },
#endif
#if ENABLED(BABYSTEPPING)
volatile int Temperature::babystepsTodo[XYZ] = { 0 };
volatile int16_t Temperature::babystepsTodo[XYZ] = { 0 };
#endif
#if WATCH_HOTENDS
@ -527,13 +529,14 @@ int Temperature::getHeaterPower(const int heater) {
#if HAS_AUTO_FAN
void Temperature::checkExtruderAutoFans() {
static const pin_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN, CHAMBER_AUTO_FAN_PIN };
static const pin_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN, E5_AUTO_FAN_PIN, CHAMBER_AUTO_FAN_PIN };
static const uint8_t fanBit[] PROGMEM = {
0,
AUTO_1_IS_0 ? 0 : 1,
AUTO_2_IS_0 ? 0 : AUTO_2_IS_1 ? 1 : 2,
AUTO_3_IS_0 ? 0 : AUTO_3_IS_1 ? 1 : AUTO_3_IS_2 ? 2 : 3,
AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 : 4,
AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 : 4,
AUTO_5_IS_0 ? 0 : AUTO_5_IS_1 ? 1 : AUTO_5_IS_2 ? 2 : AUTO_5_IS_3 ? 3 : AUTO_5_IS_4 ? 4 : 5,
AUTO_CHAMBER_IS_0 ? 0 : AUTO_CHAMBER_IS_1 ? 1 : AUTO_CHAMBER_IS_2 ? 2 : AUTO_CHAMBER_IS_3 ? 3 : AUTO_CHAMBER_IS_4 ? 4 : 5
};
uint8_t fanState = 0;
@ -1193,6 +1196,9 @@ void Temperature::init() {
#if HAS_TEMP_ADC_4
HAL_ANALOG_SELECT(TEMP_4_PIN);
#endif
#if HAS_TEMP_ADC_5
HAL_ANALOG_SELECT(TEMP_5_PIN);
#endif
#if HAS_HEATED_BED
HAL_ANALOG_SELECT(TEMP_BED_PIN);
#endif
@ -1226,7 +1232,7 @@ void Temperature::init() {
SET_OUTPUT(E1_AUTO_FAN_PIN);
#endif
#endif
#if HAS_AUTO_FAN_2 && !AUTO_2_IS_0 && !AUTO_2_IS_1
#if HAS_AUTO_FAN_2 && !(AUTO_2_IS_0 || AUTO_2_IS_1)
#if E2_AUTO_FAN_PIN == FAN1_PIN
SET_OUTPUT(E2_AUTO_FAN_PIN);
#if ENABLED(FAST_PWM_FAN)
@ -1236,7 +1242,7 @@ void Temperature::init() {
SET_OUTPUT(E2_AUTO_FAN_PIN);
#endif
#endif
#if HAS_AUTO_FAN_3 && !AUTO_3_IS_0 && !AUTO_3_IS_1 && !AUTO_3_IS_2
#if HAS_AUTO_FAN_3 && !(AUTO_3_IS_0 || AUTO_3_IS_1 || AUTO_3_IS_2)
#if E3_AUTO_FAN_PIN == FAN1_PIN
SET_OUTPUT(E3_AUTO_FAN_PIN);
#if ENABLED(FAST_PWM_FAN)
@ -1246,7 +1252,7 @@ void Temperature::init() {
SET_OUTPUT(E3_AUTO_FAN_PIN);
#endif
#endif
#if HAS_AUTO_FAN_4 && !AUTO_4_IS_0 && !AUTO_4_IS_1 && !AUTO_4_IS_2 && !AUTO_4_IS_3
#if HAS_AUTO_FAN_4 && !(AUTO_4_IS_0 || AUTO_4_IS_1 || AUTO_4_IS_2 || AUTO_4_IS_3)
#if E4_AUTO_FAN_PIN == FAN1_PIN
SET_OUTPUT(E4_AUTO_FAN_PIN);
#if ENABLED(FAST_PWM_FAN)
@ -1256,7 +1262,17 @@ void Temperature::init() {
SET_OUTPUT(E4_AUTO_FAN_PIN);
#endif
#endif
#if HAS_AUTO_CHAMBER_FAN && !AUTO_CHAMBER_IS_0 && !AUTO_CHAMBER_IS_1 && !AUTO_CHAMBER_IS_2 && !AUTO_CHAMBER_IS_3 && ! AUTO_CHAMBER_IS_4
#if HAS_AUTO_FAN_5 && !(AUTO_5_IS_0 || AUTO_5_IS_1 || AUTO_5_IS_2 || AUTO_5_IS_3 || AUTO_5_IS_4)
#if E5_AUTO_FAN_PIN == FAN1_PIN
SET_OUTPUT(E5_AUTO_FAN_PIN);
#if ENABLED(FAST_PWM_FAN)
setPwmFrequency(E5_AUTO_FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8
#endif
#else
SET_OUTPUT(E5_AUTO_FAN_PIN);
#endif
#endif
#if HAS_AUTO_CHAMBER_FAN && !(AUTO_CHAMBER_IS_0 || AUTO_CHAMBER_IS_1 || AUTO_CHAMBER_IS_2 || AUTO_CHAMBER_IS_3 || AUTO_CHAMBER_IS_4 || AUTO_CHAMBER_IS_5)
#if CHAMBER_AUTO_FAN_PIN == FAN1_PIN
SET_OUTPUT(CHAMBER_AUTO_FAN_PIN);
#if ENABLED(FAST_PWM_FAN)
@ -1321,6 +1337,14 @@ void Temperature::init() {
#ifdef HEATER_4_MAXTEMP
TEMP_MAX_ROUTINE(4);
#endif
#if HOTENDS > 5
#ifdef HEATER_5_MINTEMP
TEMP_MIN_ROUTINE(5);
#endif
#ifdef HEATER_5_MAXTEMP
TEMP_MAX_ROUTINE(5);
#endif
#endif // HOTENDS > 5
#endif // HOTENDS > 4
#endif // HOTENDS > 3
#endif // HOTENDS > 2
@ -1539,6 +1563,9 @@ void Temperature::disable_all_heaters() {
DISABLE_HEATER(3);
#if HOTENDS > 4
DISABLE_HEATER(4);
#if HOTENDS > 5
DISABLE_HEATER(5);
#endif // HOTENDS > 5
#endif // HOTENDS > 4
#endif // HOTENDS > 3
#endif // HOTENDS > 2
@ -1665,10 +1692,13 @@ void Temperature::set_current_temp_raw() {
current_temperature_raw[3] = raw_temp_value[3];
#if HAS_TEMP_ADC_4
current_temperature_raw[4] = raw_temp_value[4];
#endif
#endif
#endif
#endif
#if HAS_TEMP_ADC_5
current_temperature_raw[5] = raw_temp_value[5];
#endif // HAS_TEMP_ADC_5
#endif // HAS_TEMP_ADC_4
#endif // HAS_TEMP_ADC_3
#endif // HAS_TEMP_ADC_2
#endif // HAS_TEMP_ADC_1
#if HAS_HEATED_BED
current_temperature_bed_raw = raw_temp_bed_value;
@ -1718,6 +1748,9 @@ void Temperature::readings_ready() {
, TEMPDIR(3)
#if HOTENDS > 4
, TEMPDIR(4)
#if HOTENDS > 5
, TEMPDIR(5)
#endif // HOTENDS > 5
#endif // HOTENDS > 4
#endif // HOTENDS > 3
#endif // HOTENDS > 2
@ -1815,6 +1848,9 @@ void Temperature::isr() {
ISR_STATICS(3);
#if HOTENDS > 4
ISR_STATICS(4);
#if HOTENDS > 5
ISR_STATICS(5);
#endif // HOTENDS > 5
#endif // HOTENDS > 4
#endif // HOTENDS > 3
#endif // HOTENDS > 2
@ -1851,6 +1887,10 @@ void Temperature::isr() {
#if HOTENDS > 4
soft_pwm_count_4 = (soft_pwm_count_4 & pwm_mask) + soft_pwm_amount[4];
WRITE_HEATER_4(soft_pwm_count_4 > pwm_mask ? HIGH : LOW);
#if HOTENDS > 5
soft_pwm_count_5 = (soft_pwm_count_5 & pwm_mask) + soft_pwm_amount[5];
WRITE_HEATER_5(soft_pwm_count_5 > pwm_mask ? HIGH : LOW);
#endif // HOTENDS > 5
#endif // HOTENDS > 4
#endif // HOTENDS > 3
#endif // HOTENDS > 2
@ -1886,6 +1926,9 @@ void Temperature::isr() {
if (soft_pwm_count_3 <= pwm_count_tmp) WRITE_HEATER_3(LOW);
#if HOTENDS > 4
if (soft_pwm_count_4 <= pwm_count_tmp) WRITE_HEATER_4(LOW);
#if HOTENDS > 5
if (soft_pwm_count_5 <= pwm_count_tmp) WRITE_HEATER_5(LOW);
#endif // HOTENDS > 5
#endif // HOTENDS > 4
#endif // HOTENDS > 3
#endif // HOTENDS > 2
@ -1968,6 +2011,9 @@ void Temperature::isr() {
SLOW_PWM_ROUTINE(3);
#if HOTENDS > 4
SLOW_PWM_ROUTINE(4);
#if HOTENDS > 5
SLOW_PWM_ROUTINE(5);
#endif // HOTENDS > 5
#endif // HOTENDS > 4
#endif // HOTENDS > 3
#endif // HOTENDS > 2
@ -1987,6 +2033,9 @@ void Temperature::isr() {
PWM_OFF_ROUTINE(3);
#if HOTENDS > 4
PWM_OFF_ROUTINE(4);
#if HOTENDS > 5
PWM_OFF_ROUTINE(5);
#endif // HOTENDS > 5
#endif // HOTENDS > 4
#endif // HOTENDS > 3
#endif // HOTENDS > 2
@ -2047,6 +2096,9 @@ void Temperature::isr() {
if (state_timer_heater_3 > 0) state_timer_heater_3--;
#if HOTENDS > 4
if (state_timer_heater_4 > 0) state_timer_heater_4--;
#if HOTENDS > 5
if (state_timer_heater_5 > 0) state_timer_heater_5--;
#endif // HOTENDS > 5
#endif // HOTENDS > 4
#endif // HOTENDS > 3
#endif // HOTENDS > 2
@ -2169,6 +2221,15 @@ void Temperature::isr() {
break;
#endif
#if HAS_TEMP_ADC_5
case PrepareTemp_5:
HAL_START_ADC(TEMP_5_PIN);
break;
case MeasureTemp_5:
ACCUMULATE_ADC(raw_temp_value[5]);
break;
#endif
#if ENABLED(FILAMENT_WIDTH_SENSOR)
case Prepare_FILWIDTH:
HAL_START_ADC(FILWIDTH_PIN);
@ -2218,7 +2279,7 @@ void Temperature::isr() {
#if ENABLED(BABYSTEPPING)
LOOP_XYZ(axis) {
const int curTodo = babystepsTodo[axis]; // get rid of volatile for performance
const int16_t curTodo = babystepsTodo[axis]; // get rid of volatile for performance
if (curTodo) {
stepper.babystep((AxisEnum)axis, curTodo > 0);
if (curTodo > 0) babystepsTodo[axis]--;

View File

@ -163,7 +163,7 @@ class Temperature {
#endif
#if ENABLED(BABYSTEPPING)
static volatile int babystepsTodo[3];
static volatile int16_t babystepsTodo[3];
#endif
#if ENABLED(PREVENT_COLD_EXTRUSION)