Browse Source

Code changes supporting up to 6 extruders

Scott Lahteine 5 years ago
parent
commit
1718eff54a
52 changed files with 848 additions and 191 deletions
  1. 2
    0
      Marlin/src/HAL/HAL_AVR/SanityCheck.h
  2. 2
    0
      Marlin/src/HAL/HAL_STM32F7/SanityCheck.h
  3. 11
    2
      Marlin/src/Marlin.cpp
  4. 14
    1
      Marlin/src/Marlin.h
  5. 2
    1
      Marlin/src/core/drivers.h
  6. 5
    0
      Marlin/src/core/language.h
  7. 31
    0
      Marlin/src/feature/I2CPositionEncoder.cpp
  8. 6
    3
      Marlin/src/feature/controllerfan.cpp
  9. 6
    3
      Marlin/src/feature/power.cpp
  10. 3
    0
      Marlin/src/feature/runout.cpp
  11. 3
    0
      Marlin/src/feature/runout.h
  12. 8
    0
      Marlin/src/feature/solenoid.cpp
  13. 23
    0
      Marlin/src/feature/tmc_util.cpp
  14. 18
    13
      Marlin/src/feature/tmc_util.h
  15. 2
    2
      Marlin/src/gcode/bedlevel/abl/G29.cpp
  16. 6
    0
      Marlin/src/gcode/feature/trinamic/M906.cpp
  17. 12
    0
      Marlin/src/gcode/feature/trinamic/M911-M915.cpp
  18. 34
    2
      Marlin/src/inc/Conditionals_post.h
  19. 62
    24
      Marlin/src/inc/SanityCheck.h
  20. 1
    0
      Marlin/src/lcd/language/language_an.h
  21. 1
    0
      Marlin/src/lcd/language/language_bg.h
  22. 1
    0
      Marlin/src/lcd/language/language_ca.h
  23. 1
    0
      Marlin/src/lcd/language/language_cz.h
  24. 1
    0
      Marlin/src/lcd/language/language_da.h
  25. 1
    0
      Marlin/src/lcd/language/language_de.h
  26. 6
    0
      Marlin/src/lcd/language/language_en.h
  27. 1
    0
      Marlin/src/lcd/language/language_es.h
  28. 1
    0
      Marlin/src/lcd/language/language_eu.h
  29. 1
    0
      Marlin/src/lcd/language/language_fi.h
  30. 1
    0
      Marlin/src/lcd/language/language_fr.h
  31. 1
    0
      Marlin/src/lcd/language/language_gl.h
  32. 1
    0
      Marlin/src/lcd/language/language_hr.h
  33. 1
    0
      Marlin/src/lcd/language/language_it.h
  34. 1
    0
      Marlin/src/lcd/language/language_nl.h
  35. 1
    0
      Marlin/src/lcd/language/language_pl.h
  36. 1
    0
      Marlin/src/lcd/language/language_pt-br.h
  37. 1
    0
      Marlin/src/lcd/language/language_pt.h
  38. 1
    0
      Marlin/src/lcd/language/language_ru.h
  39. 1
    0
      Marlin/src/lcd/language/language_sk.h
  40. 2
    1
      Marlin/src/lcd/language/language_tr.h
  41. 1
    0
      Marlin/src/lcd/language/language_uk.h
  42. 1
    0
      Marlin/src/lcd/language/language_zh_CN.h
  43. 1
    0
      Marlin/src/lcd/language/language_zh_TW.h
  44. 142
    11
      Marlin/src/lcd/ultralcd.cpp
  45. 168
    108
      Marlin/src/module/configuration_store.cpp
  46. 27
    0
      Marlin/src/module/planner.cpp
  47. 25
    0
      Marlin/src/module/stepper.cpp
  48. 42
    1
      Marlin/src/module/stepper_indirection.h
  49. 73
    12
      Marlin/src/module/temperature.cpp
  50. 1
    1
      Marlin/src/module/temperature.h
  51. 54
    6
      Marlin/src/pins/pins.h
  52. 36
    0
      Marlin/src/pins/pinsDebug_list.h

+ 2
- 0
Marlin/src/HAL/HAL_AVR/SanityCheck.h View File

@@ -78,6 +78,8 @@
78 78
       #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN."
79 79
     #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN
80 80
       #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN."
81
+    #elif PIN_EXISTS(E5_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E5_AUTO_FAN_PIN
82
+      #error "SPINDLE_LASER_PWM_PIN is used by E5_AUTO_FAN_PIN."
81 83
     #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN
82 84
       #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN."
83 85
     #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN

+ 2
- 0
Marlin/src/HAL/HAL_STM32F7/SanityCheck.h View File

@@ -53,6 +53,8 @@
53 53
       #error "SPINDLE_LASER_PWM_PIN is used by E3_AUTO_FAN_PIN."
54 54
     #elif PIN_EXISTS(E4_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E4_AUTO_FAN_PIN
55 55
       #error "SPINDLE_LASER_PWM_PIN is used by E4_AUTO_FAN_PIN."
56
+    #elif PIN_EXISTS(E5_AUTO_FAN) && SPINDLE_LASER_PWM_PIN == E5_AUTO_FAN_PIN
57
+      #error "SPINDLE_LASER_PWM_PIN is used by E5_AUTO_FAN_PIN."
56 58
     #elif PIN_EXISTS(FAN) && SPINDLE_LASER_PWM_PIN == FAN_PIN
57 59
       #error "SPINDLE_LASER_PWM_PIN is used FAN_PIN."
58 60
     #elif PIN_EXISTS(FAN1) && SPINDLE_LASER_PWM_PIN == FAN1_PIN

+ 11
- 2
Marlin/src/Marlin.cpp View File

@@ -290,6 +290,7 @@ void enable_all_steppers() {
290 290
   enable_E2();
291 291
   enable_E3();
292 292
   enable_E4();
293
+  enable_E5();
293 294
 }
294 295
 
295 296
 void disable_e_steppers() {
@@ -298,6 +299,7 @@ void disable_e_steppers() {
298 299
   disable_E2();
299 300
   disable_E3();
300 301
   disable_E4();
302
+  disable_E5();
301 303
 }
302 304
 
303 305
 void disable_e_stepper(const uint8_t e) {
@@ -307,6 +309,7 @@ void disable_e_stepper(const uint8_t e) {
307 309
     case 2: disable_E2(); break;
308 310
     case 3: disable_E3(); break;
309 311
     case 4: disable_E4(); break;
312
+    case 5: disable_E5(); break;
310 313
   }
311 314
 }
312 315
 
@@ -440,7 +443,7 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
440 443
           #if E_STEPPERS > 1
441 444
             case 2: case 3: oldstatus = E1_ENABLE_READ; enable_E1(); break;
442 445
             #if E_STEPPERS > 2
443
-              case 4: oldstatus = E2_ENABLE_READ; enable_E2(); break;
446
+              case 4: case 5: oldstatus = E2_ENABLE_READ; enable_E2(); break;
444 447
             #endif // E_STEPPERS > 2
445 448
           #endif // E_STEPPERS > 1
446 449
         }
@@ -456,6 +459,9 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
456 459
                 case 3: oldstatus = E3_ENABLE_READ; enable_E3(); break;
457 460
                 #if E_STEPPERS > 4
458 461
                   case 4: oldstatus = E4_ENABLE_READ; enable_E4(); break;
462
+                  #if E_STEPPERS > 5
463
+                    case 5: oldstatus = E5_ENABLE_READ; enable_E5(); break;
464
+                  #endif // E_STEPPERS > 5
459 465
                 #endif // E_STEPPERS > 4
460 466
               #endif // E_STEPPERS > 3
461 467
             #endif // E_STEPPERS > 2
@@ -476,7 +482,7 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
476 482
           #if E_STEPPERS > 1
477 483
             case 2: case 3: oldstatus = E1_ENABLE_WRITE(oldstatus); break;
478 484
             #if E_STEPPERS > 2
479
-              case 4: oldstatus = E2_ENABLE_WRITE(oldstatus); break;
485
+              case 4: case 5: oldstatus = E2_ENABLE_WRITE(oldstatus); break;
480 486
             #endif // E_STEPPERS > 2
481 487
           #endif // E_STEPPERS > 1
482 488
         }
@@ -491,6 +497,9 @@ void manage_inactivity(const bool ignore_stepper_queue/*=false*/) {
491 497
                 case 3: E3_ENABLE_WRITE(oldstatus); break;
492 498
                 #if E_STEPPERS > 4
493 499
                   case 4: E4_ENABLE_WRITE(oldstatus); break;
500
+                  #if E_STEPPERS > 5
501
+                    case 5: E5_ENABLE_WRITE(oldstatus); break;
502
+                  #endif // E_STEPPERS > 5
494 503
                 #endif // E_STEPPERS > 4
495 504
               #endif // E_STEPPERS > 3
496 505
             #endif // E_STEPPERS > 2

+ 14
- 1
Marlin/src/Marlin.h View File

@@ -83,7 +83,10 @@ void manage_inactivity(const bool ignore_stepper_queue=false);
83 83
   /**
84 84
    * Mixing steppers synchronize their enable (and direction) together
85 85
    */
86
-  #if MIXING_STEPPERS > 4
86
+  #if MIXING_STEPPERS > 5
87
+    #define  enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); E4_ENABLE_WRITE( E_ENABLE_ON); E5_ENABLE_WRITE( E_ENABLE_ON); }
88
+    #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); E4_ENABLE_WRITE(!E_ENABLE_ON); E5_ENABLE_WRITE(!E_ENABLE_ON); }
89
+  #elif MIXING_STEPPERS > 4
87 90
     #define  enable_E0() { E0_ENABLE_WRITE( E_ENABLE_ON); E1_ENABLE_WRITE( E_ENABLE_ON); E2_ENABLE_WRITE( E_ENABLE_ON); E3_ENABLE_WRITE( E_ENABLE_ON); E4_ENABLE_WRITE( E_ENABLE_ON); }
88 91
     #define disable_E0() { E0_ENABLE_WRITE(!E_ENABLE_ON); E1_ENABLE_WRITE(!E_ENABLE_ON); E2_ENABLE_WRITE(!E_ENABLE_ON); E3_ENABLE_WRITE(!E_ENABLE_ON); E4_ENABLE_WRITE(!E_ENABLE_ON); }
89 92
   #elif MIXING_STEPPERS > 3
@@ -104,6 +107,8 @@ void manage_inactivity(const bool ignore_stepper_queue=false);
104 107
   #define disable_E3() NOOP
105 108
   #define  enable_E4() NOOP
106 109
   #define disable_E4() NOOP
110
+  #define  enable_E5() NOOP
111
+  #define disable_E5() NOOP
107 112
 
108 113
 #else // !MIXING_EXTRUDER
109 114
 
@@ -147,6 +152,14 @@ void manage_inactivity(const bool ignore_stepper_queue=false);
147 152
     #define disable_E4() NOOP
148 153
   #endif
149 154
 
155
+  #if E_STEPPERS > 5 && HAS_E5_ENABLE
156
+    #define  enable_E5() E5_ENABLE_WRITE( E_ENABLE_ON)
157
+    #define disable_E5() E5_ENABLE_WRITE(!E_ENABLE_ON)
158
+  #else
159
+    #define  enable_E5() NOOP
160
+    #define disable_E5() NOOP
161
+  #endif
162
+
150 163
 #endif // !MIXING_EXTRUDER
151 164
 
152 165
 #if ENABLED(EXPERIMENTAL_I2CBUS)

+ 2
- 1
Marlin/src/core/drivers.h View File

@@ -54,6 +54,7 @@
54 54
 #define AXIS_DRIVER_TYPE_E2(T) (E_STEPPERS > 2 && _AXIS_DRIVER_TYPE(E2,T))
55 55
 #define AXIS_DRIVER_TYPE_E3(T) (E_STEPPERS > 3 && _AXIS_DRIVER_TYPE(E3,T))
56 56
 #define AXIS_DRIVER_TYPE_E4(T) (E_STEPPERS > 4 && _AXIS_DRIVER_TYPE(E4,T))
57
+#define AXIS_DRIVER_TYPE_E5(T) (E_STEPPERS > 5 && _AXIS_DRIVER_TYPE(E5,T))
57 58
 
58 59
 #define AXIS_DRIVER_TYPE(A,T) AXIS_DRIVER_TYPE_##A(T)
59 60
 
@@ -62,7 +63,7 @@
62 63
                         AXIS_DRIVER_TYPE_Z(T)  || AXIS_DRIVER_TYPE_Z2(T) || AXIS_DRIVER_TYPE_Z3(T) || \
63 64
                         AXIS_DRIVER_TYPE_E0(T) || AXIS_DRIVER_TYPE_E1(T) || \
64 65
                         AXIS_DRIVER_TYPE_E2(T) || AXIS_DRIVER_TYPE_E3(T) || \
65
-                        AXIS_DRIVER_TYPE_E4(T) )
66
+                        AXIS_DRIVER_TYPE_E4(T) || AXIS_DRIVER_TYPE_E5(T) )
66 67
 
67 68
 // Test for supported TMC drivers that require advanced configuration
68 69
 // Does not match standalone configurations

+ 5
- 0
Marlin/src/core/language.h View File

@@ -289,26 +289,31 @@
289 289
 #define MSG_H3 "3"
290 290
 #define MSG_H4 "4"
291 291
 #define MSG_H5 "5"
292
+#define MSG_H6 "6"
292 293
 #define MSG_N1 " 1"
293 294
 #define MSG_N2 " 2"
294 295
 #define MSG_N3 " 3"
295 296
 #define MSG_N4 " 4"
296 297
 #define MSG_N5 " 5"
298
+#define MSG_N6 " 6"
297 299
 #define MSG_E1 "E1"
298 300
 #define MSG_E2 "E2"
299 301
 #define MSG_E3 "E3"
300 302
 #define MSG_E4 "E4"
301 303
 #define MSG_E5 "E5"
304
+#define MSG_E6 "E6"
302 305
 #define MSG_MOVE_E1 "1"
303 306
 #define MSG_MOVE_E2 "2"
304 307
 #define MSG_MOVE_E3 "3"
305 308
 #define MSG_MOVE_E4 "4"
306 309
 #define MSG_MOVE_E5 "5"
310
+#define MSG_MOVE_E6 "6"
307 311
 #define MSG_DIAM_E1 " 1"
308 312
 #define MSG_DIAM_E2 " 2"
309 313
 #define MSG_DIAM_E3 " 3"
310 314
 #define MSG_DIAM_E4 " 4"
311 315
 #define MSG_DIAM_E5 " 5"
316
+#define MSG_DIAM_E6 " 6"
312 317
 
313 318
 #include INCLUDE_LANGUAGE
314 319
 

+ 31
- 0
Marlin/src/feature/I2CPositionEncoder.cpp View File

@@ -646,6 +646,37 @@ void I2CPositionEncodersMgr::init() {
646 646
       encoders[i].set_homed();
647 647
     #endif
648 648
   #endif
649
+
650
+  #if I2CPE_ENCODER_CNT > 5
651
+    i++;
652
+
653
+    encoders[i].init(I2CPE_ENC_6_ADDR, I2CPE_ENC_6_AXIS);
654
+
655
+    #ifdef I2CPE_ENC_6_TYPE
656
+      encoders[i].set_type(I2CPE_ENC_6_TYPE);
657
+    #endif
658
+    #ifdef I2CPE_ENC_6_TICKS_UNIT
659
+      encoders[i].set_ticks_unit(I2CPE_ENC_6_TICKS_UNIT);
660
+    #endif
661
+    #ifdef I2CPE_ENC_6_TICKS_REV
662
+      encoders[i].set_stepper_ticks(I2CPE_ENC_6_TICKS_REV);
663
+    #endif
664
+    #ifdef I2CPE_ENC_6_INVERT
665
+      encoders[i].set_inverted(I2CPE_ENC_6_INVERT);
666
+    #endif
667
+    #ifdef I2CPE_ENC_6_EC_METHOD
668
+      encoders[i].set_ec_method(I2CPE_ENC_6_EC_METHOD);
669
+    #endif
670
+    #ifdef I2CPE_ENC_6_EC_THRESH
671
+      encoders[i].set_ec_threshold(I2CPE_ENC_6_EC_THRESH);
672
+    #endif
673
+
674
+    encoders[i].set_active(encoders[i].passes_test(true));
675
+
676
+    #if I2CPE_ENC_6_AXIS == E_AXIS
677
+      encoders[i].set_homed();
678
+    #endif
679
+  #endif
649 680
 }
650 681
 
651 682
 void I2CPositionEncodersMgr::report_position(const int8_t idx, const bool units, const bool noOffset) {

+ 6
- 3
Marlin/src/feature/controllerfan.cpp View File

@@ -57,11 +57,14 @@ void controllerfan_update() {
57 57
         #if E_STEPPERS > 1
58 58
           || E1_ENABLE_READ == E_ENABLE_ON
59 59
           #if E_STEPPERS > 2
60
-              || E2_ENABLE_READ == E_ENABLE_ON
60
+            || E2_ENABLE_READ == E_ENABLE_ON
61 61
             #if E_STEPPERS > 3
62
-                || E3_ENABLE_READ == E_ENABLE_ON
62
+              || E3_ENABLE_READ == E_ENABLE_ON
63 63
               #if E_STEPPERS > 4
64
-                  || E4_ENABLE_READ == E_ENABLE_ON
64
+                || E4_ENABLE_READ == E_ENABLE_ON
65
+                #if E_STEPPERS > 5
66
+                  || E5_ENABLE_READ == E_ENABLE_ON
67
+                #endif
65 68
               #endif
66 69
             #endif
67 70
           #endif

+ 6
- 3
Marlin/src/feature/power.cpp View File

@@ -68,11 +68,14 @@ bool Power::is_power_needed() {
68 68
       #if E_STEPPERS > 1
69 69
         || E1_ENABLE_READ == E_ENABLE_ON
70 70
         #if E_STEPPERS > 2
71
-            || E2_ENABLE_READ == E_ENABLE_ON
71
+          || E2_ENABLE_READ == E_ENABLE_ON
72 72
           #if E_STEPPERS > 3
73
-              || E3_ENABLE_READ == E_ENABLE_ON
73
+            || E3_ENABLE_READ == E_ENABLE_ON
74 74
             #if E_STEPPERS > 4
75
-                || E4_ENABLE_READ == E_ENABLE_ON
75
+              || E4_ENABLE_READ == E_ENABLE_ON
76
+              #if E_STEPPERS > 5
77
+                || E5_ENABLE_READ == E_ENABLE_ON
78
+              #endif
76 79
             #endif
77 80
           #endif
78 81
         #endif

+ 3
- 0
Marlin/src/feature/runout.cpp View File

@@ -54,6 +54,9 @@ void FilamentRunoutSensor::setup() {
54 54
         INIT_RUNOUT_PIN(FIL_RUNOUT4_PIN);
55 55
         #if NUM_RUNOUT_SENSORS > 4
56 56
           INIT_RUNOUT_PIN(FIL_RUNOUT5_PIN);
57
+          #if NUM_RUNOUT_SENSORS > 5
58
+            INIT_RUNOUT_PIN(FIL_RUNOUT6_PIN);
59
+          #endif
57 60
         #endif
58 61
       #endif
59 62
     #endif

+ 3
- 0
Marlin/src/feature/runout.h View File

@@ -71,6 +71,9 @@ class FilamentRunoutSensor {
71 71
               case 3: is_out = READ(FIL_RUNOUT4_PIN) == FIL_RUNOUT_INVERTING; break;
72 72
               #if NUM_RUNOUT_SENSORS > 4
73 73
                 case 4: is_out = READ(FIL_RUNOUT5_PIN) == FIL_RUNOUT_INVERTING; break;
74
+                #if NUM_RUNOUT_SENSORS > 5
75
+                  case 5: is_out = READ(FIL_RUNOUT6_PIN) == FIL_RUNOUT_INVERTING; break;
76
+                #endif
74 77
               #endif
75 78
             #endif
76 79
           #endif

+ 8
- 0
Marlin/src/feature/solenoid.cpp View File

@@ -53,6 +53,11 @@ inline void enable_solenoid(const uint8_t num) {
53 53
           OUT_WRITE(SOL4_PIN, HIGH);
54 54
           break;
55 55
       #endif
56
+      #if HAS_SOLENOID_5 && EXTRUDERS > 5
57
+        case 5:
58
+          OUT_WRITE(SOL5_PIN, HIGH);
59
+          break;
60
+      #endif
56 61
     default:
57 62
       SERIAL_ECHO_START();
58 63
       SERIAL_ECHOLNPGM(MSG_INVALID_SOLENOID);
@@ -76,6 +81,9 @@ void disable_all_solenoids() {
76 81
   #if HAS_SOLENOID_4 && EXTRUDERS > 4
77 82
     OUT_WRITE(SOL4_PIN, LOW);
78 83
   #endif
84
+  #if HAS_SOLENOID_5 && EXTRUDERS > 5
85
+    OUT_WRITE(SOL5_PIN, LOW);
86
+  #endif
79 87
 }
80 88
 
81 89
 #endif // EXT_SOLENOID

+ 23
- 0
Marlin/src/feature/tmc_util.cpp View File

@@ -213,6 +213,10 @@ bool report_tmc_status = false;
213 213
         static uint8_t e4_otpw_cnt = 0;
214 214
         monitor_tmc_driver(stepperE4, TMC_E4, e4_otpw_cnt);
215 215
       #endif
216
+      #if HAS_HW_COMMS(E5)
217
+        static uint8_t e5_otpw_cnt = 0;
218
+        monitor_tmc_driver(stepperE5, TMC_E5, e5_otpw_cnt);
219
+      #endif
216 220
 
217 221
       if (report_tmc_status) SERIAL_EOL();
218 222
     }
@@ -244,6 +248,9 @@ void _tmc_say_axis(const TMC_AxisEnum axis) {
244 248
             , ext_E3[] PROGMEM = "E3"
245 249
             #if E_STEPPERS > 4
246 250
               , ext_E4[] PROGMEM = "E4"
251
+              #if E_STEPPERS > 5
252
+                , ext_E5[] PROGMEM = "E5"
253
+              #endif
247 254
             #endif
248 255
           #endif
249 256
         #endif
@@ -274,6 +281,9 @@ void _tmc_say_axis(const TMC_AxisEnum axis) {
274 281
             , ext_E3
275 282
             #if E_STEPPERS > 4
276 283
               , ext_E4
284
+              #if E_STEPPERS > 5
285
+                , ext_E5
286
+              #endif
277 287
             #endif
278 288
           #endif
279 289
         #endif
@@ -532,6 +542,13 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
532 542
         #endif
533 543
       ]);
534 544
     #endif
545
+    #if AXIS_IS_TMC(E5)
546
+      tmc_status(stepperE5, TMC_E5, i, planner.axis_steps_per_mm[E_AXIS
547
+        #if ENABLED(DISTINCT_E_FACTORS)
548
+          + 5
549
+        #endif
550
+      ]);
551
+    #endif
535 552
 
536 553
     SERIAL_EOL();
537 554
   }
@@ -576,6 +593,9 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
576 593
     #if AXIS_IS_TMC(E4)
577 594
       tmc_parse_drv_status(stepperE4, TMC_E4, i);
578 595
     #endif
596
+    #if AXIS_IS_TMC(E5)
597
+      tmc_parse_drv_status(stepperE5, TMC_E5, i);
598
+    #endif
579 599
 
580 600
     SERIAL_EOL();
581 601
   }
@@ -693,6 +713,9 @@ void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
693 713
     #if AXIS_DRIVER_TYPE(E4, TMC2130)
694 714
       SET_CS_PIN(E4);
695 715
     #endif
716
+    #if AXIS_DRIVER_TYPE(E5, TMC2130)
717
+      SET_CS_PIN(E5);
718
+    #endif
696 719
   }
697 720
 #endif // TMC2130
698 721
 

+ 18
- 13
Marlin/src/feature/tmc_util.h View File

@@ -49,19 +49,24 @@ enum TMC_AxisEnum : char {
49 49
   #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS)
50 50
     , TMC_Z3
51 51
   #endif
52
-  , TMC_E0
53
-  #if E_STEPPERS > 1
54
-    , TMC_E1
55
-    #if E_STEPPERS > 2
56
-      , TMC_E2
57
-      #if E_STEPPERS > 3
58
-        , TMC_E3
59
-        #if E_STEPPERS > 4
60
-          , TMC_E4
61
-        #endif
62
-      #endif
63
-    #endif
64
-  #endif
52
+  #if E_STEPPERS
53
+    , TMC_E0
54
+    #if E_STEPPERS > 1
55
+      , TMC_E1
56
+      #if E_STEPPERS > 2
57
+        , TMC_E2
58
+        #if E_STEPPERS > 3
59
+          , TMC_E3
60
+          #if E_STEPPERS > 4
61
+            , TMC_E4
62
+            #if E_STEPPERS > 5
63
+              , TMC_E5
64
+            #endif // E_STEPPERS > 5
65
+          #endif // E_STEPPERS > 4
66
+        #endif // E_STEPPERS > 3
67
+      #endif // E_STEPPERS > 2
68
+    #endif // E_STEPPERS > 1
69
+  #endif // E_STEPPERS
65 70
 };
66 71
 
67 72
 constexpr uint32_t _tmc_thrs(const uint16_t msteps, const int32_t thrs, const uint32_t spmm) {

+ 2
- 2
Marlin/src/gcode/bedlevel/abl/G29.cpp View File

@@ -677,8 +677,8 @@ G29_TYPE GcodeSuite::G29() {
677 677
         // Inner loop is Y with PROBE_Y_FIRST enabled
678 678
         for (int8_t PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; PR_INNER_VAR += inInc) {
679 679
 
680
-          float xBase = left_probe_bed_position + xGridSpacing * xCount,
681
-                yBase = front_probe_bed_position + yGridSpacing * yCount;
680
+          const float xBase = left_probe_bed_position + xGridSpacing * xCount,
681
+                      yBase = front_probe_bed_position + yGridSpacing * yCount;
682 682
 
683 683
           xProbe = FLOOR(xBase + (xBase < 0 ? 0 : 0.5));
684 684
           yProbe = FLOOR(yBase + (yBase < 0 ? 0 : 0.5));

+ 6
- 0
Marlin/src/gcode/feature/trinamic/M906.cpp View File

@@ -86,6 +86,9 @@ void GcodeSuite::M906() {
86 86
           #if AXIS_IS_TMC(E4)
87 87
             case 4: TMC_SET_CURRENT(E4); break;
88 88
           #endif
89
+          #if AXIS_IS_TMC(E5)
90
+            case 5: TMC_SET_CURRENT(E5); break;
91
+          #endif
89 92
         }
90 93
       } break;
91 94
     }
@@ -128,6 +131,9 @@ void GcodeSuite::M906() {
128 131
     #if AXIS_IS_TMC(E4)
129 132
       TMC_SAY_CURRENT(E4);
130 133
     #endif
134
+    #if AXIS_IS_TMC(E5)
135
+      TMC_SAY_CURRENT(E5);
136
+    #endif
131 137
   }
132 138
 }
133 139
 

+ 12
- 0
Marlin/src/gcode/feature/trinamic/M911-M915.cpp View File

@@ -74,6 +74,9 @@ void GcodeSuite::M911() {
74 74
   #if M91x_USE_E(4)
75 75
     tmc_report_otpw(stepperE4, TMC_E4);
76 76
   #endif
77
+  #if M91x_USE_E(5)
78
+    tmc_report_otpw(stepperE5, TMC_E5);
79
+  #endif
77 80
 }
78 81
 
79 82
 /**
@@ -145,6 +148,9 @@ void GcodeSuite::M912() {
145 148
       #if M91x_USE_E(4)
146 149
         if (hasNone || eval == 4 || (hasE && eval < 0)) tmc_clear_otpw(stepperE4, TMC_E4);
147 150
       #endif
151
+      #if M91x_USE_E(5)
152
+        if (hasNone || eval == 5 || (hasE && eval == 10)) tmc_clear_otpw(stepperE5, TMC_E5);
153
+      #endif
148 154
     #endif
149 155
 }
150 156
 
@@ -208,6 +214,9 @@ void GcodeSuite::M912() {
208 214
             #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4)
209 215
               case 4: TMC_SET_PWMTHRS_E(4); break;
210 216
             #endif
217
+            #if E_STEPPERS > 5 && AXIS_HAS_STEALTHCHOP(E5)
218
+              case 5: TMC_SET_PWMTHRS_E(5); break;
219
+            #endif
211 220
           }
212 221
         } break;
213 222
       }
@@ -250,6 +259,9 @@ void GcodeSuite::M912() {
250 259
       #if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4)
251 260
         TMC_SAY_PWMTHRS_E(4);
252 261
       #endif
262
+      #if E_STEPPERS > 5 && AXIS_HAS_STEALTHCHOP(E5)
263
+        TMC_SAY_PWMTHRS_E(5);
264
+      #endif
253 265
     }
254 266
   }
255 267
 #endif // HYBRID_THRESHOLD

+ 34
- 2
Marlin/src/inc/Conditionals_post.h View File

@@ -381,6 +381,22 @@
381 381
   #define HEATER_4_USES_THERMISTOR
382 382
 #endif
383 383
 
384
+#if TEMP_SENSOR_5 == -4
385
+  #define HEATER_5_USES_AD8495
386
+#elif TEMP_SENSOR_5 == -3
387
+  #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_5."
388
+#elif TEMP_SENSOR_5 == -2
389
+  #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_5."
390
+#elif TEMP_SENSOR_5 == -1
391
+  #define HEATER_5_USES_AD595
392
+#elif TEMP_SENSOR_5 == 0
393
+  #undef HEATER_5_MINTEMP
394
+  #undef HEATER_5_MAXTEMP
395
+#elif TEMP_SENSOR_5 > 0
396
+  #define THERMISTORHEATER_5 TEMP_SENSOR_5
397
+  #define HEATER_5_USES_THERMISTOR
398
+#endif
399
+
384 400
 #if TEMP_SENSOR_BED == -4
385 401
   #define HEATER_BED_USES_AD8495
386 402
 #elif TEMP_SENSOR_BED == -3
@@ -841,6 +857,12 @@
841 857
 #define HAS_E4_MICROSTEPS (PIN_EXISTS(E4_MS1))
842 858
 #define HAS_SOLENOID_4    (PIN_EXISTS(SOL4))
843 859
 
860
+#define HAS_E5_ENABLE     (PIN_EXISTS(E5_ENABLE))
861
+#define HAS_E5_DIR        (PIN_EXISTS(E5_DIR))
862
+#define HAS_E5_STEP       (PIN_EXISTS(E5_STEP))
863
+#define HAS_E5_MICROSTEPS (PIN_EXISTS(E5_MS1))
864
+#define HAS_SOLENOID_5    (PIN_EXISTS(SOL5))
865
+
844 866
 // Trinamic Stepper Drivers
845 867
 #define HAS_STEALTHCHOP (HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2208))
846 868
 #define HAS_STALLGUARD  HAS_DRIVER(TMC2130)
@@ -919,8 +941,9 @@
919 941
 #define HAS_AUTO_FAN_2 (HOTENDS > 2 && PIN_EXISTS(E2_AUTO_FAN))
920 942
 #define HAS_AUTO_FAN_3 (HOTENDS > 3 && PIN_EXISTS(E3_AUTO_FAN))
921 943
 #define HAS_AUTO_FAN_4 (HOTENDS > 4 && PIN_EXISTS(E4_AUTO_FAN))
944
+#define HAS_AUTO_FAN_5 (HOTENDS > 5 && PIN_EXISTS(E5_AUTO_FAN))
922 945
 #define HAS_AUTO_CHAMBER_FAN (PIN_EXISTS(CHAMBER_AUTO_FAN))
923
-#define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 || HAS_AUTO_CHAMBER_FAN)
946
+#define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 || HAS_AUTO_FAN_4 || HAS_AUTO_FAN_5 || HAS_AUTO_CHAMBER_FAN)
924 947
 #define AUTO_1_IS_0 (E1_AUTO_FAN_PIN == E0_AUTO_FAN_PIN)
925 948
 #define AUTO_2_IS_0 (E2_AUTO_FAN_PIN == E0_AUTO_FAN_PIN)
926 949
 #define AUTO_2_IS_1 (E2_AUTO_FAN_PIN == E1_AUTO_FAN_PIN)
@@ -931,11 +954,17 @@
931 954
 #define AUTO_4_IS_1 (E4_AUTO_FAN_PIN == E1_AUTO_FAN_PIN)
932 955
 #define AUTO_4_IS_2 (E4_AUTO_FAN_PIN == E2_AUTO_FAN_PIN)
933 956
 #define AUTO_4_IS_3 (E4_AUTO_FAN_PIN == E3_AUTO_FAN_PIN)
957
+#define AUTO_5_IS_0 (E5_AUTO_FAN_PIN == E0_AUTO_FAN_PIN)
958
+#define AUTO_5_IS_1 (E5_AUTO_FAN_PIN == E1_AUTO_FAN_PIN)
959
+#define AUTO_5_IS_2 (E5_AUTO_FAN_PIN == E2_AUTO_FAN_PIN)
960
+#define AUTO_5_IS_3 (E5_AUTO_FAN_PIN == E3_AUTO_FAN_PIN)
961
+#define AUTO_5_IS_4 (E5_AUTO_FAN_PIN == E4_AUTO_FAN_PIN)
934 962
 #define AUTO_CHAMBER_IS_0 (CHAMBER_AUTO_FAN_PIN == E0_AUTO_FAN_PIN)
935 963
 #define AUTO_CHAMBER_IS_1 (CHAMBER_AUTO_FAN_PIN == E1_AUTO_FAN_PIN)
936 964
 #define AUTO_CHAMBER_IS_2 (CHAMBER_AUTO_FAN_PIN == E2_AUTO_FAN_PIN)
937 965
 #define AUTO_CHAMBER_IS_3 (CHAMBER_AUTO_FAN_PIN == E3_AUTO_FAN_PIN)
938 966
 #define AUTO_CHAMBER_IS_4 (CHAMBER_AUTO_FAN_PIN == E4_AUTO_FAN_PIN)
967
+#define AUTO_CHAMBER_IS_5 (CHAMBER_AUTO_FAN_PIN == E5_AUTO_FAN_PIN)
939 968
 
940 969
 // Other fans
941 970
 #define HAS_FAN0 (PIN_EXISTS(FAN))
@@ -966,7 +995,7 @@
966 995
 #define HAS_CASE_LIGHT (PIN_EXISTS(CASE_LIGHT) && ENABLED(CASE_LIGHT_ENABLE))
967 996
 
968 997
 // Digital control
969
-#define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Z_MICROSTEPS || HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS)
998
+#define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Z_MICROSTEPS || HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS || HAS_E5_MICROSTEPS)
970 999
 #define HAS_STEPPER_RESET (PIN_EXISTS(STEPPER_RESET))
971 1000
 #define HAS_DIGIPOTSS (PIN_EXISTS(DIGIPOTSS))
972 1001
 #define HAS_MOTOR_CURRENT_PWM (PIN_EXISTS(MOTOR_CURRENT_PWM_XY) || PIN_EXISTS(MOTOR_CURRENT_PWM_Z) || PIN_EXISTS(MOTOR_CURRENT_PWM_E))
@@ -1022,6 +1051,9 @@
1022 1051
       #define WRITE_HEATER_3(v) WRITE(HEATER_3_PIN, (v) ^ HEATER_3_INVERTING)
1023 1052
       #if HOTENDS > 4
1024 1053
         #define WRITE_HEATER_4(v) WRITE(HEATER_4_PIN, (v) ^ HEATER_4_INVERTING)
1054
+        #if HOTENDS > 5
1055
+          #define WRITE_HEATER_5(v) WRITE(HEATER_5_PIN, (v) ^ HEATER_5_INVERTING)
1056
+        #endif // HOTENDS > 5
1025 1057
       #endif // HOTENDS > 4
1026 1058
     #endif // HOTENDS > 3
1027 1059
   #endif // HOTENDS > 2

+ 62
- 24
Marlin/src/inc/SanityCheck.h View File

@@ -273,19 +273,19 @@
273 273
 #elif defined(HAVE_L6470DRIVER)
274 274
   #error "HAVE_L6470DRIVER is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h."
275 275
 #elif defined(X_IS_TMC) || defined(X2_IS_TMC) || defined(Y_IS_TMC) || defined(Y2_IS_TMC) || defined(Z_IS_TMC) || defined(Z2_IS_TMC) || defined(Z3_IS_TMC) \
276
-   || defined(E0_IS_TMC) || defined(E1_IS_TMC) || defined(E2_IS_TMC) || defined(E3_IS_TMC) || defined(E4_IS_TMC)
276
+   || defined(E0_IS_TMC) || defined(E1_IS_TMC) || defined(E2_IS_TMC) || defined(E3_IS_TMC) || defined(E4_IS_TMC) || defined(E5_IS_TMC)
277 277
   #error "[AXIS]_IS_TMC is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h."
278 278
 #elif defined(X_IS_TMC26X) || defined(X2_IS_TMC26X) || defined(Y_IS_TMC26X) || defined(Y2_IS_TMC26X) || defined(Z_IS_TMC26X) || defined(Z2_IS_TMC26X) || defined(Z3_IS_TMC26X) \
279
-   || defined(E0_IS_TMC26X) || defined(E1_IS_TMC26X) || defined(E2_IS_TMC26X) || defined(E3_IS_TMC26X) || defined(E4_IS_TMC26X)
279
+   || defined(E0_IS_TMC26X) || defined(E1_IS_TMC26X) || defined(E2_IS_TMC26X) || defined(E3_IS_TMC26X) || defined(E4_IS_TMC26X) || defined(E5_IS_TMC26X)
280 280
   #error "[AXIS]_IS_TMC26X is now [AXIS]_DRIVER_TYPE TMC26X. Please update your Configuration.h."
281 281
 #elif defined(X_IS_TMC2130) || defined(X2_IS_TMC2130) || defined(Y_IS_TMC2130) || defined(Y2_IS_TMC2130) || defined(Z_IS_TMC2130) || defined(Z2_IS_TMC2130) || defined(Z3_IS_TMC2130) \
282
-   || defined(E0_IS_TMC2130) || defined(E1_IS_TMC2130) || defined(E2_IS_TMC2130) || defined(E3_IS_TMC2130) || defined(E4_IS_TMC2130)
282
+   || defined(E0_IS_TMC2130) || defined(E1_IS_TMC2130) || defined(E2_IS_TMC2130) || defined(E3_IS_TMC2130) || defined(E4_IS_TMC2130) || defined(E5_IS_TMC2130)
283 283
   #error "[AXIS]_IS_TMC2130 is now [AXIS]_DRIVER_TYPE TMC2130. Please update your Configuration.h."
284 284
 #elif defined(X_IS_TMC2208) || defined(X2_IS_TMC2208) || defined(Y_IS_TMC2208) || defined(Y2_IS_TMC2208) || defined(Z_IS_TMC2208) || defined(Z2_IS_TMC2208) || defined(Z3_IS_TMC2208) \
285
-   || defined(E0_IS_TMC2208) || defined(E1_IS_TMC2208) || defined(E2_IS_TMC2208) || defined(E3_IS_TMC2208) || defined(E4_IS_TMC2208)
285
+   || defined(E0_IS_TMC2208) || defined(E1_IS_TMC2208) || defined(E2_IS_TMC2208) || defined(E3_IS_TMC2208) || defined(E4_IS_TMC2208) || defined(E5_IS_TMC2208)
286 286
   #error "[AXIS]_IS_TMC2208 is now [AXIS]_DRIVER_TYPE TMC2208. Please update your Configuration.h."
287 287
 #elif defined(X_IS_L6470) || defined(X2_IS_L6470) || defined(Y_IS_L6470) || defined(Y2_IS_L6470) || defined(Z_IS_L6470) || defined(Z2_IS_L6470) || defined(Z3_IS_L6470) \
288
-   || defined(E0_IS_L6470) || defined(E1_IS_L6470) || defined(E2_IS_L6470) || defined(E3_IS_L6470) || defined(E4_IS_L6470)
288
+   || defined(E0_IS_L6470) || defined(E1_IS_L6470) || defined(E2_IS_L6470) || defined(E3_IS_L6470) || defined(E4_IS_L6470) || defined(E5_IS_L6470)
289 289
   #error "[AXIS]_IS_L6470 is now [AXIS]_DRIVER_TYPE L6470. Please update your Configuration.h."
290 290
 #elif defined(AUTOMATIC_CURRENT_CONTROL)
291 291
   #error "AUTOMATIC_CURRENT_CONTROL is now MONITOR_DRIVER_STATUS. Please update your configuration."
@@ -534,6 +534,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
534 534
     #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 3 requires FIL_RUNOUT4_PIN."
535 535
   #elif NUM_RUNOUT_SENSORS > 4 && !PIN_EXISTS(FIL_RUNOUT5)
536 536
     #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 4 requires FIL_RUNOUT5_PIN."
537
+  #elif NUM_RUNOUT_SENSORS > 5 && !PIN_EXISTS(FIL_RUNOUT6)
538
+    #error "FILAMENT_RUNOUT_SENSOR with NUM_RUNOUT_SENSORS > 5 requires FIL_RUNOUT6_PIN."
537 539
   #elif DISABLED(SDSUPPORT) && DISABLED(PRINTJOB_TIMER_AUTOSTART)
538 540
     #error "FILAMENT_RUNOUT_SENSOR requires SDSUPPORT or PRINTJOB_TIMER_AUTOSTART."
539 541
   #elif DISABLED(ADVANCED_PAUSE_FEATURE)
@@ -1242,13 +1244,28 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
1242 1244
         #elif !PIN_EXISTS(TEMP_4)
1243 1245
           #error "TEMP_4_PIN not defined for this board."
1244 1246
         #endif
1247
+        #if HOTENDS > 5
1248
+          #if TEMP_SENSOR_5 == 0
1249
+            #error "TEMP_SENSOR_5 is required with 5 HOTENDS."
1250
+          #elif !HAS_HEATER_5
1251
+            #error "HEATER_5_PIN not defined for this board."
1252
+          #elif !PIN_EXISTS(TEMP_5)
1253
+            #error "TEMP_5_PIN not defined for this board."
1254
+          #endif
1255
+        #elif TEMP_SENSOR_5 != 0
1256
+          #error "TEMP_SENSOR_5 shouldn't be set with only 5 HOTENDS."
1257
+        #endif
1245 1258
       #elif TEMP_SENSOR_4 != 0
1246 1259
         #error "TEMP_SENSOR_4 shouldn't be set with only 4 HOTENDS."
1260
+      #elif TEMP_SENSOR_5 != 0
1261
+        #error "TEMP_SENSOR_5 shouldn't be set with only 5 HOTENDS."
1247 1262
       #endif
1248 1263
     #elif TEMP_SENSOR_3 != 0
1249 1264
       #error "TEMP_SENSOR_3 shouldn't be set with only 3 HOTENDS."
1250 1265
     #elif TEMP_SENSOR_4 != 0
1251 1266
       #error "TEMP_SENSOR_4 shouldn't be set with only 3 HOTENDS."
1267
+    #elif TEMP_SENSOR_5 != 0
1268
+      #error "TEMP_SENSOR_5 shouldn't be set with only 4 HOTENDS."
1252 1269
     #endif
1253 1270
   #elif TEMP_SENSOR_2 != 0
1254 1271
     #error "TEMP_SENSOR_2 shouldn't be set with only 2 HOTENDS."
@@ -1256,6 +1273,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
1256 1273
     #error "TEMP_SENSOR_3 shouldn't be set with only 2 HOTENDS."
1257 1274
   #elif TEMP_SENSOR_4 != 0
1258 1275
     #error "TEMP_SENSOR_4 shouldn't be set with only 2 HOTENDS."
1276
+  #elif TEMP_SENSOR_5 != 0
1277
+    #error "TEMP_SENSOR_5 shouldn't be set with only 2 HOTENDS."
1259 1278
   #endif
1260 1279
 #elif TEMP_SENSOR_1 != 0 && DISABLED(TEMP_SENSOR_1_AS_REDUNDANT)
1261 1280
   #error "TEMP_SENSOR_1 shouldn't be set with only 1 HOTEND."
@@ -1265,6 +1284,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
1265 1284
   #error "TEMP_SENSOR_3 shouldn't be set with only 1 HOTEND."
1266 1285
 #elif TEMP_SENSOR_4 != 0
1267 1286
   #error "TEMP_SENSOR_4 shouldn't be set with only 1 HOTEND."
1287
+#elif TEMP_SENSOR_5 != 0
1288
+  #error "TEMP_SENSOR_5 shouldn't be set with only 1 HOTEND."
1268 1289
 #endif
1269 1290
 
1270 1291
 #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) && TEMP_SENSOR_1 == 0
@@ -1306,23 +1327,36 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
1306 1327
  * Test Extruder Stepper Pins
1307 1328
  */
1308 1329
 #if DISABLED(MK2_MULTIPLEXER) // MK2_MULTIPLEXER uses E0 stepper only
1309
-  #if E_STEPPERS > 4
1310
-    #if !(PIN_EXISTS(E4_STEP) && PIN_EXISTS(E4_DIR) && PIN_EXISTS(E4_ENABLE))
1311
-      #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board."
1312
-    #endif
1313
-  #elif E_STEPPERS > 3
1314
-    #if !(PIN_EXISTS(E3_STEP) && PIN_EXISTS(E3_DIR) && PIN_EXISTS(E3_ENABLE))
1315
-      #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board."
1316
-    #endif
1317
-  #elif E_STEPPERS > 2
1318
-    #if !(PIN_EXISTS(E2_STEP) && PIN_EXISTS(E2_DIR) && PIN_EXISTS(E2_ENABLE))
1319
-      #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board."
1320
-    #endif
1321
-  #elif E_STEPPERS > 1
1322
-    #if !(PIN_EXISTS(E1_STEP) && PIN_EXISTS(E1_DIR) && PIN_EXISTS(E1_ENABLE))
1323
-      #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board."
1330
+  #if E_STEPPERS
1331
+    #if !(PIN_EXISTS(E0_STEP) && PIN_EXISTS(E0_DIR) && PIN_EXISTS(E0_ENABLE))
1332
+      #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board."
1324 1333
     #endif
1325
-  #endif
1334
+    #if E_STEPPERS > 1
1335
+      #if !(PIN_EXISTS(E1_STEP) && PIN_EXISTS(E1_DIR) && PIN_EXISTS(E1_ENABLE))
1336
+        #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board."
1337
+      #endif
1338
+      #if E_STEPPERS > 2
1339
+        #if !(PIN_EXISTS(E2_STEP) && PIN_EXISTS(E2_DIR) && PIN_EXISTS(E2_ENABLE))
1340
+          #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board."
1341
+        #endif
1342
+        #if E_STEPPERS > 3
1343
+          #if !(PIN_EXISTS(E3_STEP) && PIN_EXISTS(E3_DIR) && PIN_EXISTS(E3_ENABLE))
1344
+            #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board."
1345
+          #endif
1346
+          #if E_STEPPERS > 4
1347
+            #if !(PIN_EXISTS(E4_STEP) && PIN_EXISTS(E4_DIR) && PIN_EXISTS(E4_ENABLE))
1348
+              #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board."
1349
+            #endif
1350
+            #if E_STEPPERS > 5
1351
+              #if !(PIN_EXISTS(E5_STEP) && PIN_EXISTS(E5_DIR) && PIN_EXISTS(E5_ENABLE))
1352
+                #error "E5_STEP_PIN, E5_DIR_PIN, or E5_ENABLE_PIN not defined for this board."
1353
+              #endif
1354
+            #endif // E_STEPPERS > 5
1355
+          #endif // E_STEPPERS > 4
1356
+        #endif // E_STEPPERS > 3
1357
+      #endif // E_STEPPERS > 2
1358
+    #endif // E_STEPPERS > 1
1359
+  #endif // E_STEPPERS
1326 1360
 #endif
1327 1361
 
1328 1362
 /**
@@ -1625,6 +1659,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
1625 1659
   #error "E3_CS_PIN is required for TMC2130. Define E3_CS_PIN in Configuration_adv.h."
1626 1660
 #elif AXIS_DRIVER_TYPE(E4, TMC2130) && !PIN_EXISTS(E4_CS)
1627 1661
   #error "E4_CS_PIN is required for TMC2130. Define E4_CS_PIN in Configuration_adv.h."
1662
+#elif AXIS_DRIVER_TYPE(E5, TMC2130) && !PIN_EXISTS(E5_CS)
1663
+  #error "E5_CS_PIN is required for TMC2130. Define E5_CS_PIN in Configuration_adv.h."
1628 1664
 #endif
1629 1665
 
1630 1666
 /**
@@ -1642,8 +1678,9 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
1642 1678
     || defined(E1_HARDWARE_SERIAL) \
1643 1679
     || defined(E2_HARDWARE_SERIAL) \
1644 1680
     || defined(E3_HARDWARE_SERIAL) \
1645
-    || defined(E4_HARDWARE_SERIAL) )
1646
-  #error "select hardware UART for TMC2208 to use both TMC2208 and ENDSTOP_INTERRUPTS_FEATURE."
1681
+    || defined(E4_HARDWARE_SERIAL) \
1682
+    || defined(E5_HARDWARE_SERIAL) )
1683
+  #error "Select hardware UART for TMC2208 to use both TMC2208 and ENDSTOP_INTERRUPTS_FEATURE."
1647 1684
 #endif
1648 1685
 
1649 1686
 /**
@@ -1660,7 +1697,8 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
1660 1697
     || defined(E1_HARDWARE_SERIAL) \
1661 1698
     || defined(E2_HARDWARE_SERIAL) \
1662 1699
     || defined(E3_HARDWARE_SERIAL) \
1663
-    || defined(E4_HARDWARE_SERIAL) )
1700
+    || defined(E4_HARDWARE_SERIAL) \
1701
+    || defined(E5_HARDWARE_SERIAL) )
1664 1702
   #error "TMC2208 Software Serial is supported only on AVR and LPC1768 platforms."
1665 1703
 #endif
1666 1704
 

+ 1
- 0
Marlin/src/lcd/language/language_an.h View File

@@ -130,6 +130,7 @@
130 130
 #define MSG_E3STEPS                         _UxGT("E3 trangos/mm")
131 131
 #define MSG_E4STEPS                         _UxGT("E4 trangos/mm")
132 132
 #define MSG_E5STEPS                         _UxGT("E5 trangos/mm")
133
+#define MSG_E6STEPS                         _UxGT("E6 trangos/mm")
133 134
 #define MSG_TEMPERATURE                     _UxGT("Temperatura")
134 135
 #define MSG_MOTION                          _UxGT("Movimiento")
135 136
 #define MSG_FILAMENT                        _UxGT("Filamento")

+ 1
- 0
Marlin/src/lcd/language/language_bg.h View File

@@ -99,6 +99,7 @@
99 99
 #define MSG_E3STEPS                         _UxGT("E3 стъпки/mm")
100 100
 #define MSG_E4STEPS                         _UxGT("E4 стъпки/mm")
101 101
 #define MSG_E5STEPS                         _UxGT("E5 стъпки/mm")
102
+#define MSG_E6STEPS                         _UxGT("E6 стъпки/mm")
102 103
 #define MSG_TEMPERATURE                     _UxGT("Температура")
103 104
 #define MSG_MOTION                          _UxGT("Движение")
104 105
 #define MSG_FILAMENT                        _UxGT("Нишка")

+ 1
- 0
Marlin/src/lcd/language/language_ca.h View File

@@ -132,6 +132,7 @@
132 132
 #define MSG_E3STEPS                         _UxGT("E3passos/mm")
133 133
 #define MSG_E4STEPS                         _UxGT("E4passos/mm")
134 134
 #define MSG_E5STEPS                         _UxGT("E5passos/mm")
135
+#define MSG_E6STEPS                         _UxGT("E6passos/mm")
135 136
 #define MSG_TEMPERATURE                     _UxGT("Temperatura")
136 137
 #define MSG_MOTION                          _UxGT("Moviment")
137 138
 #define MSG_FILAMENT                        _UxGT("Filament")

+ 1
- 0
Marlin/src/lcd/language/language_cz.h View File

@@ -233,6 +233,7 @@
233 233
 #define MSG_E3STEPS                         _UxGT("E3kroků/mm")
234 234
 #define MSG_E4STEPS                         _UxGT("E4kroků/mm")
235 235
 #define MSG_E5STEPS                         _UxGT("E5kroků/mm")
236
+#define MSG_E6STEPS                         _UxGT("E6kroků/mm")
236 237
 #define MSG_TEMPERATURE                     _UxGT("Teplota")
237 238
 #define MSG_MOTION                          _UxGT("Pohyb")
238 239
 #define MSG_FILAMENT                        _UxGT("Filament")

+ 1
- 0
Marlin/src/lcd/language/language_da.h View File

@@ -130,6 +130,7 @@
130 130
 #define MSG_E3STEPS                         _UxGT("E3steps/mm")
131 131
 #define MSG_E4STEPS                         _UxGT("E4steps/mm")
132 132
 #define MSG_E5STEPS                         _UxGT("E5steps/mm")
133
+#define MSG_E6STEPS                         _UxGT("E6steps/mm")
133 134
 #define MSG_TEMPERATURE                     _UxGT("Temperatur")
134 135
 #define MSG_MOTION                          _UxGT("Bevægelse")
135 136
 #define MSG_FILAMENT                        _UxGT("Filament")

+ 1
- 0
Marlin/src/lcd/language/language_de.h View File

@@ -145,6 +145,7 @@
145 145
 #define MSG_E3STEPS                         _UxGT("E3 Steps/mm")
146 146
 #define MSG_E4STEPS                         _UxGT("E4 Steps/mm")
147 147
 #define MSG_E5STEPS                         _UxGT("E5 Steps/mm")
148
+#define MSG_E6STEPS                         _UxGT("E6 Steps/mm")
148 149
 #define MSG_TEMPERATURE                     _UxGT("Temperatur")
149 150
 #define MSG_MOTION                          _UxGT("Bewegung")
150 151
 #define MSG_FILAMENT                        _UxGT("Filament")

+ 6
- 0
Marlin/src/lcd/language/language_en.h View File

@@ -630,6 +630,12 @@
630 630
 #ifndef MSG_E5STEPS
631 631
   #define MSG_E5STEPS                         _UxGT("E5steps/mm")
632 632
 #endif
633
+#ifndef MSG_E6STEPS
634
+  #define MSG_E6STEPS                         _UxGT("E6steps/mm")
635
+#endif
636
+#ifndef MSG_E6STEPS
637
+  #define MSG_E6STEPS                         _UxGT("E6steps/mm")
638
+#endif
633 639
 #ifndef MSG_TEMPERATURE
634 640
   #define MSG_TEMPERATURE                     _UxGT("Temperature")
635 641
 #endif

+ 1
- 0
Marlin/src/lcd/language/language_es.h View File

@@ -125,6 +125,7 @@
125 125
 #define MSG_E3STEPS                         _UxGT("E3 pasos/mm")
126 126
 #define MSG_E4STEPS                         _UxGT("E4 pasos/mm")
127 127
 #define MSG_E5STEPS                         _UxGT("E5 pasos/mm")
128
+#define MSG_E6STEPS                         _UxGT("E6 pasos/mm")
128 129
 #define MSG_TEMPERATURE                     _UxGT("Temperatura")
129 130
 #define MSG_MOTION                          _UxGT("Movimiento")
130 131
 #define MSG_FILAMENT                        _UxGT("Filamento")

+ 1
- 0
Marlin/src/lcd/language/language_eu.h View File

@@ -224,6 +224,7 @@
224 224
 #define MSG_E3STEPS                         _UxGT("E3 pausoak/mm")
225 225
 #define MSG_E4STEPS                         _UxGT("E4 pausoak/mm")
226 226
 #define MSG_E5STEPS                         _UxGT("E5 pausoak/mm")
227
+#define MSG_E6STEPS                         _UxGT("E6 pausoak/mm")
227 228
 #define MSG_TEMPERATURE                     _UxGT("Tenperatura")
228 229
 #define MSG_MOTION                          _UxGT("Mugimendua")
229 230
 #define MSG_FILAMENT                        _UxGT("Harizpia")

+ 1
- 0
Marlin/src/lcd/language/language_fi.h View File

@@ -120,6 +120,7 @@
120 120
 #define MSG_E3STEPS                         _UxGT("E3steps/mm")
121 121
 #define MSG_E4STEPS                         _UxGT("E4steps/mm")
122 122
 #define MSG_E5STEPS                         _UxGT("E5steps/mm")
123
+#define MSG_E6STEPS                         _UxGT("E6steps/mm")
123 124
 #define MSG_TEMPERATURE                     _UxGT("Lämpötila")
124 125
 #define MSG_MOTION                          _UxGT("Liike")
125 126
 #define MSG_FILAMENT                        _UxGT("Filament")

+ 1
- 0
Marlin/src/lcd/language/language_fr.h View File

@@ -228,6 +228,7 @@
228 228
 #define MSG_E3STEPS                         _UxGT("E3 pas/mm")
229 229
 #define MSG_E4STEPS                         _UxGT("E4 pas/mm")
230 230
 #define MSG_E5STEPS                         _UxGT("E5 pas/mm")
231
+#define MSG_E6STEPS                         _UxGT("E6 pas/mm")
231 232
 #define MSG_TEMPERATURE                     _UxGT("Température")
232 233
 #define MSG_MOTION                          _UxGT("Mouvement")
233 234
 #define MSG_FILAMENT                        _UxGT("Filament")

+ 1
- 0
Marlin/src/lcd/language/language_gl.h View File

@@ -129,6 +129,7 @@
129 129
 #define MSG_E3STEPS                         _UxGT("E3 pasos/mm")
130 130
 #define MSG_E4STEPS                         _UxGT("E4 pasos/mm")
131 131
 #define MSG_E5STEPS                         _UxGT("E5 pasos/mm")
132
+#define MSG_E6STEPS                         _UxGT("E6 pasos/mm")
132 133
 #define MSG_TEMPERATURE                     _UxGT("Temperatura")
133 134
 #define MSG_MOTION                          _UxGT("Movemento")
134 135
 #define MSG_FILAMENT                        _UxGT("Filamento")

+ 1
- 0
Marlin/src/lcd/language/language_hr.h View File

@@ -129,6 +129,7 @@
129 129
 #define MSG_E3STEPS                         _UxGT("E3steps/mm")
130 130
 #define MSG_E4STEPS                         _UxGT("E4steps/mm")
131 131
 #define MSG_E5STEPS                         _UxGT("E5steps/mm")
132
+#define MSG_E6STEPS                         _UxGT("E6steps/mm")
132 133
 #define MSG_TEMPERATURE                     _UxGT("Temperature")
133 134
 #define MSG_MOTION                          _UxGT("Gibanje")
134 135
 #define MSG_FILAMENT                        _UxGT("Filament")

+ 1
- 0
Marlin/src/lcd/language/language_it.h View File

@@ -232,6 +232,7 @@
232 232
 #define MSG_E3STEPS                         _UxGT("E3passi/mm")
233 233
 #define MSG_E4STEPS                         _UxGT("E4passi/mm")
234 234
 #define MSG_E5STEPS                         _UxGT("E5passi/mm")
235
+#define MSG_E6STEPS                         _UxGT("E6passi/mm")
235 236
 #define MSG_TEMPERATURE                     _UxGT("Temperatura")
236 237
 #define MSG_MOTION                          _UxGT("Movimento")
237 238
 #define MSG_FILAMENT                        _UxGT("Filamento")

+ 1
- 0
Marlin/src/lcd/language/language_nl.h View File

@@ -136,6 +136,7 @@
136 136
 #define MSG_E3STEPS                         _UxGT("E3steps/mm")
137 137
 #define MSG_E4STEPS                         _UxGT("E4steps/mm")
138 138
 #define MSG_E5STEPS                         _UxGT("E5steps/mm")
139
+#define MSG_E6STEPS                         _UxGT("E6steps/mm")
139 140
 #define MSG_TEMPERATURE                     _UxGT("Temperatuur")
140 141
 #define MSG_MOTION                          _UxGT("Beweging")
141 142
 #define MSG_FILAMENT                        _UxGT("Filament")

+ 1
- 0
Marlin/src/lcd/language/language_pl.h View File

@@ -129,6 +129,7 @@
129 129
 #define MSG_E3STEPS                         _UxGT("krokiE3/mm")
130 130
 #define MSG_E4STEPS                         _UxGT("krokiE4/mm")
131 131
 #define MSG_E5STEPS                         _UxGT("krokiE5/mm")
132
+#define MSG_E6STEPS                         _UxGT("krokiE6/mm")
132 133
 #define MSG_TEMPERATURE                     _UxGT("Temperatura")
133 134
 #define MSG_MOTION                          _UxGT("Ruch")
134 135
 #define MSG_FILAMENT                        _UxGT("Filament")

+ 1
- 0
Marlin/src/lcd/language/language_pt-br.h View File

@@ -237,6 +237,7 @@
237 237
 #define MSG_E3STEPS                         _UxGT("E3/mm")
238 238
 #define MSG_E4STEPS                         _UxGT("E4/mm")
239 239
 #define MSG_E5STEPS                         _UxGT("E5/mm")
240
+#define MSG_E6STEPS                         _UxGT("E6/mm")
240 241
 #define MSG_TEMPERATURE                     _UxGT("Temperatura")
241 242
 #define MSG_MOTION                          _UxGT("Movimento")
242 243
 #define MSG_FILAMENT                        _UxGT("Filamento")

+ 1
- 0
Marlin/src/lcd/language/language_pt.h View File

@@ -126,6 +126,7 @@
126 126
 #define MSG_E3STEPS                         _UxGT("E3 passo/mm")
127 127
 #define MSG_E4STEPS                         _UxGT("E4 passo/mm")
128 128
 #define MSG_E5STEPS                         _UxGT("E5 passo/mm")
129
+#define MSG_E6STEPS                         _UxGT("E6 passo/mm")
129 130
 #define MSG_TEMPERATURE                     _UxGT("Temperatura")
130 131
 #define MSG_MOTION                          _UxGT("Movimento")
131 132
 #define MSG_FILAMENT                        _UxGT("Filamento")

+ 1
- 0
Marlin/src/lcd/language/language_ru.h View File

@@ -227,6 +227,7 @@
227 227
 #define MSG_E3STEPS                         _UxGT("E3шаг/мм")
228 228
 #define MSG_E4STEPS                         _UxGT("E4шаг/мм")
229 229
 #define MSG_E5STEPS                         _UxGT("E5шаг/мм")
230
+#define MSG_E6STEPS                         _UxGT("E6шаг/мм")
230 231
 #define MSG_TEMPERATURE                     _UxGT("Температура")
231 232
 #define MSG_MOTION                          _UxGT("Движение")
232 233
 #define MSG_FILAMENT                        _UxGT("Филамент")

+ 1
- 0
Marlin/src/lcd/language/language_sk.h View File

@@ -246,6 +246,7 @@
246 246
 #define MSG_E3STEPS                         _UxGT("E3krokov/mm")
247 247
 #define MSG_E4STEPS                         _UxGT("E4krokov/mm")
248 248
 #define MSG_E5STEPS                         _UxGT("E5krokov/mm")
249
+#define MSG_E6STEPS                         _UxGT("E6krokov/mm")
249 250
 #define MSG_TEMPERATURE                     _UxGT("Teplota")
250 251
 #define MSG_MOTION                          _UxGT("Pohyb")
251 252
 #define MSG_FILAMENT                        _UxGT("Filament")

+ 2
- 1
Marlin/src/lcd/language/language_tr.h View File

@@ -135,7 +135,8 @@
135 135
 #define MSG_E2STEPS                         _UxGT("E2steps/mm")                                         // E2steps/mm
136 136
 #define MSG_E3STEPS                         _UxGT("E3steps/mm")                                         // E3steps/mm
137 137
 #define MSG_E4STEPS                         _UxGT("E4steps/mm")                                         // E4steps/mm
138
-#define MSG_E5STEPS                         _UxGT("E5steps/mm")                                         // E4steps/mm
138
+#define MSG_E5STEPS                         _UxGT("E5steps/mm")                                         // E5steps/mm
139
+#define MSG_E6STEPS                         _UxGT("E6steps/mm")                                         // E6steps/mm
139 140
 #define MSG_TEMPERATURE                     _UxGT("Sıcaklık")                                           // Sıcaklık
140 141
 #define MSG_MOTION                          _UxGT("Hareket")                                            // Hareket
141 142
 #define MSG_FILAMENT                        _UxGT("Filaman")                                            // Filaman

+ 1
- 0
Marlin/src/lcd/language/language_uk.h View File

@@ -129,6 +129,7 @@
129 129
 #define MSG_E3STEPS                         _UxGT("E3кроків/мм")
130 130
 #define MSG_E4STEPS                         _UxGT("E4кроків/мм")
131 131
 #define MSG_E5STEPS                         _UxGT("E5кроків/мм")
132
+#define MSG_E6STEPS                         _UxGT("E6кроків/мм")
132 133
 #define MSG_TEMPERATURE                     _UxGT("Температура")
133 134
 #define MSG_MOTION                          _UxGT("Рух")
134 135
 #define MSG_FILAMENT                        _UxGT("Волокно")

+ 1
- 0
Marlin/src/lcd/language/language_zh_CN.h View File

@@ -226,6 +226,7 @@
226 226
 #define MSG_E3STEPS                         _UxGT("挤出机3步数/mm") //"E3steps/mm"
227 227
 #define MSG_E4STEPS                         _UxGT("挤出机4步数/mm") //"E4steps/mm"
228 228
 #define MSG_E5STEPS                         _UxGT("挤出机5步数/mm") //"E5steps/mm"
229
+#define MSG_E6STEPS                         _UxGT("挤出机6步数/mm") //"E6steps/mm"
229 230
 #define MSG_TEMPERATURE                     _UxGT("温度")  //"Temperature"
230 231
 #define MSG_MOTION                          _UxGT("运动")  //"Motion"
231 232
 #define MSG_FILAMENT                        _UxGT("丝料测容")  //"Filament" lcd_control_volumetric_menu

+ 1
- 0
Marlin/src/lcd/language/language_zh_TW.h View File

@@ -226,6 +226,7 @@
226 226
 #define MSG_E3STEPS                         _UxGT("擠出機3步數/mm") //"E3steps/mm"
227 227
 #define MSG_E4STEPS                         _UxGT("擠出機4步數/mm") //"E4steps/mm"
228 228
 #define MSG_E5STEPS                         _UxGT("擠出機5步數/mm") //"E5steps/mm"
229
+#define MSG_E6STEPS                         _UxGT("擠出機6步數/mm") //"E6steps/mm"
229 230
 #define MSG_TEMPERATURE                     _UxGT("溫度")  //"Temperature"
230 231
 #define MSG_MOTION                          _UxGT("運作")  //"Motion"
231 232
 #define MSG_FILAMENT                        _UxGT("絲料測容")  //"Filament" lcd_control_volumetric_menu

+ 142
- 11
Marlin/src/lcd/ultralcd.cpp View File

@@ -1402,6 +1402,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
1402 1402
           void watch_temp_callback_E3() { _WATCH_FUNC(3); }
1403 1403
           #if HOTENDS > 4
1404 1404
             void watch_temp_callback_E4() { _WATCH_FUNC(4); }
1405
+            #if HOTENDS > 5
1406
+              void watch_temp_callback_E5() { _WATCH_FUNC(5); }
1407
+            #endif // HOTENDS > 5
1405 1408
           #endif // HOTENDS > 4
1406 1409
         #endif // HOTENDS > 3
1407 1410
       #endif // HOTENDS > 2
@@ -1434,6 +1437,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
1434 1437
         inline void _lcd_refresh_e_factor_3() { planner.refresh_e_factor(3); }
1435 1438
         #if EXTRUDERS > 4
1436 1439
           inline void _lcd_refresh_e_factor_4() { planner.refresh_e_factor(4); }
1440
+          #if EXTRUDERS > 5
1441
+            inline void _lcd_refresh_e_factor_5() { planner.refresh_e_factor(5); }
1442
+          #endif // EXTRUDERS > 5
1437 1443
         #endif // EXTRUDERS > 4
1438 1444
       #endif // EXTRUDERS > 3
1439 1445
     #endif // EXTRUDERS > 2
@@ -1486,6 +1492,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
1486 1492
           MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N4, &thermalManager.target_temperature[3], 0, HEATER_3_MAXTEMP - 15, watch_temp_callback_E3);
1487 1493
           #if HOTENDS > 4
1488 1494
             MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N5, &thermalManager.target_temperature[4], 0, HEATER_4_MAXTEMP - 15, watch_temp_callback_E4);
1495
+            #if HOTENDS > 5
1496
+              MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N6, &thermalManager.target_temperature[5], 0, HEATER_5_MAXTEMP - 15, watch_temp_callback_E5);
1497
+            #endif // HOTENDS > 5
1489 1498
           #endif // HOTENDS > 4
1490 1499
         #endif // HOTENDS > 3
1491 1500
       #endif // HOTENDS > 2
@@ -1538,6 +1547,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
1538 1547
           MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N4, &planner.flow_percentage[3], 10, 999, _lcd_refresh_e_factor_3);
1539 1548
           #if EXTRUDERS > 4
1540 1549
             MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N5, &planner.flow_percentage[4], 10, 999, _lcd_refresh_e_factor_4);
1550
+            #if EXTRUDERS > 5
1551
+              MENU_ITEM_EDIT_CALLBACK(int3, MSG_FLOW MSG_N6, &planner.flow_percentage[5], 10, 999, _lcd_refresh_e_factor_5);
1552
+            #endif // EXTRUDERS > 5
1541 1553
           #endif // EXTRUDERS > 4
1542 1554
         #endif // EXTRUDERS > 3
1543 1555
       #endif // EXTRUDERS > 2
@@ -1672,6 +1684,14 @@ void lcd_quick_feedback(const bool clear_buttons) {
1672 1684
             void lcd_preheat_m1_e4() { _lcd_preheat(4, lcd_preheat_hotend_temp[0], lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); }
1673 1685
             void lcd_preheat_m2_e4() { _lcd_preheat(4, lcd_preheat_hotend_temp[1], lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); }
1674 1686
           #endif
1687
+          #if HOTENDS > 5
1688
+            void lcd_preheat_m1_e5_only() { _lcd_preheat(5, lcd_preheat_hotend_temp[0], -1, lcd_preheat_fan_speed[0]); }
1689
+            void lcd_preheat_m2_e5_only() { _lcd_preheat(5, lcd_preheat_hotend_temp[1], -1, lcd_preheat_fan_speed[1]); }
1690
+            #if HAS_HEATED_BED
1691
+              void lcd_preheat_m1_e5() { _lcd_preheat(5, lcd_preheat_hotend_temp[0], lcd_preheat_bed_temp[0], lcd_preheat_fan_speed[0]); }
1692
+              void lcd_preheat_m2_e5() { _lcd_preheat(5, lcd_preheat_hotend_temp[1], lcd_preheat_bed_temp[1], lcd_preheat_fan_speed[1]); }
1693
+            #endif
1694
+          #endif // HOTENDS > 5
1675 1695
         #endif // HOTENDS > 4
1676 1696
       #endif // HOTENDS > 3
1677 1697
     #endif // HOTENDS > 2
@@ -1685,6 +1705,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
1685 1705
             thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 3);
1686 1706
             #if HOTENDS > 4
1687 1707
               thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 4);
1708
+              #if HOTENDS > 5
1709
+                thermalManager.setTargetHotend(lcd_preheat_hotend_temp[0], 5);
1710
+              #endif // HOTENDS > 5
1688 1711
             #endif // HOTENDS > 4
1689 1712
           #endif // HOTENDS > 3
1690 1713
         #endif // HOTENDS > 2
@@ -1704,6 +1727,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
1704 1727
             thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 3);
1705 1728
             #if HOTENDS > 4
1706 1729
               thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 4);
1730
+              #if HOTENDS > 5
1731
+                thermalManager.setTargetHotend(lcd_preheat_hotend_temp[1], 5);
1732
+              #endif // HOTENDS > 5
1707 1733
             #endif // HOTENDS > 4
1708 1734
           #endif // HOTENDS > 3
1709 1735
         #endif // HOTENDS > 2
@@ -1765,6 +1791,14 @@ void lcd_quick_feedback(const bool clear_buttons) {
1765 1791
               #else
1766 1792
                 MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H5, lcd_preheat_m1_e4_only);
1767 1793
               #endif
1794
+              #if HOTENDS > 5
1795
+                #if HAS_HEATED_BED
1796
+                  MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H6, lcd_preheat_m1_e5);
1797
+                  MENU_ITEM(function, MSG_PREHEAT_1_END " " MSG_E6, lcd_preheat_m1_e5_only);
1798
+                #else
1799
+                  MENU_ITEM(function, MSG_PREHEAT_1_N MSG_H6, lcd_preheat_m1_e5_only);
1800
+                #endif
1801
+              #endif // HOTENDS > 5
1768 1802
             #endif // HOTENDS > 4
1769 1803
           #endif // HOTENDS > 3
1770 1804
         #endif // HOTENDS > 2
@@ -1817,6 +1851,14 @@ void lcd_quick_feedback(const bool clear_buttons) {
1817 1851
               #else
1818 1852
                 MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H5, lcd_preheat_m2_e4_only);
1819 1853
               #endif
1854
+              #if HOTENDS > 5
1855
+                #if HAS_HEATED_BED
1856
+                  MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H6, lcd_preheat_m2_e5);
1857
+                  MENU_ITEM(function, MSG_PREHEAT_2_END " " MSG_E6, lcd_preheat_m2_e5_only);
1858
+                #else
1859
+                  MENU_ITEM(function, MSG_PREHEAT_2_N MSG_H6, lcd_preheat_m2_e5_only);
1860
+                #endif
1861
+              #endif // HOTENDS > 5
1820 1862
             #endif // HOTENDS > 4
1821 1863
           #endif // HOTENDS > 3
1822 1864
         #endif // HOTENDS > 2
@@ -3061,6 +3103,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3061 3103
               case 3: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E4); break;
3062 3104
               #if E_MANUAL > 4
3063 3105
                 case 4: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E5); break;
3106
+                #if E_MANUAL > 5
3107
+                  case 5: pos_label = PSTR(MSG_MOVE_E MSG_MOVE_E6); break;
3108
+                #endif // E_MANUAL > 5
3064 3109
               #endif // E_MANUAL > 4
3065 3110
             #endif // E_MANUAL > 3
3066 3111
           #endif // E_MANUAL > 2
@@ -3087,6 +3132,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3087 3132
         void lcd_move_e3() { _lcd_move_e(3); }
3088 3133
         #if E_MANUAL > 4
3089 3134
           void lcd_move_e4() { _lcd_move_e(4); }
3135
+          #if E_MANUAL > 5
3136
+            void lcd_move_e5() { _lcd_move_e(5); }
3137
+          #endif // E_MANUAL > 5
3090 3138
         #endif // E_MANUAL > 4
3091 3139
       #endif // E_MANUAL > 3
3092 3140
     #endif // E_MANUAL > 2
@@ -3147,6 +3195,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3147 3195
         void lcd_move_get_e3_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e3); }
3148 3196
         #if E_MANUAL > 4
3149 3197
           void lcd_move_get_e4_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e4); }
3198
+          #if E_MANUAL > 5
3199
+            void lcd_move_get_e5_amount() { _lcd_move_distance_menu(E_AXIS, lcd_move_e5); }
3200
+          #endif // E_MANUAL > 5
3150 3201
         #endif // E_MANUAL > 4
3151 3202
       #endif // E_MANUAL > 3
3152 3203
     #endif // E_MANUAL > 2
@@ -3199,7 +3250,16 @@ void lcd_quick_feedback(const bool clear_buttons) {
3199 3250
 
3200 3251
     #if ENABLED(SWITCHING_EXTRUDER) || ENABLED(SWITCHING_NOZZLE)
3201 3252
 
3202
-      #if EXTRUDERS == 4
3253
+      #if EXTRUDERS == 6
3254
+        switch (active_extruder) {
3255
+          case 0: MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); break;
3256
+          case 1: MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); break;
3257
+          case 2: MENU_ITEM(gcode, MSG_SELECT " " MSG_E4, PSTR("T3")); break;
3258
+          case 3: MENU_ITEM(gcode, MSG_SELECT " " MSG_E3, PSTR("T2")); break;
3259
+          case 4: MENU_ITEM(gcode, MSG_SELECT " " MSG_E6, PSTR("T5")); break;
3260
+          case 5: MENU_ITEM(gcode, MSG_SELECT " " MSG_E5, PSTR("T4")); break;
3261
+        }
3262
+      #elif EXTRUDERS == 5 || EXTRUDERS == 4
3203 3263
         switch (active_extruder) {
3204 3264
           case 0: MENU_ITEM(gcode, MSG_SELECT " " MSG_E2, PSTR("T1")); break;
3205 3265
           case 1: MENU_ITEM(gcode, MSG_SELECT " " MSG_E1, PSTR("T0")); break;
@@ -3253,6 +3313,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3253 3313
             MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E4, lcd_move_get_e3_amount);
3254 3314
             #if E_MANUAL > 4
3255 3315
               MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E5, lcd_move_get_e4_amount);
3316
+              #if E_MANUAL > 5
3317
+                MENU_ITEM(submenu, MSG_MOVE_E MSG_MOVE_E6, lcd_move_get_e5_amount);
3318
+              #endif // E_MANUAL > 5
3256 3319
             #endif // E_MANUAL > 4
3257 3320
           #endif // E_MANUAL > 3
3258 3321
         #endif // E_MANUAL > 2
@@ -3412,6 +3475,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3412 3475
             DEFINE_PIDTEMP_FUNCS(3);
3413 3476
             #if HOTENDS > 4
3414 3477
               DEFINE_PIDTEMP_FUNCS(4);
3478
+              #if HOTENDS > 5
3479
+                DEFINE_PIDTEMP_FUNCS(5);
3480
+              #endif // HOTENDS > 5
3415 3481
             #endif // HOTENDS > 4
3416 3482
           #endif // HOTENDS > 3
3417 3483
         #endif // HOTENDS > 2
@@ -3444,6 +3510,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3444 3510
           MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N4, &thermalManager.target_temperature[3], 0, HEATER_3_MAXTEMP - 15, watch_temp_callback_E3);
3445 3511
           #if HOTENDS > 4
3446 3512
             MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N5, &thermalManager.target_temperature[4], 0, HEATER_4_MAXTEMP - 15, watch_temp_callback_E4);
3513
+            #if HOTENDS > 5
3514
+              MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(int3, MSG_NOZZLE MSG_N6, &thermalManager.target_temperature[5], 0, HEATER_5_MAXTEMP - 15, watch_temp_callback_E5);
3515
+            #endif // HOTENDS > 5
3447 3516
           #endif // HOTENDS > 4
3448 3517
         #endif // HOTENDS > 3
3449 3518
       #endif // HOTENDS > 2
@@ -3568,6 +3637,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3568 3637
             PID_MENU_ITEMS(" " MSG_E4, 3);
3569 3638
             #if HOTENDS > 4
3570 3639
               PID_MENU_ITEMS(" " MSG_E5, 4);
3640
+              #if HOTENDS > 5
3641
+                PID_MENU_ITEMS(" " MSG_E6, 5);
3642
+              #endif // HOTENDS > 5
3571 3643
             #endif // HOTENDS > 4
3572 3644
           #endif // HOTENDS > 3
3573 3645
         #endif // HOTENDS > 2
@@ -3583,7 +3655,10 @@ void lcd_quick_feedback(const bool clear_buttons) {
3583 3655
   #if DISABLED(SLIM_LCD_MENUS)
3584 3656
 
3585 3657
     void _lcd_configuration_temperature_preheat_settings_menu(const uint8_t material) {
3586
-      #if HOTENDS > 4
3658
+      #if HOTENDS > 5
3659
+        #define MINTEMP_ALL MIN5(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP, HEATER_5_MINTEMP)
3660
+        #define MAXTEMP_ALL MAX5(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP)
3661
+      #elif HOTENDS > 4
3587 3662
         #define MINTEMP_ALL MIN5(HEATER_0_MINTEMP, HEATER_1_MINTEMP, HEATER_2_MINTEMP, HEATER_3_MINTEMP, HEATER_4_MINTEMP)
3588 3663
         #define MAXTEMP_ALL MAX5(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP)
3589 3664
       #elif HOTENDS > 3
@@ -3639,6 +3714,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3639 3714
           void _reset_e3_acceleration_rate() { _reset_e_acceleration_rate(3); }
3640 3715
           #if E_STEPPERS > 4
3641 3716
             void _reset_e4_acceleration_rate() { _reset_e_acceleration_rate(4); }
3717
+            #if E_STEPPERS > 5
3718
+              void _reset_e5_acceleration_rate() { _reset_e_acceleration_rate(5); }
3719
+            #endif // E_STEPPERS > 5
3642 3720
           #endif // E_STEPPERS > 4
3643 3721
         #endif // E_STEPPERS > 3
3644 3722
       #endif // E_STEPPERS > 2
@@ -3660,6 +3738,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3660 3738
           void _planner_refresh_e3_positioning() { _planner_refresh_e_positioning(3); }
3661 3739
           #if E_STEPPERS > 4
3662 3740
             void _planner_refresh_e4_positioning() { _planner_refresh_e_positioning(4); }
3741
+            #if E_STEPPERS > 5
3742
+              void _planner_refresh_e5_positioning() { _planner_refresh_e_positioning(5); }
3743
+            #endif // E_STEPPERS > 5
3663 3744
           #endif // E_STEPPERS > 4
3664 3745
         #endif // E_STEPPERS > 3
3665 3746
       #endif // E_STEPPERS > 2
@@ -3685,6 +3766,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3685 3766
             MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E4, &planner.max_feedrate_mm_s[E_AXIS + 3], 1, 999);
3686 3767
             #if E_STEPPERS > 4
3687 3768
               MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E5, &planner.max_feedrate_mm_s[E_AXIS + 4], 1, 999);
3769
+              #if E_STEPPERS > 5
3770
+                MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E6, &planner.max_feedrate_mm_s[E_AXIS + 5], 1, 999);
3771
+              #endif // E_STEPPERS > 5
3688 3772
             #endif // E_STEPPERS > 4
3689 3773
           #endif // E_STEPPERS > 3
3690 3774
         #endif // E_STEPPERS > 2
@@ -3730,6 +3814,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3730 3814
             MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E4, &planner.max_acceleration_mm_per_s2[E_AXIS + 3], 100, 99000, _reset_e3_acceleration_rate);
3731 3815
             #if E_STEPPERS > 4
3732 3816
               MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E5, &planner.max_acceleration_mm_per_s2[E_AXIS + 4], 100, 99000, _reset_e4_acceleration_rate);
3817
+              #if E_STEPPERS > 5
3818
+                MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E6, &planner.max_acceleration_mm_per_s2[E_AXIS + 5], 100, 99000, _reset_e5_acceleration_rate);
3819
+              #endif // E_STEPPERS > 5
3733 3820
             #endif // E_STEPPERS > 4
3734 3821
           #endif // E_STEPPERS > 3
3735 3822
         #endif // E_STEPPERS > 2
@@ -3787,6 +3874,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3787 3874
             MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E4STEPS, &planner.axis_steps_per_mm[E_AXIS + 3], 5, 9999, _planner_refresh_e3_positioning);
3788 3875
             #if E_STEPPERS > 4
3789 3876
               MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E5STEPS, &planner.axis_steps_per_mm[E_AXIS + 4], 5, 9999, _planner_refresh_e4_positioning);
3877
+              #if E_STEPPERS > 5
3878
+                MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E6STEPS, &planner.axis_steps_per_mm[E_AXIS + 5], 5, 9999, _planner_refresh_e5_positioning);
3879
+              #endif // E_STEPPERS > 5
3790 3880
             #endif // E_STEPPERS > 4
3791 3881
           #endif // E_STEPPERS > 3
3792 3882
         #endif // E_STEPPERS > 2
@@ -3865,6 +3955,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3865 3955
             MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E4, &planner.extruder_advance_K[3], 0, 999);
3866 3956
             #if EXTRUDERS > 4
3867 3957
               MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E5, &planner.extruder_advance_K[4], 0, 999);
3958
+              #if EXTRUDERS > 5
3959
+                MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E6, &planner.extruder_advance_K[5], 0, 999);
3960
+              #endif // EXTRUDERS > 5
3868 3961
             #endif // EXTRUDERS > 4
3869 3962
           #endif // EXTRUDERS > 3
3870 3963
         #endif // EXTRUDERS > 2
@@ -3914,6 +4007,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
3914 4007
               MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E4, &planner.extruder_advance_K[3], 0, 999);
3915 4008
               #if EXTRUDERS > 4
3916 4009
                 MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E5, &planner.extruder_advance_K[4], 0, 999);
4010
+                #if EXTRUDERS > 5
4011
+                  MENU_ITEM_EDIT(float52, MSG_ADVANCE_K MSG_E6, &planner.extruder_advance_K[5], 0, 999);
4012
+                #endif // EXTRUDERS > 5
3917 4013
               #endif // EXTRUDERS > 4
3918 4014
             #endif // EXTRUDERS > 3
3919 4015
           #endif // EXTRUDERS > 2
@@ -3932,10 +4028,13 @@ void lcd_quick_feedback(const bool clear_buttons) {
3932 4028
             MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E2, &planner.filament_size[1], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
3933 4029
             #if EXTRUDERS > 2
3934 4030
               MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E3, &planner.filament_size[2], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
3935
-            #if EXTRUDERS > 3
3936
-              MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E4, &planner.filament_size[3], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
3937
-              #if EXTRUDERS > 4
4031
+              #if EXTRUDERS > 3
4032
+                MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E4, &planner.filament_size[3], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
4033
+                #if EXTRUDERS > 4
3938 4034
                   MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E5, &planner.filament_size[4], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
4035
+                  #if EXTRUDERS > 5
4036
+                    MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E6, &planner.filament_size[5], 1.5f, 3.25f, planner.calculate_volumetric_multipliers);
4037
+                  #endif // EXTRUDERS > 5
3939 4038
                 #endif // EXTRUDERS > 4
3940 4039
               #endif // EXTRUDERS > 3
3941 4040
             #endif // EXTRUDERS > 2
@@ -3960,10 +4059,13 @@ void lcd_quick_feedback(const bool clear_buttons) {
3960 4059
           MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E2, &filament_change_unload_length[1], 0, extrude_maxlength);
3961 4060
           #if EXTRUDERS > 2
3962 4061
             MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E3, &filament_change_unload_length[2], 0, extrude_maxlength);
3963
-          #if EXTRUDERS > 3
3964
-            MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E4, &filament_change_unload_length[3], 0, extrude_maxlength);
3965
-            #if EXTRUDERS > 4
4062
+            #if EXTRUDERS > 3
4063
+              MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E4, &filament_change_unload_length[3], 0, extrude_maxlength);
4064
+              #if EXTRUDERS > 4
3966 4065
                 MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E5, &filament_change_unload_length[4], 0, extrude_maxlength);
4066
+                #if EXTRUDERS > 5
4067
+                  MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E6, &filament_change_unload_length[5], 0, extrude_maxlength);
4068
+                #endif // EXTRUDERS > 5
3967 4069
               #endif // EXTRUDERS > 4
3968 4070
             #endif // EXTRUDERS > 3
3969 4071
           #endif // EXTRUDERS > 2
@@ -3977,10 +4079,13 @@ void lcd_quick_feedback(const bool clear_buttons) {
3977 4079
           MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E2, &filament_change_load_length[1], 0, extrude_maxlength);
3978 4080
           #if EXTRUDERS > 2
3979 4081
             MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E3, &filament_change_load_length[2], 0, extrude_maxlength);
3980
-          #if EXTRUDERS > 3
3981
-            MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E4, &filament_change_load_length[3], 0, extrude_maxlength);
3982
-            #if EXTRUDERS > 4
4082
+            #if EXTRUDERS > 3
4083
+              MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E4, &filament_change_load_length[3], 0, extrude_maxlength);
4084
+              #if EXTRUDERS > 4
3983 4085
                 MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E5, &filament_change_load_length[4], 0, extrude_maxlength);
4086
+                #if EXTRUDERS > 5
4087
+                  MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E6, &filament_change_load_length[5], 0, extrude_maxlength);
4088
+                #endif // EXTRUDERS > 5
3984 4089
               #endif // EXTRUDERS > 4
3985 4090
             #endif // EXTRUDERS > 3
3986 4091
           #endif // EXTRUDERS > 2
@@ -4405,6 +4510,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
4405 4510
               case 3: max_temp = HEATER_3_MAXTEMP; break;
4406 4511
               #if HOTENDS > 4
4407 4512
                 case 4: max_temp = HEATER_4_MAXTEMP; break;
4513
+                #if HOTENDS > 5
4514
+                  case 5: max_temp = HEATER_5_MAXTEMP; break;
4515
+                #endif
4408 4516
               #endif
4409 4517
             #endif
4410 4518
           #endif
@@ -4486,6 +4594,13 @@ void lcd_quick_feedback(const bool clear_buttons) {
4486 4594
                   MENU_ITEM_P(submenu, msg4, lcd_temp_menu_e4_filament_change);
4487 4595
                 else
4488 4596
                   MENU_ITEM_P(gcode, msg4, PSTR("M600 B0 T4"));
4597
+                #if E_STEPPERS > 5
4598
+                  PGM_P msg5 = PSTR(MSG_FILAMENTCHANGE " " MSG_E6);
4599
+                  if (thermalManager.targetTooColdToExtrude(5))
4600
+                    MENU_ITEM_P(submenu, msg5, lcd_temp_menu_e5_filament_change);
4601
+                  else
4602
+                    MENU_ITEM_P(gcode, msg5, PSTR("M600 B0 T5"));
4603
+                #endif // E_STEPPERS > 5
4489 4604
               #endif // E_STEPPERS > 4
4490 4605
             #endif // E_STEPPERS > 3
4491 4606
           #endif // E_STEPPERS > 2
@@ -4529,6 +4644,13 @@ void lcd_quick_feedback(const bool clear_buttons) {
4529 4644
                       MENU_ITEM_P(submenu, msg4, lcd_temp_menu_e4_filament_load);
4530 4645
                     else
4531 4646
                       MENU_ITEM_P(gcode, msg4, PSTR("M701 T4"));
4647
+                    #if E_STEPPERS > 5
4648
+                      PGM_P msg5 = PSTR(MSG_FILAMENTLOAD " " MSG_E6);
4649
+                      if (thermalManager.targetTooColdToExtrude(5))
4650
+                        MENU_ITEM_P(submenu, msg5, lcd_temp_menu_e5_filament_load);
4651
+                      else
4652
+                        MENU_ITEM_P(gcode, msg5, PSTR("M701 T5"));
4653
+                    #endif // E_STEPPERS > 5
4532 4654
                   #endif // E_STEPPERS > 4
4533 4655
                 #endif // E_STEPPERS > 3
4534 4656
               #endif // E_STEPPERS > 2
@@ -4551,6 +4673,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
4551 4673
                         && thermalManager.targetHotEnoughToExtrude(3)
4552 4674
                         #if E_STEPPERS > 4
4553 4675
                           && thermalManager.targetHotEnoughToExtrude(4)
4676
+                          #if E_STEPPERS > 5
4677
+                            && thermalManager.targetHotEnoughToExtrude(5)
4678
+                          #endif // E_STEPPERS > 5
4554 4679
                         #endif // E_STEPPERS > 4
4555 4680
                       #endif // E_STEPPERS > 3
4556 4681
                     #endif // E_STEPPERS > 2
@@ -4583,6 +4708,12 @@ void lcd_quick_feedback(const bool clear_buttons) {
4583 4708
                       MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E5, PSTR("M702 T4"));
4584 4709
                     else
4585 4710
                       MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E5, lcd_temp_menu_e4_filament_unload);
4711
+                    #if E_STEPPERS > 5
4712
+                      if (thermalManager.targetHotEnoughToExtrude(5))
4713
+                        MENU_ITEM(gcode, MSG_FILAMENTUNLOAD " " MSG_E6, PSTR("M702 T5"));
4714
+                      else
4715
+                        MENU_ITEM(submenu, MSG_FILAMENTUNLOAD " " MSG_E6, lcd_temp_menu_e5_filament_unload);
4716
+                    #endif // E_STEPPERS > 5
4586 4717
                   #endif // E_STEPPERS > 4
4587 4718
                 #endif // E_STEPPERS > 3
4588 4719
               #endif // E_STEPPERS > 2

+ 168
- 108
Marlin/src/module/configuration_store.cpp View File

@@ -37,7 +37,7 @@
37 37
  */
38 38
 
39 39
 // Change EEPROM version if the structure changes
40
-#define EEPROM_VERSION "V57"
40
+#define EEPROM_VERSION "V58"
41 41
 #define EEPROM_OFFSET 100
42 42
 
43 43
 // Check the integrity of data offsets.
@@ -213,7 +213,7 @@ typedef struct SettingsDataStruct {
213 213
   //
214 214
   // PIDTEMP
215 215
   //
216
-  PIDC hotendPID[MAX_EXTRUDERS];                        // M301 En PIDC / M303 En U
216
+  PIDC hotendPID[HOTENDS];                              // M301 En PIDC / M303 En U
217 217
 
218 218
   int16_t lpq_len;                                      // M301 L
219 219
 
@@ -244,14 +244,14 @@ typedef struct SettingsDataStruct {
244 244
   // !NO_VOLUMETRIC
245 245
   //
246 246
   bool parser_volumetric_enabled;                       // M200 D  parser.volumetric_enabled
247
-  float planner_filament_size[MAX_EXTRUDERS];           // M200 T D  planner.filament_size[]
247
+  float planner_filament_size[EXTRUDERS];               // M200 T D  planner.filament_size[]
248 248
 
249 249
   //
250 250
   // HAS_TRINAMIC
251 251
   //
252 252
   #define TMC_AXES (MAX_EXTRUDERS + 7)
253
-  uint16_t tmc_stepper_current[TMC_AXES];               // M906 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4
254
-  uint32_t tmc_hybrid_threshold[TMC_AXES];              // M913 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4
253
+  uint16_t tmc_stepper_current[TMC_AXES];               // M906 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
254
+  uint32_t tmc_hybrid_threshold[TMC_AXES];              // M913 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
255 255
   int16_t tmc_sgt[XYZ];                                 // M914 X Y Z
256 256
 
257 257
   //
@@ -279,8 +279,8 @@ typedef struct SettingsDataStruct {
279 279
   //
280 280
   // ADVANCED_PAUSE_FEATURE
281 281
   //
282
-  float filament_change_unload_length[MAX_EXTRUDERS],   // M603 T U
283
-        filament_change_load_length[MAX_EXTRUDERS];     // M603 T L
282
+  float filament_change_unload_length[EXTRUDERS],       // M603 T U
283
+        filament_change_load_length[EXTRUDERS];         // M603 T L
284 284
 
285 285
 } SettingsData;
286 286
 
@@ -629,29 +629,23 @@ void MarlinSettings::postprocess() {
629 629
     EEPROM_WRITE(lcd_preheat_bed_temp);
630 630
     EEPROM_WRITE(lcd_preheat_fan_speed);
631 631
 
632
-    for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) {
633
-
632
+    for (uint8_t e = 0; e < HOTENDS; e++) {
634 633
       #if ENABLED(PIDTEMP)
635
-        if (e < HOTENDS) {
636
-          EEPROM_WRITE(PID_PARAM(Kp, e));
637
-          EEPROM_WRITE(PID_PARAM(Ki, e));
638
-          EEPROM_WRITE(PID_PARAM(Kd, e));
639
-          #if ENABLED(PID_EXTRUSION_SCALING)
640
-            EEPROM_WRITE(PID_PARAM(Kc, e));
641
-          #else
642
-            dummy = 1.0f; // 1.0 = default kc
643
-            EEPROM_WRITE(dummy);
644
-          #endif
645
-        }
646
-        else
647
-      #endif // !PIDTEMP
648
-        {
649
-          dummy = DUMMY_PID_VALUE; // When read, will not change the existing value
650
-          EEPROM_WRITE(dummy); // Kp
651
-          dummy = 0;
652
-          for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); // Ki, Kd, Kc
653
-        }
654
-
634
+        EEPROM_WRITE(PID_PARAM(Kp, e));
635
+        EEPROM_WRITE(PID_PARAM(Ki, e));
636
+        EEPROM_WRITE(PID_PARAM(Kd, e));
637
+        #if ENABLED(PID_EXTRUSION_SCALING)
638
+          EEPROM_WRITE(PID_PARAM(Kc, e));
639
+        #else
640
+          dummy = 1.0f; // 1.0 = default kc
641
+          EEPROM_WRITE(dummy);
642
+        #endif
643
+      #else
644
+        dummy = DUMMY_PID_VALUE; // When read, will not change the existing value
645
+        EEPROM_WRITE(dummy); // Kp
646
+        dummy = 0;
647
+        for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); // Ki, Kd, Kc
648
+      #endif
655 649
     } // Hotends Loop
656 650
 
657 651
     _FIELD_TEST(lpq_len);
@@ -705,17 +699,15 @@ void MarlinSettings::postprocess() {
705 699
       EEPROM_WRITE(parser.volumetric_enabled);
706 700
 
707 701
       // Save filament sizes
708
-      for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
709
-        if (q < COUNT(planner.filament_size)) dummy = planner.filament_size[q];
710
-        EEPROM_WRITE(dummy);
711
-      }
702
+      for (uint8_t q = 0; q < COUNT(planner.filament_size); q++)
703
+        EEPROM_WRITE(planner.filament_size[q]);
712 704
 
713 705
     #else
714 706
 
715 707
       const bool volumetric_enabled = false;
716 708
       dummy = DEFAULT_NOMINAL_FILAMENT_DIA;
717 709
       EEPROM_WRITE(volumetric_enabled);
718
-      for (uint8_t q = MAX_EXTRUDERS; q--;) EEPROM_WRITE(dummy);
710
+      for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummy);
719 711
 
720 712
     #endif
721 713
 
@@ -762,31 +754,48 @@ void MarlinSettings::postprocess() {
762 754
         #else
763 755
           0,
764 756
         #endif
765
-        #if AXIS_IS_TMC(E0)
766
-          stepperE0.getCurrent(),
767
-        #else
768
-          0,
769
-        #endif
770
-        #if AXIS_IS_TMC(E1)
771
-          stepperE1.getCurrent(),
772
-        #else
773
-          0,
774
-        #endif
775
-        #if AXIS_IS_TMC(E2)
776
-          stepperE2.getCurrent(),
777
-        #else
778
-          0,
779
-        #endif
780
-        #if AXIS_IS_TMC(E3)
781
-          stepperE3.getCurrent(),
782
-        #else
783
-          0,
784
-        #endif
785
-        #if AXIS_IS_TMC(E4)
786
-          stepperE4.getCurrent()
787
-        #else
788
-          0
789
-        #endif
757
+        #if MAX_EXTRUDERS
758
+          #if AXIS_IS_TMC(E0)
759
+            stepperE0.getCurrent(),
760
+          #else
761
+            0,
762
+          #endif
763
+          #if MAX_EXTRUDERS > 1
764
+            #if AXIS_IS_TMC(E1)
765
+              stepperE1.getCurrent(),
766
+            #else
767
+              0,
768
+            #endif
769
+            #if MAX_EXTRUDERS > 2
770
+              #if AXIS_IS_TMC(E2)
771
+                stepperE2.getCurrent(),
772
+              #else
773
+                0,
774
+              #endif
775
+              #if MAX_EXTRUDERS > 3
776
+                  #if AXIS_IS_TMC(E3)
777
+                  stepperE3.getCurrent(),
778
+                #else
779
+                  0,
780
+                #endif
781
+                #if MAX_EXTRUDERS > 4
782
+                  #if AXIS_IS_TMC(E4)
783
+                    stepperE4.getCurrent()
784
+                  #else
785
+                    0
786
+                  #endif
787
+                  #if MAX_EXTRUDERS > 5
788
+                    #if AXIS_IS_TMC(E5)
789
+                      stepperE5.getCurrent()
790
+                    #else
791
+                      0
792
+                    #endif
793
+                  #endif // MAX_EXTRUDERS > 5
794
+                #endif // MAX_EXTRUDERS > 4
795
+              #endif // MAX_EXTRUDERS > 3
796
+            #endif // MAX_EXTRUDERS > 2
797
+          #endif // MAX_EXTRUDERS > 1
798
+        #endif // MAX_EXTRUDERS
790 799
       #else
791 800
         0
792 801
       #endif
@@ -836,35 +845,69 @@ void MarlinSettings::postprocess() {
836 845
         #else
837 846
           Z3_HYBRID_THRESHOLD,
838 847
         #endif
839
-        #if AXIS_HAS_STEALTHCHOP(E0)
840
-          TMC_GET_PWMTHRS(E, E0),
841
-        #else
842
-          E0_HYBRID_THRESHOLD,
843
-        #endif
844
-        #if AXIS_HAS_STEALTHCHOP(E1)
845
-          TMC_GET_PWMTHRS(E, E1),
846
-        #else
847
-          E1_HYBRID_THRESHOLD,
848
-        #endif
849
-        #if AXIS_HAS_STEALTHCHOP(E2)
850
-          TMC_GET_PWMTHRS(E, E2),
851
-        #else
852
-          E2_HYBRID_THRESHOLD,
853
-        #endif
854
-        #if AXIS_HAS_STEALTHCHOP(E3)
855
-          TMC_GET_PWMTHRS(E, E3),
856
-        #else
857
-          E3_HYBRID_THRESHOLD,
858
-        #endif
859
-        #if AXIS_HAS_STEALTHCHOP(E4)
860
-          TMC_GET_PWMTHRS(E, E4)
861
-        #else
862
-          E4_HYBRID_THRESHOLD
863
-        #endif
848
+        #if MAX_EXTRUDERS
849
+          #if AXIS_HAS_STEALTHCHOP(E0)
850
+            TMC_GET_PWMTHRS(E, E0),
851
+          #else
852
+            E0_HYBRID_THRESHOLD,
853
+          #endif
854
+          #if MAX_EXTRUDERS > 1
855
+            #if AXIS_HAS_STEALTHCHOP(E1)
856
+              TMC_GET_PWMTHRS(E, E1),
857
+            #else
858
+              E1_HYBRID_THRESHOLD,
859
+            #endif
860
+            #if MAX_EXTRUDERS > 2
861
+              #if AXIS_HAS_STEALTHCHOP(E2)
862
+                TMC_GET_PWMTHRS(E, E2),
863
+              #else
864
+                E2_HYBRID_THRESHOLD,
865
+              #endif
866
+              #if MAX_EXTRUDERS > 3
867
+                #if AXIS_HAS_STEALTHCHOP(E3)
868
+                  TMC_GET_PWMTHRS(E, E3),
869
+                #else
870
+                  E3_HYBRID_THRESHOLD,
871
+                #endif
872
+                #if MAX_EXTRUDERS > 4
873
+                  #if AXIS_HAS_STEALTHCHOP(E4)
874
+                    TMC_GET_PWMTHRS(E, E4)
875
+                  #else
876
+                    E4_HYBRID_THRESHOLD
877
+                  #endif
878
+                  #if MAX_EXTRUDERS > 5
879
+                    #if AXIS_HAS_STEALTHCHOP(E5)
880
+                      TMC_GET_PWMTHRS(E, E5)
881
+                    #else
882
+                      E5_HYBRID_THRESHOLD
883
+                    #endif
884
+                  #endif // MAX_EXTRUDERS > 5
885
+                #endif // MAX_EXTRUDERS > 4
886
+              #endif // MAX_EXTRUDERS > 3
887
+            #endif // MAX_EXTRUDERS > 2
888
+          #endif // MAX_EXTRUDERS > 1
889
+        #endif // MAX_EXTRUDERS
864 890
       #else
865
-        100, 100, 3,          // X, Y, Z
866
-        100, 100, 3, 3,       // X2, Y2, Z2, Z3
867
-        30, 30, 30, 30, 30    // E0, E1, E2, E3, E4
891
+        100, 100, 3,            // X, Y, Z
892
+        100, 100, 3, 3          // X2, Y2, Z2, Z3
893
+        #if MAX_EXTRUDERS
894
+          , 30                  // E0
895
+          #if MAX_EXTRUDERS > 1
896
+            , 30                // E1
897
+            #if MAX_EXTRUDERS > 2
898
+              , 30              // E2
899
+              #if MAX_EXTRUDERS > 3
900
+                , 30            // E3
901
+                #if MAX_EXTRUDERS > 4
902
+                  , 30          // E4
903
+                  #if MAX_EXTRUDERS > 5
904
+                    , 30        // E5
905
+                  #endif
906
+                #endif
907
+              #endif
908
+            #endif
909
+          #endif
910
+        #endif
868 911
       #endif
869 912
     };
870 913
     EEPROM_WRITE(tmc_hybrid_threshold);
@@ -951,17 +994,13 @@ void MarlinSettings::postprocess() {
951 994
     _FIELD_TEST(filament_change_unload_length);
952 995
 
953 996
     #if ENABLED(ADVANCED_PAUSE_FEATURE)
954
-      for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
955
-        if (q < COUNT(filament_change_unload_length)) dummy = filament_change_unload_length[q];
956
-        EEPROM_WRITE(dummy);
957
-      }
958
-      for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
959
-        if (q < COUNT(filament_change_load_length)) dummy = filament_change_load_length[q];
960
-        EEPROM_WRITE(dummy);
997
+      for (uint8_t q = 0; q < COUNT(filament_change_unload_length); q++) {
998
+        EEPROM_WRITE(filament_change_unload_length[q]);
999
+        EEPROM_WRITE(filament_change_load_length[q]);
961 1000
       }
962 1001
     #else
963 1002
       dummy = 0;
964
-      for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_WRITE(dummy);
1003
+      for (uint8_t q = EXTRUDERS * 2; q--;) EEPROM_WRITE(dummy);
965 1004
     #endif
966 1005
 
967 1006
     //
@@ -1271,9 +1310,9 @@ void MarlinSettings::postprocess() {
1271 1310
       //
1272 1311
 
1273 1312
       #if ENABLED(PIDTEMP)
1274
-        for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) {
1313
+        for (uint8_t e = 0; e < HOTENDS; e++) {
1275 1314
           EEPROM_READ(dummy); // Kp
1276
-          if (e < HOTENDS && dummy != DUMMY_PID_VALUE) {
1315
+          if (dummy != DUMMY_PID_VALUE) {
1277 1316
             // do not need to scale PID values as the values in EEPROM are already scaled
1278 1317
             if (!validating) PID_PARAM(Kp, e) = dummy;
1279 1318
             EEPROM_READ(PID_PARAM(Ki, e));
@@ -1284,13 +1323,12 @@ void MarlinSettings::postprocess() {
1284 1323
               EEPROM_READ(dummy);
1285 1324
             #endif
1286 1325
           }
1287
-          else {
1326
+          else
1288 1327
             for (uint8_t q=3; q--;) EEPROM_READ(dummy); // Ki, Kd, Kc
1289
-          }
1290 1328
         }
1291 1329
       #else // !PIDTEMP
1292 1330
         // 4 x 4 = 16 slots for PID parameters
1293
-        for (uint8_t q = MAX_EXTRUDERS * 4; q--;) EEPROM_READ(dummy);  // Kp, Ki, Kd, Kc
1331
+        for (uint8_t q = HOTENDS * 4; q--;) EEPROM_READ(dummy);  // Kp, Ki, Kd, Kc
1294 1332
       #endif // !PIDTEMP
1295 1333
 
1296 1334
       //
@@ -1359,16 +1397,15 @@ void MarlinSettings::postprocess() {
1359 1397
 
1360 1398
         EEPROM_READ(parser.volumetric_enabled);
1361 1399
 
1362
-        for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
1400
+        for (uint8_t q = 0; q < COUNT(planner.filament_size); q++) {
1363 1401
           EEPROM_READ(dummy);
1364
-          if (!validating && q < COUNT(planner.filament_size))
1365
-            planner.filament_size[q] = dummy;
1402
+          if (!validating) planner.filament_size[q] = dummy;
1366 1403
         }
1367 1404
 
1368 1405
       #else
1369 1406
 
1370 1407
         EEPROM_READ(dummyb);
1371
-        for (uint8_t q=MAX_EXTRUDERS; q--;) EEPROM_READ(dummy);
1408
+        for (uint8_t q=EXTRUDERS; q--;) EEPROM_READ(dummy);
1372 1409
 
1373 1410
       #endif
1374 1411
 
@@ -1422,6 +1459,9 @@ void MarlinSettings::postprocess() {
1422 1459
           #if AXIS_IS_TMC(E4)
1423 1460
             SET_CURR(E4);
1424 1461
           #endif
1462
+          #if AXIS_IS_TMC(E5)
1463
+            SET_CURR(E5);
1464
+          #endif
1425 1465
         }
1426 1466
       #else
1427 1467
         uint16_t val;
@@ -1469,6 +1509,9 @@ void MarlinSettings::postprocess() {
1469 1509
           #if AXIS_HAS_STEALTHCHOP(E4)
1470 1510
             TMC_SET_PWMTHRS(E, E4);
1471 1511
           #endif
1512
+          #if AXIS_HAS_STEALTHCHOP(E5)
1513
+            TMC_SET_PWMTHRS(E, E5);
1514
+          #endif
1472 1515
         }
1473 1516
       #else
1474 1517
         uint32_t thrs_val;
@@ -1580,16 +1623,14 @@ void MarlinSettings::postprocess() {
1580 1623
       _FIELD_TEST(filament_change_unload_length);
1581 1624
 
1582 1625
       #if ENABLED(ADVANCED_PAUSE_FEATURE)
1583
-        for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
1626
+        for (uint8_t q = 0; q < COUNT(filament_change_unload_length); q++) {
1584 1627
           EEPROM_READ(dummy);
1585 1628
           if (!validating && q < COUNT(filament_change_unload_length)) filament_change_unload_length[q] = dummy;
1586
-        }
1587
-        for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
1588 1629
           EEPROM_READ(dummy);
1589 1630
           if (!validating && q < COUNT(filament_change_load_length)) filament_change_load_length[q] = dummy;
1590 1631
         }
1591 1632
       #else
1592
-        for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_READ(dummy);
1633
+        for (uint8_t q = EXTRUDERS * 2; q--;) EEPROM_READ(dummy);
1593 1634
       #endif
1594 1635
 
1595 1636
       eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET));
@@ -2176,6 +2217,11 @@ void MarlinSettings::reset(PORTARG_SOLO) {
2176 2217
               CONFIG_ECHO_START;
2177 2218
               SERIAL_ECHOPAIR_P(port, "  M200 T4 D", LINEAR_UNIT(planner.filament_size[4]));
2178 2219
               SERIAL_EOL_P(port);
2220
+              #if EXTRUDERS > 5
2221
+                CONFIG_ECHO_START;
2222
+                SERIAL_ECHOPAIR_P(port, "  M200 T5 D", LINEAR_UNIT(planner.filament_size[5]));
2223
+                SERIAL_EOL_P(port);
2224
+              #endif // EXTRUDERS > 5
2179 2225
             #endif // EXTRUDERS > 4
2180 2226
           #endif // EXTRUDERS > 3
2181 2227
         #endif // EXTRUDERS > 2
@@ -2681,6 +2727,10 @@ void MarlinSettings::reset(PORTARG_SOLO) {
2681 2727
         say_M906(PORTVAR_SOLO);
2682 2728
         SERIAL_ECHOLNPAIR_P(port, " T4 E", stepperE4.getCurrent());
2683 2729
       #endif
2730
+      #if E_STEPPERS > 5 && AXIS_IS_TMC(E5)
2731
+        say_M906(PORTVAR_SOLO);
2732
+        SERIAL_ECHOLNPAIR_P(port, " T5 E", stepperE5.getCurrent());
2733
+      #endif
2684 2734
       SERIAL_EOL_P(port);
2685 2735
 
2686 2736
       /**
@@ -2748,6 +2798,10 @@ void MarlinSettings::reset(PORTARG_SOLO) {
2748 2798
           say_M913(PORTVAR_SOLO);
2749 2799
           SERIAL_ECHOLNPAIR_P(port, " T4 E", TMC_GET_PWMTHRS(E, E4));
2750 2800
         #endif
2801
+        #if E_STEPPERS > 5 && AXIS_IS_TMC(E5)
2802
+          say_M913(PORTVAR_SOLO);
2803
+          SERIAL_ECHOLNPAIR_P(port, " T5 E", TMC_GET_PWMTHRS(E, E5));
2804
+        #endif
2751 2805
         SERIAL_EOL_P(port);
2752 2806
       #endif // HYBRID_THRESHOLD
2753 2807
 
@@ -2871,6 +2925,12 @@ void MarlinSettings::reset(PORTARG_SOLO) {
2871 2925
               say_M603(PORTVAR_SOLO);
2872 2926
               SERIAL_ECHOPAIR_P(port, "T4 L", LINEAR_UNIT(filament_change_load_length[4]));
2873 2927
               SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[4]));
2928
+              #if EXTRUDERS > 5
2929
+                CONFIG_ECHO_START;
2930
+                say_M603(PORTVAR_SOLO);
2931
+                SERIAL_ECHOPAIR_P(port, "T5 L", LINEAR_UNIT(filament_change_load_length[5]));
2932
+                SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[5]));
2933
+              #endif // EXTRUDERS > 5
2874 2934
             #endif // EXTRUDERS > 4
2875 2935
           #endif // EXTRUDERS > 3
2876 2936
         #endif // EXTRUDERS > 2

+ 27
- 0
Marlin/src/module/planner.cpp View File

@@ -1849,6 +1849,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
1849 1849
                 DISABLE_IDLE_E(3);
1850 1850
                 #if EXTRUDERS > 4
1851 1851
                   DISABLE_IDLE_E(4);
1852
+                  #if EXTRUDERS > 5
1853
+                    DISABLE_IDLE_E(5);
1854
+                  #endif // EXTRUDERS > 5
1852 1855
                 #endif // EXTRUDERS > 4
1853 1856
               #endif // EXTRUDERS > 3
1854 1857
             #endif // EXTRUDERS > 2
@@ -1871,6 +1874,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
1871 1874
                 DISABLE_IDLE_E(3);
1872 1875
                 #if EXTRUDERS > 4
1873 1876
                   DISABLE_IDLE_E(4);
1877
+                  #if EXTRUDERS > 5
1878
+                    DISABLE_IDLE_E(5);
1879
+                  #endif // EXTRUDERS > 5
1874 1880
                 #endif // EXTRUDERS > 4
1875 1881
               #endif // EXTRUDERS > 3
1876 1882
             #endif // EXTRUDERS > 2
@@ -1885,6 +1891,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
1885 1891
                 DISABLE_IDLE_E(3);
1886 1892
                 #if EXTRUDERS > 4
1887 1893
                   DISABLE_IDLE_E(4);
1894
+                  #if EXTRUDERS > 5
1895
+                    DISABLE_IDLE_E(5);
1896
+                  #endif
1888 1897
                 #endif
1889 1898
               #endif
1890 1899
               enable_E2();
@@ -1897,6 +1906,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
1897 1906
                 DISABLE_IDLE_E(2);
1898 1907
                 #if EXTRUDERS > 4
1899 1908
                   DISABLE_IDLE_E(4);
1909
+                  #if EXTRUDERS > 5
1910
+                    DISABLE_IDLE_E(5);
1911
+                  #endif
1900 1912
                 #endif
1901 1913
                 enable_E3();
1902 1914
                 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,
1907 1919
                   DISABLE_IDLE_E(1);
1908 1920
                   DISABLE_IDLE_E(2);
1909 1921
                   DISABLE_IDLE_E(3);
1922
+                  #if EXTRUDERS > 5
1923
+                    DISABLE_IDLE_E(5);
1924
+                  #endif
1910 1925
                   enable_E4();
1911 1926
                   g_uc_extruder_last_move[4] = (BLOCK_BUFFER_SIZE) * 2;
1912 1927
                 break;
1928
+                #if EXTRUDERS > 5
1929
+                  case 5:
1930
+                    DISABLE_IDLE_E(0);
1931
+                    DISABLE_IDLE_E(1);
1932
+                    DISABLE_IDLE_E(2);
1933
+                    DISABLE_IDLE_E(3);
1934
+                    DISABLE_IDLE_E(4);
1935
+                    enable_E5();
1936
+                    g_uc_extruder_last_move[5] = (BLOCK_BUFFER_SIZE) * 2;
1937
+                  break;
1938
+                #endif // EXTRUDERS > 5
1913 1939
               #endif // EXTRUDERS > 4
1914 1940
             #endif // EXTRUDERS > 3
1915 1941
           #endif // EXTRUDERS > 2
@@ -1921,6 +1947,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
1921 1947
       enable_E2();
1922 1948
       enable_E3();
1923 1949
       enable_E4();
1950
+      enable_E5();
1924 1951
     #endif
1925 1952
   }
1926 1953
 

+ 25
- 0
Marlin/src/module/stepper.cpp View File

@@ -1982,6 +1982,9 @@ void Stepper::init() {
1982 1982
   #if HAS_E4_DIR
1983 1983
     E4_DIR_INIT;
1984 1984
   #endif
1985
+  #if HAS_E5_DIR
1986
+    E5_DIR_INIT;
1987
+  #endif
1985 1988
 
1986 1989
   // Init Enable Pins - steppers default to disabled.
1987 1990
   #if HAS_X_ENABLE
@@ -2032,6 +2035,10 @@ void Stepper::init() {
2032 2035
     E4_ENABLE_INIT;
2033 2036
     if (!E_ENABLE_ON) E4_ENABLE_WRITE(HIGH);
2034 2037
   #endif
2038
+  #if HAS_E5_ENABLE
2039
+    E5_ENABLE_INIT;
2040
+    if (!E_ENABLE_ON) E5_ENABLE_WRITE(HIGH);
2041
+  #endif
2035 2042
 
2036 2043
   #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT
2037 2044
   #define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW)
@@ -2088,6 +2095,9 @@ void Stepper::init() {
2088 2095
   #if E_STEPPERS > 4 && HAS_E4_STEP
2089 2096
     E_AXIS_INIT(4);
2090 2097
   #endif
2098
+  #if E_STEPPERS > 5 && HAS_E5_STEP
2099
+    E_AXIS_INIT(5);
2100
+  #endif
2091 2101
 
2092 2102
   // Init Stepper ISR to 122 Hz for quick starting
2093 2103
   HAL_timer_start(STEP_TIMER_NUM, 122);
@@ -2524,6 +2534,10 @@ void Stepper::report_positions() {
2524 2534
       SET_OUTPUT(E4_MS1_PIN);
2525 2535
       SET_OUTPUT(E4_MS2_PIN);
2526 2536
     #endif
2537
+    #if HAS_E5_MICROSTEPS
2538
+      SET_OUTPUT(E5_MS1_PIN);
2539
+      SET_OUTPUT(E5_MS2_PIN);
2540
+    #endif
2527 2541
     static const uint8_t microstep_modes[] = MICROSTEP_MODES;
2528 2542
     for (uint16_t i = 0; i < COUNT(microstep_modes); i++)
2529 2543
       microstep_mode(i, microstep_modes[i]);
@@ -2553,6 +2567,9 @@ void Stepper::report_positions() {
2553 2567
       #if HAS_E4_MICROSTEPS
2554 2568
         case 7: WRITE(E4_MS1_PIN, ms1); break;
2555 2569
       #endif
2570
+      #if HAS_E5_MICROSTEPS
2571
+        case 8: WRITE(E5_MS1_PIN, ms1); break;
2572
+      #endif
2556 2573
     }
2557 2574
     if (ms2 >= 0) switch (driver) {
2558 2575
       case 0: WRITE(X_MS2_PIN, ms2); break;
@@ -2577,6 +2594,9 @@ void Stepper::report_positions() {
2577 2594
       #if HAS_E4_MICROSTEPS
2578 2595
         case 7: WRITE(E4_MS2_PIN, ms2); break;
2579 2596
       #endif
2597
+      #if HAS_E5_MICROSTEPS
2598
+        case 8: WRITE(E5_MS2_PIN, ms2); break;
2599
+      #endif
2580 2600
     }
2581 2601
   }
2582 2602
 
@@ -2638,6 +2658,11 @@ void Stepper::report_positions() {
2638 2658
       SERIAL_PROTOCOL(READ(E4_MS1_PIN));
2639 2659
       SERIAL_PROTOCOLLN(READ(E4_MS2_PIN));
2640 2660
     #endif
2661
+    #if HAS_E5_MICROSTEPS
2662
+      SERIAL_PROTOCOLPGM("E5: ");
2663
+      SERIAL_PROTOCOL(READ(E5_MS1_PIN));
2664
+      SERIAL_PROTOCOLLN(READ(E5_MS2_PIN));
2665
+    #endif
2641 2666
   }
2642 2667
 
2643 2668
 #endif // HAS_MICROSTEPS

+ 42
- 1
Marlin/src/module/stepper_indirection.h View File

@@ -482,11 +482,48 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
482 482
 #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE)
483 483
 #define E4_STEP_READ READ(E4_STEP_PIN)
484 484
 
485
+// E5 Stepper
486
+#if AXIS_DRIVER_TYPE(E5, L6470)
487
+  extern L6470 stepperE5;
488
+  #define E5_ENABLE_INIT NOOP
489
+  #define E5_ENABLE_WRITE(STATE) do{ if (STATE) stepperE5.Step_Clock(stepperE5.getStatus() & STATUS_HIZ); else stepperE5.softFree(); }while(0)
490
+  #define E5_ENABLE_READ (stepperE5.getStatus() & STATUS_HIZ)
491
+  #define E5_DIR_INIT NOOP
492
+  #define E5_DIR_WRITE(STATE) stepperE5.Step_Clock(STATE)
493
+  #define E5_DIR_READ (stepperE5.getStatus() & STATUS_DIR)
494
+#else
495
+  #if AXIS_DRIVER_TYPE(E5, TMC26X)
496
+    extern TMC26XStepper stepperE5;
497
+    #define E5_ENABLE_INIT NOOP
498
+    #define E5_ENABLE_WRITE(STATE) stepperE5.setEnabled(STATE)
499
+    #define E5_ENABLE_READ stepperE5.isEnabled()
500
+  #else
501
+    #if AXIS_DRIVER_TYPE(E5, TMC2130)
502
+      extern TMC2130Stepper stepperE5;
503
+    #elif AXIS_DRIVER_TYPE(E5, TMC2208)
504
+      extern TMC2208Stepper stepperE5;
505
+    #endif
506
+    #define E5_ENABLE_INIT SET_OUTPUT(E5_ENABLE_PIN)
507
+    #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE)
508
+    #define E5_ENABLE_READ READ(E5_ENABLE_PIN)
509
+  #endif
510
+  #define E5_DIR_INIT SET_OUTPUT(E5_DIR_PIN)
511
+  #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,STATE)
512
+  #define E5_DIR_READ READ(E5_DIR_PIN)
513
+#endif
514
+#define E5_STEP_INIT SET_OUTPUT(E5_STEP_PIN)
515
+#define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE)
516
+#define E5_STEP_READ READ(E5_STEP_PIN)
517
+
485 518
 /**
486 519
  * Extruder indirection for the single E axis
487 520
  */
488 521
 #if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index
489
-  #if EXTRUDERS > 4
522
+  #if EXTRUDERS > 5
523
+    #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)
524
+    #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)
525
+    #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)
526
+  #elif EXTRUDERS > 4
490 527
     #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)
491 528
     #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)
492 529
     #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
507 544
   #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
508 545
   #define   NORM_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR:  INVERT_E0_DIR); }while(0)
509 546
   #define    REV_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ?  INVERT_E0_DIR: !INVERT_E0_DIR); }while(0)
547
+#elif E_STEPPERS > 5
548
+  #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)
549
+  #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)
550
+  #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)
510 551
 #elif E_STEPPERS > 4
511 552
   #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)
512 553
   #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)

+ 73
- 12
Marlin/src/module/temperature.cpp View File

@@ -74,6 +74,7 @@ Temperature thermalManager;
74 74
     (HOTENDS > 2 && (E) == 2) ? PSTR(MSG_E3 " " MSG) : \
75 75
     (HOTENDS > 3 && (E) == 3) ? PSTR(MSG_E4 " " MSG) : \
76 76
     (HOTENDS > 4 && (E) == 4) ? PSTR(MSG_E5 " " MSG) : \
77
+    (HOTENDS > 5 && (E) == 5) ? PSTR(MSG_E6 " " MSG) : \
77 78
     PSTR(MSG_E1 " " MSG)
78 79
 #else
79 80
   #define TEMP_ERR_PSTR(MSG, E) \
@@ -81,6 +82,7 @@ Temperature thermalManager;
81 82
     (HOTENDS > 2 && (E) == 2) ? PSTR(MSG_E3 " " MSG) : \
82 83
     (HOTENDS > 3 && (E) == 3) ? PSTR(MSG_E4 " " MSG) : \
83 84
     (HOTENDS > 4 && (E) == 4) ? PSTR(MSG_E5 " " MSG) : \
85
+    (HOTENDS > 5 && (E) == 5) ? PSTR(MSG_E6 " " MSG) : \
84 86
     PSTR(MSG_E1 " " MSG)
85 87
 #endif
86 88
 
@@ -149,7 +151,7 @@ int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 },
149 151
 #endif
150 152
 
151 153
 #if ENABLED(BABYSTEPPING)
152
-  volatile int Temperature::babystepsTodo[XYZ] = { 0 };
154
+  volatile int16_t Temperature::babystepsTodo[XYZ] = { 0 };
153 155
 #endif
154 156
 
155 157
 #if WATCH_HOTENDS
@@ -527,13 +529,14 @@ int Temperature::getHeaterPower(const int heater) {
527 529
 #if HAS_AUTO_FAN
528 530
 
529 531
   void Temperature::checkExtruderAutoFans() {
530
-    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 };
532
+    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 };
531 533
     static const uint8_t fanBit[] PROGMEM = {
532 534
                     0,
533 535
       AUTO_1_IS_0 ? 0 :               1,
534 536
       AUTO_2_IS_0 ? 0 : AUTO_2_IS_1 ? 1 :               2,
535 537
       AUTO_3_IS_0 ? 0 : AUTO_3_IS_1 ? 1 : AUTO_3_IS_2 ? 2 :               3,
536
-      AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 : 4,
538
+      AUTO_4_IS_0 ? 0 : AUTO_4_IS_1 ? 1 : AUTO_4_IS_2 ? 2 : AUTO_4_IS_3 ? 3 :                   4,
539
+      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,
537 540
       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
538 541
     };
539 542
     uint8_t fanState = 0;
@@ -1193,6 +1196,9 @@ void Temperature::init() {
1193 1196
   #if HAS_TEMP_ADC_4
1194 1197
     HAL_ANALOG_SELECT(TEMP_4_PIN);
1195 1198
   #endif
1199
+  #if HAS_TEMP_ADC_5
1200
+    HAL_ANALOG_SELECT(TEMP_5_PIN);
1201
+  #endif
1196 1202
   #if HAS_HEATED_BED
1197 1203
     HAL_ANALOG_SELECT(TEMP_BED_PIN);
1198 1204
   #endif
@@ -1226,7 +1232,7 @@ void Temperature::init() {
1226 1232
       SET_OUTPUT(E1_AUTO_FAN_PIN);
1227 1233
     #endif
1228 1234
   #endif
1229
-  #if HAS_AUTO_FAN_2 && !AUTO_2_IS_0 && !AUTO_2_IS_1
1235
+  #if HAS_AUTO_FAN_2 && !(AUTO_2_IS_0 || AUTO_2_IS_1)
1230 1236
     #if E2_AUTO_FAN_PIN == FAN1_PIN
1231 1237
       SET_OUTPUT(E2_AUTO_FAN_PIN);
1232 1238
       #if ENABLED(FAST_PWM_FAN)
@@ -1236,7 +1242,7 @@ void Temperature::init() {
1236 1242
       SET_OUTPUT(E2_AUTO_FAN_PIN);
1237 1243
     #endif
1238 1244
   #endif
1239
-  #if HAS_AUTO_FAN_3 && !AUTO_3_IS_0 && !AUTO_3_IS_1 && !AUTO_3_IS_2
1245
+  #if HAS_AUTO_FAN_3 && !(AUTO_3_IS_0 || AUTO_3_IS_1 || AUTO_3_IS_2)
1240 1246
     #if E3_AUTO_FAN_PIN == FAN1_PIN
1241 1247
       SET_OUTPUT(E3_AUTO_FAN_PIN);
1242 1248
       #if ENABLED(FAST_PWM_FAN)
@@ -1246,7 +1252,7 @@ void Temperature::init() {
1246 1252
       SET_OUTPUT(E3_AUTO_FAN_PIN);
1247 1253
     #endif
1248 1254
   #endif
1249
-  #if HAS_AUTO_FAN_4 && !AUTO_4_IS_0 && !AUTO_4_IS_1 && !AUTO_4_IS_2 && !AUTO_4_IS_3
1255
+  #if HAS_AUTO_FAN_4 && !(AUTO_4_IS_0 || AUTO_4_IS_1 || AUTO_4_IS_2 || AUTO_4_IS_3)
1250 1256
     #if E4_AUTO_FAN_PIN == FAN1_PIN
1251 1257
       SET_OUTPUT(E4_AUTO_FAN_PIN);
1252 1258
       #if ENABLED(FAST_PWM_FAN)
@@ -1256,7 +1262,17 @@ void Temperature::init() {
1256 1262
       SET_OUTPUT(E4_AUTO_FAN_PIN);
1257 1263
     #endif
1258 1264
   #endif
1259
-  #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
1265
+  #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)
1266
+    #if E5_AUTO_FAN_PIN == FAN1_PIN
1267
+      SET_OUTPUT(E5_AUTO_FAN_PIN);
1268
+      #if ENABLED(FAST_PWM_FAN)
1269
+        setPwmFrequency(E5_AUTO_FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8
1270
+      #endif
1271
+    #else
1272
+      SET_OUTPUT(E5_AUTO_FAN_PIN);
1273
+    #endif
1274
+  #endif
1275
+  #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)
1260 1276
     #if CHAMBER_AUTO_FAN_PIN == FAN1_PIN
1261 1277
       SET_OUTPUT(CHAMBER_AUTO_FAN_PIN);
1262 1278
       #if ENABLED(FAST_PWM_FAN)
@@ -1321,6 +1337,14 @@ void Temperature::init() {
1321 1337
           #ifdef HEATER_4_MAXTEMP
1322 1338
             TEMP_MAX_ROUTINE(4);
1323 1339
           #endif
1340
+          #if HOTENDS > 5
1341
+            #ifdef HEATER_5_MINTEMP
1342
+              TEMP_MIN_ROUTINE(5);
1343
+            #endif
1344
+            #ifdef HEATER_5_MAXTEMP
1345
+              TEMP_MAX_ROUTINE(5);
1346
+            #endif
1347
+          #endif // HOTENDS > 5
1324 1348
         #endif // HOTENDS > 4
1325 1349
       #endif // HOTENDS > 3
1326 1350
     #endif // HOTENDS > 2
@@ -1539,6 +1563,9 @@ void Temperature::disable_all_heaters() {
1539 1563
           DISABLE_HEATER(3);
1540 1564
           #if HOTENDS > 4
1541 1565
             DISABLE_HEATER(4);
1566
+            #if HOTENDS > 5
1567
+              DISABLE_HEATER(5);
1568
+            #endif // HOTENDS > 5
1542 1569
           #endif // HOTENDS > 4
1543 1570
         #endif // HOTENDS > 3
1544 1571
       #endif // HOTENDS > 2
@@ -1665,10 +1692,13 @@ void Temperature::set_current_temp_raw() {
1665 1692
         current_temperature_raw[3] = raw_temp_value[3];
1666 1693
         #if HAS_TEMP_ADC_4
1667 1694
           current_temperature_raw[4] = raw_temp_value[4];
1668
-        #endif
1669
-      #endif
1670
-    #endif
1671
-  #endif
1695
+          #if HAS_TEMP_ADC_5
1696
+            current_temperature_raw[5] = raw_temp_value[5];
1697
+          #endif // HAS_TEMP_ADC_5
1698
+        #endif // HAS_TEMP_ADC_4
1699
+      #endif // HAS_TEMP_ADC_3
1700
+    #endif // HAS_TEMP_ADC_2
1701
+  #endif // HAS_TEMP_ADC_1
1672 1702
 
1673 1703
   #if HAS_HEATED_BED
1674 1704
     current_temperature_bed_raw = raw_temp_bed_value;
@@ -1718,6 +1748,9 @@ void Temperature::readings_ready() {
1718 1748
           , TEMPDIR(3)
1719 1749
           #if HOTENDS > 4
1720 1750
             , TEMPDIR(4)
1751
+            #if HOTENDS > 5
1752
+              , TEMPDIR(5)
1753
+            #endif // HOTENDS > 5
1721 1754
           #endif // HOTENDS > 4
1722 1755
         #endif // HOTENDS > 3
1723 1756
       #endif // HOTENDS > 2
@@ -1815,6 +1848,9 @@ void Temperature::isr() {
1815 1848
         ISR_STATICS(3);
1816 1849
         #if HOTENDS > 4
1817 1850
           ISR_STATICS(4);
1851
+          #if HOTENDS > 5
1852
+            ISR_STATICS(5);
1853
+          #endif // HOTENDS > 5
1818 1854
         #endif // HOTENDS > 4
1819 1855
       #endif // HOTENDS > 3
1820 1856
     #endif // HOTENDS > 2
@@ -1851,6 +1887,10 @@ void Temperature::isr() {
1851 1887
             #if HOTENDS > 4
1852 1888
               soft_pwm_count_4 = (soft_pwm_count_4 & pwm_mask) + soft_pwm_amount[4];
1853 1889
               WRITE_HEATER_4(soft_pwm_count_4 > pwm_mask ? HIGH : LOW);
1890
+              #if HOTENDS > 5
1891
+                soft_pwm_count_5 = (soft_pwm_count_5 & pwm_mask) + soft_pwm_amount[5];
1892
+                WRITE_HEATER_5(soft_pwm_count_5 > pwm_mask ? HIGH : LOW);
1893
+              #endif // HOTENDS > 5
1854 1894
             #endif // HOTENDS > 4
1855 1895
           #endif // HOTENDS > 3
1856 1896
         #endif // HOTENDS > 2
@@ -1886,6 +1926,9 @@ void Temperature::isr() {
1886 1926
             if (soft_pwm_count_3 <= pwm_count_tmp) WRITE_HEATER_3(LOW);
1887 1927
             #if HOTENDS > 4
1888 1928
               if (soft_pwm_count_4 <= pwm_count_tmp) WRITE_HEATER_4(LOW);
1929
+              #if HOTENDS > 5
1930
+                if (soft_pwm_count_5 <= pwm_count_tmp) WRITE_HEATER_5(LOW);
1931
+              #endif // HOTENDS > 5
1889 1932
             #endif // HOTENDS > 4
1890 1933
           #endif // HOTENDS > 3
1891 1934
         #endif // HOTENDS > 2
@@ -1968,6 +2011,9 @@ void Temperature::isr() {
1968 2011
             SLOW_PWM_ROUTINE(3);
1969 2012
             #if HOTENDS > 4
1970 2013
               SLOW_PWM_ROUTINE(4);
2014
+              #if HOTENDS > 5
2015
+                SLOW_PWM_ROUTINE(5);
2016
+              #endif // HOTENDS > 5
1971 2017
             #endif // HOTENDS > 4
1972 2018
           #endif // HOTENDS > 3
1973 2019
         #endif // HOTENDS > 2
@@ -1987,6 +2033,9 @@ void Temperature::isr() {
1987 2033
           PWM_OFF_ROUTINE(3);
1988 2034
           #if HOTENDS > 4
1989 2035
             PWM_OFF_ROUTINE(4);
2036
+            #if HOTENDS > 5
2037
+              PWM_OFF_ROUTINE(5);
2038
+            #endif // HOTENDS > 5
1990 2039
           #endif // HOTENDS > 4
1991 2040
         #endif // HOTENDS > 3
1992 2041
       #endif // HOTENDS > 2
@@ -2047,6 +2096,9 @@ void Temperature::isr() {
2047 2096
             if (state_timer_heater_3 > 0) state_timer_heater_3--;
2048 2097
             #if HOTENDS > 4
2049 2098
               if (state_timer_heater_4 > 0) state_timer_heater_4--;
2099
+              #if HOTENDS > 5
2100
+                if (state_timer_heater_5 > 0) state_timer_heater_5--;
2101
+              #endif // HOTENDS > 5
2050 2102
             #endif // HOTENDS > 4
2051 2103
           #endif // HOTENDS > 3
2052 2104
         #endif // HOTENDS > 2
@@ -2169,6 +2221,15 @@ void Temperature::isr() {
2169 2221
         break;
2170 2222
     #endif
2171 2223
 
2224
+    #if HAS_TEMP_ADC_5
2225
+      case PrepareTemp_5:
2226
+        HAL_START_ADC(TEMP_5_PIN);
2227
+        break;
2228
+      case MeasureTemp_5:
2229
+        ACCUMULATE_ADC(raw_temp_value[5]);
2230
+        break;
2231
+    #endif
2232
+
2172 2233
     #if ENABLED(FILAMENT_WIDTH_SENSOR)
2173 2234
       case Prepare_FILWIDTH:
2174 2235
         HAL_START_ADC(FILWIDTH_PIN);
@@ -2218,7 +2279,7 @@ void Temperature::isr() {
2218 2279
 
2219 2280
   #if ENABLED(BABYSTEPPING)
2220 2281
     LOOP_XYZ(axis) {
2221
-      const int curTodo = babystepsTodo[axis]; // get rid of volatile for performance
2282
+      const int16_t curTodo = babystepsTodo[axis]; // get rid of volatile for performance
2222 2283
       if (curTodo) {
2223 2284
         stepper.babystep((AxisEnum)axis, curTodo > 0);
2224 2285
         if (curTodo > 0) babystepsTodo[axis]--;

+ 1
- 1
Marlin/src/module/temperature.h View File

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

+ 54
- 6
Marlin/src/pins/pins.h View File

@@ -468,6 +468,15 @@
468 468
 #ifndef E4_MS3_PIN
469 469
   #define E4_MS3_PIN -1
470 470
 #endif
471
+#ifndef E5_MS1_PIN
472
+  #define E5_MS1_PIN -1
473
+#endif
474
+#ifndef E5_MS2_PIN
475
+  #define E5_MS2_PIN -1
476
+#endif
477
+#ifndef E5_MS3_PIN
478
+  #define E5_MS3_PIN -1
479
+#endif
471 480
 
472 481
 #ifndef E0_STEP_PIN
473 482
   #define E0_STEP_PIN -1
@@ -514,6 +523,15 @@
514 523
 #ifndef E4_ENABLE_PIN
515 524
   #define E4_ENABLE_PIN -1
516 525
 #endif
526
+#ifndef E5_STEP_PIN
527
+  #define E5_STEP_PIN -1
528
+#endif
529
+#ifndef E5_DIR_PIN
530
+  #define E5_DIR_PIN -1
531
+#endif
532
+#ifndef E5_ENABLE_PIN
533
+  #define E5_ENABLE_PIN -1
534
+#endif
517 535
 
518 536
 #ifndef X_CS_PIN
519 537
   #define X_CS_PIN -1
@@ -539,6 +557,9 @@
539 557
 #ifndef E4_CS_PIN
540 558
   #define E4_CS_PIN -1
541 559
 #endif
560
+#ifndef E5_CS_PIN
561
+  #define E5_CS_PIN -1
562
+#endif
542 563
 
543 564
 #ifndef FAN_PIN
544 565
   #define FAN_PIN -1
@@ -578,6 +599,9 @@
578 599
 #ifndef HEATER_4_PIN
579 600
   #define HEATER_4_PIN -1
580 601
 #endif
602
+#ifndef HEATER_5_PIN
603
+  #define HEATER_5_PIN -1
604
+#endif
581 605
 #ifndef HEATER_BED_PIN
582 606
   #define HEATER_BED_PIN -1
583 607
 #endif
@@ -597,6 +621,9 @@
597 621
 #ifndef TEMP_4_PIN
598 622
   #define TEMP_4_PIN -1
599 623
 #endif
624
+#ifndef TEMP_5_PIN
625
+  #define TEMP_5_PIN -1
626
+#endif
600 627
 #ifndef TEMP_BED_PIN
601 628
   #define TEMP_BED_PIN -1
602 629
 #endif
@@ -669,6 +696,13 @@
669 696
     #define E4_AUTO_FAN_PIN -1
670 697
   #endif
671 698
 #endif
699
+#ifndef E5_AUTO_FAN_PIN
700
+  #ifdef ORIG_E5_AUTO_FAN_PIN
701
+    #define E5_AUTO_FAN_PIN ORIG_E5_AUTO_FAN_PIN
702
+  #else
703
+    #define E5_AUTO_FAN_PIN -1
704
+  #endif
705
+#endif
672 706
 #ifndef CHAMBER_AUTO_FAN_PIN
673 707
   #ifdef ORIG_CHAMBER_AUTO_FAN_PIN
674 708
     #define CHAMBER_AUTO_FAN_PIN ORIG_CHAMBER_AUTO_FAN_PIN
@@ -683,6 +717,7 @@
683 717
 #define _E2_PINS
684 718
 #define _E3_PINS
685 719
 #define _E4_PINS
720
+#define _E5_PINS
686 721
 
687 722
 #if ENABLED(SWITCHING_EXTRUDER)
688 723
                       // Tools 0 and 1 use E0
@@ -706,6 +741,10 @@
706 741
       #if EXTRUDERS > 4
707 742
         #undef _E4_PINS
708 743
         #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, E4_MS1_PIN, E4_MS2_PIN, E4_MS3_PIN, E4_CS_PIN,
744
+        #if EXTRUDERS > 5
745
+          #undef _E5_PINS
746
+          #define _E5_PINS E5_STEP_PIN, E5_DIR_PIN, E5_ENABLE_PIN, E5_MS1_PIN, E5_MS2_PIN, E5_MS3_PIN, E5_CS_PIN,
747
+        #endif // EXTRUDERS > 5
709 748
       #endif // EXTRUDERS > 4
710 749
     #endif // EXTRUDERS > 3
711 750
   #endif // EXTRUDERS > 2
@@ -716,6 +755,7 @@
716 755
 #define _H2_PINS
717 756
 #define _H3_PINS
718 757
 #define _H4_PINS
758
+#define _H5_PINS
719 759
 
720 760
 #if HOTENDS > 1
721 761
   #undef _H1_PINS
@@ -728,7 +768,11 @@
728 768
       #define _H3_PINS HEATER_3_PIN, E3_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_3_PIN),
729 769
       #if HOTENDS > 4
730 770
         #undef _H4_PINS
731
-        #define _H4_PINS HEATER_4_PIN, analogInputToDigitalPin(TEMP_4_PIN),
771
+        #define _H4_PINS HEATER_4_PIN, E4_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_4_PIN),
772
+        #if HOTENDS > 5
773
+          #undef _H5_PINS
774
+          #define _H5_PINS HEATER_5_PIN, E5_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_5_PIN),
775
+        #endif // HOTENDS > 5
732 776
       #endif // HOTENDS > 4
733 777
     #endif // HOTENDS > 3
734 778
   #endif // HOTENDS > 2
@@ -744,6 +788,10 @@
744 788
       #if MIXING_STEPPERS > 4
745 789
         #undef _E4_PINS
746 790
         #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, E4_MS1_PIN, E4_MS2_PIN, E4_CS_PIN,
791
+        #if MIXING_STEPPERS > 5
792
+          #undef _E5_PINS
793
+          #define _E5_PINS E5_STEP_PIN, E5_DIR_PIN, E5_ENABLE_PIN, E5_MS1_PIN, E5_MS2_PIN, E5_CS_PIN,
794
+        #endif // MIXING_STEPPERS > 5
747 795
       #endif // MIXING_STEPPERS > 4
748 796
     #endif // MIXING_STEPPERS > 3
749 797
   #endif // MIXING_STEPPERS > 2
@@ -856,7 +904,7 @@
856 904
     #ifndef X2_CS_PIN
857 905
       #define X2_CS_PIN   _EPIN(E_STEPPERS, CS)
858 906
     #endif
859
-    #if E_STEPPERS > 4 || !PIN_EXISTS(X2_ENABLE)
907
+    #if E_STEPPERS > MAX_EXTRUDERS || !PIN_EXISTS(X2_ENABLE)
860 908
       #error "No E stepper plug left for X2!"
861 909
     #endif
862 910
   #endif
@@ -881,7 +929,7 @@
881 929
     #ifndef Y2_CS_PIN
882 930
       #define Y2_CS_PIN   _EPIN(Y2_E_INDEX, CS)
883 931
     #endif
884
-    #if Y2_E_INDEX > 4 || !PIN_EXISTS(Y2_ENABLE)
932
+    #if Y2_E_INDEX > MAX_EXTRUDERS || !PIN_EXISTS(Y2_ENABLE)
885 933
       #error "No E stepper plug left for Y2!"
886 934
     #endif
887 935
   #endif
@@ -906,7 +954,7 @@
906 954
     #ifndef Z2_CS_PIN
907 955
       #define Z2_CS_PIN   _EPIN(Z2_E_INDEX, CS)
908 956
     #endif
909
-    #if Z2_E_INDEX > 4 || !PIN_EXISTS(Z2_ENABLE)
957
+    #if Z2_E_INDEX > MAX_EXTRUDERS || !PIN_EXISTS(Z2_ENABLE)
910 958
       #error "No E stepper plug left for Z2!"
911 959
     #endif
912 960
   #endif
@@ -952,8 +1000,8 @@
952 1000
     Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Y_MS1_PIN, Y_MS2_PIN, Y_CS_PIN, \
953 1001
     Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, Z_MS1_PIN, Z_MS2_PIN, Z_MS3_PIN, Z_CS_PIN, Z_MIN_PROBE_PIN, \
954 1002
     PS_ON_PIN, HEATER_BED_PIN, FAN_PIN, FAN1_PIN, FAN2_PIN, CONTROLLER_FAN_PIN, \
955
-    _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS BED_PINS \
956
-    _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS \
1003
+    _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS _E5_PINS BED_PINS \
1004
+    _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS _H5_PINS \
957 1005
     _X2_PINS _Y2_PINS _Z2_PINS _Z3_PINS \
958 1006
     HAL_SENSITIVE_PINS \
959 1007
   }

+ 36
- 0
Marlin/src/pins/pinsDebug_list.h View File

@@ -361,6 +361,30 @@
361 361
 #if PIN_EXISTS(E4_STEP)
362 362
   REPORT_NAME_DIGITAL(__LINE__, E4_STEP_PIN)
363 363
 #endif
364
+#if PIN_EXISTS(E5_AUTO_FAN)
365
+  REPORT_NAME_DIGITAL(__LINE__, E5_AUTO_FAN_PIN)
366
+#endif
367
+#if PIN_EXISTS(E5_CS)
368
+  REPORT_NAME_DIGITAL(__LINE__, E5_CS_PIN)
369
+#endif
370
+#if PIN_EXISTS(E5_DIR)
371
+  REPORT_NAME_DIGITAL(__LINE__, E5_DIR_PIN)
372
+#endif
373
+#if PIN_EXISTS(E5_ENABLE)
374
+  REPORT_NAME_DIGITAL(__LINE__, E5_ENABLE_PIN)
375
+#endif
376
+#if PIN_EXISTS(E5_MS1)
377
+  REPORT_NAME_DIGITAL(__LINE__, E5_MS1_PIN)
378
+#endif
379
+#if PIN_EXISTS(E5_MS2)
380
+  REPORT_NAME_DIGITAL(__LINE__, E5_MS2_PIN)
381
+#endif
382
+#if PIN_EXISTS(E5_MS3)
383
+  REPORT_NAME_DIGITAL(__LINE__, E5_MS3_PIN)
384
+#endif
385
+#if PIN_EXISTS(E5_STEP)
386
+  REPORT_NAME_DIGITAL(__LINE__, E5_STEP_PIN)
387
+#endif
364 388
 #if defined(ENET_CRS) && ENET_CRS >= 0
365 389
   REPORT_NAME_DIGITAL(__LINE__, ENET_CRS)
366 390
 #endif
@@ -578,6 +602,9 @@
578 602
 #if PIN_EXISTS(ORIG_E4_AUTO_FAN)
579 603
   REPORT_NAME_DIGITAL(__LINE__, ORIG_E4_AUTO_FAN_PIN)
580 604
 #endif
605
+#if PIN_EXISTS(ORIG_E5_AUTO_FAN)
606
+  REPORT_NAME_DIGITAL(__LINE__, ORIG_E5_AUTO_FAN_PIN)
607
+#endif
581 608
 #if PIN_EXISTS(PHOTOGRAPH)
582 609
   REPORT_NAME_DIGITAL(__LINE__, PHOTOGRAPH_PIN)
583 610
 #endif
@@ -689,6 +716,9 @@
689 716
 #if PIN_EXISTS(SOL4)
690 717
   REPORT_NAME_DIGITAL(__LINE__, SOL4_PIN)
691 718
 #endif
719
+#if PIN_EXISTS(SOL5)
720
+  REPORT_NAME_DIGITAL(__LINE__, SOL5_PIN)
721
+#endif
692 722
 #if defined(SPARE_IO) && SPARE_IO >= 0
693 723
   REPORT_NAME_DIGITAL(__LINE__, SPARE_IO)
694 724
 #endif
@@ -1043,3 +1073,9 @@
1043 1073
 #if PIN_EXISTS(E4_SERIAL_RX)
1044 1074
   REPORT_NAME_DIGITAL(__LINE__, E4_SERIAL_RX_PIN)
1045 1075
 #endif
1076
+#if PIN_EXISTS(E5_SERIAL_TX)
1077
+  REPORT_NAME_DIGITAL(__LINE__, E5_SERIAL_TX_PIN)
1078
+#endif
1079
+#if PIN_EXISTS(E5_SERIAL_RX)
1080
+  REPORT_NAME_DIGITAL(__LINE__, E5_SERIAL_RX_PIN)
1081
+#endif

Loading…
Cancel
Save