diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index fe6e371c5c..6a8fd36789 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -148,6 +148,7 @@ #ifdef PIDTEMP //#define PID_DEBUG // Sends debug data to the serial port. //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (circa 0.125Hz=8s) and miminum state time of circa 1s usefoul for heater drived by relay #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature // is more then PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. #define PID_INTEGRAL_DRIVE_MAX PID_MAX //limit for the integral term @@ -564,7 +565,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of // The Elefu RA Board Control Panel // http://www.elefu.com/index.php?route=product/product&product_id=53 -// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARUDINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C //#define RA_CONTROL_PANEL //automatic expansion diff --git a/Marlin/example_configurations/SCARA/Configuration.h b/Marlin/example_configurations/SCARA/Configuration.h index 0526b88d93..d38abd26a8 100644 --- a/Marlin/example_configurations/SCARA/Configuration.h +++ b/Marlin/example_configurations/SCARA/Configuration.h @@ -571,7 +571,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of // The Elefu RA Board Control Panel // http://www.elefu.com/index.php?route=product/product&product_id=53 -// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARUDINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C //#define RA_CONTROL_PANEL //automatic expansion diff --git a/Marlin/example_configurations/delta/Configuration.h b/Marlin/example_configurations/delta/Configuration.h index d3ff07071f..6c530e9234 100644 --- a/Marlin/example_configurations/delta/Configuration.h +++ b/Marlin/example_configurations/delta/Configuration.h @@ -475,7 +475,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of // The Elefu RA Board Control Panel // http://www.elefu.com/index.php?route=product/product&product_id=53 -// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARUDINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C //#define RA_CONTROL_PANEL // Delta calibration menu diff --git a/Marlin/example_configurations/makibox/Configuration.h b/Marlin/example_configurations/makibox/Configuration.h index 5360ef421f..1aa77f98fe 100644 --- a/Marlin/example_configurations/makibox/Configuration.h +++ b/Marlin/example_configurations/makibox/Configuration.h @@ -543,7 +543,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of // The Elefu RA Board Control Panel // http://www.elefu.com/index.php?route=product/product&product_id=53 -// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARUDINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C //#define RA_CONTROL_PANEL //automatic expansion diff --git a/Marlin/example_configurations/tvrrug/Round2/Configuration.h b/Marlin/example_configurations/tvrrug/Round2/Configuration.h index 8924f7048b..6bea624ff7 100644 --- a/Marlin/example_configurations/tvrrug/Round2/Configuration.h +++ b/Marlin/example_configurations/tvrrug/Round2/Configuration.h @@ -557,7 +557,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of // The Elefu RA Board Control Panel // http://www.elefu.com/index.php?route=product/product&product_id=53 -// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARUDINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C //#define RA_CONTROL_PANEL //automatic expansion diff --git a/Marlin/language_it.h b/Marlin/language_it.h index 76845e3bcd..cb7dc466ae 100644 --- a/Marlin/language_it.h +++ b/Marlin/language_it.h @@ -15,37 +15,37 @@ #define MSG_AUTOSTART "Autostart" #define MSG_DISABLE_STEPPERS "Disabilita Motori" #define MSG_AUTO_HOME "Auto Home" -#define MSG_SET_HOME_OFFSETS "Set home offsets" +#define MSG_SET_HOME_OFFSETS "Setta offset home" #define MSG_SET_ORIGIN "Imposta Origine" #define MSG_PREHEAT_PLA "Preriscalda PLA" #define MSG_PREHEAT_PLA0 "Preriscalda PLA 1" #define MSG_PREHEAT_PLA1 "Preriscalda PLA 2" #define MSG_PREHEAT_PLA2 "Preriscalda PLA 3" -#define MSG_PREHEAT_PLA012 "Preris. PLA Tutto" -#define MSG_PREHEAT_PLA_BEDONLY "Preri. PLA Piatto" -#define MSG_PREHEAT_PLA_SETTINGS "Preris. PLA Conf" +#define MSG_PREHEAT_PLA012 "Prer. PLA Tutto" +#define MSG_PREHEAT_PLA_BEDONLY "Prer. PLA Piatto" +#define MSG_PREHEAT_PLA_SETTINGS "Config. prer. PLA" #define MSG_PREHEAT_ABS "Preriscalda ABS" #define MSG_PREHEAT_ABS0 "Preriscalda ABS 1" #define MSG_PREHEAT_ABS1 "Preriscalda ABS 2" #define MSG_PREHEAT_ABS2 "Preriscalda ABS 3" -#define MSG_PREHEAT_ABS012 "Preris. ABS Tutto" -#define MSG_PREHEAT_ABS_BEDONLY "Preri. ABS Piatto" -#define MSG_PREHEAT_ABS_SETTINGS "Preris. ABS Conf" +#define MSG_PREHEAT_ABS012 "Prer. ABS Tutto" +#define MSG_PREHEAT_ABS_BEDONLY "Prer. ABS Piatto" +#define MSG_PREHEAT_ABS_SETTINGS "Config. prer. ABS" #define MSG_COOLDOWN "Raffredda" -#define MSG_SWITCH_PS_ON "Switch Power On" -#define MSG_SWITCH_PS_OFF "Switch Power Off" +#define MSG_SWITCH_PS_ON "Accendi aliment." +#define MSG_SWITCH_PS_OFF "Spegni aliment." #define MSG_EXTRUDE "Estrudi" #define MSG_RETRACT "Ritrai" #define MSG_MOVE_AXIS "Muovi Asse" -#define MSG_MOVE_X "Move X" -#define MSG_MOVE_Y "Move Y" -#define MSG_MOVE_Z "Move Z" -#define MSG_MOVE_E "Extruder" -#define MSG_MOVE_E1 "Extruder2" -#define MSG_MOVE_E2 "Extruder3" -#define MSG_MOVE_01MM "Move 0.1mm" -#define MSG_MOVE_1MM "Move 1mm" -#define MSG_MOVE_10MM "Move 10mm" +#define MSG_MOVE_X "Muovi X" +#define MSG_MOVE_Y "Muovi Y" +#define MSG_MOVE_Z "Muovi Z" +#define MSG_MOVE_E "Estrusore" +#define MSG_MOVE_E1 "Estrusore 2" +#define MSG_MOVE_E2 "Estrusore 3" +#define MSG_MOVE_01MM "Muovi di 0.1mm" +#define MSG_MOVE_1MM "Muovi di 1mm" +#define MSG_MOVE_10MM "Muovi di 10mm" #define MSG_SPEED "Velcità" #define MSG_NOZZLE "Ugello" #define MSG_NOZZLE1 "Ugello2" @@ -61,13 +61,13 @@ #define MSG_MAX " \002 Max:" #define MSG_FACTOR " \002 Fact:" #define MSG_AUTOTEMP "Autotemp" -#define MSG_ON "On " -#define MSG_OFF "Off" +#define MSG_ON "ON " +#define MSG_OFF "OFF" #define MSG_PID_P "PID-P" #define MSG_PID_I "PID-I" #define MSG_PID_D "PID-D" #define MSG_PID_C "PID-C" -#define MSG_ACC "Accel" +#define MSG_ACC "Accel." #define MSG_VXY_JERK "Vxy-jerk" #define MSG_VZ_JERK "Vz-jerk" #define MSG_VE_JERK "Ve-jerk" @@ -87,11 +87,11 @@ #define MSG_TEMPERATURE "Temperatura" #define MSG_MOTION "Movimento" #define MSG_VOLUMETRIC "Filament" -#define MSG_VOLUMETRIC_ENABLED "E in mm3" -#define MSG_FILAMENT_SIZE_EXTRUDER_0 "Fil. Dia. 1" -#define MSG_FILAMENT_SIZE_EXTRUDER_1 "Fil. Dia. 2" -#define MSG_FILAMENT_SIZE_EXTRUDER_2 "Fil. Dia. 3" -#define MSG_CONTRAST "LCD contrast" +#define MSG_VOLUMETRIC_ENABLED "E in mm³" +#define MSG_FILAMENT_SIZE_EXTRUDER_0 "Diam. filo 1" +#define MSG_FILAMENT_SIZE_EXTRUDER_1 "Diam. filo 2" +#define MSG_FILAMENT_SIZE_EXTRUDER_2 "Diam. filo 3" +#define MSG_CONTRAST "Contrasto LCD" #define MSG_STORE_EPROM "Salva in EEPROM" #define MSG_LOAD_EPROM "Carica da EEPROM" #define MSG_RESTORE_FAILSAFE "Impostaz. default" @@ -100,17 +100,17 @@ #define MSG_PREPARE "Prepara" #define MSG_TUNE "Adatta" #define MSG_PAUSE_PRINT "Pausa" -#define MSG_RESUME_PRINT "Riprendi Stampa" -#define MSG_STOP_PRINT "Arresta Stampa" +#define MSG_RESUME_PRINT "Riprendi stampa" +#define MSG_STOP_PRINT "Arresta stampa" #define MSG_CARD_MENU "SD Card Menu" #define MSG_NO_CARD "No SD Card" #define MSG_DWELL "Sospensione..." #define MSG_USERWAIT "Attendi Utente..." #define MSG_RESUMING "Riprendi Stampa" -#define MSG_PRINT_ABORTED "Print aborted" -#define MSG_NO_MOVE "Nessun Movimento." -#define MSG_KILLED "UCCISO. " -#define MSG_STOPPED "ARRESTATO. " +#define MSG_PRINT_ABORTED "Stampa abortita" +#define MSG_NO_MOVE "Nessun Movimento" +#define MSG_KILLED "UCCISO " +#define MSG_STOPPED "ARRESTATO " #define MSG_CONTROL_RETRACT "Ritrai mm" #define MSG_CONTROL_RETRACT_SWAP "Scamb. Ritrai mm" #define MSG_CONTROL_RETRACTF "Ritrai V" @@ -128,16 +128,16 @@ #define MSG_BABYSTEP_X "Babystep X" #define MSG_BABYSTEP_Y "Babystep Y" #define MSG_BABYSTEP_Z "Babystep Z" -#define MSG_ENDSTOP_ABORT "Endstop abort" +#define MSG_ENDSTOP_ABORT "Finecorsa abort" #define MSG_RECTRACT "Ritrai" #ifdef DELTA_CALIBRATION_MENU - #define MSG_DELTA_CALIBRATE "Delta Calibration" - #define MSG_DELTA_CALIBRATE_X "Calibrate X" - #define MSG_DELTA_CALIBRATE_Y "Calibrate Y" - #define MSG_DELTA_CALIBRATE_Z "Calibrate Z" - #define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center" + #define MSG_DELTA_CALIBRATE "Calibraz. Delta" + #define MSG_DELTA_CALIBRATE_X "Calibra X" + #define MSG_DELTA_CALIBRATE_Y "Calibra Y" + #define MSG_DELTA_CALIBRATE_Z "Calibra Z" + #define MSG_DELTA_CALIBRATE_CENTER "Calibra Center" #endif // DELTA_CALIBRATION_MENU #endif // LANGUAGE_IT_H diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index 7acc5ffd87..8bdb7647f8 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -497,7 +497,7 @@ void manage_heater() SERIAL_ECHO(" iTerm "); SERIAL_ECHO(iTerm[e]); SERIAL_ECHO(" dTerm "); - SERIAL_ECHOLN(dTerm[e]); + SERIAL_ECHOLN(dTerm[e]); #endif //PID_DEBUG #else /* PID off */ pid_output = 0; @@ -1221,68 +1221,311 @@ ISR(TIMER0_COMPB_vect) static unsigned char temp_state = 10; static unsigned char pwm_count = (1 << SOFT_PWM_SCALE); static unsigned char soft_pwm_0; - #if (EXTRUDERS > 1) || defined(HEATERS_PARALLEL) +#ifdef SLOW_PWM_HEATERS + static unsigned char slow_pwm_count = 0; + static unsigned char state_heater_0 = 0; + static unsigned char state_timer_heater_0 = 0; +#endif +#if (EXTRUDERS > 1) || defined(HEATERS_PARALLEL) static unsigned char soft_pwm_1; - #endif - #if EXTRUDERS > 2 +#ifdef SLOW_PWM_HEATERS + static unsigned char state_heater_1 = 0; + static unsigned char state_timer_heater_1 = 0; +#endif +#endif +#if EXTRUDERS > 2 static unsigned char soft_pwm_2; - #endif - #if HEATER_BED_PIN > -1 +#ifdef SLOW_PWM_HEATERS + static unsigned char state_heater_2 = 0; + static unsigned char state_timer_heater_2 = 0; +#endif +#endif +#if HEATER_BED_PIN > -1 static unsigned char soft_pwm_b; - #endif +#ifdef SLOW_PWM_HEATERS + static unsigned char state_heater_b = 0; + static unsigned char state_timer_heater_b = 0; +#endif +#endif - #if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1) - static unsigned long raw_filwidth_value = 0; //added for filament width sensor - #endif +#if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1) + static unsigned long raw_filwidth_value = 0; //added for filament width sensor +#endif +#ifndef SLOW_PWM_HEATERS + /* + * standard PWM modulation + */ if(pwm_count == 0){ soft_pwm_0 = soft_pwm[0]; if(soft_pwm_0 > 0) { WRITE(HEATER_0_PIN,1); - #ifdef HEATERS_PARALLEL +#ifdef HEATERS_PARALLEL WRITE(HEATER_1_PIN,1); - #endif +#endif } else WRITE(HEATER_0_PIN,0); - - #if EXTRUDERS > 1 + +#if EXTRUDERS > 1 soft_pwm_1 = soft_pwm[1]; if(soft_pwm_1 > 0) WRITE(HEATER_1_PIN,1); else WRITE(HEATER_1_PIN,0); - #endif - #if EXTRUDERS > 2 +#endif +#if EXTRUDERS > 2 soft_pwm_2 = soft_pwm[2]; if(soft_pwm_2 > 0) WRITE(HEATER_2_PIN,1); else WRITE(HEATER_2_PIN,0); - #endif - #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 +#endif +#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 soft_pwm_b = soft_pwm_bed; if(soft_pwm_b > 0) WRITE(HEATER_BED_PIN,1); else WRITE(HEATER_BED_PIN,0); - #endif - #ifdef FAN_SOFT_PWM +#endif +#ifdef FAN_SOFT_PWM soft_pwm_fan = fanSpeedSoftPwm / 2; if(soft_pwm_fan > 0) WRITE(FAN_PIN,1); else WRITE(FAN_PIN,0); - #endif +#endif } if(soft_pwm_0 < pwm_count) { - WRITE(HEATER_0_PIN,0); - #ifdef HEATERS_PARALLEL - WRITE(HEATER_1_PIN,0); - #endif - } - #if EXTRUDERS > 1 + WRITE(HEATER_0_PIN,0); +#ifdef HEATERS_PARALLEL + WRITE(HEATER_1_PIN,0); +#endif + } +#if EXTRUDERS > 1 if(soft_pwm_1 < pwm_count) WRITE(HEATER_1_PIN,0); - #endif - #if EXTRUDERS > 2 +#endif +#if EXTRUDERS > 2 if(soft_pwm_2 < pwm_count) WRITE(HEATER_2_PIN,0); - #endif - #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 +#endif +#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 if(soft_pwm_b < pwm_count) WRITE(HEATER_BED_PIN,0); - #endif - #ifdef FAN_SOFT_PWM +#endif +#ifdef FAN_SOFT_PWM if(soft_pwm_fan < pwm_count) WRITE(FAN_PIN,0); - #endif +#endif + + pwm_count += (1 << SOFT_PWM_SCALE); + pwm_count &= 0x7f; + +#else //ifndef SLOW_PWM_HEATERS + /* + * SLOW PWM HEATERS + * + * for heaters drived by relay + */ +#ifndef MIN_STATE_TIME +#define MIN_STATE_TIME 16 // MIN_STATE_TIME * 65.5 = time in milliseconds +#endif + if (slow_pwm_count == 0) { + // EXTRUDER 0 + soft_pwm_0 = soft_pwm[0]; + if (soft_pwm_0 > 0) { + // turn ON heather only if the minimum time is up + if (state_timer_heater_0 == 0) { + // if change state set timer + if (state_heater_0 == 0) { + state_timer_heater_0 = MIN_STATE_TIME; + } + state_heater_0 = 1; + WRITE(HEATER_0_PIN, 1); +#ifdef HEATERS_PARALLEL + WRITE(HEATER_1_PIN, 1); +#endif + } + } else { + // turn OFF heather only if the minimum time is up + if (state_timer_heater_0 == 0) { + // if change state set timer + if (state_heater_0 == 1) { + state_timer_heater_0 = MIN_STATE_TIME; + } + state_heater_0 = 0; + WRITE(HEATER_0_PIN, 0); +#ifdef HEATERS_PARALLEL + WRITE(HEATER_1_PIN, 0); +#endif + } + } + +#if EXTRUDERS > 1 + // EXTRUDER 1 + soft_pwm_1 = soft_pwm[1]; + if (soft_pwm_1 > 0) { + // turn ON heather only if the minimum time is up + if (state_timer_heater_1 == 0) { + // if change state set timer + if (state_heater_1 == 0) { + state_timer_heater_1 = MIN_STATE_TIME; + } + state_heater_1 = 1; + WRITE(HEATER_1_PIN, 1); + } + } else { + // turn OFF heather only if the minimum time is up + if (state_timer_heater_1 == 0) { + // if change state set timer + if (state_heater_1 == 1) { + state_timer_heater_1 = MIN_STATE_TIME; + } + state_heater_1 = 0; + WRITE(HEATER_1_PIN, 0); + } + } +#endif + +#if EXTRUDERS > 2 + // EXTRUDER 2 + soft_pwm_2 = soft_pwm[2]; + if (soft_pwm_2 > 0) { + // turn ON heather only if the minimum time is up + if (state_timer_heater_2 == 0) { + // if change state set timer + if (state_heater_2 == 0) { + state_timer_heater_2 = MIN_STATE_TIME; + } + state_heater_2 = 1; + WRITE(HEATER_2_PIN, 1); + } + } else { + // turn OFF heather only if the minimum time is up + if (state_timer_heater_2 == 0) { + // if change state set timer + if (state_heater_2 == 1) { + state_timer_heater_2 = MIN_STATE_TIME; + } + state_heater_2 = 0; + WRITE(HEATER_2_PIN, 0); + } + } +#endif + +#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + // BED + soft_pwm_b = soft_pwm_bed; + if (soft_pwm_b > 0) { + // turn ON heather only if the minimum time is up + if (state_timer_heater_b == 0) { + // if change state set timer + if (state_heater_b == 0) { + state_timer_heater_b = MIN_STATE_TIME; + } + state_heater_b = 1; + WRITE(HEATER_BED_PIN, 1); + } + } else { + // turn OFF heather only if the minimum time is up + if (state_timer_heater_b == 0) { + // if change state set timer + if (state_heater_b == 1) { + state_timer_heater_b = MIN_STATE_TIME; + } + state_heater_b = 0; + WRITE(HEATER_BED_PIN, 0); + } + } +#endif + } // if (slow_pwm_count == 0) + + // EXTRUDER 0 + if (soft_pwm_0 < slow_pwm_count) { + // turn OFF heather only if the minimum time is up + if (state_timer_heater_0 == 0) { + // if change state set timer + if (state_heater_0 == 1) { + state_timer_heater_0 = MIN_STATE_TIME; + } + state_heater_0 = 0; + WRITE(HEATER_0_PIN, 0); +#ifdef HEATERS_PARALLEL + WRITE(HEATER_1_PIN, 0); +#endif + } + } + +#if EXTRUDERS > 1 + // EXTRUDER 1 + if (soft_pwm_1 < slow_pwm_count) { + // turn OFF heather only if the minimum time is up + if (state_timer_heater_1 == 0) { + // if change state set timer + if (state_heater_1 == 1) { + state_timer_heater_1 = MIN_STATE_TIME; + } + state_heater_1 = 0; + WRITE(HEATER_1_PIN, 0); + } + } +#endif + +#if EXTRUDERS > 2 + // EXTRUDER 2 + if (soft_pwm_2 < slow_pwm_count) { + // turn OFF heather only if the minimum time is up + if (state_timer_heater_2 == 0) { + // if change state set timer + if (state_heater_2 == 1) { + state_timer_heater_2 = MIN_STATE_TIME; + } + state_heater_2 = 0; + WRITE(HEATER_2_PIN, 0); + } + } +#endif + +#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + // BED + if (soft_pwm_b < slow_pwm_count) { + // turn OFF heather only if the minimum time is up + if (state_timer_heater_b == 0) { + // if change state set timer + if (state_heater_b == 1) { + state_timer_heater_b = MIN_STATE_TIME; + } + state_heater_b = 0; + WRITE(HEATER_BED_PIN, 0); + } + } +#endif + +#ifdef FAN_SOFT_PWM + if (pwm_count == 0){ + soft_pwm_fan = fanSpeedSoftPwm / 2; + if (soft_pwm_fan > 0) WRITE(FAN_PIN,1); else WRITE(FAN_PIN,0); + } + if (soft_pwm_fan < pwm_count) WRITE(FAN_PIN,0); +#endif pwm_count += (1 << SOFT_PWM_SCALE); pwm_count &= 0x7f; + // increment slow_pwm_count only every 64 pwm_count circa 65.5ms + if ((pwm_count % 64) == 0) { + slow_pwm_count++; + slow_pwm_count &= 0x7f; + + // Extruder 0 + if (state_timer_heater_0 > 0) { + state_timer_heater_0--; + } + +#if EXTRUDERS > 1 + // Extruder 1 + if (state_timer_heater_1 > 0) + state_timer_heater_1--; +#endif + +#if EXTRUDERS > 2 + // Extruder 2 + if (state_timer_heater_2 > 0) + state_timer_heater_2--; +#endif + +#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + // Bed + if (state_timer_heater_b > 0) + state_timer_heater_b--; +#endif + } //if ((pwm_count % 64) == 0) { + +#endif //ifndef SLOW_PWM_HEATERS + switch(temp_state) { case 0: // Prepare TEMP_0 #if defined(TEMP_0_PIN) && (TEMP_0_PIN > -1)