Skip to content
Snippets Groups Projects
Configuration_adv.h 98.6 KiB
Newer Older
  • Learn to ignore specific revisions
  •  * Marlin 3D Printer Firmware
    
     * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
    
     *
     * Based on Sprinter and grbl.
     * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
     *
     * This program is free software: you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     *
     */
    
    /**
     * Configuration_adv.h
     *
     * Advanced settings.
     * Only change these if you know exactly what you're doing.
     * Some of these settings can damage your printer if improperly set!
     *
     * Basic settings can be found in Configuration.h
     *
     */
    
    #define CONFIGURATION_ADV_H_VERSION 020000
    
    //===========================================================================
    //=============================Thermal Settings  ============================
    //===========================================================================
    
    
    //
    // Custom Thermistor 1000 parameters
    //
    #if TEMP_SENSOR_0 == 1000
      #define HOTEND0_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND0_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND0_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_1 == 1000
      #define HOTEND1_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND1_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND1_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_2 == 1000
      #define HOTEND2_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND2_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND2_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_3 == 1000
      #define HOTEND3_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND3_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND3_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_4 == 1000
      #define HOTEND4_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND4_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND4_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_5 == 1000
      #define HOTEND5_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define HOTEND5_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define HOTEND5_BETA                 3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_BED == 1000
      #define BED_PULLUP_RESISTOR_OHMS     4700    // Pullup resistor
      #define BED_RESISTANCE_25C_OHMS      100000  // Resistance at 25C
      #define BED_BETA                     3950    // Beta value
    #endif
    
    #if TEMP_SENSOR_CHAMBER == 1000
      #define CHAMBER_PULLUP_RESISTOR_OHMS 4700    // Pullup resistor
      #define CHAMBER_RESISTANCE_25C_OHMS  100000  // Resistance at 25C
      #define CHAMBER_BETA                 3950    // Beta value
    #endif
    
    
    //
    // Hephestos 2 24V heated bed upgrade kit.
    // https://store.bq.com/en/heated-bed-kit-hephestos2
    //
    //#define HEPHESTOS2_HEATED_BED_KIT
    #if ENABLED(HEPHESTOS2_HEATED_BED_KIT)
      #undef TEMP_SENSOR_BED
      #define TEMP_SENSOR_BED 70
      #define HEATER_BED_INVERTING true
    #endif
    
    
    /**
     * Heated Chamber settings
     */
    #if TEMP_SENSOR_CHAMBER
      #define CHAMBER_MINTEMP             5
      #define CHAMBER_MAXTEMP            60
      #define TEMP_CHAMBER_HYSTERESIS     1   // (°C) Temperature proximity considered "close enough" to the target
      //#define CHAMBER_LIMIT_SWITCHING
      //#define HEATER_CHAMBER_PIN       44   // Chamber heater on/off pin
      //#define HEATER_CHAMBER_INVERTING false
    #endif
    
    
    #if DISABLED(PIDTEMPBED)
      #define BED_CHECK_INTERVAL 5000 // ms between checks in bang-bang control
      #if ENABLED(BED_LIMIT_SWITCHING)
        #define BED_HYSTERESIS 2 // Only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS
      #endif
    
     * Thermal Protection provides additional protection to your printer from damage
     * and fire. Marlin always includes safe min and max temperature ranges which
     * protect against a broken or disconnected thermistor wire.
    
     * The issue: If a thermistor falls out, it will report the much lower
     * temperature of the air in the room, and the the firmware will keep
     * the heater on.
    
     *
     * The solution: Once the temperature reaches the target, start observing.
    
     * If the temperature stays too far below the target (hysteresis) for too
     * long (period), the firmware will halt the machine as a safety precaution.
    
     * If you get false positives for "Thermal Runaway", increase
     * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD
    
    #if ENABLED(THERMAL_PROTECTION_HOTENDS)
    
      #define THERMAL_PROTECTION_PERIOD 40        // Seconds
      #define THERMAL_PROTECTION_HYSTERESIS 4     // Degrees Celsius
    
    
      //#define ADAPTIVE_FAN_SLOWING              // Slow part cooling fan if temperature drops
    
      #if BOTH(ADAPTIVE_FAN_SLOWING, PIDTEMP)
    
        //#define NO_FAN_SLOWING_IN_PID_TUNING    // Don't slow fan speed during M303
      #endif
    
       * Whenever an M104, M109, or M303 increases the target temperature, the
       * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature
       * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and
       * requires a hard reset. This test restarts with any M104/M109/M303, but only
       * if the current temperature is far enough below the target for a reliable
       * test.
    
       * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD
       * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set
       * below 2.
    
      #define WATCH_TEMP_PERIOD 20                // Seconds
      #define WATCH_TEMP_INCREASE 2               // Degrees Celsius
    
     * Thermal Protection parameters for the bed are just as above for hotends.
    
    #if ENABLED(THERMAL_PROTECTION_BED)
    
      #define THERMAL_PROTECTION_BED_PERIOD 20    // Seconds
      #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius
    
       * As described above, except for the bed (M140/M190/M303).
    
       */
      #define WATCH_BED_TEMP_PERIOD 60                // Seconds
      #define WATCH_BED_TEMP_INCREASE 2               // Degrees Celsius
    
    /**
     * Thermal Protection parameters for the heated chamber.
     */
    #if ENABLED(THERMAL_PROTECTION_CHAMBER)
      #define THERMAL_PROTECTION_CHAMBER_PERIOD 20    // Seconds
      #define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // Degrees Celsius
    
      /**
       * Heated chamber watch settings (M141/M191).
       */
      #define WATCH_CHAMBER_TEMP_PERIOD 60            // Seconds
      #define WATCH_CHAMBER_TEMP_INCREASE 2           // Degrees Celsius
    #endif
    
    
    #if ENABLED(PIDTEMP)
    
      // Add an experimental additional term to the heater power, proportional to the extrusion speed.
      // A well-chosen Kc value should add just enough power to melt the increased material volume.
    
      //#define PID_EXTRUSION_SCALING
      #if ENABLED(PID_EXTRUSION_SCALING)
    
        #define DEFAULT_Kc (100) //heating power=Kc*(e_speed)
        #define LPQ_MAX_LEN 50
    
    /**
     * Automatic Temperature:
     * The hotend target temperature is calculated by all the buffered lines of gcode.
     * The maximum buffered steps/sec of the extruder motor is called "se".
     * Start autotemp mode with M109 S<mintemp> B<maxtemp> F<factor>
     * The target temperature is set to mintemp+factor*se[steps/sec] and is limited by
    
     * mintemp and maxtemp. Turn this off by executing M109 without F*
    
     * Also, if the temperature is set to a value below mintemp, it will not be changed by autotemp.
     * On an Ultimaker, some initial testing worked with M109 S215 B260 F1 in the start.gcode
     */
    
    #if ENABLED(AUTOTEMP)
    
      #define AUTOTEMP_OLDWEIGHT 0.98
    #endif
    
    
    // Show extra position information in M114
    //#define M114_DETAIL
    
    
    // Show Temperature ADC value
    // Enable for M105 to include ADC values read from temperature sensors.
    
    Alex Borro's avatar
    Alex Borro committed
    //#define SHOW_TEMP_ADC_VALUES
    
    
    /**
     * High Temperature Thermistor Support
     *
     * Thermistors able to support high temperature tend to have a hard time getting
     * good readings at room and lower temperatures. This means HEATER_X_RAW_LO_TEMP
     * will probably be caught when the heating element first turns on during the
     * preheating process, which will trigger a min_temp_error as a safety measure
     * and force stop everything.
     * To circumvent this limitation, we allow for a preheat time (during which,
     * min_temp_error won't be triggered) and add a min_temp buffer to handle
     * aberrant readings.
     *
     * If you want to enable this feature for your hotend thermistor(s)
     * uncomment and set values > 0 in the constants below
     */
    
    // The number of consecutive low temperature errors that can occur
    // before a min_temp_error is triggered. (Shouldn't be more than 10.)
    //#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0
    
    // The number of milliseconds a hotend will preheat before starting to check
    // the temperature. This value should NOT be set to the time it takes the
    // hot end to reach the target temperature, but the time it takes to reach
    // the minimum temperature your thermistor can read. The lower the better/safer.
    // This shouldn't need to be more than 30 seconds (30000)
    //#define MILLISECONDS_PREHEAT_TIME 0
    
    
    // Extruder runout prevention.
    // If the machine is idle and the temperature over MINTEMP
    // then extrude some filament every couple of SECONDS.
    
    //#define EXTRUDER_RUNOUT_PREVENT
    
    #if ENABLED(EXTRUDER_RUNOUT_PREVENT)
      #define EXTRUDER_RUNOUT_MINTEMP 190
      #define EXTRUDER_RUNOUT_SECONDS 30
    
      #define EXTRUDER_RUNOUT_SPEED 1500  // (mm/m)
      #define EXTRUDER_RUNOUT_EXTRUDE 5   // (mm)
    
    // Calibration for AD595 / AD8495 sensor to adjust temperature measurements.
    // The final temperature is calculated as (measuredTemp * GAIN) + OFFSET.
    #define TEMP_SENSOR_AD595_OFFSET  0.0
    #define TEMP_SENSOR_AD595_GAIN    1.0
    #define TEMP_SENSOR_AD8495_OFFSET 0.0
    #define TEMP_SENSOR_AD8495_GAIN   1.0
    
    /**
     * Controller Fan
     * To cool down the stepper drivers and MOSFETs.
     *
     * The fan will turn on automatically whenever any stepper is enabled
     * and turn off after a set period after all steppers are turned off.
     */
    //#define USE_CONTROLLER_FAN
    #if ENABLED(USE_CONTROLLER_FAN)
    
    Bob-the-Kuhn's avatar
    Bob-the-Kuhn committed
      //#define CONTROLLER_FAN_PIN -1        // Set a custom pin for the controller fan
    
      #define CONTROLLERFAN_SECS 60          // Duration in seconds for the fan to run after all motors are disabled
      #define CONTROLLERFAN_SPEED 255        // 255 == full speed
    #endif
    
    // When first starting the main fan, run it at full speed for the
    // given number of milliseconds.  This gets the fan spinning reliably
    
    // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu)
    //#define FAN_KICKSTART_TIME 100
    
    /**
     * PWM Fan Scaling
     *
     * Define the min/max speeds for PWM fans (as set with M106).
     *
     * With these options the M106 0-255 value range is scaled to a subset
     * to ensure that the fan has enough power to spin, or to run lower
     * current fans with higher current. (e.g., 5V/12V fans with 12V/24V)
     * Value 0 always turns off the fan.
     *
     * Define one or both of these to override the default 0-255 range.
     */
    
    //#define FAN_MAX_PWM 128
    
    /**
     * FAST PWM FAN Settings
     *
     * Use to change the FAST FAN PWM frequency (if enabled in Configuration.h)
     * Combinations of PWM Modes, prescale values and TOP resolutions are used internally to produce a
     * frequency as close as possible to the desired frequency.
     *
     * FAST_PWM_FAN_FREQUENCY [undefined by default]
     *   Set this to your desired frequency.
     *   If left undefined this defaults to F = F_CPU/(2*255*1)
     *   ie F = 31.4 Khz on 16 MHz microcontrollers or F = 39.2 KHz on 20 MHz microcontrollers
     *   These defaults are the same as with the old FAST_PWM_FAN implementation - no migration is required
    
     *   NOTE: Setting very low frequencies (< 10 Hz) may result in unexpected timer behavior.
    
     *
     * USE_OCR2A_AS_TOP [undefined by default]
     *   Boards that use TIMER2 for PWM have limitations resulting in only a few possible frequencies on TIMER2:
     *   16MHz MCUs: [62.5KHz, 31.4KHz (default), 7.8KHz, 3.92KHz, 1.95KHz, 977Hz, 488Hz, 244Hz, 60Hz, 122Hz, 30Hz]
     *   20MHz MCUs: [78.1KHz, 39.2KHz (default), 9.77KHz, 4.9KHz, 2.44KHz, 1.22KHz, 610Hz, 305Hz, 153Hz, 76Hz, 38Hz]
     *   A greater range can be achieved by enabling USE_OCR2A_AS_TOP. But note that this option blocks the use of
     *   PWM on pin OC2A. Only use this option if you don't need PWM on 0C2A. (Check your schematic.)
     *   USE_OCR2A_AS_TOP sacrifices duty cycle control resolution to achieve this broader range of frequencies.
     */
    #if ENABLED(FAST_PWM_FAN)
      //#define FAST_PWM_FAN_FREQUENCY 31400
      //#define USE_OCR2A_AS_TOP
    #endif
    
    
    /**
     * Extruder cooling fans
     *
     * Extruder auto fans automatically turn on when their extruders'
     * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE.
     *
     * Your board's pins file specifies the recommended pins. Override those here
     * or set to -1 to disable completely.
     *
     * Multiple extruders can be assigned to the same pin in which case
     * the fan will turn on when any selected extruder is above the threshold.
     */
    #define E0_AUTO_FAN_PIN -1
    #define E1_AUTO_FAN_PIN -1
    #define E2_AUTO_FAN_PIN -1
    #define E3_AUTO_FAN_PIN -1
    
    #define E4_AUTO_FAN_PIN -1
    
    #define E5_AUTO_FAN_PIN -1
    
    #define CHAMBER_AUTO_FAN_PIN -1
    
    #define EXTRUDER_AUTO_FAN_TEMPERATURE 50
    
    #define EXTRUDER_AUTO_FAN_SPEED 255   // 255 == full speed
    
    /**
     * Part-Cooling Fan Multiplexer
    
    Scott Lahteine's avatar
    Scott Lahteine committed
     *
    
     * This feature allows you to digitally multiplex the fan output.
     * The multiplexer is automatically switched at tool-change.
     * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans.
     */
    #define FANMUX0_PIN -1
    #define FANMUX1_PIN -1
    #define FANMUX2_PIN -1
    
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    /**
     * M355 Case Light on-off / brightness
     */
    
    //#define CASE_LIGHT_ENABLE
    #if ENABLED(CASE_LIGHT_ENABLE)
    
      //#define CASE_LIGHT_PIN 4                  // Override the default pin if needed
      #define INVERT_CASE_LIGHT false             // Set true if Case Light is ON when pin is LOW
      #define CASE_LIGHT_DEFAULT_ON true          // Set default power-up state on
      #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105   // Set default power-up brightness (0-255, requires PWM pin)
    
      //#define CASE_LIGHT_MENU                   // Add Case Light options to the LCD menu
      //#define CASE_LIGHT_NO_BRIGHTNESS          // Disable brightness control. Enable for non-PWM lighting.
    
      //#define CASE_LIGHT_USE_NEOPIXEL           // Use Neopixel LED as case light, requires NEOPIXEL_LED.
      #if ENABLED(CASE_LIGHT_USE_NEOPIXEL)
        #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White }
      #endif
    
    Stanley's avatar
    Stanley committed
    
    
    // If you want endstops to stay on (by default) even when not homing
    // enable this option. Override at any time with M120, M121.
    //#define ENDSTOPS_ALWAYS_ON_DEFAULT
    
    //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats.
    
    
    // Employ an external closed loop controller. Override pins here if needed.
    //#define EXTERNAL_CLOSED_LOOP_CONTROLLER
    #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER)
      //#define CLOSED_LOOP_ENABLE_PIN        -1
      //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1
    #endif
    
    
    /**
     * Dual Steppers / Dual Endstops
     *
     * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes.
     *
     * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to
     * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop
     * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug
     * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'.
     *
     * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors
     * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error
     * in X2. Dual endstop offsets can be set at runtime with 'M666 X<offset> Y<offset> Z<offset>'.
     */
    
    
    //#define X_DUAL_STEPPER_DRIVERS
    #if ENABLED(X_DUAL_STEPPER_DRIVERS)
    
      #define INVERT_X2_VS_X_DIR true   // Set 'true' if X motors should rotate in opposite directions
      //#define X_DUAL_ENDSTOPS
      #if ENABLED(X_DUAL_ENDSTOPS)
        #define X2_USE_ENDSTOP _XMAX_
        #define X_DUAL_ENDSTOPS_ADJUSTMENT  0
      #endif
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    //#define Y_DUAL_STEPPER_DRIVERS
    
    #if ENABLED(Y_DUAL_STEPPER_DRIVERS)
    
      #define INVERT_Y2_VS_Y_DIR true   // Set 'true' if Y motors should rotate in opposite directions
      //#define Y_DUAL_ENDSTOPS
      #if ENABLED(Y_DUAL_ENDSTOPS)
        #define Y2_USE_ENDSTOP _YMAX_
        #define Y_DUAL_ENDSTOPS_ADJUSTMENT  0
      #endif
    
    Scott Lahteine's avatar
    Scott Lahteine committed
    //#define Z_DUAL_STEPPER_DRIVERS
    
    #if ENABLED(Z_DUAL_STEPPER_DRIVERS)
    
    Richard Wackerbarth's avatar
    Richard Wackerbarth committed
      //#define Z_DUAL_ENDSTOPS
    
      #if ENABLED(Z_DUAL_ENDSTOPS)
    
        #define Z2_USE_ENDSTOP _XMAX_
    
        #define Z_DUAL_ENDSTOPS_ADJUSTMENT  0
    
    //#define Z_TRIPLE_STEPPER_DRIVERS
    #if ENABLED(Z_TRIPLE_STEPPER_DRIVERS)
      //#define Z_TRIPLE_ENDSTOPS
      #if ENABLED(Z_TRIPLE_ENDSTOPS)
        #define Z2_USE_ENDSTOP _XMAX_
        #define Z3_USE_ENDSTOP _YMAX_
    
        #define Z_TRIPLE_ENDSTOPS_ADJUSTMENT2  0
        #define Z_TRIPLE_ENDSTOPS_ADJUSTMENT3  0
    
    /**
     * Dual X Carriage
     *
     * This setup has two X carriages that can move independently, each with its own hotend.
     * The carriages can be used to print an object with two colors or materials, or in
     * "duplication mode" it can print two identical or X-mirrored objects simultaneously.
     * The inactive carriage is parked automatically to prevent oozing.
     * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis.
     * By default the X2 stepper is assigned to the first unused E plug on the board.
    
     * The following Dual X Carriage modes can be selected with M605 S<mode>:
    
     *   0 : (FULL_CONTROL) The slicer has full control over both X-carriages and can achieve optimal travel
     *       results as long as it supports dual X-carriages. (M605 S0)
    
     *   1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so
     *       that additional slicer support is not required. (M605 S1)
    
     *   2 : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with
     *       the first X-carriage and extruder, to print 2 copies of the same object at the same time.
     *       Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and
     *       follow with M605 S2 to initiate duplicated movement.
    
     *   3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates
     *       the movement of the first except the second extruder is reversed in the X axis.
     *       Set the initial X offset and temperature differential with M605 S2 X[offs] R[deg] and
     *       follow with M605 S3 to initiate mirrored movement.
    
    //#define DUAL_X_CARRIAGE
    
    #if ENABLED(DUAL_X_CARRIAGE)
    
      #define X1_MIN_POS X_MIN_POS   // Set to X_MIN_POS
      #define X1_MAX_POS X_BED_SIZE  // Set a maximum so the first X-carriage can't hit the parked second X-carriage
      #define X2_MIN_POS    80       // Set a minimum to ensure the  second X-carriage can't hit the parked first X-carriage
      #define X2_MAX_POS   353       // Set this to the distance between toolheads when both heads are homed
      #define X2_HOME_DIR    1       // Set to 1. The second X-carriage always homes to the maximum endstop position
      #define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS.
                          // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software
                          // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops
                          // without modifying the firmware (through the "M218 T1 X???" command).
                          // Remember: you should set the second extruder x-offset to 0 in your slicer.
    
    
      // This is the default power-up mode which can be later using M605.
    
      #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE
    
    
      // Default x offset in duplication mode (typically set to half print bed width)
      #define DEFAULT_DUPLICATION_X_OFFSET 100
    
    #endif // DUAL_X_CARRIAGE
    
    // Activate a solenoid on the active extruder with M380. Disable all with M381.
    // Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid.
    //#define EXT_SOLENOID
    
    // Homing hits each endstop, retracts by these distances, then does a slower bump.
    
    #define X_HOME_BUMP_MM 5
    #define Y_HOME_BUMP_MM 5
    #define Z_HOME_BUMP_MM 2
    
    #define HOMING_BUMP_DIVISOR { 2, 2, 4 }  // Re-Bump Speed Divisor (Divides the Homing Feedrate)
    //#define QUICK_HOME                     // If homing includes X and Y, do a diagonal move initially
    
    //#define HOMING_BACKOFF_MM { 2, 2, 2 }  // (mm) Move away from the endstops after homing
    
    // When G28 is called, this option will make Y home before X
    
    Richard Wackerbarth's avatar
    Richard Wackerbarth committed
    //#define HOME_Y_BEFORE_X
    
    // Enable this if X or Y can't home without homing the other axis first.
    //#define CODEPENDENT_XY_HOMING
    
    
    #if ENABLED(BLTOUCH)
      /**
       * Either: Use the defaults (recommended) or: For special purposes, use the following DEFINES
       * Do not activate settings that the probe might not understand. Clones might misunderstand
       * advanced commands.
       *
       * Note: If the probe is not deploying, check a "Cmd: Reset" and "Cmd: Self-Test" and then
       *       check the wiring of the BROWN, RED and ORANGE wires.
       *
       * Note: If the trigger signal of your probe is not being recognized, it has been very often
       *       because the BLACK and WHITE wires needed to be swapped. They are not "interchangeable"
       *       like they would be with a real switch. So please check the wiring first.
       *
       * Settings for all BLTouch and clone probes:
       */
    
      // Safety: The probe needs time to recognize the command.
      //         Minimum command delay (ms). Enable and increase if needed.
      //#define BLTOUCH_DELAY 500
    
      /**
       * Settings for BLTOUCH Classic 1.2, 1.3 or BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1, and most clones:
       */
    
      // Feature: Switch into SW mode after a deploy. It makes the output pulse longer. Can be useful
      //          in special cases, like noisy or filtered input configurations.
      //#define BLTOUCH_FORCE_SW_MODE
    
      /**
       * Settings for BLTouch Smart 3.0 and 3.1
       * Summary:
       *   - Voltage modes: 5V and OD (open drain - "logic voltage free") output modes
       *   - High-Speed mode
       *   - Disable LCD voltage options
       */
    
      /**
       * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller!
       * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup.
       * If disabled, OD mode is the hard-coded default on 3.0
       * On startup, Marlin will compare its eeprom to this vale. If the selected mode
       * differs, a mode set eeprom write will be completed at initialization.
       * Use the option below to force an eeprom write to a V3.1 probe regardless.
       */
      //#define BLTOUCH_SET_5V_MODE
    
      /**
       * Safety: Activate if connecting a probe with an unknown voltage mode.
       * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0
       * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write )
       * To preserve the life of the probe, use this once then turn it off and re-flash.
       */
      //#define BLTOUCH_FORCE_MODE_SET
    
      /**
       * Use "HIGH SPEED" mode for probing.
       * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems.
       * This feature was designed for Delta's with very fast Z moves however higher speed cartesians may function
       * If the machine cannot raise the probe fast enough after a trigger, it may enter a fault state.
       */
      //#define BLTOUCH_HS_MODE
    
      // Safety: Enable voltage mode settings in the LCD menu.
      //#define BLTOUCH_LCD_VOLTAGE_MENU
    
    #endif // BLTOUCH
    
    
    /**
     * Z Steppers Auto-Alignment
     * Add the G34 command to align multiple Z steppers using a bed probe.
     */
    
    //#define Z_STEPPER_AUTO_ALIGN
    #if ENABLED(Z_STEPPER_AUTO_ALIGN)
      // Define probe X and Y positions for Z1, Z2 [, Z3]
      #define Z_STEPPER_ALIGN_X { 10, 150, 290 }
      #define Z_STEPPER_ALIGN_Y { 290, 10, 290 }
      // Set number of iterations to align
      #define Z_STEPPER_ALIGN_ITERATIONS 3
      // Enable to restore leveling setup after operation
      #define RESTORE_LEVELING_AFTER_G34
    
    
      // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm
      #define G34_MAX_GRADE  5  // (%) Maximum incline G34 will handle
    
    
      // Use the amplification factor to de-/increase correction step.
      // In case the stepper (spindle) position is further out than the test point
      // Use a value > 1. NOTE: This may cause instability
      #define Z_STEPPER_ALIGN_AMP 1.0
      // Stop criterion. If the accuracy is better than this stop iterating early
      #define Z_STEPPER_ALIGN_ACC 0.02
    #endif
    
    
    #define AXIS_RELATIVE_MODES { false, false, false, false }
    
    // Add a Duplicate option for well-separated conjoined nozzles
    //#define MULTI_NOZZLE_DUPLICATION
    
    
    // By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step.
    
    #define INVERT_X_STEP_PIN false
    #define INVERT_Y_STEP_PIN false
    #define INVERT_Z_STEP_PIN false
    #define INVERT_E_STEP_PIN false
    
    
    // Default stepper release if idle. Set to 0 to deactivate.
    
    // Steppers will shut down DEFAULT_STEPPER_DEACTIVE_TIME seconds after the last move when DISABLE_INACTIVE_? is true.
    
    // Time can be set by M18 and M84.
    #define DEFAULT_STEPPER_DEACTIVE_TIME 120
    #define DISABLE_INACTIVE_X true
    #define DISABLE_INACTIVE_Y true
    
    #define DISABLE_INACTIVE_Z true  // Set to false if the nozzle will fall down on your printed part when print has finished.
    
    #define DISABLE_INACTIVE_E true
    
    
    #define DEFAULT_MINIMUMFEEDRATE       0.0     // minimum feedrate
    #define DEFAULT_MINTRAVELFEEDRATE     0.0
    
    
    Brian's avatar
    Brian committed
    //#define HOME_AFTER_DEACTIVATE  // Require rehoming after steppers are deactivated
    
    
    #if EITHER(ULTIPANEL, EXTENSIBLE_UI)
    
      #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 60 } // Feedrates for manual moves along X, Y, Z, E from panel
      #if ENABLED(ULTIPANEL)
        #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position"
        #define ULTIPANEL_FEEDMULTIPLY  // Encoder sets the feedrate multiplier on the Status Screen
      #endif
    
    // minimum time in microseconds that a movement needs to take if the buffer is emptied.
    #define DEFAULT_MINSEGMENTTIME        20000
    
    
    // If defined the movements slow down when the look ahead buffer is only half full
    #define SLOWDOWN
    
    // Frequency limit
    // See nophead's blog for more info
    // Not working O
    //#define XY_FREQUENCY_LIMIT  15
    
    // Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end
    // of the buffer and all stops. This should not be much greater than zero and should only be changed
    // if unwanted behavior is observed on a user's machine when running at very slow speeds.
    
    #define MINIMUM_PLANNER_SPEED 0.05 // (mm/s)
    
    //
    // Backlash Compensation
    // Adds extra movement to axes on direction-changes to account for backlash.
    //
    //#define BACKLASH_COMPENSATION
    #if ENABLED(BACKLASH_COMPENSATION)
      // Define values for backlash distance and correction.
      // If BACKLASH_GCODE is enabled these values are the defaults.
      #define BACKLASH_DISTANCE_MM { 0, 0, 0 } // (mm)
      #define BACKLASH_CORRECTION    0.0       // 0.0 = no correction; 1.0 = full correction
    
      // Set BACKLASH_SMOOTHING_MM to spread backlash correction over multiple segments
      // to reduce print artifacts. (Enabling this is costly in memory and computation!)
      //#define BACKLASH_SMOOTHING_MM 3 // (mm)
    
      // Add runtime configuration and tuning of backlash values (M425)
      //#define BACKLASH_GCODE
    
      #if ENABLED(BACKLASH_GCODE)
        // Measure the Z backlash when probing (G29) and set with "M425 Z"
        #define MEASURE_BACKLASH_WHEN_PROBING
    
        #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING)
          // When measuring, the probe will move up to BACKLASH_MEASUREMENT_LIMIT
          // mm away from point of contact in BACKLASH_MEASUREMENT_RESOLUTION
          // increments while checking for the contact to be broken.
          #define BACKLASH_MEASUREMENT_LIMIT       0.5   // (mm)
          #define BACKLASH_MEASUREMENT_RESOLUTION  0.005 // (mm)
          #define BACKLASH_MEASUREMENT_FEEDRATE    Z_PROBE_SPEED_SLOW // (mm/m)
        #endif
      #endif
    #endif
    
    
    /**
     * Automatic backlash, position and hotend offset calibration
     *
     * Enable G425 to run automatic calibration using an electrically-
     * conductive cube, bolt, or washer mounted on the bed.
     *
     * G425 uses the probe to touch the top and sides of the calibration object
     * on the bed and measures and/or correct positional offsets, axis backlash
     * and hotend offsets.
     *
     * Note: HOTEND_OFFSET and CALIBRATION_OBJECT_CENTER must be set to within
     *       ±5mm of true values for G425 to succeed.
     */
    //#define CALIBRATION_GCODE
    #if ENABLED(CALIBRATION_GCODE)
    
      #define CALIBRATION_MEASUREMENT_RESOLUTION     0.01 // mm
    
      #define CALIBRATION_FEEDRATE_SLOW             60    // mm/m
      #define CALIBRATION_FEEDRATE_FAST           1200    // mm/m
      #define CALIBRATION_FEEDRATE_TRAVEL         3000    // mm/m
    
      // The following parameters refer to the conical section of the nozzle tip.
      #define CALIBRATION_NOZZLE_TIP_HEIGHT          1.0  // mm
      #define CALIBRATION_NOZZLE_OUTER_DIAMETER      2.0  // mm
    
      // Uncomment to enable reporting (required for "G425 V", but consumes PROGMEM).
      //#define CALIBRATION_REPORTING
    
      // The true location and dimension the cube/bolt/washer on the bed.
      #define CALIBRATION_OBJECT_CENTER     { 264.0, -22.0,  -2.0} // mm
      #define CALIBRATION_OBJECT_DIMENSIONS {  10.0,  10.0,  10.0} // mm
    
      // Comment out any sides which are unreachable by the probe. For best
      // auto-calibration results, all sides must be reachable.
      #define CALIBRATION_MEASURE_RIGHT
      #define CALIBRATION_MEASURE_FRONT
      #define CALIBRATION_MEASURE_LEFT
      #define CALIBRATION_MEASURE_BACK
    
      // Probing at the exact top center only works if the center is flat. If
      // probing on a screwhead or hollow washer, probe near the edges.
      //#define CALIBRATION_MEASURE_AT_TOP_EDGES
    
      // Define pin which is read during calibration
      #ifndef CALIBRATION_PIN
        #define CALIBRATION_PIN -1 // Override in pins.h or set to -1 to use your Z endstop
    
        #define CALIBRATION_PIN_INVERTING false // Set to true to invert the pin
    
        //#define CALIBRATION_PIN_PULLDOWN
        #define CALIBRATION_PIN_PULLUP
      #endif
    #endif
    
    
    /**
     * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies
     * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible
     * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the
     * lowest stepping frequencies.
     */
    //#define ADAPTIVE_STEP_SMOOTHING
    
    
    /**
     * Custom Microstepping
     * Override as-needed for your setup. Up to 3 MS pins are supported.
     */
    //#define MICROSTEP1 LOW,LOW,LOW
    //#define MICROSTEP2 HIGH,LOW,LOW
    //#define MICROSTEP4 LOW,HIGH,LOW
    //#define MICROSTEP8 HIGH,HIGH,LOW
    //#define MICROSTEP16 LOW,LOW,HIGH
    //#define MICROSTEP32 HIGH,LOW,HIGH
    
    
    // Microstep setting (Only functional when stepper driver microstep pins are connected to MCU.
    
    #define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16]
    
    /**
     *  @section  stepper motor current
     *
     *  Some boards have a means of setting the stepper motor current via firmware.
     *
     *  The power on motor currents are set by:
     *    PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2
     *                         known compatible chips: A4982
     *    DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H
     *                         known compatible chips: AD5206
     *    DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2
     *                         known compatible chips: MCP4728
    
     *    DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE
    
     *                         known compatible chips: MCP4451, MCP4018
    
     *
     *  Motor currents can also be set by M907 - M910 and by the LCD.
     *    M907 - applies to all.
     *    M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H
     *    M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2
     */
    
    //#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 }          // Values in milliamps
    //#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 }   // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A)
    //#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 }    // Default drive percent - X, Y, Z, E axis
    
    // Use an I2C based DIGIPOT (e.g., Azteeg X3 Pro)
    
    //#define DIGIPOT_I2C
    
    #if ENABLED(DIGIPOT_I2C) && !defined(DIGIPOT_I2C_ADDRESS_A)
      /**
       * Common slave addresses:
       *
    
       *                        A   (A shifted)   B   (B shifted)  IC
       * Smoothie              0x2C (0x58)       0x2D (0x5A)       MCP4451
       * AZTEEG_X3_PRO         0x2C (0x58)       0x2E (0x5C)       MCP4451
    
       * AZTEEG_X5_MINI        0x2C (0x58)       0x2E (0x5C)       MCP4451
    
       * AZTEEG_X5_MINI_WIFI         0x58              0x5C        MCP4451
       * MIGHTYBOARD_REVE      0x2F (0x5E)                         MCP4018
    
    Bob-the-Kuhn's avatar
    Bob-the-Kuhn committed
      #define DIGIPOT_I2C_ADDRESS_A 0x2C  // unshifted slave address for first DIGIPOT
      #define DIGIPOT_I2C_ADDRESS_B 0x2D  // unshifted slave address for second DIGIPOT
    #endif
    
    
    //#define DIGIPOT_MCP4018          // Requires library from https://github.com/stawel/SlowSoftI2CMaster
    
    #define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT: 4     AZTEEG_X3_PRO: 8     MKS SBASE: 5
    
    // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS.
    // These correspond to the physical drivers, so be mindful if the order is changed.
    
    #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }  //  AZTEEG_X3_PRO
    
    //===========================================================================
    //=============================Additional Features===========================
    //===========================================================================
    
    Jim Morris's avatar
    Jim Morris committed
    
    
    // Change values more rapidly when the encoder is rotated faster
    #define ENCODER_RATE_MULTIPLIER
    #if ENABLED(ENCODER_RATE_MULTIPLIER)
      #define ENCODER_10X_STEPS_PER_SEC   30  // (steps/s) Encoder rate for 10x speed
      #define ENCODER_100X_STEPS_PER_SEC  80  // (steps/s) Encoder rate for 100x speed
    #endif
    
    
    // Play a beep when the feedrate is changed from the Status Screen
    //#define BEEP_ON_FEEDRATE_CHANGE
    #if ENABLED(BEEP_ON_FEEDRATE_CHANGE)
      #define FEEDRATE_CHANGE_BEEP_DURATION   10
      #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440
    #endif
    
    
    // Include a page of printer information in the LCD Main Menu
    //#define LCD_INFO_MENU
    
    
    // Scroll a longer status message into view
    //#define STATUS_MESSAGE_SCROLLING
    
    
    // On the Info Screen, display XY with one decimal place when possible
    //#define LCD_DECIMAL_SMALL_XY
    
    
    // The timeout (in ms) to return to the status screen from sub-menus
    //#define LCD_TIMEOUT_TO_STATUS 15000
    
    
    // Add an 'M73' G-code to set the current percentage
    //#define LCD_SET_PROGRESS_MANUALLY
    
    
    #if HAS_CHARACTER_LCD && HAS_PRINT_PROGRESS
    
      //#define LCD_PROGRESS_BAR              // Show a progress bar on HD44780 LCDs for SD printing
    
    Scott Lahteine's avatar
    Scott Lahteine committed
      #if ENABLED(LCD_PROGRESS_BAR)
    
        #define PROGRESS_BAR_BAR_TIME 2000    // (ms) Amount of time to show the bar
        #define PROGRESS_BAR_MSG_TIME 3000    // (ms) Amount of time to show the status message
        #define PROGRESS_MSG_EXPIRE   0       // (ms) Amount of time to retain the status message (0=forever)
        //#define PROGRESS_MSG_ONCE           // Show the message for MSG_TIME then clear it
        //#define LCD_PROGRESS_BAR_TEST       // Add a menu item to test the progress bar
    
    Scott Lahteine's avatar
    Scott Lahteine committed
      #endif
    
    /**
     * LED Control Menu
     * Enable this feature to add LED Control to the LCD menu
     */
    //#define LED_CONTROL_MENU
    
    Tannoo's avatar
    Tannoo committed
    #if ENABLED(LED_CONTROL_MENU)
    
      #define LED_COLOR_PRESETS                 // Enable the Preset Color menu option
      #if ENABLED(LED_COLOR_PRESETS)
        #define LED_USER_PRESET_RED        255  // User defined RED value
        #define LED_USER_PRESET_GREEN      128  // User defined GREEN value
        #define LED_USER_PRESET_BLUE         0  // User defined BLUE value
        #define LED_USER_PRESET_WHITE      255  // User defined WHITE value
        #define LED_USER_PRESET_BRIGHTNESS 255  // User defined intensity
        //#define LED_USER_PRESET_STARTUP       // Have the printer display the user preset color on startup
      #endif
    
    Tannoo's avatar
    Tannoo committed
    #endif // LED_CONTROL_MENU
    
    
    #if ENABLED(SDSUPPORT)
    
      // Some RAMPS and other boards don't detect when an SD card is inserted. You can work
      // around this by connecting a push button or single throw switch to the pin defined
      // as SD_DETECT_PIN in your board's pins definitions.
      // This setting should be disabled unless you are using a push button, pulling the pin to ground.
      // Note: This is always disabled for ULTIPANEL (except ELB_FULL_GRAPHIC_CONTROLLER).
      #define SD_DETECT_INVERTED
    
      #define SD_FINISHED_STEPPERRELEASE true          // Disable steppers when SD Print is finished
    
      #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the Z enabled so your bed stays in place.
    
      // Reverse SD sort to show "more recent" files first, according to the card's FAT.
      // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended.
      #define SDCARD_RATHERRECENTFIRST
    
    
      #define SD_MENU_CONFIRM_START             // Confirm the selected SD file before printing
    
    
      //#define MENU_ADDAUTOSTART               // Add a menu option to run auto#.g files
    
      #define EVENT_GCODE_SD_STOP "G28XY"       // G-code to run on Stop Print (e.g., "G28XY" or "G27")
    
      /**
       * Continue after Power-Loss (Creality3D)
       *
       * Store the current state to the SD Card at the start of each layer
       * during SD printing. If the recovery file is found at boot time, present
       * an option on the LCD screen to continue the print from the last-known
       * point in the file.
       */
      //#define POWER_LOSS_RECOVERY
    
      #if ENABLED(POWER_LOSS_RECOVERY)
    
        //#define POWER_LOSS_PIN         44 // Pin to detect power loss
    
        //#define POWER_LOSS_STATE     HIGH // State of pin indicating power loss
        //#define POWER_LOSS_PURGE_LEN   20 // (mm) Length of filament to purge on resume
        //#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power.
    
    
        // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card,
        // especially with "vase mode" printing. Set too high and vases cannot be continued.
        #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data
    
      #endif
    
      /**
       * Sort SD file listings in alphabetical order.
       *
       * With this option enabled, items on SD cards will be sorted
       * by name for easier navigation.
       *
       * By default...
       *
       *  - Use the slowest -but safest- method for sorting.
       *  - Folders are sorted to the top.
       *  - The sort key is statically allocated.
       *  - No added G-code (M34) support.
       *  - 40 item sorting limit. (Items after the first 40 are unsorted.)
       *
       * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the
       * compiler to calculate the worst-case usage and throw an error if the SRAM
       * limit is exceeded.
       *
       *  - SDSORT_USES_RAM provides faster sorting via a static directory buffer.
       *  - SDSORT_USES_STACK does the same, but uses a local stack-based buffer.
       *  - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!)
    
       *  - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!)
    
       */
      //#define SDCARD_SORT_ALPHA
    
      // SD Card Sorting options
      #if ENABLED(SDCARD_SORT_ALPHA)
    
        #define SDSORT_LIMIT       40     // Maximum number of sorted items (10-256). Costs 27 bytes each.
    
        #define FOLDER_SORTING     -1     // -1=above  0=none  1=below
        #define SDSORT_GCODE       false  // Allow turning sorting on/off with LCD and M34 g-code.
        #define SDSORT_USES_RAM    false  // Pre-allocate a static array for faster pre-sorting.
        #define SDSORT_USES_STACK  false  // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.)
        #define SDSORT_CACHE_NAMES false  // Keep sorted items in RAM longer for speedy performance. Most expensive option.
    
        #define SDSORT_DYNAMIC_RAM false  // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use!
    
        #define SDSORT_CACHE_VFATS 2      // Maximum number of 13-byte VFAT entries to use for sorting.
                                          // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM.
    
      // This allows hosts to request long names for files and folders with M33
      //#define LONG_FILENAME_HOST_SUPPORT
    
    
      // Enable this option to scroll long filenames in the SD card menu
      //#define SCROLL_LONG_FILENAMES
    
    
      // Leave the heaters on after Stop Print (not recommended!)
      //#define SD_ABORT_NO_COOLDOWN
    
    
      /**
       * This option allows you to abort SD printing when any endstop is triggered.
       * This feature must be enabled with "M540 S1" or from the LCD menu.
       * To have any effect, endstops must be enabled during SD printing.
       */
    
      //#define SD_ABORT_ON_ENDSTOP_HIT
    
       * This option makes it easier to print the same SD Card file again.
       * On print completion the LCD Menu will open with the file selected.
       * You can just click to start the print, or navigate elsewhere.
    
       */
      //#define SD_REPRINT_LAST_SELECTED_FILE
    
    
      /**
       * Auto-report SdCard status with M27 S<seconds>
       */
      //#define AUTO_REPORT_SD_STATUS