Преглед на файлове

Modify E-stepping macros for use in LINEAR_ADVANCE (#10885)

Scott Lahteine преди 7 години
родител
ревизия
4299e5dc8b
No account linked to committer's email address
променени са 2 файла, в които са добавени 57 реда и са изтрити 168 реда
  1. 18
    110
      Marlin/src/module/stepper.cpp
  2. 39
    58
      Marlin/src/module/stepper_indirection.h

+ 18
- 110
Marlin/src/module/stepper.cpp Целия файл

@@ -259,7 +259,7 @@ volatile int32_t Stepper::endstops_trigsteps[XYZ];
259 259
 #endif
260 260
 
261 261
 #if DISABLED(MIXING_EXTRUDER)
262
-  #define E_APPLY_STEP(v,Q) E_STEP_WRITE(v)
262
+  #define E_APPLY_STEP(v,Q) E_STEP_WRITE(current_block->active_extruder, v)
263 263
 #endif
264 264
 
265 265
 /**
@@ -315,11 +315,11 @@ void Stepper::set_directions() {
315 315
 
316 316
   #if DISABLED(LIN_ADVANCE)
317 317
     if (motor_direction(E_AXIS)) {
318
-      REV_E_DIR();
318
+      REV_E_DIR(current_block->active_extruder);
319 319
       count_direction[E_AXIS] = -1;
320 320
     }
321 321
     else {
322
-      NORM_E_DIR();
322
+      NORM_E_DIR(current_block->active_extruder);
323 323
       count_direction[E_AXIS] = 1;
324 324
     }
325 325
   #endif // !LIN_ADVANCE
@@ -1423,7 +1423,7 @@ void Stepper::stepper_pulse_phase_isr() {
1423 1423
           // Step mixing steppers (proportionally)
1424 1424
           counter_m[j] += current_block->steps[E_AXIS];
1425 1425
           // Step when the counter goes over zero
1426
-          if (counter_m[j] >= 0) En_STEP_WRITE(j, !INVERT_E_STEP_PIN);
1426
+          if (counter_m[j] >= 0) E_STEP_WRITE(j, !INVERT_E_STEP_PIN);
1427 1427
         }
1428 1428
       #else // !MIXING_EXTRUDER
1429 1429
         PULSE_START(E);
@@ -1465,7 +1465,7 @@ void Stepper::stepper_pulse_phase_isr() {
1465 1465
         MIXING_STEPPERS_LOOP(j) {
1466 1466
           if (counter_m[j] >= 0) {
1467 1467
             counter_m[j] -= current_block->mix_event_count[j];
1468
-            En_STEP_WRITE(j, INVERT_E_STEP_PIN);
1468
+            E_STEP_WRITE(j, INVERT_E_STEP_PIN);
1469 1469
           }
1470 1470
         }
1471 1471
       #else // !MIXING_EXTRUDER
@@ -1774,61 +1774,6 @@ uint32_t Stepper::stepper_block_phase_isr() {
1774 1774
   uint32_t Stepper::advance_isr() {
1775 1775
     uint32_t interval;
1776 1776
 
1777
-    #if ENABLED(MK2_MULTIPLEXER) // For SNMM even-numbered steppers are reversed
1778
-      #define SET_E_STEP_DIR(INDEX) do{ if (e_steps) E0_DIR_WRITE(e_steps < 0 ? !INVERT_E## INDEX ##_DIR ^ TEST(INDEX, 0) : INVERT_E## INDEX ##_DIR ^ TEST(INDEX, 0)); }while(0)
1779
-    #elif ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE)
1780
-      #define SET_E_STEP_DIR(INDEX) do{ if (e_steps) { if (e_steps < 0) REV_E_DIR(); else NORM_E_DIR(); } }while(0)
1781
-    #elif ENABLED(SWITCHING_EXTRUDER)
1782
-      #if EXTRUDERS > 4
1783
-        #define SET_E_STEP_DIR(INDEX) do{ if (e_steps) { switch (INDEX) { \
1784
-            case 0: case 1: E0_DIR_WRITE(!INVERT_E0_DIR ^ TEST(INDEX, 0) ^ (e_steps < 0)); break; \
1785
-            case 2: case 3: E1_DIR_WRITE(!INVERT_E1_DIR ^ TEST(INDEX, 0) ^ (e_steps < 0)); break; \
1786
-                    case 4: E2_DIR_WRITE(!INVERT_E2_DIR ^ TEST(INDEX, 0) ^ (e_steps < 0)); \
1787
-        } } }while(0)
1788
-      #elif EXTRUDERS > 2
1789
-        #define SET_E_STEP_DIR(INDEX) do{ if (e_steps) { switch (INDEX) { \
1790
-            case 0: case 1: E0_DIR_WRITE(!INVERT_E0_DIR ^ TEST(INDEX, 0) ^ (e_steps < 0)); break; \
1791
-            case 2: case 3: E1_DIR_WRITE(!INVERT_E1_DIR ^ TEST(INDEX, 0) ^ (e_steps < 0)); break; \
1792
-        } } }while(0)
1793
-      #else
1794
-        #define SET_E_STEP_DIR(INDEX) do{ if (e_steps) E0_DIR_WRITE(!INVERT_E0_DIR ^ TEST(INDEX, 0) ^ (e_steps < 0)); }while(0)
1795
-      #endif
1796
-    #else
1797
-      #define SET_E_STEP_DIR(INDEX) do{ if (e_steps) E## INDEX ##_DIR_WRITE(!INVERT_E## INDEX ##_DIR ^ (e_steps < 0)); }while(0)
1798
-    #endif
1799
-
1800
-    #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE)
1801
-      #define START_E_PULSE(INDEX) do{ if (e_steps) E_STEP_WRITE(!INVERT_E_STEP_PIN); }while(0)
1802
-      #define STOP_E_PULSE(INDEX) do{ if (e_steps) { e_steps < 0 ? ++e_steps : --e_steps; E_STEP_WRITE(INVERT_E_STEP_PIN); } }while(0)
1803
-    #elif ENABLED(SWITCHING_EXTRUDER)
1804
-      #if EXTRUDERS > 4
1805
-        #define START_E_PULSE(INDEX) do{ if (e_steps) { switch (INDEX) { \
1806
-            case 0: case 1: E0_STEP_WRITE(!INVERT_E_STEP_PIN); break; \
1807
-            case 2: case 3: E1_STEP_WRITE(!INVERT_E_STEP_PIN); break; \
1808
-                    case 4: E2_STEP_WRITE(!INVERT_E_STEP_PIN); } \
1809
-        } }while(0)
1810
-        #define STOP_E_PULSE(INDEX) do{ if (e_steps) { \
1811
-          e_steps < 0 ? ++e_steps : --e_steps; \
1812
-          switch (INDEX) { \
1813
-            case 0: case 1: E0_STEP_WRITE( INVERT_E_STEP_PIN); break; \
1814
-            case 2: case 3: E1_STEP_WRITE( INVERT_E_STEP_PIN); break; \
1815
-                    case 4: E2_STEP_WRITE( INVERT_E_STEP_PIN); } \
1816
-        } }while(0)
1817
-      #elif EXTRUDERS > 2
1818
-        #define START_E_PULSE(INDEX) do{ if (e_steps) { if (INDEX < 2) E0_STEP_WRITE(!INVERT_E_STEP_PIN); else E1_STEP_WRITE(!INVERT_E_STEP_PIN); } }while(0)
1819
-        #define STOP_E_PULSE(INDEX) do{ if (e_steps) { \
1820
-          e_steps < 0 ? ++e_steps : --e_steps; \
1821
-          if (INDEX < 2) E0_STEP_WRITE(INVERT_E_STEP_PIN); else E1_STEP_WRITE(INVERT_E_STEP_PIN); \
1822
-        } }while(0)
1823
-      #else
1824
-        #define START_E_PULSE(INDEX) do{ if (e_steps) E0_STEP_WRITE(!INVERT_E_STEP_PIN); }while(0)
1825
-        #define STOP_E_PULSE(INDEX) do{ if (e_steps) { e_steps < 0 ? ++e_steps : --e_steps; E0_STEP_WRITE(INVERT_E_STEP_PIN); }while(0)
1826
-      #endif
1827
-    #else
1828
-      #define START_E_PULSE(INDEX) do{ if (e_steps) E## INDEX ##_STEP_WRITE(!INVERT_E_STEP_PIN); }while(0)
1829
-      #define STOP_E_PULSE(INDEX) do { if (e_steps) { e_steps < 0 ? ++e_steps : --e_steps; E## INDEX ##_STEP_WRITE(INVERT_E_STEP_PIN); } }while(0)
1830
-    #endif
1831
-
1832 1777
     if (use_advance_lead) {
1833 1778
       if (step_events_completed > LA_decelerate_after && current_adv_steps > final_adv_steps) {
1834 1779
         e_steps--;
@@ -1847,21 +1792,10 @@ uint32_t Stepper::stepper_block_phase_isr() {
1847 1792
     else
1848 1793
       interval = ADV_NEVER;
1849 1794
 
1850
-    switch (LA_active_extruder) {
1851
-      case 0: SET_E_STEP_DIR(0); break;
1852
-      #if EXTRUDERS > 1
1853
-        case 1: SET_E_STEP_DIR(1); break;
1854
-        #if EXTRUDERS > 2
1855
-          case 2: SET_E_STEP_DIR(2); break;
1856
-          #if EXTRUDERS > 3
1857
-            case 3: SET_E_STEP_DIR(3); break;
1858
-            #if EXTRUDERS > 4
1859
-              case 4: SET_E_STEP_DIR(4); break;
1860
-            #endif // EXTRUDERS > 4
1861
-          #endif // EXTRUDERS > 3
1862
-        #endif // EXTRUDERS > 2
1863
-      #endif // EXTRUDERS > 1
1864
-    }
1795
+    if (e_steps >= 0)
1796
+      NORM_E_DIR(LA_active_extruder);
1797
+    else
1798
+      REV_E_DIR(LA_active_extruder);
1865 1799
 
1866 1800
     // Step E stepper if we have steps
1867 1801
     while (e_steps) {
@@ -1870,21 +1804,7 @@ uint32_t Stepper::stepper_block_phase_isr() {
1870 1804
         hal_timer_t pulse_start = HAL_timer_get_count(PULSE_TIMER_NUM);
1871 1805
       #endif
1872 1806
 
1873
-      switch (LA_active_extruder) {
1874
-        case 0: START_E_PULSE(0); break;
1875
-        #if EXTRUDERS > 1
1876
-          case 1: START_E_PULSE(1); break;
1877
-          #if EXTRUDERS > 2
1878
-            case 2: START_E_PULSE(2); break;
1879
-            #if EXTRUDERS > 3
1880
-              case 3: START_E_PULSE(3); break;
1881
-              #if EXTRUDERS > 4
1882
-                case 4: START_E_PULSE(4); break;
1883
-              #endif // EXTRUDERS > 4
1884
-            #endif // EXTRUDERS > 3
1885
-          #endif // EXTRUDERS > 2
1886
-        #endif // EXTRUDERS > 1
1887
-      }
1807
+      E_STEP_WRITE(LA_active_extruder, !INVERT_E_STEP_PIN);
1888 1808
 
1889 1809
       // For minimum pulse time wait before stopping pulses
1890 1810
       #if EXTRA_CYCLES_E > 20
@@ -1894,21 +1814,9 @@ uint32_t Stepper::stepper_block_phase_isr() {
1894 1814
         DELAY_NS(EXTRA_CYCLES_E * NANOSECONDS_PER_CYCLE);
1895 1815
       #endif
1896 1816
 
1897
-      switch (LA_active_extruder) {
1898
-        case 0: STOP_E_PULSE(0); break;
1899
-        #if EXTRUDERS > 1
1900
-          case 1: STOP_E_PULSE(1); break;
1901
-          #if EXTRUDERS > 2
1902
-            case 2: STOP_E_PULSE(2); break;
1903
-            #if EXTRUDERS > 3
1904
-              case 3: STOP_E_PULSE(3); break;
1905
-              #if EXTRUDERS > 4
1906
-                case 4: STOP_E_PULSE(4); break;
1907
-              #endif // EXTRUDERS > 4
1908
-            #endif // EXTRUDERS > 3
1909
-          #endif // EXTRUDERS > 2
1910
-        #endif // EXTRUDERS > 1
1911
-      }
1817
+      e_steps < 0 ? ++e_steps : --e_steps;
1818
+
1819
+      E_STEP_WRITE(LA_active_extruder, INVERT_E_STEP_PIN);
1912 1820
 
1913 1821
       // For minimum pulse time wait before looping
1914 1822
       #if EXTRA_CYCLES_E > 20
@@ -2061,19 +1969,19 @@ void Stepper::init() {
2061 1969
     AXIS_INIT(Z, Z);
2062 1970
   #endif
2063 1971
 
2064
-  #if HAS_E0_STEP
1972
+  #if E_STEPPERS > 0 && HAS_E0_STEP
2065 1973
     E_AXIS_INIT(0);
2066 1974
   #endif
2067
-  #if HAS_E1_STEP
1975
+  #if E_STEPPERS > 1 && HAS_E1_STEP
2068 1976
     E_AXIS_INIT(1);
2069 1977
   #endif
2070
-  #if HAS_E2_STEP
1978
+  #if E_STEPPERS > 2 && HAS_E2_STEP
2071 1979
     E_AXIS_INIT(2);
2072 1980
   #endif
2073
-  #if HAS_E3_STEP
1981
+  #if E_STEPPERS > 3 && HAS_E3_STEP
2074 1982
     E_AXIS_INIT(3);
2075 1983
   #endif
2076
-  #if HAS_E4_STEP
1984
+  #if E_STEPPERS > 4 && HAS_E4_STEP
2077 1985
     E_AXIS_INIT(4);
2078 1986
   #endif
2079 1987
 

+ 39
- 58
Marlin/src/module/stepper_indirection.h Целия файл

@@ -450,73 +450,54 @@ void reset_stepper_drivers();    // Called by settings.load / settings.reset
450 450
 /**
451 451
  * Extruder indirection for the single E axis
452 452
  */
453
-#if ENABLED(SWITCHING_EXTRUDER)
453
+#if ENABLED(SWITCHING_EXTRUDER) // One stepper driver per two extruders, reversed on odd index
454 454
   #if EXTRUDERS > 4
455
-    #define E_STEP_WRITE(v) do{ if (current_block->active_extruder < 2) { E0_STEP_WRITE(v); } else if (current_block->active_extruder < 4) { E1_STEP_WRITE(v); } else { E2_STEP_WRITE(v); } }while(0)
456
-    #define NORM_E_DIR() do{ switch (current_block->active_extruder) { 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)
457
-    #define REV_E_DIR()  do{ switch (current_block->active_extruder) { 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)
455
+    #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)
456
+    #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)
457
+    #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)
458 458
   #elif EXTRUDERS > 3
459
-    #define E_STEP_WRITE(v) do{ if (current_block->active_extruder < 2) { E0_STEP_WRITE(v); } else { E1_STEP_WRITE(v); } }while(0)
460
-    #define NORM_E_DIR() do{ switch (current_block->active_extruder) { 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); } }while(0)
461
-    #define REV_E_DIR()  do{ switch (current_block->active_extruder) { 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); } }while(0)
459
+    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
460
+    #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); } }while(0)
461
+    #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); } }while(0)
462 462
   #elif EXTRUDERS > 2
463
-    #define E_STEP_WRITE(v) do{ if (current_block->active_extruder < 2) { E0_STEP_WRITE(v); } else { E1_STEP_WRITE(v); } }while(0)
464
-    #define NORM_E_DIR() do{ switch (current_block->active_extruder) { 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); } }while(0)
465
-    #define REV_E_DIR()  do{ switch (current_block->active_extruder) { 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); } }while(0)
463
+    #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
464
+    #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); } }while(0)
465
+    #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); } }while(0)
466 466
   #else
467
-    #define E_STEP_WRITE(v) E0_STEP_WRITE(v)
468
-    #define NORM_E_DIR() do{ E0_DIR_WRITE(current_block->active_extruder ?  INVERT_E0_DIR : !INVERT_E0_DIR); }while(0)
469
-    #define REV_E_DIR()  do{ E0_DIR_WRITE(current_block->active_extruder ? !INVERT_E0_DIR :  INVERT_E0_DIR); }while(0)
467
+    #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
468
+    #define   NORM_E_DIR(E)   do{ E0_DIR_WRITE(E ?  INVERT_E0_DIR : !INVERT_E0_DIR); }while(0)
469
+    #define    REV_E_DIR(E)   do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR :  INVERT_E0_DIR); }while(0)
470 470
   #endif
471
-#elif ENABLED(MK2_MULTIPLEXER) // Even-numbered steppers are reversed
472
-  #define E_STEP_WRITE(v) E0_STEP_WRITE(v)
473
-  #define NORM_E_DIR() do{ E0_DIR_WRITE(TEST(current_block->active_extruder, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0)
474
-  #define REV_E_DIR()  do{ E0_DIR_WRITE(TEST(current_block->active_extruder, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0)
475
-#elif EXTRUDERS > 4
476
-  #define E_STEP_WRITE(v) do{ switch (current_block->active_extruder) { 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)
477
-  #define NORM_E_DIR() do{ switch (current_block->active_extruder) { 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)
478
-  #define REV_E_DIR()  do{ switch (current_block->active_extruder) { 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)
479
-#elif EXTRUDERS > 3
480
-  #define E_STEP_WRITE(v) do{ switch (current_block->active_extruder) { 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); } }while(0)
481
-  #define NORM_E_DIR() do{ switch (current_block->active_extruder) { 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); } }while(0)
482
-  #define REV_E_DIR()  do{ switch (current_block->active_extruder) { 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); } }while(0)
483
-#elif EXTRUDERS > 2
484
-  #define E_STEP_WRITE(v) do{ switch (current_block->active_extruder) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); break; case 2: E2_STEP_WRITE(v); } }while(0)
485
-  #define NORM_E_DIR() do{ switch (current_block->active_extruder) { 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); } }while(0)
486
-  #define REV_E_DIR()  do{ switch (current_block->active_extruder) { 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); } }while(0)
487
-#elif EXTRUDERS > 1
471
+#elif ENABLED(MK2_MULTIPLEXER) // One multiplexed stepper driver, reversed on odd index
472
+  #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
473
+  #define   NORM_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR:  INVERT_E0_DIR); }while(0)
474
+  #define    REV_E_DIR(E)   do{ E0_DIR_WRITE(TEST(E, 0) ?  INVERT_E0_DIR: !INVERT_E0_DIR); }while(0)
475
+#elif E_STEPPERS > 4
476
+  #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)
477
+  #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)
478
+  #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); } }while(0)
479
+#elif E_STEPPERS > 3
480
+  #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); } }while(0)
481
+  #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); } }while(0)
482
+  #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); } }while(0)
483
+#elif E_STEPPERS > 2
484
+  #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); } }while(0)
485
+  #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); } }while(0)
486
+  #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); } }while(0)
487
+#elif E_STEPPERS > 1
488 488
   #if ENABLED(DUAL_X_CARRIAGE) || ENABLED(DUAL_NOZZLE_DUPLICATION_MODE)
489
-    #define E_STEP_WRITE(v) do{ if (extruder_duplication_enabled) { E0_STEP_WRITE(v); E1_STEP_WRITE(v); } else if (current_block->active_extruder == 0) { E0_STEP_WRITE(v); } else { E1_STEP_WRITE(v); } }while(0)
490
-    #define NORM_E_DIR() do{ if (extruder_duplication_enabled) { E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); } else if (current_block->active_extruder == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
491
-    #define REV_E_DIR()  do{ if (extruder_duplication_enabled) { E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); } else if (current_block->active_extruder == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
489
+    #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { E0_STEP_WRITE(V); E1_STEP_WRITE(V); } else if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
490
+    #define   NORM_E_DIR(E)   do{ if (extruder_duplication_enabled) { E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); } else if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
491
+    #define    REV_E_DIR(E)   do{ if (extruder_duplication_enabled) { E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); } else if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
492 492
   #else
493
-    #define E_STEP_WRITE(v) do{ if (current_block->active_extruder == 0) { E0_STEP_WRITE(v); } else { E1_STEP_WRITE(v); } }while(0)
494
-    #define NORM_E_DIR() do{ if (current_block->active_extruder == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
495
-    #define REV_E_DIR()  do{ if (current_block->active_extruder == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
496
-  #endif
497
-#elif ENABLED(MIXING_EXTRUDER)
498
-  #define E_STEP_WRITE(v) NOOP /* not used for mixing extruders! */
499
-  #if MIXING_STEPPERS > 4
500
-    #define En_STEP_WRITE(n,v) do{ switch (n) { 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)
501
-    #define NORM_E_DIR() do{ E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); E2_DIR_WRITE(!INVERT_E2_DIR); E3_DIR_WRITE(!INVERT_E3_DIR); E4_DIR_WRITE(!INVERT_E4_DIR); }while(0)
502
-    #define REV_E_DIR()  do{ E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); E2_DIR_WRITE( INVERT_E2_DIR); E3_DIR_WRITE( INVERT_E3_DIR); E4_DIR_WRITE( INVERT_E4_DIR); }while(0)
503
-  #elif MIXING_STEPPERS > 3
504
-    #define En_STEP_WRITE(n,v) do{ switch (n) { 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); } }while(0)
505
-    #define NORM_E_DIR() do{ E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); E2_DIR_WRITE(!INVERT_E2_DIR); E3_DIR_WRITE(!INVERT_E3_DIR); }while(0)
506
-    #define REV_E_DIR()  do{ E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); E2_DIR_WRITE( INVERT_E2_DIR); E3_DIR_WRITE( INVERT_E3_DIR); }while(0)
507
-  #elif MIXING_STEPPERS > 2
508
-    #define En_STEP_WRITE(n,v) do{ switch (n) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); break; case 2: E2_STEP_WRITE(v); } }while(0)
509
-    #define NORM_E_DIR() do{ E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); E2_DIR_WRITE(!INVERT_E2_DIR); }while(0)
510
-    #define REV_E_DIR()  do{ E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); E2_DIR_WRITE( INVERT_E2_DIR); }while(0)
511
-  #else
512
-    #define En_STEP_WRITE(n,v) do{ switch (n) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); } }while(0)
513
-    #define NORM_E_DIR() do{ E0_DIR_WRITE(!INVERT_E0_DIR); E1_DIR_WRITE(!INVERT_E1_DIR); }while(0)
514
-    #define REV_E_DIR()  do{ E0_DIR_WRITE( INVERT_E0_DIR); E1_DIR_WRITE( INVERT_E1_DIR); }while(0)
493
+    #define E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0)
494
+    #define   NORM_E_DIR(E)   do{ if (E == 0) { E0_DIR_WRITE(!INVERT_E0_DIR); } else { E1_DIR_WRITE(!INVERT_E1_DIR); } }while(0)
495
+    #define    REV_E_DIR(E)   do{ if (E == 0) { E0_DIR_WRITE( INVERT_E0_DIR); } else { E1_DIR_WRITE( INVERT_E1_DIR); } }while(0)
515 496
   #endif
516 497
 #else
517
-  #define E_STEP_WRITE(v) E0_STEP_WRITE(v)
518
-  #define NORM_E_DIR() E0_DIR_WRITE(!INVERT_E0_DIR)
519
-  #define REV_E_DIR() E0_DIR_WRITE( INVERT_E0_DIR)
498
+  #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
499
+  #define   NORM_E_DIR(E)   E0_DIR_WRITE(!INVERT_E0_DIR)
500
+  #define    REV_E_DIR(E)   E0_DIR_WRITE( INVERT_E0_DIR)
520 501
 #endif
521 502
 
522 503
 #endif // STEPPER_INDIRECTION_H

Loading…
Отказ
Запис