Merge branch 'Marlin_v1' of https://github.com/dob71/Marlin into Marlin_v1
This commit is contained in:
commit
3664ed6aad
12 changed files with 703 additions and 548 deletions
|
@ -4,11 +4,11 @@
|
||||||
|
|
||||||
|
|
||||||
// This determines the communication speed of the printer
|
// This determines the communication speed of the printer
|
||||||
#define BAUDRATE 250000
|
//#define BAUDRATE 250000
|
||||||
//#define BAUDRATE 115200
|
#define BAUDRATE 115200
|
||||||
//#define BAUDRATE 230400
|
//#define BAUDRATE 230400
|
||||||
|
|
||||||
#define EXTRUDERS 1
|
#define EXTRUDERS 2
|
||||||
|
|
||||||
// Frequency limit
|
// Frequency limit
|
||||||
// See nophead's blog for more info
|
// See nophead's blog for more info
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
// Sanguinololu 1.2 and above = 62
|
// Sanguinololu 1.2 and above = 62
|
||||||
// Ultimaker = 7,
|
// Ultimaker = 7,
|
||||||
// Teensylu = 8
|
// Teensylu = 8
|
||||||
#define MOTHERBOARD 7
|
#define MOTHERBOARD 33
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================Thermal Settings ============================
|
//=============================Thermal Settings ============================
|
||||||
|
@ -46,17 +46,16 @@
|
||||||
// 5 is ParCan supplied 104GT-2 100K
|
// 5 is ParCan supplied 104GT-2 100K
|
||||||
// 6 is EPCOS 100k
|
// 6 is EPCOS 100k
|
||||||
// 7 is 100k Honeywell thermistor 135-104LAG-J01
|
// 7 is 100k Honeywell thermistor 135-104LAG-J01
|
||||||
//#define THERMISTORHEATER_0 3
|
#define THERMISTORHEATER_0 1
|
||||||
//#define THERMISTORHEATER_1 3
|
#define THERMISTORHEATER_1 1
|
||||||
//#define THERMISTORBED 3
|
#define HEATER_0_USES_THERMISTOR
|
||||||
|
#define HEATER_1_USES_THERMISTOR
|
||||||
//#define HEATER_0_USES_THERMISTOR
|
//#define HEATER_0_USES_AD595
|
||||||
//#define HEATER_1_USES_THERMISTOR
|
|
||||||
#define HEATER_0_USES_AD595
|
|
||||||
//#define HEATER_1_USES_AD595
|
//#define HEATER_1_USES_AD595
|
||||||
|
|
||||||
// Select one of these only to define how the bed temp is read.
|
// Select one of these only to define how the bed temp is read.
|
||||||
//#define BED_USES_THERMISTOR
|
#define THERMISTORBED 1
|
||||||
|
#define BED_USES_THERMISTOR
|
||||||
//#define BED_USES_AD595
|
//#define BED_USES_AD595
|
||||||
|
|
||||||
#define BED_CHECK_INTERVAL 5000 //ms
|
#define BED_CHECK_INTERVAL 5000 //ms
|
||||||
|
@ -68,13 +67,13 @@
|
||||||
//#define WATCHPERIOD 5000 //5 seconds
|
//#define WATCHPERIOD 5000 //5 seconds
|
||||||
|
|
||||||
// Actual temperature must be close to target for this long before M109 returns success
|
// Actual temperature must be close to target for this long before M109 returns success
|
||||||
//#define TEMP_RESIDENCY_TIME 20 // (seconds)
|
#define TEMP_RESIDENCY_TIME 30 // (seconds)
|
||||||
//#define TEMP_HYSTERESIS 5 // (C°) range of +/- temperatures considered "close" to the target one
|
#define TEMP_HYSTERESIS 3 // (C°) range of +/- temperatures considered "close" to the target one
|
||||||
|
|
||||||
//// The minimal temperature defines the temperature below which the heater will not be enabled
|
//// The minimal temperature defines the temperature below which the heater will not be enabled
|
||||||
#define HEATER_0_MINTEMP 5
|
#define HEATER_0_MINTEMP 5
|
||||||
//#define HEATER_1_MINTEMP 5
|
//#define HEATER_1_MINTEMP 5
|
||||||
//#define BED_MINTEMP 5
|
#define BED_MINTEMP 5
|
||||||
|
|
||||||
|
|
||||||
// When temperature exceeds max temp, your heater will be switched off.
|
// When temperature exceeds max temp, your heater will be switched off.
|
||||||
|
@ -82,7 +81,7 @@
|
||||||
// You should use MINTEMP for thermistor short/failure protection.
|
// You should use MINTEMP for thermistor short/failure protection.
|
||||||
#define HEATER_0_MAXTEMP 275
|
#define HEATER_0_MAXTEMP 275
|
||||||
//#define HEATER_1_MAXTEMP 275
|
//#define HEATER_1_MAXTEMP 275
|
||||||
//#define BED_MAXTEMP 150
|
#define BED_MAXTEMP 150
|
||||||
|
|
||||||
|
|
||||||
// Wait for Cooldown
|
// Wait for Cooldown
|
||||||
|
@ -131,9 +130,14 @@
|
||||||
// #define DEFAULT_Kd (PID_SWING_AT_CRITIAL/8./PID_dT)
|
// #define DEFAULT_Kd (PID_SWING_AT_CRITIAL/8./PID_dT)
|
||||||
|
|
||||||
// Ultitmaker
|
// Ultitmaker
|
||||||
#define DEFAULT_Kp 22.2
|
// #define DEFAULT_Kp 22.2
|
||||||
#define DEFAULT_Ki (1.25*PID_dT)
|
// #define DEFAULT_Ki (1.25*PID_dT)
|
||||||
#define DEFAULT_Kd (99/PID_dT)
|
// #define DEFAULT_Kd (99/PID_dT)
|
||||||
|
|
||||||
|
// Makergear
|
||||||
|
#define DEFAULT_Kp 7.0
|
||||||
|
#define DEFAULT_Ki 0.1
|
||||||
|
#define DEFAULT_Kd 12
|
||||||
|
|
||||||
// Mendel Parts V9 on 12V
|
// Mendel Parts V9 on 12V
|
||||||
// #define DEFAULT_Kp 63.0
|
// #define DEFAULT_Kp 63.0
|
||||||
|
@ -152,7 +156,7 @@
|
||||||
// if Kc is choosen well, the additional required power due to increased melting should be compensated.
|
// if Kc is choosen well, the additional required power due to increased melting should be compensated.
|
||||||
#define PID_ADD_EXTRUSION_RATE
|
#define PID_ADD_EXTRUSION_RATE
|
||||||
#ifdef PID_ADD_EXTRUSION_RATE
|
#ifdef PID_ADD_EXTRUSION_RATE
|
||||||
#define DEFAULT_Kc (3) //heatingpower=Kc*(e_speed)
|
#define DEFAULT_Kc (1) //heatingpower=Kc*(e_speed)
|
||||||
#endif
|
#endif
|
||||||
#endif // PIDTEMP
|
#endif // PIDTEMP
|
||||||
|
|
||||||
|
@ -164,10 +168,11 @@
|
||||||
|
|
||||||
// Endstop Settings
|
// Endstop Settings
|
||||||
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
|
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
|
||||||
|
|
||||||
// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
|
// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
|
||||||
const bool X_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
|
const bool X_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.
|
||||||
const bool Y_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
|
const bool Y_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.
|
||||||
const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
|
const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.
|
||||||
// For optos H21LOB set to true, for Mendel-Parts newer optos TCST2103 set to false
|
// For optos H21LOB set to true, for Mendel-Parts newer optos TCST2103 set to false
|
||||||
|
|
||||||
//#define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing
|
//#define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing
|
||||||
|
@ -176,24 +181,26 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
|
||||||
#define X_ENABLE_ON 0
|
#define X_ENABLE_ON 0
|
||||||
#define Y_ENABLE_ON 0
|
#define Y_ENABLE_ON 0
|
||||||
#define Z_ENABLE_ON 0
|
#define Z_ENABLE_ON 0
|
||||||
#define E_ENABLE_ON 0
|
#define E_ENABLE_ON 0 // For all extruders
|
||||||
|
|
||||||
// Disables axis when it's not being used.
|
// Disables axis when it's not being used.
|
||||||
#define DISABLE_X false
|
#define DISABLE_X false
|
||||||
#define DISABLE_Y false
|
#define DISABLE_Y false
|
||||||
#define DISABLE_Z false
|
#define DISABLE_Z true
|
||||||
#define DISABLE_E false
|
#define DISABLE_E false // For all extruders
|
||||||
|
|
||||||
// Inverting axis direction
|
// Inverting axis direction
|
||||||
//#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true
|
//#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true
|
||||||
//#define INVERT_Y_DIR true // for Mendel set to true, for Orca set to false
|
//#define INVERT_Y_DIR true // for Mendel set to true, for Orca set to false
|
||||||
//#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true
|
//#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true
|
||||||
//#define INVERT_E_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false
|
//#define INVERT_E*_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false, used for all extruders
|
||||||
|
|
||||||
#define INVERT_X_DIR true // for Mendel set to false, for Orca set to true
|
#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true
|
||||||
#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false
|
#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false
|
||||||
#define INVERT_Z_DIR true // for Mendel set to false, for Orca set to true
|
#define INVERT_Z_DIR true // for Mendel set to false, for Orca set to true
|
||||||
#define INVERT_E_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
|
#define INVERT_E0_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
|
||||||
|
#define INVERT_E1_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false
|
||||||
|
#define INVERT_E2_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
|
||||||
|
|
||||||
//// ENDSTOP SETTINGS:
|
//// ENDSTOP SETTINGS:
|
||||||
// Sets direction of endstops when homing; 1=MAX, -1=MIN
|
// Sets direction of endstops when homing; 1=MAX, -1=MIN
|
||||||
|
@ -209,7 +216,7 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
|
||||||
|
|
||||||
//// MOVEMENT SETTINGS
|
//// MOVEMENT SETTINGS
|
||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
|
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
|
||||||
#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0} // set the homing speeds (mm/min)
|
#define HOMING_FEEDRATE {30*60, 30*60, 2*60, 0} // set the homing speeds (mm/min)
|
||||||
|
|
||||||
//homing hits the endstop, then retracts by this distance, before it tries to slowly bump again:
|
//homing hits the endstop, then retracts by this distance, before it tries to slowly bump again:
|
||||||
#define X_HOME_RETRACT_MM 5
|
#define X_HOME_RETRACT_MM 5
|
||||||
|
@ -223,8 +230,9 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
|
||||||
|
|
||||||
// default settings
|
// default settings
|
||||||
|
|
||||||
#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200*8/3,760*1.1} // default steps per unit for ultimaker
|
//#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200*8/3,760*1.1} // default steps per unit for ultimaker
|
||||||
//#define DEFAULT_AXIS_STEPS_PER_UNIT {40, 40, 3333.92, 67} //sells mendel with v9 extruder
|
//#define DEFAULT_AXIS_STEPS_PER_UNIT {40, 40, 3333.92, 67} //sells mendel with v9 extruder
|
||||||
|
#define DEFAULT_AXIS_STEPS_PER_UNIT {80.3232, 80.8900, 2284.7651, 757.2218} // SAE Prusa w/ Wade extruder
|
||||||
#define DEFAULT_MAX_FEEDRATE {500, 500, 5, 45} // (mm/sec)
|
#define DEFAULT_MAX_FEEDRATE {500, 500, 5, 45} // (mm/sec)
|
||||||
#define DEFAULT_MAX_ACCELERATION {9000,9000,100,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot.
|
#define DEFAULT_MAX_ACCELERATION {9000,9000,100,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot.
|
||||||
|
|
||||||
|
@ -290,7 +298,7 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
|
||||||
|
|
||||||
//LCD and SD support
|
//LCD and SD support
|
||||||
//#define ULTRA_LCD //general lcd support, also 16x2
|
//#define ULTRA_LCD //general lcd support, also 16x2
|
||||||
//#define SDSUPPORT // Enable SD Card Support in Hardware Console
|
#define SDSUPPORT // Enable SD Card Support in Hardware Console
|
||||||
#define SD_FINISHED_STEPPERRELEASE true //if sd support and the file is finished: disable steppers?
|
#define SD_FINISHED_STEPPERRELEASE true //if sd support and the file is finished: disable steppers?
|
||||||
|
|
||||||
//#define ULTIPANEL
|
//#define ULTIPANEL
|
||||||
|
|
|
@ -57,6 +57,8 @@ const prog_char echomagic[] PROGMEM ="echo:";
|
||||||
|
|
||||||
#define SERIAL_ECHOPAIR(name,value) {SERIAL_ECHOPGM(name);SERIAL_ECHO(value);}
|
#define SERIAL_ECHOPAIR(name,value) {SERIAL_ECHOPGM(name);SERIAL_ECHO(value);}
|
||||||
|
|
||||||
|
// Macro for getting current active extruder
|
||||||
|
#define ACTIVE_EXTRUDER (active_extruder)
|
||||||
|
|
||||||
//things to write to serial from Programmemory. saves 400 to 2k of RAM.
|
//things to write to serial from Programmemory. saves 400 to 2k of RAM.
|
||||||
#define SerialprintPGM(x) serialprintPGM(MYPGM(x))
|
#define SerialprintPGM(x) serialprintPGM(MYPGM(x))
|
||||||
|
@ -100,14 +102,31 @@ void manage_inactivity(byte debug);
|
||||||
#define disable_z() ;
|
#define disable_z() ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if E_ENABLE_PIN > -1
|
#if defined(E0_ENABLE_PIN) && (E0_ENABLE_PIN > -1)
|
||||||
#define enable_e() WRITE(E_ENABLE_PIN, E_ENABLE_ON)
|
#define enable_e0() WRITE(E0_ENABLE_PIN, E_ENABLE_ON)
|
||||||
#define disable_e() WRITE(E_ENABLE_PIN,!E_ENABLE_ON)
|
#define disable_e0() WRITE(E0_ENABLE_PIN,!E_ENABLE_ON)
|
||||||
#else
|
#else
|
||||||
#define enable_e() ;
|
#define enable_e0() /* nothing */
|
||||||
#define disable_e() ;
|
#define disable_e0() /* nothing */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (EXTRUDERS > 1) && defined(E1_ENABLE_PIN) && (E1_ENABLE_PIN > -1)
|
||||||
|
#define enable_e1() WRITE(E1_ENABLE_PIN, E_ENABLE_ON)
|
||||||
|
#define disable_e1() WRITE(E1_ENABLE_PIN,!E_ENABLE_ON)
|
||||||
|
#else
|
||||||
|
#define enable_e1() /* nothing */
|
||||||
|
#define disable_e1() /* nothing */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (EXTRUDERS > 2) && defined(E2_ENABLE_PIN) && (E2_ENABLE_PIN > -1)
|
||||||
|
#define enable_e2() WRITE(E2_ENABLE_PIN, E_ENABLE_ON)
|
||||||
|
#define disable_e2() WRITE(E2_ENABLE_PIN,!E_ENABLE_ON)
|
||||||
|
#else
|
||||||
|
#define enable_e2() /* nothing */
|
||||||
|
#define disable_e2() /* nothing */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
enum AxisEnum {X_AXIS=0, Y_AXIS=1, Z_AXIS=2, E_AXIS=3};
|
enum AxisEnum {X_AXIS=0, Y_AXIS=1, Z_AXIS=2, E_AXIS=3};
|
||||||
|
|
||||||
|
|
||||||
|
@ -131,4 +150,7 @@ extern bool axis_relative_modes[];
|
||||||
extern float current_position[NUM_AXIS] ;
|
extern float current_position[NUM_AXIS] ;
|
||||||
extern float add_homeing[3];
|
extern float add_homeing[3];
|
||||||
|
|
||||||
|
// Handling multiple extruders pins
|
||||||
|
extern uint8_t active_extruder;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -119,7 +119,6 @@
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================imported variables============================
|
//=============================imported variables============================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
extern float HeaterPower;
|
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -135,6 +134,8 @@ int saved_feedmultiply;
|
||||||
volatile bool feedmultiplychanged=false;
|
volatile bool feedmultiplychanged=false;
|
||||||
float current_position[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0 };
|
float current_position[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0 };
|
||||||
float add_homeing[3]={0,0,0};
|
float add_homeing[3]={0,0,0};
|
||||||
|
uint8_t active_extruder = 0;
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================private variables=============================
|
//=============================private variables=============================
|
||||||
|
@ -601,7 +602,6 @@ FORCE_INLINE void process_commands()
|
||||||
|
|
||||||
else if(code_seen('M'))
|
else if(code_seen('M'))
|
||||||
{
|
{
|
||||||
|
|
||||||
switch( (int)code_value() )
|
switch( (int)code_value() )
|
||||||
{
|
{
|
||||||
case 17:
|
case 17:
|
||||||
|
@ -609,10 +609,12 @@ FORCE_INLINE void process_commands()
|
||||||
enable_x();
|
enable_x();
|
||||||
enable_y();
|
enable_y();
|
||||||
enable_z();
|
enable_z();
|
||||||
enable_e();
|
enable_e0();
|
||||||
|
enable_e1();
|
||||||
|
enable_e2();
|
||||||
break;
|
break;
|
||||||
#ifdef SDSUPPORT
|
|
||||||
|
|
||||||
|
#ifdef SDSUPPORT
|
||||||
case 20: // M20 - list SD card
|
case 20: // M20 - list SD card
|
||||||
SERIAL_PROTOCOLLNPGM("Begin file list");
|
SERIAL_PROTOCOLLNPGM("Begin file list");
|
||||||
card.ls();
|
card.ls();
|
||||||
|
@ -643,7 +645,6 @@ FORCE_INLINE void process_commands()
|
||||||
case 26: //M26 - Set SD index
|
case 26: //M26 - Set SD index
|
||||||
if(card.cardOK && code_seen('S')) {
|
if(card.cardOK && code_seen('S')) {
|
||||||
card.setIndex(code_value_long());
|
card.setIndex(code_value_long());
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 27: //M27 - Get SD status
|
case 27: //M27 - Get SD status
|
||||||
|
@ -657,7 +658,6 @@ FORCE_INLINE void process_commands()
|
||||||
*(starpos-1) = '\0';
|
*(starpos-1) = '\0';
|
||||||
}
|
}
|
||||||
card.openFile(strchr_pointer+4,false);
|
card.openFile(strchr_pointer+4,false);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 29: //M29 - Stop SD write
|
case 29: //M29 - Stop SD write
|
||||||
//processed in write to file routine above
|
//processed in write to file routine above
|
||||||
|
@ -723,7 +723,7 @@ FORCE_INLINE void process_commands()
|
||||||
if (code_seen('S')) setTargetBed(code_value());
|
if (code_seen('S')) setTargetBed(code_value());
|
||||||
break;
|
break;
|
||||||
case 105 : // M105
|
case 105 : // M105
|
||||||
tmp_extruder = active_extruder;
|
tmp_extruder = ACTIVE_EXTRUDER;
|
||||||
if(code_seen('T')) {
|
if(code_seen('T')) {
|
||||||
tmp_extruder = code_value();
|
tmp_extruder = code_value();
|
||||||
if(tmp_extruder >= EXTRUDERS) {
|
if(tmp_extruder >= EXTRUDERS) {
|
||||||
|
@ -733,21 +733,16 @@ FORCE_INLINE void process_commands()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if (TEMP_0_PIN > -1) || (TEMP_2_PIN > -1)
|
#if (TEMP_0_PIN > -1)
|
||||||
SERIAL_PROTOCOLPGM("ok T:");
|
SERIAL_PROTOCOLPGM("ok T:");
|
||||||
SERIAL_PROTOCOL(degHotend(tmp_extruder));
|
SERIAL_PROTOCOL(degHotend(tmp_extruder));
|
||||||
#if TEMP_1_PIN > -1
|
#if TEMP_BED_PIN > -1
|
||||||
SERIAL_PROTOCOLPGM(" B:");
|
SERIAL_PROTOCOLPGM(" B:");
|
||||||
SERIAL_PROTOCOL(degBed());
|
SERIAL_PROTOCOL(degBed());
|
||||||
#endif //TEMP_1_PIN
|
#endif //TEMP_BED_PIN
|
||||||
#else
|
#else
|
||||||
SERIAL_ERROR_START;
|
SERIAL_ERROR_START;
|
||||||
SERIAL_ERRORLNPGM("No thermistors - no temp");
|
SERIAL_ERRORLNPGM("No thermistors - no temp");
|
||||||
#endif
|
|
||||||
#ifdef PIDTEMP
|
|
||||||
SERIAL_PROTOCOLPGM(" @:");
|
|
||||||
SERIAL_PROTOCOL( HeaterPower);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
SERIAL_PROTOCOLLN("");
|
SERIAL_PROTOCOLLN("");
|
||||||
return;
|
return;
|
||||||
|
@ -790,15 +785,27 @@ FORCE_INLINE void process_commands()
|
||||||
residencyStart = -1;
|
residencyStart = -1;
|
||||||
/* continue to loop until we have reached the target temp
|
/* continue to loop until we have reached the target temp
|
||||||
_and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
|
_and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
|
||||||
while((target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder))) ||
|
while((residencyStart == -1) ||
|
||||||
(residencyStart > -1 && (millis() - residencyStart) < TEMP_RESIDENCY_TIME*1000) ) {
|
(residencyStart > -1 && (millis() - residencyStart) < TEMP_RESIDENCY_TIME*1000) ) {
|
||||||
#else
|
#else
|
||||||
while ( target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder)&&(CooldownNoWait==false)) ) {
|
while ( target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder)&&(CooldownNoWait==false)) ) {
|
||||||
#endif //TEMP_RESIDENCY_TIME
|
#endif //TEMP_RESIDENCY_TIME
|
||||||
if( (millis() - codenum) > 1000 )
|
if( (millis() - codenum) > 1000 )
|
||||||
{ //Print Temp Reading every 1 second while heating up/cooling down
|
{ //Print Temp Reading and remaining time every 1 second while heating up/cooling down
|
||||||
SERIAL_PROTOCOLPGM("T:");
|
SERIAL_PROTOCOLPGM("T:");
|
||||||
SERIAL_PROTOCOLLN( degHotend(tmp_extruder) );
|
SERIAL_PROTOCOLLN( degHotend(tmp_extruder) );
|
||||||
|
SERIAL_PROTOCOLPGM(" E:");
|
||||||
|
SERIAL_PROTOCOLLN( (int)tmp_extruder );
|
||||||
|
SERIAL_PROTOCOLPGM(" W:");
|
||||||
|
if(residencyStart > -1)
|
||||||
|
{
|
||||||
|
codenum = TEMP_RESIDENCY_TIME - ((millis() - residencyStart) / 1000);
|
||||||
|
SERIAL_PROTOCOLLN( codenum );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SERIAL_PROTOCOLLN( "?" );
|
||||||
|
}
|
||||||
codenum = millis();
|
codenum = millis();
|
||||||
}
|
}
|
||||||
manage_heater();
|
manage_heater();
|
||||||
|
@ -818,8 +825,8 @@ FORCE_INLINE void process_commands()
|
||||||
starttime=millis();
|
starttime=millis();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 190: // M190 - Wait bed for heater to reach target.
|
case 190: // M190 - Wait for bed heater to reach target.
|
||||||
#if TEMP_1_PIN > -1
|
#if TEMP_BED_PIN > -1
|
||||||
LCD_MESSAGEPGM("Bed Heating.");
|
LCD_MESSAGEPGM("Bed Heating.");
|
||||||
if (code_seen('S')) setTargetBed(code_value());
|
if (code_seen('S')) setTargetBed(code_value());
|
||||||
codenum = millis();
|
codenum = millis();
|
||||||
|
@ -827,11 +834,11 @@ FORCE_INLINE void process_commands()
|
||||||
{
|
{
|
||||||
if( (millis()-codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
|
if( (millis()-codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
|
||||||
{
|
{
|
||||||
float tt=degHotend0();
|
float tt=degHotend(ACTIVE_EXTRUDER);
|
||||||
SERIAL_PROTOCOLPGM("T:");
|
SERIAL_PROTOCOLPGM("T:");
|
||||||
SERIAL_PROTOCOLLN(tt );
|
|
||||||
SERIAL_PROTOCOLPGM("ok T:");
|
|
||||||
SERIAL_PROTOCOL(tt);
|
SERIAL_PROTOCOL(tt);
|
||||||
|
SERIAL_PROTOCOLPGM(" E:");
|
||||||
|
SERIAL_PROTOCOLLN( (int)tmp_extruder );
|
||||||
SERIAL_PROTOCOLPGM(" B:");
|
SERIAL_PROTOCOLPGM(" B:");
|
||||||
SERIAL_PROTOCOLLN(degBed());
|
SERIAL_PROTOCOLLN(degBed());
|
||||||
codenum = millis();
|
codenum = millis();
|
||||||
|
@ -886,7 +893,9 @@ FORCE_INLINE void process_commands()
|
||||||
if(code_seen('E')) {
|
if(code_seen('E')) {
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
LCD_MESSAGEPGM("Free Move");
|
LCD_MESSAGEPGM("Free Move");
|
||||||
disable_e();
|
disable_e0();
|
||||||
|
disable_e1();
|
||||||
|
disable_e2();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
finishAndDisableSteppers();
|
finishAndDisableSteppers();
|
||||||
|
@ -1061,7 +1070,9 @@ FORCE_INLINE void process_commands()
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(code_seen('T')) {
|
|
||||||
|
else if(code_seen('T'))
|
||||||
|
{
|
||||||
tmp_extruder = code_value();
|
tmp_extruder = code_value();
|
||||||
if(tmp_extruder >= EXTRUDERS) {
|
if(tmp_extruder >= EXTRUDERS) {
|
||||||
SERIAL_ECHO_START;
|
SERIAL_ECHO_START;
|
||||||
|
@ -1071,8 +1082,12 @@ FORCE_INLINE void process_commands()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
active_extruder = tmp_extruder;
|
active_extruder = tmp_extruder;
|
||||||
|
SERIAL_ECHO_START;
|
||||||
|
SERIAL_ECHO("Active Extruder: ");
|
||||||
|
SERIAL_PROTOCOLLN((int)active_extruder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SERIAL_ECHO_START;
|
SERIAL_ECHO_START;
|
||||||
|
@ -1167,7 +1182,9 @@ void manage_inactivity(byte debug)
|
||||||
disable_x();
|
disable_x();
|
||||||
disable_y();
|
disable_y();
|
||||||
disable_z();
|
disable_z();
|
||||||
disable_e();
|
disable_e0();
|
||||||
|
disable_e1();
|
||||||
|
disable_e2();
|
||||||
}
|
}
|
||||||
check_axes_activity();
|
check_axes_activity();
|
||||||
}
|
}
|
||||||
|
@ -1179,7 +1196,9 @@ void kill()
|
||||||
disable_x();
|
disable_x();
|
||||||
disable_y();
|
disable_y();
|
||||||
disable_z();
|
disable_z();
|
||||||
disable_e();
|
disable_e0();
|
||||||
|
disable_e1();
|
||||||
|
disable_e2();
|
||||||
|
|
||||||
if(PS_ON_PIN > -1) pinMode(PS_ON_PIN,INPUT);
|
if(PS_ON_PIN > -1) pinMode(PS_ON_PIN,INPUT);
|
||||||
SERIAL_ERROR_START;
|
SERIAL_ERROR_START;
|
||||||
|
|
|
@ -47,6 +47,20 @@
|
||||||
#define READ(IO) _READ(IO)
|
#define READ(IO) _READ(IO)
|
||||||
/// Write to a pin wrapper
|
/// Write to a pin wrapper
|
||||||
#define WRITE(IO, v) _WRITE(IO, v)
|
#define WRITE(IO, v) _WRITE(IO, v)
|
||||||
|
#if EXTRUDERS > 2
|
||||||
|
#define WRITE_E_STEP(v) { if(ACTIVE_EXTRUDER == 2) { WRITE(E2_STEP_PIN, v); } else { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}}
|
||||||
|
#define NORM_E_DIR() { if(ACTIVE_EXTRUDER == 2) { WRITE(E2_DIR_PIN, INVERT_E2_DIR); } else { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}}
|
||||||
|
#define REV_E_DIR() { if(ACTIVE_EXTRUDER == 2) { WRITE(E2_DIR_PIN, !INVERT_E2_DIR); } else { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_DIR_PIN, !INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}}
|
||||||
|
#elif EXTRUDERS > 1
|
||||||
|
#define WRITE_E_STEP(v) { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}
|
||||||
|
#define NORM_E_DIR() { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}
|
||||||
|
#define REV_E_DIR() { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_DIR_PIN, !INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}
|
||||||
|
#else
|
||||||
|
#define WRITE_E_STEP(v) WRITE(E0_STEP_PIN, v)
|
||||||
|
#define NORM_E_DIR() WRITE(E0_DIR_PIN, INVERT_E0_DIR)
|
||||||
|
#define REV_E_DIR() WRITE(E0_DIR_PIN, !INVERT_E0_DIR)
|
||||||
|
#endif
|
||||||
|
|
||||||
/// toggle a pin wrapper
|
/// toggle a pin wrapper
|
||||||
#define TOGGLE(IO) _TOGGLE(IO)
|
#define TOGGLE(IO) _TOGGLE(IO)
|
||||||
|
|
||||||
|
|
173
Marlin/pins.h
173
Marlin/pins.h
|
@ -47,9 +47,9 @@
|
||||||
#define Z_MIN_PIN 17
|
#define Z_MIN_PIN 17
|
||||||
#define Z_MAX_PIN 16
|
#define Z_MAX_PIN 16
|
||||||
|
|
||||||
#define E_STEP_PIN 11
|
#define E0_STEP_PIN 11
|
||||||
#define E_DIR_PIN 12
|
#define E0_DIR_PIN 12
|
||||||
#define E_ENABLE_PIN -1
|
#define E0_ENABLE_PIN -1
|
||||||
|
|
||||||
#define SDPOWER -1
|
#define SDPOWER -1
|
||||||
#define SDSS -1
|
#define SDSS -1
|
||||||
|
@ -59,9 +59,13 @@
|
||||||
#define KILL_PIN -1
|
#define KILL_PIN -1
|
||||||
|
|
||||||
#define HEATER_0_PIN 6
|
#define HEATER_0_PIN 6
|
||||||
#define TEMP_0_PIN 0 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
|
||||||
#define HEATER_1_PIN -1
|
#define HEATER_1_PIN -1
|
||||||
#define HEATER_2_PIN -1
|
#define HEATER_2_PIN -1
|
||||||
|
#define TEMP_0_PIN 0 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
||||||
|
#define TEMP_1_PIN -1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
||||||
|
#define TEMP_2_PIN -1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
||||||
|
#define HEATER_BED_PIN -1
|
||||||
|
#define TEMP_BED_PIN -1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -120,9 +124,9 @@
|
||||||
#define Z_MIN_PIN 2
|
#define Z_MIN_PIN 2
|
||||||
#define Z_MAX_PIN 1
|
#define Z_MAX_PIN 1
|
||||||
|
|
||||||
#define E_STEP_PIN 12
|
#define E0_STEP_PIN 12
|
||||||
#define E_DIR_PIN 16
|
#define E0_DIR_PIN 16
|
||||||
#define E_ENABLE_PIN 3
|
#define E0_ENABLE_PIN 3
|
||||||
|
|
||||||
#define SDPOWER -1
|
#define SDPOWER -1
|
||||||
#define SDSS -1
|
#define SDSS -1
|
||||||
|
@ -132,9 +136,13 @@
|
||||||
#define KILL_PIN -1
|
#define KILL_PIN -1
|
||||||
|
|
||||||
#define HEATER_0_PIN 14
|
#define HEATER_0_PIN 14
|
||||||
#define TEMP_0_PIN 4 //D27 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
|
||||||
#define HEATER_1_PIN -1
|
#define HEATER_1_PIN -1
|
||||||
#define HEATER_2_PIN -1
|
#define HEATER_2_PIN -1
|
||||||
|
#define TEMP_0_PIN 4 //D27 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
||||||
|
#define TEMP_1_PIN -1
|
||||||
|
#define TEMP_2_PIN -1
|
||||||
|
#define HEATER_BED_PIN -1
|
||||||
|
#define TEMP_BED_PIN -1
|
||||||
/* Unused (1) (2) (3) 4 5 6 7 8 9 10 11 12 13 (14) (15) (16) 17 (18) (19) (20) (21) (22) (23) 24 (25) (26) (27) 28 (29) (30) (31) */
|
/* Unused (1) (2) (3) 4 5 6 7 8 9 10 11 12 13 (14) (15) (16) 17 (18) (19) (20) (21) (22) (23) 24 (25) (26) (27) 28 (29) (30) (31) */
|
||||||
|
|
||||||
|
|
||||||
|
@ -171,9 +179,9 @@
|
||||||
#define Z_MIN_PIN 30
|
#define Z_MIN_PIN 30
|
||||||
#define Z_MAX_PIN 31
|
#define Z_MAX_PIN 31
|
||||||
|
|
||||||
#define E_STEP_PIN 17
|
#define E0_STEP_PIN 17
|
||||||
#define E_DIR_PIN 16
|
#define E0_DIR_PIN 16
|
||||||
#define E_ENABLE_PIN -1
|
#define E0_ENABLE_PIN -1
|
||||||
|
|
||||||
#define SDPOWER -1
|
#define SDPOWER -1
|
||||||
#define SDSS 4
|
#define SDSS 4
|
||||||
|
@ -194,11 +202,13 @@
|
||||||
#define KILL_PIN -1
|
#define KILL_PIN -1
|
||||||
|
|
||||||
#define HEATER_0_PIN -1
|
#define HEATER_0_PIN -1
|
||||||
#define TEMP_0_PIN -1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
|
||||||
#define HEATER_1_PIN -1
|
#define HEATER_1_PIN -1
|
||||||
#define HEATER_2_PIN -1
|
#define HEATER_2_PIN -1
|
||||||
|
#define TEMP_0_PIN -1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
||||||
|
#define TEMP_1_PIN -1
|
||||||
|
#define TEMP_2_PIN -1
|
||||||
|
#define HEATER_BED_PIN -1
|
||||||
|
#define TEMP_BED_PIN -1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -230,37 +240,43 @@
|
||||||
#define X_DIR_PIN 55
|
#define X_DIR_PIN 55
|
||||||
#define X_ENABLE_PIN 38
|
#define X_ENABLE_PIN 38
|
||||||
#define X_MIN_PIN 3
|
#define X_MIN_PIN 3
|
||||||
#define X_MAX_PIN -1 //2 //Max endstops default to disabled "-1", set to commented value to enable.
|
#define X_MAX_PIN 2 //2 //Max endstops default to disabled "-1", set to commented value to enable.
|
||||||
|
|
||||||
#define Y_STEP_PIN 60
|
#define Y_STEP_PIN 60
|
||||||
#define Y_DIR_PIN 61
|
#define Y_DIR_PIN 61
|
||||||
#define Y_ENABLE_PIN 56
|
#define Y_ENABLE_PIN 56
|
||||||
#define Y_MIN_PIN 14
|
#define Y_MIN_PIN 14
|
||||||
#define Y_MAX_PIN -1 //15
|
#define Y_MAX_PIN 15 //15
|
||||||
|
|
||||||
#define Z_STEP_PIN 46
|
#define Z_STEP_PIN 46
|
||||||
#define Z_DIR_PIN 48
|
#define Z_DIR_PIN 48
|
||||||
#define Z_ENABLE_PIN 62
|
#define Z_ENABLE_PIN 62
|
||||||
#define Z_MIN_PIN 18
|
#define Z_MIN_PIN 18
|
||||||
#define Z_MAX_PIN -1 //19
|
#define Z_MAX_PIN 19 //19
|
||||||
|
|
||||||
#define E_STEP_PIN 26
|
#define E0_STEP_PIN 26
|
||||||
#define E_DIR_PIN 28
|
#define E0_DIR_PIN 28
|
||||||
#define E_ENABLE_PIN 24
|
#define E0_ENABLE_PIN 24
|
||||||
|
|
||||||
|
#define E1_STEP_PIN 36
|
||||||
|
#define E1_DIR_PIN 34
|
||||||
|
#define E1_ENABLE_PIN 30
|
||||||
|
|
||||||
#define SDPOWER -1
|
#define SDPOWER -1
|
||||||
#define SDSS 53
|
#define SDSS 53
|
||||||
#define LED_PIN 13
|
#define LED_PIN 13
|
||||||
#define FAN_PIN 9
|
#define FAN_PIN 4
|
||||||
#define PS_ON_PIN 12
|
#define PS_ON_PIN 12
|
||||||
#define KILL_PIN -1
|
#define KILL_PIN -1
|
||||||
|
|
||||||
#define HEATER_0_PIN 10
|
#define HEATER_0_PIN 10 // EXTRUDER 1
|
||||||
#define HEATER_1_PIN 8
|
#define HEATER_1_PIN 9 // EXTRUDER 2
|
||||||
#define HEATER_2_PIN -1
|
#define HEATER_2_PIN -1 // EXTRUDER 2
|
||||||
#define TEMP_0_PIN 13 // ANALOG NUMBERING
|
#define TEMP_0_PIN 13 // ANALOG NUMBERING
|
||||||
#define TEMP_1_PIN 14 // ANALOG NUMBERING
|
#define TEMP_1_PIN 15 // ANALOG NUMBERING
|
||||||
#define TEMP_2_PIN -1 // ANALOG NUMBERING
|
#define TEMP_2_PIN -1 // ANALOG NUMBERING
|
||||||
|
#define HEATER_BED_PIN 8 // BED
|
||||||
|
#define TEMP_BED_PIN 14 // ANALOG NUMBERING
|
||||||
|
|
||||||
|
|
||||||
#else // RAMPS_V_1_1 or RAMPS_V_1_2 as default
|
#else // RAMPS_V_1_1 or RAMPS_V_1_2 as default
|
||||||
|
@ -283,9 +299,9 @@
|
||||||
#define Z_MIN_PIN 18
|
#define Z_MIN_PIN 18
|
||||||
#define Z_MAX_PIN -1 //19
|
#define Z_MAX_PIN -1 //19
|
||||||
|
|
||||||
#define E_STEP_PIN 32
|
#define E0_STEP_PIN 32
|
||||||
#define E_DIR_PIN 34
|
#define E0_DIR_PIN 34
|
||||||
#define E_ENABLE_PIN 30
|
#define E0_ENABLE_PIN 30
|
||||||
|
|
||||||
#define SDPOWER 48
|
#define SDPOWER 48
|
||||||
#define SDSS 53
|
#define SDSS 53
|
||||||
|
@ -297,18 +313,19 @@
|
||||||
|
|
||||||
#ifdef RAMPS_V_1_0 // RAMPS_V_1_0
|
#ifdef RAMPS_V_1_0 // RAMPS_V_1_0
|
||||||
#define HEATER_0_PIN 12 // RAMPS 1.0
|
#define HEATER_0_PIN 12 // RAMPS 1.0
|
||||||
#define HEATER_1_PIN -1 // RAMPS 1.0
|
#define HEATER_BED_PIN -1 // RAMPS 1.0
|
||||||
#define FAN_PIN 11 // RAMPS 1.0
|
#define FAN_PIN 11 // RAMPS 1.0
|
||||||
|
|
||||||
#else // RAMPS_V_1_1 or RAMPS_V_1_2
|
#else // RAMPS_V_1_1 or RAMPS_V_1_2
|
||||||
#define HEATER_0_PIN 10 // RAMPS 1.1
|
#define HEATER_0_PIN 10 // RAMPS 1.1
|
||||||
#define HEATER_1_PIN 8 // RAMPS 1.1
|
#define HEATER_BED_PIN 8 // RAMPS 1.1
|
||||||
#define FAN_PIN 9 // RAMPS 1.1
|
#define FAN_PIN 9 // RAMPS 1.1
|
||||||
#endif
|
#endif
|
||||||
|
#define HEATER_1_PIN -1
|
||||||
#define HEATER_2_PIN -1
|
#define HEATER_2_PIN -1
|
||||||
#define TEMP_0_PIN 2 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
#define TEMP_0_PIN 2 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
||||||
#define TEMP_1_PIN 1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
#define TEMP_1_PIN -1
|
||||||
#define TEMP_2_PIN -1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
#define TEMP_2_PIN -1
|
||||||
|
#define TEMP_BED_PIN 1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// SPI for Max6675 Thermocouple
|
// SPI for Max6675 Thermocouple
|
||||||
|
@ -353,9 +370,9 @@
|
||||||
#define Z_MIN_PIN 4
|
#define Z_MIN_PIN 4
|
||||||
#define Z_MAX_PIN -1
|
#define Z_MAX_PIN -1
|
||||||
|
|
||||||
#define E_STEP_PIN 11
|
#define E0_STEP_PIN 11
|
||||||
#define E_DIR_PIN 12
|
#define E0_DIR_PIN 12
|
||||||
#define E_ENABLE_PIN -1
|
#define E0_ENABLE_PIN -1
|
||||||
|
|
||||||
#define SDPOWER -1
|
#define SDPOWER -1
|
||||||
#define SDSS -1
|
#define SDSS -1
|
||||||
|
@ -365,9 +382,13 @@
|
||||||
#define KILL_PIN -1
|
#define KILL_PIN -1
|
||||||
|
|
||||||
#define HEATER_0_PIN 6
|
#define HEATER_0_PIN 6
|
||||||
#define TEMP_0_PIN 0 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
|
||||||
#define HEATER_1_PIN -1
|
#define HEATER_1_PIN -1
|
||||||
#define HEATER_2_PIN -1
|
#define HEATER_2_PIN -1
|
||||||
|
#define TEMP_0_PIN 0 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
|
||||||
|
#define TEMP_1_PIN -1
|
||||||
|
#define TEMP_2_PIN -1
|
||||||
|
#define HEATER_BED_PIN -1
|
||||||
|
#define TEMP_BED_PIN -1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -404,19 +425,21 @@
|
||||||
#define Z_MAX_PIN -1
|
#define Z_MAX_PIN -1
|
||||||
|
|
||||||
//extruder pins
|
//extruder pins
|
||||||
#define E_STEP_PIN 4 //Edited @ EJE Electronics 20100715
|
#define E0_STEP_PIN 4 //Edited @ EJE Electronics 20100715
|
||||||
#define E_DIR_PIN 2 //Edited @ EJE Electronics 20100715
|
#define E0_DIR_PIN 2 //Edited @ EJE Electronics 20100715
|
||||||
#define E_ENABLE_PIN 3 //Added @ EJE Electronics 20100715
|
#define E0_ENABLE_PIN 3 //Added @ EJE Electronics 20100715
|
||||||
#define TEMP_0_PIN 5 //changed @ rkoeppl 20110410
|
#define TEMP_0_PIN 5 //changed @ rkoeppl 20110410
|
||||||
|
#define TEMP_1_PIN -1 //changed @ rkoeppl 20110410
|
||||||
|
#define TEMP_2_PIN -1 //changed @ rkoeppl 20110410
|
||||||
#define HEATER_0_PIN 14 //changed @ rkoeppl 20110410
|
#define HEATER_0_PIN 14 //changed @ rkoeppl 20110410
|
||||||
#define HEATER_1_PIN -1 //changed @ rkoeppl 20110410
|
#define HEATER_1_PIN -1
|
||||||
#define HEATER_2_PIN -1
|
#define HEATER_2_PIN -1
|
||||||
|
#define HEATER_BED_PIN -1 //changed @ rkoeppl 20110410
|
||||||
|
#define TEMP_BED_PIN -1 //changed @ rkoeppl 20110410
|
||||||
|
|
||||||
#define SDPOWER -1
|
#define SDPOWER -1
|
||||||
#define SDSS 17
|
#define SDSS 17
|
||||||
#define LED_PIN -1 //changed @ rkoeppl 20110410
|
#define LED_PIN -1 //changed @ rkoeppl 20110410
|
||||||
#define TEMP_1_PIN -1 //changed @ rkoeppl 20110410
|
|
||||||
#define TEMP_2_PIN -1
|
|
||||||
#define FAN_PIN -1 //changed @ rkoeppl 20110410
|
#define FAN_PIN -1 //changed @ rkoeppl 20110410
|
||||||
#define PS_ON_PIN -1 //changed @ rkoeppl 20110410
|
#define PS_ON_PIN -1 //changed @ rkoeppl 20110410
|
||||||
//our pin for debugging.
|
//our pin for debugging.
|
||||||
|
@ -459,8 +482,8 @@
|
||||||
#define Z_MIN_PIN 20
|
#define Z_MIN_PIN 20
|
||||||
#define Z_MAX_PIN -1
|
#define Z_MAX_PIN -1
|
||||||
|
|
||||||
#define E_STEP_PIN 1
|
#define E0_STEP_PIN 1
|
||||||
#define E_DIR_PIN 0
|
#define E0_DIR_PIN 0
|
||||||
|
|
||||||
#define LED_PIN -1
|
#define LED_PIN -1
|
||||||
|
|
||||||
|
@ -470,31 +493,33 @@
|
||||||
#define KILL_PIN -1
|
#define KILL_PIN -1
|
||||||
|
|
||||||
#define HEATER_0_PIN 13 // (extruder)
|
#define HEATER_0_PIN 13 // (extruder)
|
||||||
|
#define HEATER_1_PIN -1
|
||||||
|
#define HEATER_2_PIN -1
|
||||||
|
|
||||||
#ifdef SANGUINOLOLU_V_1_2
|
#ifdef SANGUINOLOLU_V_1_2
|
||||||
|
|
||||||
#define HEATER_1_PIN 12 // (bed)
|
#define HEATER_BED_PIN 12 // (bed)
|
||||||
#define X_ENABLE_PIN 14
|
#define X_ENABLE_PIN 14
|
||||||
#define Y_ENABLE_PIN 14
|
#define Y_ENABLE_PIN 14
|
||||||
#define Z_ENABLE_PIN 26
|
#define Z_ENABLE_PIN 26
|
||||||
#define E_ENABLE_PIN 14
|
#define E0_ENABLE_PIN 14
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define HEATER_1_PIN 14 // (bed)
|
#define HEATER_BED_PIN 14 // (bed)
|
||||||
#define X_ENABLE_PIN -1
|
#define X_ENABLE_PIN -1
|
||||||
#define Y_ENABLE_PIN -1
|
#define Y_ENABLE_PIN -1
|
||||||
#define Z_ENABLE_PIN -1
|
#define Z_ENABLE_PIN -1
|
||||||
#define E_ENABLE_PIN -1
|
#define E0_ENABLE_PIN -1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TEMP_0_PIN 7 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 33 extruder)
|
#define TEMP_0_PIN 7 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 33 extruder)
|
||||||
#define TEMP_1_PIN 6 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 34 bed)
|
#define TEMP_1_PIN -1
|
||||||
#define TEMP_2_PIN -1
|
#define TEMP_2_PIN -1
|
||||||
|
#define TEMP_BED_PIN 6 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 34 bed)
|
||||||
#define SDPOWER -1
|
#define SDPOWER -1
|
||||||
#define SDSS 31
|
#define SDSS 31
|
||||||
#define HEATER_2_PIN -1
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -529,8 +554,8 @@
|
||||||
#define Z_MAX_PIN 32
|
#define Z_MAX_PIN 32
|
||||||
#define Z_ENABLE_PIN 35
|
#define Z_ENABLE_PIN 35
|
||||||
|
|
||||||
#define HEATER_1_PIN 4
|
#define HEATER_BED_PIN 4
|
||||||
#define TEMP_1_PIN 11
|
#define TEMP_BED_PIN 11
|
||||||
|
|
||||||
#define EXTRUDER_0_STEP_PIN 43
|
#define EXTRUDER_0_STEP_PIN 43
|
||||||
#define EXTRUDER_0_DIR_PIN 45
|
#define EXTRUDER_0_DIR_PIN 45
|
||||||
|
@ -543,14 +568,14 @@
|
||||||
#define EXTRUDER_1_ENABLE_PIN 51
|
#define EXTRUDER_1_ENABLE_PIN 51
|
||||||
#define EXTRUDER_1_HEATER_PIN 3
|
#define EXTRUDER_1_HEATER_PIN 3
|
||||||
#define EXTRUDER_1_TEMPERATURE_PIN 10
|
#define EXTRUDER_1_TEMPERATURE_PIN 10
|
||||||
#define HEATER_2_PIN 51
|
#define HEATER_1_PIN 51
|
||||||
#define TEMP_2_PIN 3
|
#define TEMP_1_PIN 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define E_STEP_PIN EXTRUDER_0_STEP_PIN
|
#define E0_STEP_PIN EXTRUDER_0_STEP_PIN
|
||||||
#define E_DIR_PIN EXTRUDER_0_DIR_PIN
|
#define E0_DIR_PIN EXTRUDER_0_DIR_PIN
|
||||||
#define E_ENABLE_PIN EXTRUDER_0_ENABLE_PIN
|
#define E0_ENABLE_PIN EXTRUDER_0_ENABLE_PIN
|
||||||
|
|
||||||
#define SDPOWER -1
|
#define SDPOWER -1
|
||||||
#define SDSS 53
|
#define SDSS 53
|
||||||
|
@ -655,20 +680,22 @@
|
||||||
#define Z_MIN_PIN 15
|
#define Z_MIN_PIN 15
|
||||||
#define Z_MAX_PIN -1
|
#define Z_MAX_PIN -1
|
||||||
|
|
||||||
#define E_STEP_PIN 6
|
#define E0_STEP_PIN 6
|
||||||
#define E_DIR_PIN 7
|
#define E0_DIR_PIN 7
|
||||||
#define E_ENABLE_PIN 19
|
#define E0_ENABLE_PIN 19
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define HEATER_0_PIN 21 // Extruder
|
#define HEATER_0_PIN 21 // Extruder
|
||||||
#define HEATER_1_PIN 20 // Bed
|
#define HEATER_1_PIN -1
|
||||||
#define HEATER_2_PIN -1
|
#define HEATER_2_PIN -1
|
||||||
|
#define HEATER_BED_PIN 20 // Bed
|
||||||
#define FAN_PIN 22 // Fan
|
#define FAN_PIN 22 // Fan
|
||||||
|
|
||||||
#define TEMP_0_PIN 7 // Extruder
|
#define TEMP_0_PIN 7 // Extruder
|
||||||
#define TEMP_1_PIN 6 // Bed
|
#define TEMP_1_PIN -1
|
||||||
#define TEMP_2_PIN -1
|
#define TEMP_2_PIN -1
|
||||||
|
#define TEMP_BED_PIN 6 // Bed
|
||||||
|
|
||||||
#define SDPOWER -1
|
#define SDPOWER -1
|
||||||
#define SDSS 8
|
#define SDSS 8
|
||||||
|
@ -690,6 +717,22 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//List of pins which to ignore when asked to change by gcode, 0 and 1 are RX and TX, do not mess with those!
|
//List of pins which to ignore when asked to change by gcode, 0 and 1 are RX and TX, do not mess with those!
|
||||||
#define SENSITIVE_PINS {0, 1, X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, X_MIN_PIN, X_MAX_PIN, Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, E_STEP_PIN, E_DIR_PIN, E_ENABLE_PIN, LED_PIN, PS_ON_PIN, HEATER_0_PIN, HEATER_1_PIN, HEATER_2_PIN, FAN_PIN, TEMP_0_PIN, TEMP_1_PIN, TEMP_2_PIN}
|
#define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN
|
||||||
|
#if EXTRUDERS == 3
|
||||||
|
#define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN
|
||||||
|
#define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN
|
||||||
|
#elif EXTRUDERS == 2
|
||||||
|
#define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN
|
||||||
|
#define _E2_PINS -1
|
||||||
|
#elif EXTRUDERS == 1
|
||||||
|
#define _E1_PINS -1
|
||||||
|
#define _E2_PINS -1
|
||||||
|
#else
|
||||||
|
#error Unsupported number of extruders
|
||||||
|
#endif
|
||||||
|
#define SENSITIVE_PINS {0, 1, X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, X_MIN_PIN, X_MAX_PIN, Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, LED_PIN, PS_ON_PIN, \
|
||||||
|
HEATER_0_PIN, HEATER_1_PIN, HEATER_2_PIN, \
|
||||||
|
HEATER_BED_PIN, FAN_PIN, \
|
||||||
|
_E0_PINS, _E1_PINS, _E2_PINS, \
|
||||||
|
TEMP_0_PIN, TEMP_1_PIN, TEMP_2_PIN, TEMP_BED_PIN }
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -56,9 +56,9 @@
|
||||||
//#include <math.h>
|
//#include <math.h>
|
||||||
//#include <stdlib.h>
|
//#include <stdlib.h>
|
||||||
|
|
||||||
#include "Marlin.h"
|
|
||||||
#include "Configuration.h"
|
#include "Configuration.h"
|
||||||
#include "pins.h"
|
#include "pins.h"
|
||||||
|
#include "Marlin.h"
|
||||||
#include "fastio.h"
|
#include "fastio.h"
|
||||||
#include "planner.h"
|
#include "planner.h"
|
||||||
#include "stepper.h"
|
#include "stepper.h"
|
||||||
|
@ -81,8 +81,6 @@ float max_z_jerk;
|
||||||
float mintravelfeedrate;
|
float mintravelfeedrate;
|
||||||
unsigned long axis_steps_per_sqr_second[NUM_AXIS];
|
unsigned long axis_steps_per_sqr_second[NUM_AXIS];
|
||||||
|
|
||||||
uint8_t active_extruder = 0;
|
|
||||||
|
|
||||||
// The current position of the tool in absolute steps
|
// The current position of the tool in absolute steps
|
||||||
long position[4]; //rescaled from extern when axis_steps_per_unit are changed by gcode
|
long position[4]; //rescaled from extern when axis_steps_per_unit are changed by gcode
|
||||||
static float previous_speed[4]; // Speed of previous path line segment
|
static float previous_speed[4]; // Speed of previous path line segment
|
||||||
|
@ -95,7 +93,6 @@ static float previous_nominal_speed; // Nominal speed of previous path line segm
|
||||||
bool autotemp_enabled=false;
|
bool autotemp_enabled=false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=================semi-private variables, used in inline functions =====
|
//=================semi-private variables, used in inline functions =====
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -437,7 +434,7 @@ void check_axes_activity() {
|
||||||
if((DISABLE_X) && (x_active == 0)) disable_x();
|
if((DISABLE_X) && (x_active == 0)) disable_x();
|
||||||
if((DISABLE_Y) && (y_active == 0)) disable_y();
|
if((DISABLE_Y) && (y_active == 0)) disable_y();
|
||||||
if((DISABLE_Z) && (z_active == 0)) disable_z();
|
if((DISABLE_Z) && (z_active == 0)) disable_z();
|
||||||
if((DISABLE_E) && (e_active == 0)) disable_e();
|
if((DISABLE_E) && (e_active == 0)) { disable_e0();disable_e1();disable_e2(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -496,14 +493,9 @@ void plan_buffer_line(const float &x, const float &y, const float &z, const floa
|
||||||
if(block->steps_x != 0) enable_x();
|
if(block->steps_x != 0) enable_x();
|
||||||
if(block->steps_y != 0) enable_y();
|
if(block->steps_y != 0) enable_y();
|
||||||
if(block->steps_z != 0) enable_z();
|
if(block->steps_z != 0) enable_z();
|
||||||
if(extruder == 0) {
|
|
||||||
if(block->steps_e != 0) enable_e();
|
// Enable all
|
||||||
}
|
if(block->steps_e != 0) { enable_e0();enable_e1();enable_e2(); }
|
||||||
#if (EXTRUDERS > 1)
|
|
||||||
if(extruder == 1) {
|
|
||||||
if(block->steps_e != 0) enable_e1();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
float delta_mm[4];
|
float delta_mm[4];
|
||||||
delta_mm[X_AXIS] = (target[X_AXIS]-position[X_AXIS])/axis_steps_per_unit[X_AXIS];
|
delta_mm[X_AXIS] = (target[X_AXIS]-position[X_AXIS])/axis_steps_per_unit[X_AXIS];
|
||||||
|
|
|
@ -91,8 +91,6 @@ extern float max_z_jerk;
|
||||||
extern float mintravelfeedrate;
|
extern float mintravelfeedrate;
|
||||||
extern unsigned long axis_steps_per_sqr_second[NUM_AXIS];
|
extern unsigned long axis_steps_per_sqr_second[NUM_AXIS];
|
||||||
|
|
||||||
extern uint8_t active_extruder;
|
|
||||||
|
|
||||||
#ifdef AUTOTEMP
|
#ifdef AUTOTEMP
|
||||||
extern bool autotemp_enabled;
|
extern bool autotemp_enabled;
|
||||||
extern float autotemp_max;
|
extern float autotemp_max;
|
||||||
|
|
|
@ -24,9 +24,9 @@
|
||||||
|
|
||||||
#include "stepper.h"
|
#include "stepper.h"
|
||||||
#include "Configuration.h"
|
#include "Configuration.h"
|
||||||
|
#include "pins.h"
|
||||||
#include "Marlin.h"
|
#include "Marlin.h"
|
||||||
#include "planner.h"
|
#include "planner.h"
|
||||||
#include "pins.h"
|
|
||||||
#include "fastio.h"
|
#include "fastio.h"
|
||||||
#include "temperature.h"
|
#include "temperature.h"
|
||||||
#include "ultralcd.h"
|
#include "ultralcd.h"
|
||||||
|
@ -41,7 +41,6 @@
|
||||||
block_t *current_block; // A pointer to the block currently being traced
|
block_t *current_block; // A pointer to the block currently being traced
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================private variables ============================
|
//=============================private variables ============================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -419,11 +418,11 @@ ISR(TIMER1_COMPA_vect)
|
||||||
|
|
||||||
#ifndef ADVANCE
|
#ifndef ADVANCE
|
||||||
if ((out_bits & (1<<E_AXIS)) != 0) { // -direction
|
if ((out_bits & (1<<E_AXIS)) != 0) { // -direction
|
||||||
WRITE(E_DIR_PIN,INVERT_E_DIR);
|
NORM_E_DIR();
|
||||||
count_direction[E_AXIS]=-1;
|
count_direction[E_AXIS]=-1;
|
||||||
}
|
}
|
||||||
else { // +direction
|
else { // +direction
|
||||||
WRITE(E_DIR_PIN,!INVERT_E_DIR);
|
REV_E_DIR();
|
||||||
count_direction[E_AXIS]=-1;
|
count_direction[E_AXIS]=-1;
|
||||||
}
|
}
|
||||||
#endif //!ADVANCE
|
#endif //!ADVANCE
|
||||||
|
@ -473,9 +472,9 @@ ISR(TIMER1_COMPA_vect)
|
||||||
#ifndef ADVANCE
|
#ifndef ADVANCE
|
||||||
counter_e += current_block->steps_e;
|
counter_e += current_block->steps_e;
|
||||||
if (counter_e > 0) {
|
if (counter_e > 0) {
|
||||||
WRITE(E_STEP_PIN, HIGH);
|
WRITE_E_STEP(HIGH);
|
||||||
counter_e -= current_block->step_event_count;
|
counter_e -= current_block->step_event_count;
|
||||||
WRITE(E_STEP_PIN, LOW);
|
WRITE_E_STEP(LOW);
|
||||||
count_position[E_AXIS]+=count_direction[E_AXIS];
|
count_position[E_AXIS]+=count_direction[E_AXIS];
|
||||||
}
|
}
|
||||||
#endif //!ADVANCE
|
#endif //!ADVANCE
|
||||||
|
@ -559,18 +558,18 @@ ISR(TIMER1_COMPA_vect)
|
||||||
OCR0A = old_OCR0A;
|
OCR0A = old_OCR0A;
|
||||||
// Set E direction (Depends on E direction + advance)
|
// Set E direction (Depends on E direction + advance)
|
||||||
for(unsigned char i=0; i<4;) {
|
for(unsigned char i=0; i<4;) {
|
||||||
WRITE(E_STEP_PIN, LOW);
|
WRITE_E_STEP(LOW);
|
||||||
if (e_steps == 0) break;
|
if (e_steps == 0) break;
|
||||||
i++;
|
i++;
|
||||||
if (e_steps < 0) {
|
if (e_steps < 0) {
|
||||||
WRITE(E_DIR_PIN,INVERT_E_DIR);
|
WRITE_E_DIR(INVERT_E_DIR);
|
||||||
e_steps++;
|
e_steps++;
|
||||||
WRITE(E_STEP_PIN, HIGH);
|
WRITE_E_STEP(HIGH);
|
||||||
}
|
}
|
||||||
else if (e_steps > 0) {
|
else if (e_steps > 0) {
|
||||||
WRITE(E_DIR_PIN,!INVERT_E_DIR);
|
WRITE_E_DIR(!INVERT_E_DIR);
|
||||||
e_steps--;
|
e_steps--;
|
||||||
WRITE(E_STEP_PIN, HIGH);
|
WRITE_E_STEP(HIGH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -588,8 +587,14 @@ void st_init()
|
||||||
#if Z_DIR_PIN > -1
|
#if Z_DIR_PIN > -1
|
||||||
SET_OUTPUT(Z_DIR_PIN);
|
SET_OUTPUT(Z_DIR_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if E_DIR_PIN > -1
|
#if E0_DIR_PIN > -1
|
||||||
SET_OUTPUT(E_DIR_PIN);
|
SET_OUTPUT(E0_DIR_PIN);
|
||||||
|
#endif
|
||||||
|
#if defined(E1_DIR_PIN) && (E1_DIR_PIN > -1)
|
||||||
|
SET_OUTPUT(E1_DIR_PIN);
|
||||||
|
#endif
|
||||||
|
#if defined(E2_DIR_PIN) && (E2_DIR_PIN > -1)
|
||||||
|
SET_OUTPUT(E2_DIR_PIN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Initialize Enable Pins - steppers default to disabled.
|
//Initialize Enable Pins - steppers default to disabled.
|
||||||
|
@ -606,9 +611,17 @@ void st_init()
|
||||||
SET_OUTPUT(Z_ENABLE_PIN);
|
SET_OUTPUT(Z_ENABLE_PIN);
|
||||||
if(!Z_ENABLE_ON) WRITE(Z_ENABLE_PIN,HIGH);
|
if(!Z_ENABLE_ON) WRITE(Z_ENABLE_PIN,HIGH);
|
||||||
#endif
|
#endif
|
||||||
#if (E_ENABLE_PIN > -1)
|
#if (E0_ENABLE_PIN > -1)
|
||||||
SET_OUTPUT(E_ENABLE_PIN);
|
SET_OUTPUT(E0_ENABLE_PIN);
|
||||||
if(!E_ENABLE_ON) WRITE(E_ENABLE_PIN,HIGH);
|
if(!E_ENABLE_ON) WRITE(E0_ENABLE_PIN,HIGH);
|
||||||
|
#endif
|
||||||
|
#if defined(E1_ENABLE_PIN) && (E1_ENABLE_PIN > -1)
|
||||||
|
SET_OUTPUT(E1_ENABLE_PIN);
|
||||||
|
if(!E_ENABLE_ON) WRITE(E1_ENABLE_PIN,HIGH);
|
||||||
|
#endif
|
||||||
|
#if defined(E2_ENABLE_PIN) && (E2_ENABLE_PIN > -1)
|
||||||
|
SET_OUTPUT(E2_ENABLE_PIN);
|
||||||
|
if(!E_ENABLE_ON) WRITE(E2_ENABLE_PIN,HIGH);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//endstops and pullups
|
//endstops and pullups
|
||||||
|
@ -669,8 +682,14 @@ void st_init()
|
||||||
#if (Z_STEP_PIN > -1)
|
#if (Z_STEP_PIN > -1)
|
||||||
SET_OUTPUT(Z_STEP_PIN);
|
SET_OUTPUT(Z_STEP_PIN);
|
||||||
#endif
|
#endif
|
||||||
#if (E_STEP_PIN > -1)
|
#if (E0_STEP_PIN > -1)
|
||||||
SET_OUTPUT(E_STEP_PIN);
|
SET_OUTPUT(E0_STEP_PIN);
|
||||||
|
#endif
|
||||||
|
#if defined(E1_STEP_PIN) && (E1_STEP_PIN > -1)
|
||||||
|
SET_OUTPUT(E1_STEP_PIN);
|
||||||
|
#endif
|
||||||
|
#if defined(E2_STEP_PIN) && (E2_STEP_PIN > -1)
|
||||||
|
SET_OUTPUT(E2_STEP_PIN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// waveform generation = 0100 = CTC
|
// waveform generation = 0100 = CTC
|
||||||
|
@ -749,5 +768,7 @@ void finishAndDisableSteppers()
|
||||||
disable_x();
|
disable_x();
|
||||||
disable_y();
|
disable_y();
|
||||||
disable_z();
|
disable_z();
|
||||||
disable_e();
|
disable_e0();
|
||||||
|
disable_e1();
|
||||||
|
disable_e2();
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,17 +41,14 @@
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================public variables============================
|
//=============================public variables============================
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
int target_raw[3] = {0, 0, 0};
|
int target_raw[EXTRUDERS] = { 0 };
|
||||||
int current_raw[3] = {0, 0, 0};
|
int target_raw_bed = 0;
|
||||||
int heatingtarget_raw[3]= {0, 0, 0};
|
int current_raw[EXTRUDERS] = { 0 };
|
||||||
|
int current_raw_bed = 0;
|
||||||
|
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
|
// used external
|
||||||
// probably used external
|
float pid_setpoint[EXTRUDERS] = { 0.0 };
|
||||||
float HeaterPower;
|
|
||||||
float pid_setpoint = 0.0;
|
|
||||||
|
|
||||||
|
|
||||||
float Kp=DEFAULT_Kp;
|
float Kp=DEFAULT_Kp;
|
||||||
float Ki=DEFAULT_Ki;
|
float Ki=DEFAULT_Ki;
|
||||||
|
@ -72,33 +69,63 @@ static unsigned long previous_millis_bed_heater;
|
||||||
|
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
//static cannot be external:
|
//static cannot be external:
|
||||||
static float temp_iState = 0;
|
static float temp_iState[EXTRUDERS] = { 0 };
|
||||||
static float temp_dState = 0;
|
static float temp_dState[EXTRUDERS] = { 0 };
|
||||||
static float pTerm;
|
static float pTerm[EXTRUDERS];
|
||||||
static float iTerm;
|
static float iTerm[EXTRUDERS];
|
||||||
static float dTerm;
|
static float dTerm[EXTRUDERS];
|
||||||
//int output;
|
//int output;
|
||||||
static float pid_error;
|
static float pid_error[EXTRUDERS];
|
||||||
static float temp_iState_min;
|
static float temp_iState_min[EXTRUDERS];
|
||||||
static float temp_iState_max;
|
static float temp_iState_max[EXTRUDERS];
|
||||||
// static float pid_input;
|
// static float pid_input[EXTRUDERS];
|
||||||
// static float pid_output;
|
// static float pid_output[EXTRUDERS];
|
||||||
static bool pid_reset;
|
static bool pid_reset[EXTRUDERS];
|
||||||
|
|
||||||
#endif //PIDTEMP
|
#endif //PIDTEMP
|
||||||
|
|
||||||
#ifdef WATCHPERIOD
|
#ifdef WATCHPERIOD
|
||||||
static int watch_raw[3] = {-1000,-1000,-1000};
|
static int watch_raw[EXTRUDERS] = { -1000 }; // the first value used for all
|
||||||
static unsigned long watchmillis = 0;
|
static unsigned long watchmillis = 0;
|
||||||
#endif //WATCHPERIOD
|
#endif //WATCHPERIOD
|
||||||
|
|
||||||
// Init min and max temp with extreme values to prevent false errors during startup
|
// Init min and max temp with extreme values to prevent false errors during startup
|
||||||
static int minttemp_0 = 0;
|
static int minttemp[EXTRUDERS] = { 0 };
|
||||||
static int maxttemp_0 = 16383;
|
static int maxttemp[EXTRUDERS] = { 16383 }; // the first value used for all
|
||||||
//static int minttemp_1 = 0;
|
|
||||||
//static int maxttemp_1 = 16383;
|
|
||||||
static int bed_minttemp = 0;
|
static int bed_minttemp = 0;
|
||||||
static int bed_maxttemp = 16383;
|
static int bed_maxttemp = 16383;
|
||||||
|
static int heater_pin_map[EXTRUDERS] = { HEATER_0_PIN
|
||||||
|
#if EXTRUDERS > 1
|
||||||
|
, HEATER_1_PIN
|
||||||
|
#endif
|
||||||
|
#if EXTRUDERS > 2
|
||||||
|
, HEATER_2_PIN
|
||||||
|
#endif
|
||||||
|
#if EXTRUDERS > 3
|
||||||
|
#error Unsupported number of extruders
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
static void *heater_ttbl_map[EXTRUDERS] = { (void *)heater_0_temptable
|
||||||
|
#if EXTRUDERS > 1
|
||||||
|
, (void *)heater_1_temptable
|
||||||
|
#endif
|
||||||
|
#if EXTRUDERS > 2
|
||||||
|
, (void *)heater_2_temptable
|
||||||
|
#endif
|
||||||
|
#if EXTRUDERS > 3
|
||||||
|
#error Unsupported number of extruders
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
static int heater_ttbllen_map[EXTRUDERS] = { heater_0_temptable_len
|
||||||
|
#if EXTRUDERS > 1
|
||||||
|
, heater_1_temptable_len
|
||||||
|
#endif
|
||||||
|
#if EXTRUDERS > 2
|
||||||
|
, heater_2_temptable_len
|
||||||
|
#endif
|
||||||
|
#if EXTRUDERS > 3
|
||||||
|
#error Unsupported number of extruders
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//============================= functions ============================
|
//============================= functions ============================
|
||||||
|
@ -107,7 +134,9 @@ static unsigned long previous_millis_bed_heater;
|
||||||
void updatePID()
|
void updatePID()
|
||||||
{
|
{
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
temp_iState_max = PID_INTEGRAL_DRIVE_MAX / Ki;
|
for(int e = 0; e < EXTRUDERS; e++) {
|
||||||
|
temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / Ki;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,6 +148,7 @@ void manage_heater()
|
||||||
|
|
||||||
float pid_input;
|
float pid_input;
|
||||||
float pid_output;
|
float pid_output;
|
||||||
|
|
||||||
if(temp_meas_ready != true) //better readability
|
if(temp_meas_ready != true) //better readability
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -126,85 +156,77 @@ void manage_heater()
|
||||||
temp_meas_ready = false;
|
temp_meas_ready = false;
|
||||||
CRITICAL_SECTION_END;
|
CRITICAL_SECTION_END;
|
||||||
|
|
||||||
|
for(int e = 0; e < EXTRUDERS; e++)
|
||||||
|
{
|
||||||
|
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
pid_input = analog2temp(current_raw[TEMPSENSOR_HOTEND_0]);
|
pid_input = analog2temp(current_raw[e], e);
|
||||||
|
|
||||||
#ifndef PID_OPENLOOP
|
#ifndef PID_OPENLOOP
|
||||||
pid_error = pid_setpoint - pid_input;
|
pid_error[e] = pid_setpoint[e] - pid_input;
|
||||||
if(pid_error > 10){
|
if(pid_error[e] > 10) {
|
||||||
pid_output = PID_MAX;
|
pid_output = PID_MAX;
|
||||||
pid_reset = true;
|
pid_reset[e] = true;
|
||||||
}
|
}
|
||||||
else if(pid_error < -10) {
|
else if(pid_error[e] < -10) {
|
||||||
pid_output = 0;
|
pid_output = 0;
|
||||||
pid_reset = true;
|
pid_reset[e] = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(pid_reset == true) {
|
if(pid_reset[e] == true) {
|
||||||
temp_iState = 0.0;
|
temp_iState[e] = 0.0;
|
||||||
pid_reset = false;
|
pid_reset[e] = false;
|
||||||
}
|
}
|
||||||
pTerm = Kp * pid_error;
|
pTerm[e] = Kp * pid_error[e];
|
||||||
temp_iState += pid_error;
|
temp_iState[e] += pid_error[e];
|
||||||
temp_iState = constrain(temp_iState, temp_iState_min, temp_iState_max);
|
temp_iState[e] = constrain(temp_iState[e], temp_iState_min[e], temp_iState_max[e]);
|
||||||
iTerm = Ki * temp_iState;
|
iTerm[e] = Ki * temp_iState[e];
|
||||||
//K1 defined in Configuration.h in the PID settings
|
//K1 defined in Configuration.h in the PID settings
|
||||||
#define K2 (1.0-K1)
|
#define K2 (1.0-K1)
|
||||||
dTerm = (Kd * (pid_input - temp_dState))*K2 + (K1 * dTerm);
|
dTerm[e] = (Kd * (pid_input - temp_dState[e]))*K2 + (K1 * dTerm[e]);
|
||||||
temp_dState = pid_input;
|
temp_dState[e] = pid_input;
|
||||||
// #ifdef PID_ADD_EXTRUSION_RATE
|
pid_output = constrain(pTerm[e] + iTerm[e] - dTerm[e], 0, PID_MAX);
|
||||||
// pTerm+=Kc*current_block->speed_e; //additional heating if extrusion speed is high
|
|
||||||
// #endif
|
|
||||||
pid_output = constrain(pTerm + iTerm - dTerm, 0, PID_MAX);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif //PID_OPENLOOP
|
#endif //PID_OPENLOOP
|
||||||
#ifdef PID_DEBUG
|
#ifdef PID_DEBUG
|
||||||
//SERIAL_ECHOLN(" PIDDEBUG Input "<<pid_input<<" Output "<<pid_output" pTerm "<<pTerm<<" iTerm "<<iTerm<<" dTerm "<<dTerm);
|
SERIAL_ECHOLN(" PIDDEBUG "<<e<<": Input "<<pid_input<<" Output "<<pid_output" pTerm "<<pTerm[e]<<" iTerm "<<iTerm[e]<<" dTerm "<<dTerm[e]);
|
||||||
#endif //PID_DEBUG
|
#endif //PID_DEBUG
|
||||||
HeaterPower=pid_output;
|
#else /* PID off */
|
||||||
// Check if temperature is within the correct range
|
pid_output = 0;
|
||||||
if((current_raw[TEMPSENSOR_HOTEND_0] > minttemp_0) && (current_raw[TEMPSENSOR_HOTEND_0] < maxttemp_0)) {
|
if(current_raw[e] < target_raw[e]) {
|
||||||
analogWrite(HEATER_0_PIN, pid_output);
|
pid_output = PID_MAX;
|
||||||
}
|
|
||||||
else {
|
|
||||||
analogWrite(HEATER_0_PIN, 0);
|
|
||||||
}
|
|
||||||
#endif //PIDTEMP
|
|
||||||
|
|
||||||
#ifndef PIDTEMP
|
|
||||||
// Check if temperature is within the correct range
|
|
||||||
if((current_raw[TEMPSENSOR_HOTEND_0] > minttemp_0) && (current_raw[TEMPSENSOR_HOTEND_0] < maxttemp_0)) {
|
|
||||||
if(current_raw[TEMPSENSOR_HOTEND_0] >= target_raw[TEMPSENSOR_HOTEND_0]) {
|
|
||||||
WRITE(HEATER_0_PIN,LOW);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
WRITE(HEATER_0_PIN,HIGH);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
WRITE(HEATER_0_PIN,LOW);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Check if temperature is within the correct range
|
||||||
|
if((current_raw[e] > minttemp[e]) && (current_raw[e] < maxttemp[e]))
|
||||||
|
{
|
||||||
|
analogWrite(heater_pin_map[e], pid_output);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
analogWrite(heater_pin_map[e], 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End extruder for loop
|
||||||
|
|
||||||
if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL)
|
if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL)
|
||||||
return;
|
return;
|
||||||
previous_millis_bed_heater = millis();
|
previous_millis_bed_heater = millis();
|
||||||
|
|
||||||
#if TEMP_1_PIN > -1
|
#if TEMP_BED_PIN > -1
|
||||||
// Check if temperature is within the correct range
|
// Check if temperature is within the correct range
|
||||||
if((current_raw[TEMPSENSOR_BED] > bed_minttemp) && (current_raw[TEMPSENSOR_BED] < bed_maxttemp)) {
|
if((current_raw_bed > bed_minttemp) && (current_raw_bed < bed_maxttemp)) {
|
||||||
if(current_raw[TEMPSENSOR_BED] >= target_raw[TEMPSENSOR_BED])
|
if(current_raw_bed >= target_raw_bed)
|
||||||
{
|
{
|
||||||
WRITE(HEATER_1_PIN,LOW);
|
WRITE(HEATER_BED_PIN,LOW);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WRITE(HEATER_1_PIN,HIGH);
|
WRITE(HEATER_BED_PIN,HIGH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
WRITE(HEATER_1_PIN,LOW);
|
WRITE(HEATER_BED_PIN,LOW);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -214,30 +236,38 @@ void manage_heater()
|
||||||
// For a thermistor, it uses the RepRap thermistor temp table.
|
// For a thermistor, it uses the RepRap thermistor temp table.
|
||||||
// This is needed because PID in hydra firmware hovers around a given analog value, not a temp value.
|
// This is needed because PID in hydra firmware hovers around a given analog value, not a temp value.
|
||||||
// This function is derived from inversing the logic from a portion of getTemperature() in FiveD RepRap firmware.
|
// This function is derived from inversing the logic from a portion of getTemperature() in FiveD RepRap firmware.
|
||||||
int temp2analog(int celsius) {
|
int temp2analog(int celsius, uint8_t e) {
|
||||||
#ifdef HEATER_0_USES_THERMISTOR
|
if(e >= EXTRUDERS)
|
||||||
|
{
|
||||||
|
SERIAL_ERROR_START;
|
||||||
|
SERIAL_ERROR((int)e);
|
||||||
|
SERIAL_ERRORLNPGM(" - Invalid extruder number!");
|
||||||
|
kill();
|
||||||
|
}
|
||||||
|
if(heater_ttbl_map[e] != 0)
|
||||||
|
{
|
||||||
int raw = 0;
|
int raw = 0;
|
||||||
byte i;
|
byte i;
|
||||||
|
short (*tt)[][2] = (short (*)[][2])(heater_ttbl_map[e]);
|
||||||
|
|
||||||
for (i=1; i<NUMTEMPS_HEATER_0; i++)
|
for (i=1; i<heater_ttbllen_map[e]; i++)
|
||||||
{
|
{
|
||||||
if (PGM_RD_W(heater_0_temptable[i][1]) < celsius)
|
if (PGM_RD_W((*tt)[i][1]) < celsius)
|
||||||
{
|
{
|
||||||
raw = PGM_RD_W(heater_0_temptable[i-1][0]) +
|
raw = PGM_RD_W((*tt)[i-1][0]) +
|
||||||
(celsius - PGM_RD_W(heater_0_temptable[i-1][1])) *
|
(celsius - PGM_RD_W((*tt)[i-1][1])) *
|
||||||
(PGM_RD_W(heater_0_temptable[i][0]) - PGM_RD_W(heater_0_temptable[i-1][0])) /
|
(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0])) /
|
||||||
(PGM_RD_W(heater_0_temptable[i][1]) - PGM_RD_W(heater_0_temptable[i-1][1]));
|
(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1]));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Overflow: Set to last value in the table
|
// Overflow: Set to last value in the table
|
||||||
if (i == NUMTEMPS_HEATER_0) raw = PGM_RD_W(heater_0_temptable[i-1][0]);
|
if (i == heater_ttbllen_map[e]) raw = PGM_RD_W((*tt)[i-1][0]);
|
||||||
|
|
||||||
return (1023 * OVERSAMPLENR) - raw;
|
return (1023 * OVERSAMPLENR) - raw;
|
||||||
#elif defined HEATER_0_USES_AD595
|
}
|
||||||
return celsius * (1024.0 / (5.0 * 100.0) ) * OVERSAMPLENR;
|
return celsius * (1024.0 / (5.0 * 100.0) ) * OVERSAMPLENR;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Takes bed temperature value as input and returns corresponding raw value.
|
// Takes bed temperature value as input and returns corresponding raw value.
|
||||||
|
@ -246,11 +276,10 @@ int temp2analog(int celsius) {
|
||||||
// This function is derived from inversing the logic from a portion of getTemperature() in FiveD RepRap firmware.
|
// This function is derived from inversing the logic from a portion of getTemperature() in FiveD RepRap firmware.
|
||||||
int temp2analogBed(int celsius) {
|
int temp2analogBed(int celsius) {
|
||||||
#ifdef BED_USES_THERMISTOR
|
#ifdef BED_USES_THERMISTOR
|
||||||
|
|
||||||
int raw = 0;
|
int raw = 0;
|
||||||
byte i;
|
byte i;
|
||||||
|
|
||||||
for (i=1; i<BNUMTEMPS; i++)
|
for (i=1; i<bedtemptable_len; i++)
|
||||||
{
|
{
|
||||||
if (PGM_RD_W(bedtemptable[i][1]) < celsius)
|
if (PGM_RD_W(bedtemptable[i][1]) < celsius)
|
||||||
{
|
{
|
||||||
|
@ -264,45 +293,52 @@ int temp2analogBed(int celsius) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Overflow: Set to last value in the table
|
// Overflow: Set to last value in the table
|
||||||
if (i == BNUMTEMPS) raw = PGM_RD_W(bedtemptable[i-1][0]);
|
if (i == bedtemptable_len) raw = PGM_RD_W(bedtemptable[i-1][0]);
|
||||||
|
|
||||||
return (1023 * OVERSAMPLENR) - raw;
|
return (1023 * OVERSAMPLENR) - raw;
|
||||||
#elif defined BED_USES_AD595
|
#elif defined BED_USES_AD595
|
||||||
return lround(celsius * (1024.0 * OVERSAMPLENR/ (5.0 * 100.0) ) );
|
return lround(celsius * (1024.0 * OVERSAMPLENR/ (5.0 * 100.0) ) );
|
||||||
#else
|
#else
|
||||||
#warning No heater-type defined for the bed.
|
#warning No heater-type defined for the bed.
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Derived from RepRap FiveD extruder::getTemperature()
|
// Derived from RepRap FiveD extruder::getTemperature()
|
||||||
// For hot end temperature measurement.
|
// For hot end temperature measurement.
|
||||||
float analog2temp(int raw) {
|
float analog2temp(int raw, uint8_t e) {
|
||||||
#ifdef HEATER_0_USES_THERMISTOR
|
if(e >= EXTRUDERS)
|
||||||
|
{
|
||||||
|
SERIAL_ERROR_START;
|
||||||
|
SERIAL_ERROR((int)e);
|
||||||
|
SERIAL_ERRORLNPGM(" - Invalid extruder number !");
|
||||||
|
kill();
|
||||||
|
}
|
||||||
|
if(heater_ttbl_map[e] != 0)
|
||||||
|
{
|
||||||
float celsius = 0;
|
float celsius = 0;
|
||||||
byte i;
|
byte i;
|
||||||
|
short (*tt)[][2] = (short (*)[][2])(heater_ttbl_map[e]);
|
||||||
|
|
||||||
raw = (1023 * OVERSAMPLENR) - raw;
|
raw = (1023 * OVERSAMPLENR) - raw;
|
||||||
for (i=1; i<NUMTEMPS_HEATER_0; i++)
|
for (i=1; i<heater_ttbllen_map[e]; i++)
|
||||||
{
|
{
|
||||||
if (PGM_RD_W(heater_0_temptable[i][0]) > raw)
|
if (PGM_RD_W((*tt)[i][0]) > raw)
|
||||||
{
|
{
|
||||||
celsius = PGM_RD_W(heater_0_temptable[i-1][1]) +
|
celsius = PGM_RD_W((*tt)[i-1][1]) +
|
||||||
(raw - PGM_RD_W(heater_0_temptable[i-1][0])) *
|
(raw - PGM_RD_W((*tt)[i-1][0])) *
|
||||||
(float)(PGM_RD_W(heater_0_temptable[i][1]) - PGM_RD_W(heater_0_temptable[i-1][1])) /
|
(float)(PGM_RD_W((*tt)[i][1]) - PGM_RD_W((*tt)[i-1][1])) /
|
||||||
(float)(PGM_RD_W(heater_0_temptable[i][0]) - PGM_RD_W(heater_0_temptable[i-1][0]));
|
(float)(PGM_RD_W((*tt)[i][0]) - PGM_RD_W((*tt)[i-1][0]));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Overflow: Set to last value in the table
|
// Overflow: Set to last value in the table
|
||||||
if (i == NUMTEMPS_HEATER_0) celsius = PGM_RD_W(heater_0_temptable[i-1][1]);
|
if (i == heater_ttbllen_map[e]) celsius = PGM_RD_W((*tt)[i-1][1]);
|
||||||
|
|
||||||
return celsius;
|
return celsius;
|
||||||
#elif defined HEATER_0_USES_AD595
|
}
|
||||||
return raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR;
|
return raw * ((5.0 * 100.0) / 1024.0) / OVERSAMPLENR;
|
||||||
#else
|
|
||||||
#error PLEASE DEFINE HEATER TYPE
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Derived from RepRap FiveD extruder::getTemperature()
|
// Derived from RepRap FiveD extruder::getTemperature()
|
||||||
|
@ -314,7 +350,7 @@ float analog2tempBed(int raw) {
|
||||||
|
|
||||||
raw = (1023 * OVERSAMPLENR) - raw;
|
raw = (1023 * OVERSAMPLENR) - raw;
|
||||||
|
|
||||||
for (i=1; i<BNUMTEMPS; i++)
|
for (i=1; i<bedtemptable_len; i++)
|
||||||
{
|
{
|
||||||
if (PGM_RD_W(bedtemptable[i][0]) > raw)
|
if (PGM_RD_W(bedtemptable[i][0]) > raw)
|
||||||
{
|
{
|
||||||
|
@ -328,7 +364,7 @@ float analog2tempBed(int raw) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Overflow: Set to last value in the table
|
// Overflow: Set to last value in the table
|
||||||
if (i == BNUMTEMPS) celsius = PGM_RD_W(bedtemptable[i-1][1]);
|
if (i == bedtemptable_len) celsius = PGM_RD_W(bedtemptable[i-1][1]);
|
||||||
|
|
||||||
return celsius;
|
return celsius;
|
||||||
|
|
||||||
|
@ -342,6 +378,19 @@ float analog2tempBed(int raw) {
|
||||||
|
|
||||||
void tp_init()
|
void tp_init()
|
||||||
{
|
{
|
||||||
|
// Finish init of mult extruder arrays
|
||||||
|
for(int e = 0; e < EXTRUDERS; e++) {
|
||||||
|
// populate with the first value
|
||||||
|
#ifdef WATCHPERIOD
|
||||||
|
watch_raw[e] = watch_raw[0];
|
||||||
|
#endif
|
||||||
|
maxttemp[e] = maxttemp[0];
|
||||||
|
#ifdef PIDTEMP
|
||||||
|
temp_iState_min[e] = 0.0;
|
||||||
|
temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / Ki;
|
||||||
|
#endif //PIDTEMP
|
||||||
|
}
|
||||||
|
|
||||||
#if (HEATER_0_PIN > -1)
|
#if (HEATER_0_PIN > -1)
|
||||||
SET_OUTPUT(HEATER_0_PIN);
|
SET_OUTPUT(HEATER_0_PIN);
|
||||||
#endif
|
#endif
|
||||||
|
@ -351,11 +400,12 @@ void tp_init()
|
||||||
#if (HEATER_2_PIN > -1)
|
#if (HEATER_2_PIN > -1)
|
||||||
SET_OUTPUT(HEATER_2_PIN);
|
SET_OUTPUT(HEATER_2_PIN);
|
||||||
#endif
|
#endif
|
||||||
|
#if (HEATER_BED_PIN > -1)
|
||||||
#ifdef PIDTEMP
|
SET_OUTPUT(HEATER_BED_PIN);
|
||||||
temp_iState_min = 0.0;
|
#endif
|
||||||
temp_iState_max = PID_INTEGRAL_DRIVE_MAX / Ki;
|
#if (FAN_PIN > -1)
|
||||||
#endif //PIDTEMP
|
SET_OUTPUT(FAN_PIN);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Set analog inputs
|
// Set analog inputs
|
||||||
ADCSRA = 1<<ADEN | 1<<ADSC | 1<<ADIF | 0x07;
|
ADCSRA = 1<<ADEN | 1<<ADSC | 1<<ADIF | 0x07;
|
||||||
|
@ -387,6 +437,14 @@ void tp_init()
|
||||||
ADCSRB = 1<<MUX5;
|
ADCSRB = 1<<MUX5;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if (TEMP_BED_PIN > -1)
|
||||||
|
#if TEMP_BED_PIN < 8
|
||||||
|
DIDR0 |= 1<<TEMP_BED_PIN;
|
||||||
|
#else
|
||||||
|
DIDR2 |= 1<<(TEMP_BED_PIN - 8);
|
||||||
|
ADCSRB = 1<<MUX5;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
// Use timer0 for temperature measurement
|
// Use timer0 for temperature measurement
|
||||||
// Interleave temperature interrupt with millies interrupt
|
// Interleave temperature interrupt with millies interrupt
|
||||||
|
@ -394,27 +452,34 @@ void tp_init()
|
||||||
TIMSK0 |= (1<<OCIE0B);
|
TIMSK0 |= (1<<OCIE0B);
|
||||||
|
|
||||||
// Wait for temperature measurement to settle
|
// Wait for temperature measurement to settle
|
||||||
delay(200);
|
delay(250);
|
||||||
|
|
||||||
#ifdef HEATER_0_MINTEMP
|
#ifdef HEATER_0_MINTEMP
|
||||||
minttemp_0 = temp2analog(HEATER_0_MINTEMP);
|
minttemp[0] = temp2analog(HEATER_0_MINTEMP, 0);
|
||||||
#endif //MINTEMP
|
#endif //MINTEMP
|
||||||
#ifdef HEATER_0_MAXTEMP
|
#ifdef HEATER_0_MAXTEMP
|
||||||
maxttemp_0 = temp2analog(HEATER_0_MAXTEMP);
|
maxttemp[0] = temp2analog(HEATER_0_MAXTEMP, 0);
|
||||||
#endif //MAXTEMP
|
#endif //MAXTEMP
|
||||||
|
|
||||||
#ifdef HEATER_1_MINTEMP
|
#if (EXTRUDERS > 1) && defined(HEATER_1_MINTEMP)
|
||||||
minttemp_1 = temp2analog(HEATER_1_MINTEMP);
|
minttemp[1] = temp2analog(HEATER_1_MINTEMP, 1);
|
||||||
#endif //MINTEMP
|
#endif // MINTEMP 1
|
||||||
#ifdef HEATER_1_MAXTEMP
|
#if (EXTRUDERS > 1) && defined(HEATER_1_MAXTEMP)
|
||||||
maxttemp_1 = temp2analog(HEATER_1_MAXTEMP);
|
maxttemp[1] = temp2analog(HEATER_1_MAXTEMP, 1);
|
||||||
#endif //MAXTEMP
|
#endif //MAXTEMP 1
|
||||||
|
|
||||||
|
#if (EXTRUDERS > 2) && defined(HEATER_2_MINTEMP)
|
||||||
|
minttemp[2] = temp2analog(HEATER_2_MINTEMP, 2);
|
||||||
|
#endif //MINTEMP 2
|
||||||
|
#if (EXTRUDERS > 2) && defined(HEATER_2_MAXTEMP)
|
||||||
|
maxttemp[2] = temp2analog(HEATER_2_MAXTEMP, 2);
|
||||||
|
#endif //MAXTEMP 2
|
||||||
|
|
||||||
#ifdef BED_MINTEMP
|
#ifdef BED_MINTEMP
|
||||||
bed_minttemp = temp2analog(BED_MINTEMP);
|
bed_minttemp = temp2analogBed(BED_MINTEMP);
|
||||||
#endif //BED_MINTEMP
|
#endif //BED_MINTEMP
|
||||||
#ifdef BED_MAXTEMP
|
#ifdef BED_MAXTEMP
|
||||||
bed_maxttemp = temp2analog(BED_MAXTEMP);
|
bed_maxttemp = temp2analogBed(BED_MAXTEMP);
|
||||||
#endif //BED_MAXTEMP
|
#endif //BED_MAXTEMP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -423,15 +488,16 @@ void tp_init()
|
||||||
void setWatch()
|
void setWatch()
|
||||||
{
|
{
|
||||||
#ifdef WATCHPERIOD
|
#ifdef WATCHPERIOD
|
||||||
if(isHeatingHotend0())
|
int t = 0;
|
||||||
|
for (int e = 0; e < EXTRUDERS; e++)
|
||||||
{
|
{
|
||||||
watchmillis = max(1,millis());
|
if(isHeatingHotend(e))
|
||||||
watch_raw[TEMPSENSOR_HOTEND_0] = current_raw[TEMPSENSOR_HOTEND_0];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
watchmillis = 0;
|
t = max(t,millis());
|
||||||
|
watch_raw[e] = current_raw[e];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
watchmillis = t;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -458,6 +524,13 @@ void disable_heater()
|
||||||
digitalWrite(HEATER_2_PIN,LOW);
|
digitalWrite(HEATER_2_PIN,LOW);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if TEMP_BED_PIN > -1
|
||||||
|
target_raw_bed=0;
|
||||||
|
#if HEATER_BED_PIN > -1
|
||||||
|
digitalWrite(HEATER_BED_PIN,LOW);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Timer 0 is shared with millies
|
// Timer 0 is shared with millies
|
||||||
|
@ -468,6 +541,7 @@ ISR(TIMER0_COMPB_vect)
|
||||||
static unsigned long raw_temp_0_value = 0;
|
static unsigned long raw_temp_0_value = 0;
|
||||||
static unsigned long raw_temp_1_value = 0;
|
static unsigned long raw_temp_1_value = 0;
|
||||||
static unsigned long raw_temp_2_value = 0;
|
static unsigned long raw_temp_2_value = 0;
|
||||||
|
static unsigned long raw_temp_bed_value = 0;
|
||||||
static unsigned char temp_state = 0;
|
static unsigned char temp_state = 0;
|
||||||
|
|
||||||
switch(temp_state) {
|
switch(temp_state) {
|
||||||
|
@ -492,7 +566,26 @@ ISR(TIMER0_COMPB_vect)
|
||||||
#endif
|
#endif
|
||||||
temp_state = 2;
|
temp_state = 2;
|
||||||
break;
|
break;
|
||||||
case 2: // Prepare TEMP_1
|
case 2: // Prepare TEMP_BED
|
||||||
|
#if (TEMP_BED_PIN > -1)
|
||||||
|
#if TEMP_BED_PIN > 7
|
||||||
|
ADCSRB = 1<<MUX5;
|
||||||
|
#endif
|
||||||
|
ADMUX = ((1 << REFS0) | (TEMP_BED_PIN & 0x07));
|
||||||
|
ADCSRA |= 1<<ADSC; // Start conversion
|
||||||
|
#endif
|
||||||
|
#ifdef ULTIPANEL
|
||||||
|
buttons_check();
|
||||||
|
#endif
|
||||||
|
temp_state = 3;
|
||||||
|
break;
|
||||||
|
case 3: // Measure TEMP_BED
|
||||||
|
#if (TEMP_BED_PIN > -1)
|
||||||
|
raw_temp_bed_value += ADC;
|
||||||
|
#endif
|
||||||
|
temp_state = 4;
|
||||||
|
break;
|
||||||
|
case 4: // Prepare TEMP_1
|
||||||
#if (TEMP_1_PIN > -1)
|
#if (TEMP_1_PIN > -1)
|
||||||
#if TEMP_1_PIN > 7
|
#if TEMP_1_PIN > 7
|
||||||
ADCSRB = 1<<MUX5;
|
ADCSRB = 1<<MUX5;
|
||||||
|
@ -505,15 +598,15 @@ ISR(TIMER0_COMPB_vect)
|
||||||
#ifdef ULTIPANEL
|
#ifdef ULTIPANEL
|
||||||
buttons_check();
|
buttons_check();
|
||||||
#endif
|
#endif
|
||||||
temp_state = 3;
|
temp_state = 5;
|
||||||
break;
|
break;
|
||||||
case 3: // Measure TEMP_1
|
case 5: // Measure TEMP_1
|
||||||
#if (TEMP_1_PIN > -1)
|
#if (TEMP_1_PIN > -1)
|
||||||
raw_temp_1_value += ADC;
|
raw_temp_1_value += ADC;
|
||||||
#endif
|
#endif
|
||||||
temp_state = 4;
|
temp_state = 6;
|
||||||
break;
|
break;
|
||||||
case 4: // Prepare TEMP_2
|
case 6: // Prepare TEMP_2
|
||||||
#if (TEMP_2_PIN > -1)
|
#if (TEMP_2_PIN > -1)
|
||||||
#if TEMP_2_PIN > 7
|
#if TEMP_2_PIN > 7
|
||||||
ADCSRB = 1<<MUX5;
|
ADCSRB = 1<<MUX5;
|
||||||
|
@ -526,9 +619,9 @@ ISR(TIMER0_COMPB_vect)
|
||||||
#ifdef ULTIPANEL
|
#ifdef ULTIPANEL
|
||||||
buttons_check();
|
buttons_check();
|
||||||
#endif
|
#endif
|
||||||
temp_state = 5;
|
temp_state = 7;
|
||||||
break;
|
break;
|
||||||
case 5: // Measure TEMP_2
|
case 7: // Measure TEMP_2
|
||||||
#if (TEMP_2_PIN > -1)
|
#if (TEMP_2_PIN > -1)
|
||||||
raw_temp_2_value += ADC;
|
raw_temp_2_value += ADC;
|
||||||
#endif
|
#endif
|
||||||
|
@ -541,7 +634,7 @@ ISR(TIMER0_COMPB_vect)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(temp_count >= 16) // 6 ms * 16 = 96ms.
|
if(temp_count >= 16) // 8 ms * 16 = 128ms.
|
||||||
{
|
{
|
||||||
#ifdef HEATER_0_USES_AD595
|
#ifdef HEATER_0_USES_AD595
|
||||||
current_raw[0] = raw_temp_0_value;
|
current_raw[0] = raw_temp_0_value;
|
||||||
|
@ -549,16 +642,26 @@ ISR(TIMER0_COMPB_vect)
|
||||||
current_raw[0] = 16383 - raw_temp_0_value;
|
current_raw[0] = 16383 - raw_temp_0_value;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if EXTRUDERS > 1
|
||||||
#ifdef HEATER_1_USES_AD595
|
#ifdef HEATER_1_USES_AD595
|
||||||
|
current_raw[1] = raw_temp_1_value;
|
||||||
|
#else
|
||||||
|
current_raw[1] = 16383 - raw_temp_1_value;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if EXTRUDERS > 2
|
||||||
|
#ifdef HEATER_2_USES_AD595
|
||||||
current_raw[2] = raw_temp_2_value;
|
current_raw[2] = raw_temp_2_value;
|
||||||
#else
|
#else
|
||||||
current_raw[2] = 16383 - raw_temp_2_value;
|
current_raw[2] = 16383 - raw_temp_2_value;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef BED_USES_AD595
|
#ifdef BED_USES_AD595
|
||||||
current_raw[1] = raw_temp_1_value;
|
current_raw_bed = raw_temp_bed_value;
|
||||||
#else
|
#else
|
||||||
current_raw[1] = 16383 - raw_temp_1_value;
|
current_raw_bed = 16383 - raw_temp_bed_value;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
temp_meas_ready = true;
|
temp_meas_ready = true;
|
||||||
|
@ -566,77 +669,36 @@ ISR(TIMER0_COMPB_vect)
|
||||||
raw_temp_0_value = 0;
|
raw_temp_0_value = 0;
|
||||||
raw_temp_1_value = 0;
|
raw_temp_1_value = 0;
|
||||||
raw_temp_2_value = 0;
|
raw_temp_2_value = 0;
|
||||||
#ifdef HEATER_0_MAXTEMP
|
raw_temp_bed_value = 0;
|
||||||
#if (HEATER_0_PIN > -1)
|
|
||||||
if(current_raw[TEMPSENSOR_HOTEND_0] >= maxttemp_0) {
|
|
||||||
target_raw[TEMPSENSOR_HOTEND_0] = 0;
|
|
||||||
digitalWrite(HEATER_0_PIN, 0);
|
|
||||||
SERIAL_ERROR_START;
|
|
||||||
SERIAL_ERRORLNPGM("Temperature extruder 0 switched off. MAXTEMP triggered !!");
|
|
||||||
kill();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifdef HEATER_1_MAXTEMP
|
|
||||||
#if (HEATER_1_PIN > -1)
|
|
||||||
if(current_raw[TEMPSENSOR_HOTEND_1] >= maxttemp_1) {
|
|
||||||
target_raw[TEMPSENSOR_HOTEND_1] = 0;
|
|
||||||
digitalWrite(HEATER_2_PIN, 0);
|
|
||||||
SERIAL_ERROR_START;
|
|
||||||
SERIAL_ERRORLNPGM("Temperature extruder 1 switched off. MAXTEMP triggered !!");
|
|
||||||
kill();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif //MAXTEMP
|
|
||||||
|
|
||||||
#ifdef HEATER_0_MINTEMP
|
for(int e = 0; e < EXTRUDERS; e++) {
|
||||||
#if (HEATER_0_PIN > -1)
|
if(current_raw[e] >= maxttemp[e]) {
|
||||||
if(current_raw[TEMPSENSOR_HOTEND_0] <= minttemp_0) {
|
target_raw[e] = 0;
|
||||||
target_raw[TEMPSENSOR_HOTEND_0] = 0;
|
digitalWrite(heater_pin_map[e], 0);
|
||||||
digitalWrite(HEATER_0_PIN, 0);
|
|
||||||
SERIAL_ERROR_START;
|
SERIAL_ERROR_START;
|
||||||
SERIAL_ERRORLNPGM("Temperature extruder 0 switched off. MINTEMP triggered !!");
|
SERIAL_ERRORLN((int)e);
|
||||||
|
SERIAL_ERRORLNPGM(": Extruder switched off. MAXTEMP triggered !");
|
||||||
kill();
|
kill();
|
||||||
}
|
}
|
||||||
#endif
|
if(current_raw[e] <= minttemp[e]) {
|
||||||
#endif
|
target_raw[e] = 0;
|
||||||
|
digitalWrite(heater_pin_map[e], 0);
|
||||||
#ifdef HEATER_1_MINTEMP
|
|
||||||
#if (HEATER_2_PIN > -1)
|
|
||||||
if(current_raw[TEMPSENSOR_HOTEND_1] <= minttemp_1) {
|
|
||||||
target_raw[TEMPSENSOR_HOTEND_1] = 0;
|
|
||||||
digitalWrite(HEATER_2_PIN, 0);
|
|
||||||
SERIAL_ERROR_START;
|
SERIAL_ERROR_START;
|
||||||
SERIAL_ERRORLNPGM("Temperature extruder 1 switched off. MINTEMP triggered !!");
|
SERIAL_ERRORLN(e);
|
||||||
|
SERIAL_ERRORLNPGM(": Extruder switched off. MINTEMP triggered !");
|
||||||
kill();
|
kill();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#endif //MAXTEMP
|
|
||||||
|
|
||||||
#ifdef BED_MINTEMP
|
|
||||||
#if (HEATER_1_PIN > -1)
|
|
||||||
if(current_raw[1] <= bed_minttemp) {
|
|
||||||
target_raw[1] = 0;
|
|
||||||
digitalWrite(HEATER_1_PIN, 0);
|
|
||||||
SERIAL_ERROR_START;
|
|
||||||
SERIAL_ERRORLNPGM("Temperatur heated bed switched off. MINTEMP triggered !!");
|
|
||||||
kill();
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef BED_MAXTEMP
|
#if defined(BED_MAXTEMP) && (HEATER_BED_PIN > -1)
|
||||||
#if (HEATER_1_PIN > -1)
|
if(current_raw_bed >= bed_maxttemp) {
|
||||||
if(current_raw[1] >= bed_maxttemp) {
|
target_raw_bed = 0;
|
||||||
target_raw[1] = 0;
|
digitalWrite(HEATER_BED_PIN, 0);
|
||||||
digitalWrite(HEATER_1_PIN, 0);
|
|
||||||
SERIAL_ERROR_START;
|
SERIAL_ERROR_START;
|
||||||
SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!");
|
SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!");
|
||||||
kill();
|
kill();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,95 +31,110 @@
|
||||||
void tp_init(); //initialise the heating
|
void tp_init(); //initialise the heating
|
||||||
void manage_heater(); //it is critical that this is called periodically.
|
void manage_heater(); //it is critical that this is called periodically.
|
||||||
|
|
||||||
|
|
||||||
enum TempSensor {TEMPSENSOR_HOTEND_0=0,TEMPSENSOR_BED=1, TEMPSENSOR_HOTEND_1=2};
|
|
||||||
|
|
||||||
//low leven conversion routines
|
//low leven conversion routines
|
||||||
// do not use this routines and variables outsie of temperature.cpp
|
// do not use this routines and variables outsie of temperature.cpp
|
||||||
int temp2analog(int celsius);
|
int temp2analog(int celsius, uint8_t e);
|
||||||
int temp2analogBed(int celsius);
|
int temp2analogBed(int celsius);
|
||||||
float analog2temp(int raw);
|
float analog2temp(int raw, uint8_t e);
|
||||||
float analog2tempBed(int raw);
|
float analog2tempBed(int raw);
|
||||||
extern int target_raw[3];
|
extern int target_raw[EXTRUDERS];
|
||||||
extern int heatingtarget_raw[3];
|
extern int heatingtarget_raw[EXTRUDERS];
|
||||||
extern int current_raw[3];
|
extern int current_raw[EXTRUDERS];
|
||||||
|
extern int target_raw_bed;
|
||||||
|
extern int current_raw_bed;
|
||||||
extern float Kp,Ki,Kd,Kc;
|
extern float Kp,Ki,Kd,Kc;
|
||||||
|
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
extern float pid_setpoint ;
|
extern float pid_setpoint[EXTRUDERS];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WATCHPERIOD
|
#ifdef WATCHPERIOD
|
||||||
extern int watch_raw[3] ;
|
extern int watch_raw[EXTRUDERS] ;
|
||||||
extern unsigned long watchmillis;
|
extern unsigned long watchmillis;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//high level conversion routines, for use outside of temperature.cpp
|
//high level conversion routines, for use outside of temperature.cpp
|
||||||
//inline so that there is no performance decrease.
|
//inline so that there is no performance decrease.
|
||||||
//deg=degreeCelsius
|
//deg=degreeCelsius
|
||||||
|
|
||||||
FORCE_INLINE float degHotend0(){ return analog2temp(current_raw[TEMPSENSOR_HOTEND_0]);};
|
|
||||||
FORCE_INLINE float degHotend1(){ return analog2temp(current_raw[TEMPSENSOR_HOTEND_1]);};
|
|
||||||
FORCE_INLINE float degBed() { return analog2tempBed(current_raw[TEMPSENSOR_BED]);};
|
|
||||||
FORCE_INLINE float degHotend(uint8_t extruder) {
|
FORCE_INLINE float degHotend(uint8_t extruder) {
|
||||||
if(extruder == 0) return analog2temp(current_raw[TEMPSENSOR_HOTEND_0]);
|
return analog2temp(current_raw[extruder], extruder);
|
||||||
if(extruder == 1) return analog2temp(current_raw[TEMPSENSOR_HOTEND_1]);
|
};
|
||||||
|
|
||||||
|
FORCE_INLINE float degBed() {
|
||||||
|
return analog2tempBed(current_raw_bed);
|
||||||
};
|
};
|
||||||
|
|
||||||
FORCE_INLINE float degTargetHotend0() { return analog2temp(target_raw[TEMPSENSOR_HOTEND_0]);};
|
|
||||||
FORCE_INLINE float degTargetHotend1() { return analog2temp(target_raw[TEMPSENSOR_HOTEND_1]);};
|
|
||||||
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
|
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
|
||||||
if(extruder == 0) return analog2temp(target_raw[TEMPSENSOR_HOTEND_0]);
|
return analog2temp(target_raw[extruder], extruder);
|
||||||
if(extruder == 1) return analog2temp(target_raw[TEMPSENSOR_HOTEND_1]);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
FORCE_INLINE float degTargetBed() { return analog2tempBed(target_raw[TEMPSENSOR_BED]);};
|
FORCE_INLINE float degTargetBed() {
|
||||||
|
return analog2tempBed(target_raw_bed);
|
||||||
|
};
|
||||||
|
|
||||||
FORCE_INLINE void setTargetHotend0(const float &celsius)
|
FORCE_INLINE void setTargetHotend(const float &celsius, uint8_t extruder) {
|
||||||
{
|
target_raw[extruder] = temp2analog(celsius, extruder);
|
||||||
target_raw[TEMPSENSOR_HOTEND_0]=temp2analog(celsius);
|
|
||||||
heatingtarget_raw[TEMPSENSOR_HOTEND_0]=temp2analog(celsius-HEATING_EARLY_FINISH_DEG_OFFSET);
|
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
pid_setpoint = celsius;
|
pid_setpoint[extruder] = celsius;
|
||||||
#endif //PIDTEMP
|
#endif //PIDTEMP
|
||||||
};
|
};
|
||||||
FORCE_INLINE void setTargetHotend1(const float &celsius) { target_raw[TEMPSENSOR_HOTEND_1]=temp2analog(celsius);};
|
|
||||||
FORCE_INLINE void setTargetHotend(const float &celcius, uint8_t extruder){
|
|
||||||
if(extruder == 0) setTargetHotend0(celcius);
|
|
||||||
if(extruder == 1) setTargetHotend1(celcius);
|
|
||||||
};
|
|
||||||
FORCE_INLINE void setTargetBed(const float &celsius) { target_raw[TEMPSENSOR_BED ]=temp2analogBed(celsius);};
|
|
||||||
|
|
||||||
FORCE_INLINE bool isHeatingHotend0() {return heatingtarget_raw[TEMPSENSOR_HOTEND_0] > current_raw[TEMPSENSOR_HOTEND_0];};
|
FORCE_INLINE void setTargetBed(const float &celsius) {
|
||||||
FORCE_INLINE bool isHeatingHotend1() {return target_raw[TEMPSENSOR_HOTEND_1] > current_raw[TEMPSENSOR_HOTEND_1];};
|
target_raw_bed = temp2analogBed(celsius);
|
||||||
|
};
|
||||||
|
|
||||||
FORCE_INLINE bool isHeatingHotend(uint8_t extruder){
|
FORCE_INLINE bool isHeatingHotend(uint8_t extruder){
|
||||||
if(extruder == 0) return heatingtarget_raw[TEMPSENSOR_HOTEND_0] > current_raw[TEMPSENSOR_HOTEND_0];
|
return target_raw[extruder] > current_raw[extruder];
|
||||||
if(extruder == 1) return target_raw[TEMPSENSOR_HOTEND_1] > current_raw[TEMPSENSOR_HOTEND_1];
|
|
||||||
return false;
|
|
||||||
};
|
};
|
||||||
FORCE_INLINE bool isHeatingBed() {return target_raw[TEMPSENSOR_BED] > current_raw[TEMPSENSOR_BED];};
|
|
||||||
|
|
||||||
FORCE_INLINE bool isCoolingHotend0() {return target_raw[TEMPSENSOR_HOTEND_0] < current_raw[TEMPSENSOR_HOTEND_0];};
|
FORCE_INLINE bool isHeatingBed() {
|
||||||
FORCE_INLINE bool isCoolingHotend1() {return target_raw[TEMPSENSOR_HOTEND_1] < current_raw[TEMPSENSOR_HOTEND_1];};
|
return target_raw_bed > current_raw_bed;
|
||||||
FORCE_INLINE bool isCoolingHotend(uint8_t extruder){
|
|
||||||
if(extruder == 0) return target_raw[TEMPSENSOR_HOTEND_0] < current_raw[TEMPSENSOR_HOTEND_0];
|
|
||||||
if(extruder == 1) return target_raw[TEMPSENSOR_HOTEND_1] < current_raw[TEMPSENSOR_HOTEND_1];
|
|
||||||
return false;
|
|
||||||
};
|
};
|
||||||
FORCE_INLINE bool isCoolingBed() {return target_raw[TEMPSENSOR_BED] < current_raw[TEMPSENSOR_BED];};
|
|
||||||
|
FORCE_INLINE bool isCoolingHotend(uint8_t extruder) {
|
||||||
|
return target_raw[extruder] < current_raw[extruder];
|
||||||
|
};
|
||||||
|
|
||||||
|
FORCE_INLINE bool isCoolingBed() {
|
||||||
|
return target_raw_bed < current_raw_bed;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define degHotend0() degHotend(0)
|
||||||
|
#define degTargetHotend0() degTargetHotend(0)
|
||||||
|
#define setTargetHotend0(_celsius) setTargetHotend((_celsius), 0)
|
||||||
|
#define isHeatingHotend0() isHeatingHotend(0)
|
||||||
|
#define isCoolingHotend0() isCoolingHotend(0)
|
||||||
|
#if EXTRUDERS > 1
|
||||||
|
#define degHotend1() degHotend(1)
|
||||||
|
#define degTargetHotend1() degTargetHotend(1)
|
||||||
|
#define setTargetHotend1(_celsius) setTargetHotend((_celsius), 1)
|
||||||
|
#define isHeatingHotend1() isHeatingHotend(1)
|
||||||
|
#define isCoolingHotend1() isCoolingHotend(1)
|
||||||
|
#endif
|
||||||
|
#if EXTRUDERS > 2
|
||||||
|
#define degHotend2() degHotend(2)
|
||||||
|
#define degTargetHotend2() degTargetHotend(2)
|
||||||
|
#define setTargetHotend2(_celsius) setTargetHotend((_celsius), 2)
|
||||||
|
#define isHeatingHotend2() isHeatingHotend(2)
|
||||||
|
#define isCoolingHotend2() isCoolingHotend(2)
|
||||||
|
#endif
|
||||||
|
#if EXTRUDERS > 3
|
||||||
|
#error Invalid number of extruders
|
||||||
|
#endif
|
||||||
|
|
||||||
FORCE_INLINE void autotempShutdown(){
|
FORCE_INLINE void autotempShutdown(){
|
||||||
#ifdef AUTOTEMP
|
#ifdef AUTOTEMP
|
||||||
if(autotemp_enabled)
|
if(autotemp_enabled)
|
||||||
{
|
{
|
||||||
autotemp_enabled=false;
|
autotemp_enabled=false;
|
||||||
if(degTargetHotend0()>autotemp_min)
|
if(degTargetHotend(ACTIVE_EXTRUDER)>autotemp_min)
|
||||||
setTargetHotend0(0);
|
setTargetHotend(0,ACTIVE_EXTRUDER);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void disable_heater();
|
void disable_heater();
|
||||||
void setWatch();
|
void setWatch();
|
||||||
void updatePID();
|
void updatePID();
|
||||||
|
|
|
@ -5,10 +5,9 @@
|
||||||
|
|
||||||
#define OVERSAMPLENR 16
|
#define OVERSAMPLENR 16
|
||||||
|
|
||||||
#if (THERMISTORHEATER_0 == 1) || (THERMISTORHEATER_1 == 1) || (THERMISTORBED == 1) //100k bed thermistor
|
#if (THERMISTORHEATER_0 == 1) || (THERMISTORHEATER_1 == 1) || (THERMISTORHEATER_2 == 1) || (THERMISTORBED == 1) //100k bed thermistor
|
||||||
|
|
||||||
#define NUMTEMPS_1 61
|
const short temptable_1[][2] PROGMEM = {
|
||||||
const short temptable_1[NUMTEMPS_1][2] PROGMEM = {
|
|
||||||
{ 23*OVERSAMPLENR , 300 },
|
{ 23*OVERSAMPLENR , 300 },
|
||||||
{ 25*OVERSAMPLENR , 295 },
|
{ 25*OVERSAMPLENR , 295 },
|
||||||
{ 27*OVERSAMPLENR , 290 },
|
{ 27*OVERSAMPLENR , 290 },
|
||||||
|
@ -72,9 +71,8 @@ const short temptable_1[NUMTEMPS_1][2] PROGMEM = {
|
||||||
{ 1008*OVERSAMPLENR , 0 } //safety
|
{ 1008*OVERSAMPLENR , 0 } //safety
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
#if (THERMISTORHEATER_0 == 2) || (THERMISTORHEATER_1 == 2) || (THERMISTORBED == 2) //200k bed thermistor
|
#if (THERMISTORHEATER_0 == 2) || (THERMISTORHEATER_1 == 2) || (THERMISTORHEATER_2 == 2) || (THERMISTORBED == 2) //200k bed thermistor
|
||||||
#define NUMTEMPS_2 21
|
const short temptable_2[][2] PROGMEM = {
|
||||||
const short temptable_2[NUMTEMPS_2][2] PROGMEM = {
|
|
||||||
{1*OVERSAMPLENR, 848},
|
{1*OVERSAMPLENR, 848},
|
||||||
{54*OVERSAMPLENR, 275},
|
{54*OVERSAMPLENR, 275},
|
||||||
{107*OVERSAMPLENR, 228},
|
{107*OVERSAMPLENR, 228},
|
||||||
|
@ -99,9 +97,8 @@ const short temptable_2[NUMTEMPS_2][2] PROGMEM = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#if (THERMISTORHEATER_0 == 3) || (THERMISTORHEATER_1 == 3) || (THERMISTORBED == 3) //mendel-parts
|
#if (THERMISTORHEATER_0 == 3) || (THERMISTORHEATER_1 == 3) || (THERMISTORHEATER_2 == 3) || (THERMISTORBED == 3) //mendel-parts
|
||||||
#define NUMTEMPS_3 28
|
const short temptable_3[][2] PROGMEM = {
|
||||||
const short temptable_3[NUMTEMPS_3][2] PROGMEM = {
|
|
||||||
{1*OVERSAMPLENR,864},
|
{1*OVERSAMPLENR,864},
|
||||||
{21*OVERSAMPLENR,300},
|
{21*OVERSAMPLENR,300},
|
||||||
{25*OVERSAMPLENR,290},
|
{25*OVERSAMPLENR,290},
|
||||||
|
@ -133,10 +130,8 @@ const short temptable_3[NUMTEMPS_3][2] PROGMEM = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#if (THERMISTORHEATER_0 == 4) || (THERMISTORHEATER_1 == 4) || (THERMISTORBED == 4) //10k thermistor
|
#if (THERMISTORHEATER_0 == 4) || (THERMISTORHEATER_1 == 4) || (THERMISTORHEATER_2 == 4) || (THERMISTORBED == 4) //10k thermistor
|
||||||
|
const short temptable_4[][2] PROGMEM = {
|
||||||
#define NUMTEMPS_4 20
|
|
||||||
const short temptable_4[NUMTEMPS_4][2] PROGMEM = {
|
|
||||||
{1*OVERSAMPLENR, 430},
|
{1*OVERSAMPLENR, 430},
|
||||||
{54*OVERSAMPLENR, 137},
|
{54*OVERSAMPLENR, 137},
|
||||||
{107*OVERSAMPLENR, 107},
|
{107*OVERSAMPLENR, 107},
|
||||||
|
@ -160,10 +155,8 @@ const short temptable_4[NUMTEMPS_4][2] PROGMEM = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (THERMISTORHEATER_0 == 5) || (THERMISTORHEATER_1 == 5) || (THERMISTORBED == 5) //100k ParCan thermistor (104GT-2)
|
#if (THERMISTORHEATER_0 == 5) || (THERMISTORHEATER_1 == 5) || (THERMISTORHEATER_2 == 5) || (THERMISTORBED == 5) //100k ParCan thermistor (104GT-2)
|
||||||
|
const short temptable_5[][2] PROGMEM = {
|
||||||
#define NUMTEMPS_5 61
|
|
||||||
const short temptable_5[NUMTEMPS_5][2] PROGMEM = {
|
|
||||||
{1*OVERSAMPLENR, 713},
|
{1*OVERSAMPLENR, 713},
|
||||||
{18*OVERSAMPLENR, 316},
|
{18*OVERSAMPLENR, 316},
|
||||||
{35*OVERSAMPLENR, 266},
|
{35*OVERSAMPLENR, 266},
|
||||||
|
@ -228,9 +221,8 @@ const short temptable_5[NUMTEMPS_5][2] PROGMEM = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (THERMISTORHEATER_0 == 6) || (THERMISTORHEATER_1 == 6) || (THERMISTORBED == 6) // 100k Epcos thermistor
|
#if (THERMISTORHEATER_0 == 6) || (THERMISTORHEATER_1 == 6) || (THERMISTORHEATER_2 == 6) || (THERMISTORBED == 6) // 100k Epcos thermistor
|
||||||
#define NUMTEMPS_6 36
|
const short temptable_6[][2] PROGMEM = {
|
||||||
const short temptable_6[NUMTEMPS_6][2] PROGMEM = {
|
|
||||||
{28*OVERSAMPLENR, 250},
|
{28*OVERSAMPLENR, 250},
|
||||||
{31*OVERSAMPLENR, 245},
|
{31*OVERSAMPLENR, 245},
|
||||||
{35*OVERSAMPLENR, 240},
|
{35*OVERSAMPLENR, 240},
|
||||||
|
@ -270,9 +262,8 @@ const short temptable_6[NUMTEMPS_6][2] PROGMEM = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (THERMISTORHEATER_0 == 7) || (THERMISTORHEATER_1 == 7) || (THERMISTORBED == 7) // 100k Honeywell 135-104LAG-J01
|
#if (THERMISTORHEATER_0 == 7) || (THERMISTORHEATER_1 == 7) || (THERMISTORHEATER_2 == 7) || (THERMISTORBED == 7) // 100k Honeywell 135-104LAG-J01
|
||||||
#define NUMTEMPS_7 54
|
const short temptable_7[][2] PROGMEM = {
|
||||||
const short temptable_7[NUMTEMPS_7][2] PROGMEM = {
|
|
||||||
{46*OVERSAMPLENR, 270},
|
{46*OVERSAMPLENR, 270},
|
||||||
{50*OVERSAMPLENR, 265},
|
{50*OVERSAMPLENR, 265},
|
||||||
{54*OVERSAMPLENR, 260},
|
{54*OVERSAMPLENR, 260},
|
||||||
|
@ -330,82 +321,52 @@ const short temptable_7[NUMTEMPS_7][2] PROGMEM = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define _TT_NAME(_N) temptable_ ## _N
|
||||||
|
#define TT_NAME(_N) _TT_NAME(_N)
|
||||||
|
|
||||||
|
#ifdef THERMISTORHEATER_0
|
||||||
#if THERMISTORHEATER_0 == 1
|
#define heater_0_temptable TT_NAME(THERMISTORHEATER_0)
|
||||||
#define NUMTEMPS_HEATER_0 NUMTEMPS_1
|
#define heater_0_temptable_len (sizeof(heater_0_temptable)/sizeof(*heater_0_temptable))
|
||||||
#define heater_0_temptable temptable_1
|
#else
|
||||||
#elif THERMISTORHEATER_0 == 2
|
#ifdef HEATER_0_USES_THERMISTOR
|
||||||
#define NUMTEMPS_HEATER_0 NUMTEMPS_2
|
|
||||||
#define heater_0_temptable temptable_2
|
|
||||||
#elif THERMISTORHEATER_0 == 3
|
|
||||||
#define NUMTEMPS_HEATER_0 NUMTEMPS_3
|
|
||||||
#define heater_0_temptable temptable_3
|
|
||||||
#elif THERMISTORHEATER_0 == 4
|
|
||||||
#define NUMTEMPS_HEATER_0 NUMTEMPS_4
|
|
||||||
#define heater_0_temptable temptable_4
|
|
||||||
#elif THERMISTORHEATER_0 == 5
|
|
||||||
#define NUMTEMPS_HEATER_0 NUMTEMPS_5
|
|
||||||
#define heater_0_temptable temptable_5
|
|
||||||
#elif THERMISTORHEATER_0 == 6
|
|
||||||
#define NUMTEMPS_HEATER_0 NUMTEMPS_6
|
|
||||||
#define heater_0_temptable temptable_6
|
|
||||||
#elif THERMISTORHEATER_0 == 7
|
|
||||||
#define NUMTEMPS_HEATER_0 NUMTEMPS_7
|
|
||||||
#define heater_0_temptable temptable_7
|
|
||||||
#elif defined HEATER_0_USES_THERMISTOR
|
|
||||||
#error No heater 0 thermistor table specified
|
#error No heater 0 thermistor table specified
|
||||||
|
#else // HEATER_0_USES_THERMISTOR
|
||||||
|
#define heater_0_temptable 0
|
||||||
|
#define heater_0_temptable_len 0
|
||||||
|
#endif // HEATER_0_USES_THERMISTOR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if THERMISTORHEATER_1 == 1
|
#ifdef THERMISTORHEATER_1
|
||||||
#define NUMTEMPS_HEATER_1 NUMTEMPS_1
|
#define heater_1_temptable TT_NAME(THERMISTORHEATER_1)
|
||||||
#define heater_1_temptable temptable_1
|
#define heater_1_temptable_len (sizeof(heater_1_temptable)/sizeof(*heater_1_temptable))
|
||||||
#elif THERMISTORHEATER_1 == 2
|
#else
|
||||||
#define NUMTEMPS_HEATER_1 NUMTEMPS_2
|
#ifdef HEATER_1_USES_THERMISTOR
|
||||||
#define heater_1_temptable temptable_2
|
|
||||||
#elif THERMISTORHEATER_1 == 3
|
|
||||||
#define NUMTEMPS_HEATER_1 NUMTEMPS_3
|
|
||||||
#define heater_1_temptable temptable_3
|
|
||||||
#elif THERMISTORHEATER_1 == 4
|
|
||||||
#define NUMTEMPS_HEATER_1 NUMTEMPS_4
|
|
||||||
#define heater_1_temptable temptable_4
|
|
||||||
#elif THERMISTORHEATER_1 == 5
|
|
||||||
#define NUMTEMPS_HEATER_1 NUMTEMPS_5
|
|
||||||
#define heater_1_temptable temptable_5
|
|
||||||
#elif THERMISTORHEATER_1 == 6
|
|
||||||
#define NUMTEMPS_HEATER_1 NUMTEMPS_6
|
|
||||||
#define heater_1_temptable temptable_6
|
|
||||||
#elif THERMISTORHEATER_1 == 7
|
|
||||||
#define NUMTEMPS_HEATER_1 NUMTEMPS_7
|
|
||||||
#define heater_1_temptable temptable_7
|
|
||||||
#elif defined HEATER_1_USES_THERMISTOR
|
|
||||||
#error No heater 1 thermistor table specified
|
#error No heater 1 thermistor table specified
|
||||||
|
#else // HEATER_1_USES_THERMISTOR
|
||||||
|
#define heater_1_temptable 0
|
||||||
|
#define heater_1_temptable_len 0
|
||||||
|
#endif // HEATER_1_USES_THERMISTOR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef THERMISTORHEATER_2
|
||||||
|
#define heater_2_temptable TT_NAME(THERMISTORHEATER_2)
|
||||||
|
#define heater_2_temptable_len (sizeof(heater_2_temptable)/sizeof(*heater_2_temptable))
|
||||||
|
#else
|
||||||
|
#ifdef HEATER_2_USES_THERMISTOR
|
||||||
|
#error No heater 2 thermistor table specified
|
||||||
|
#else // HEATER_2_USES_THERMISTOR
|
||||||
|
#define heater_2_temptable 0
|
||||||
|
#define heater_2_temptable_len 0
|
||||||
|
#endif // HEATER_2_USES_THERMISTOR
|
||||||
|
#endif
|
||||||
|
|
||||||
#if THERMISTORBED == 1
|
#ifdef THERMISTORBED
|
||||||
#define BNUMTEMPS NUMTEMPS_1
|
#define bedtemptable TT_NAME(THERMISTORBED)
|
||||||
#define bedtemptable temptable_1
|
#define bedtemptable_len (sizeof(bedtemptable)/sizeof(*bedtemptable))
|
||||||
#elif THERMISTORBED == 2
|
#else
|
||||||
#define BNUMTEMPS NUMTEMPS_2
|
#ifdef BED_USES_THERMISTOR
|
||||||
#define bedtemptable temptable_2
|
|
||||||
#elif THERMISTORBED == 3
|
|
||||||
#define BNUMTEMPS NUMTEMPS_3
|
|
||||||
#define bedtemptable temptable_3
|
|
||||||
#elif THERMISTORBED == 4
|
|
||||||
#define BNUMTEMPS NUMTEMPS_4
|
|
||||||
#define bedtemptable temptable_4
|
|
||||||
#elif THERMISTORBED == 5
|
|
||||||
#define BNUMTEMPS NUMTEMPS_5
|
|
||||||
#define bedtemptable temptable_5
|
|
||||||
#elif THERMISTORBED == 6
|
|
||||||
#define BNUMTEMPS NUMTEMPS_6
|
|
||||||
#define bedtemptable temptable_6
|
|
||||||
#elif THERMISTORBED == 7
|
|
||||||
#define BNUMTEMPS NUMTEMPS_7
|
|
||||||
#define bedtemptable temptable_7
|
|
||||||
#elif defined BED_USES_THERMISTOR
|
|
||||||
#error No bed thermistor table specified
|
#error No bed thermistor table specified
|
||||||
|
#endif // BED_USES_THERMISTOR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif //THERMISTORTABLES_H_
|
#endif //THERMISTORTABLES_H_
|
||||||
|
|
Reference in a new issue