diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 896c93aa18..2adda3fd61 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -29,6 +29,7 @@ // Ultimaker = 7 // Teensylu = 8 // Gen3+ =9 + #ifndef MOTHERBOARD #define MOTHERBOARD 7 #endif @@ -88,9 +89,9 @@ // If you are using a preconfigured hotend then you can use one of the value sets by uncommenting it // Ultimaker - #define DEFAULT_Kp 22.2 - #define DEFAULT_Ki (1.08*PID_dT) - #define DEFAULT_Kd (114/PID_dT) + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 // Makergear // #define DEFAULT_Kp 7.0 @@ -98,9 +99,9 @@ // #define DEFAULT_Kd 12 // Mendel Parts V9 on 12V -// #define DEFAULT_Kp 63.0 -// #define DEFAULT_Ki (2.25*PID_dT) -// #define DEFAULT_Kd (440/PID_dT) +// #define DEFAULT_Kp 63.0 +// #define DEFAULT_Ki 2.25 +// #define DEFAULT_Kd 440 #endif // PIDTEMP //this prevents dangerous Extruder moves, i.e. if the temperature is under the limit @@ -202,7 +203,7 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th #define ULTRA_LCD #define LCD_WIDTH 20 #define LCD_HEIGHT 4 - + // Preheat Constants #define PLA_PREHEAT_HOTEND_TEMP 180 #define PLA_PREHEAT_HPB_TEMP 70 @@ -215,7 +216,7 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th #else //no panel but just lcd #ifdef ULTRA_LCD #define LCD_WIDTH 16 - #define LCD_HEIGHT 2 + #define LCD_HEIGHT 2 #endif #endif diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index 919287260b..c30c5da43c 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -162,6 +162,9 @@ void ClearToSend(); void get_coordinates(); void prepare_move(); void kill(); +void Stop(); + +bool IsStopped(); void enquecommand(const char *cmd); //put an ascii command at the end of the current buffer. void prepare_arc_move(char isclockwise); diff --git a/Marlin/Marlin.pde b/Marlin/Marlin.pde index 5d8094006f..5ee40c038c 100644 --- a/Marlin/Marlin.pde +++ b/Marlin/Marlin.pde @@ -110,6 +110,7 @@ // M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. // M503 - print the current settings (from memory not from eeprom) // M303 - PID relay autotune S sets the target temperature. (default target temperature = 150C) +// M999 - Restart after being stopped by error //Stepper Movement Variables @@ -135,6 +136,7 @@ float add_homeing[3]={0,0,0}; uint8_t active_extruder = 0; unsigned char FanSpeed=0; + //=========================================================================== //=============================private variables============================= //=========================================================================== @@ -143,7 +145,7 @@ static float destination[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0}; static float offset[3] = {0.0, 0.0, 0.0}; static bool home_all_axis = true; static float feedrate = 1500.0, next_feedrate, saved_feedrate; -static long gcode_N, gcode_LastN; +static long gcode_N, gcode_LastN, Stopped_gcode_LastN = 0; static bool relative_mode = false; //Determines Absolute or Relative Coordinates static bool relative_mode_e = false; //Determines Absolute or Relative E Codes while in Absolute Coordinates mode. E is always relative in Relative Coordinates mode. @@ -174,6 +176,7 @@ static unsigned long stoptime=0; static uint8_t tmp_extruder; +bool Stopped=false; //=========================================================================== //=============================ROUTINES============================= @@ -415,11 +418,17 @@ void get_command() case 1: case 2: case 3: - #ifdef SDSUPPORT - if(card.saving) - break; - #endif //SDSUPPORT - SERIAL_PROTOCOLLNPGM(MSG_OK); + if(Stopped == false) { // If printer is stopped by an error the G[0-3] codes are ignored. + #ifdef SDSUPPORT + if(card.saving) + break; + #endif //SDSUPPORT + SERIAL_PROTOCOLLNPGM(MSG_OK); + } + else { + SERIAL_ERRORLNPGM(MSG_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + } break; default: break; @@ -547,19 +556,25 @@ void process_commands() { case 0: // G0 -> G1 case 1: // G1 - get_coordinates(); // For X Y Z E F - prepare_move(); - //ClearToSend(); - return; + if(Stopped == false) { + get_coordinates(); // For X Y Z E F + prepare_move(); + //ClearToSend(); + return; + } //break; case 2: // G2 - CW ARC - get_arc_coordinates(); - prepare_arc_move(true); - return; + if(Stopped == false) { + get_arc_coordinates(); + prepare_arc_move(true); + return; + } case 3: // G3 - CCW ARC - get_arc_coordinates(); - prepare_arc_move(false); - return; + if(Stopped == false) { + get_arc_coordinates(); + prepare_arc_move(false); + return; + } case 4: // G4 dwell LCD_MESSAGEPGM(MSG_DWELL); codenum = 0; @@ -972,6 +987,7 @@ void process_commands() #if (PS_ON_PIN > -1) case 80: // M80 - ATX Power On SET_OUTPUT(PS_ON_PIN); //GND + WRITE(PS_ON_PIN, LOW); break; #endif @@ -1236,7 +1252,11 @@ void process_commands() EEPROM_printSettings(); } break; - + case 999: // Restart after being stopped + Stopped = false; + gcode_LastN = Stopped_gcode_LastN; + FlushSerialRequestResend(); + break; } } @@ -1438,4 +1458,18 @@ void kill() while(1); // Wait for reset } +void Stop() +{ + disable_heater(); + if(Stopped == false) { + Stopped = true; + Stopped_gcode_LastN = gcode_LastN; // Save last g_code for restart + SERIAL_ERROR_START; + SERIAL_ERRORLNPGM(MSG_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + } +} + +bool IsStopped() { return Stopped; }; + diff --git a/Marlin/language.h b/Marlin/language.h index 2cdbc59426..42a9c67f4e 100644 --- a/Marlin/language.h +++ b/Marlin/language.h @@ -78,6 +78,7 @@ #define MSG_NO_MOVE "No move." #define MSG_PART_RELEASE "Partial Release" #define MSG_KILLED "KILLED. " + #define MSG_STOPPED "STOPPED. " #define MSG_PREHEAT_PLA " Preheat PLA" #define MSG_PREHEAT_ABS " Preheat ABS" #define MSG_STEPPER_RELEASED "Released." @@ -116,6 +117,7 @@ #define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1; Sprinter/grbl mashup for gen6 FIRMWARE_URL:http://www.mendel-parts.com PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:1\n" #define MSG_COUNT_X " Count X:" #define MSG_ERR_KILLED "Printer halted. kill() called !!" + #define MSG_ERR_STOPPED "Printer stopped deu to errors. Fix the error and use M999 to restart!. (Temperature is reset. Set it before restarting)" #define MSG_RESEND "Resend:" #define MSG_UNKNOWN_COMMAND "Unknown command:\"" #define MSG_ACTIVE_EXTRUDER "Active Extruder: " @@ -221,6 +223,7 @@ #define MSG_NO_MOVE "No move." #define MSG_PART_RELEASE "Partial Release" #define MSG_KILLED "KILLED. " + #define MSG_STOPPED "STOPPED. " #define MSG_PREHEAT_PLA " Preheat PLA" #define MSG_PREHEAT_ABS " Preheat ABS" #define MSG_STEPPER_RELEASED "Released." @@ -259,6 +262,7 @@ #define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1; Sprinter/grbl mashup for gen6 FIRMWARE_URL:http://www.mendel-parts.com PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:1\n" #define MSG_COUNT_X " Count X:" #define MSG_ERR_KILLED "Printer halted. kill() called !!" + #define MSG_ERR_STOPPED "Printer stopped deu to errors. Fix the error and use M999 to restart!" #define MSG_RESEND "Resend:" #define MSG_UNKNOWN_COMMAND "Unknown command:\"" #define MSG_ACTIVE_EXTRUDER "Active Extruder: " diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index 8aedf269b6..0529b534af 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -51,8 +51,8 @@ int current_raw_bed = 0; float pid_setpoint[EXTRUDERS] = { 0.0 }; float Kp=DEFAULT_Kp; - float Ki=DEFAULT_Ki; - float Kd=DEFAULT_Kd; + float Ki=(DEFAULT_Ki*PID_dT); + float Kd=(DEFAULT_Kd/PID_dT); #ifdef PID_ADD_EXTRUSION_RATE float Kc=DEFAULT_Kc; #endif @@ -708,22 +708,28 @@ void disable_heater() void max_temp_error(uint8_t e) { digitalWrite(heater_pin_map[e], 0); - SERIAL_ERROR_START; - SERIAL_ERRORLN(e); - SERIAL_ERRORLNPGM(": Extruder switched off. MAXTEMP triggered !"); + if(IsStopped() == false) { + SERIAL_ERROR_START; + SERIAL_ERRORLN(e); + SERIAL_ERRORLNPGM(": Extruder switched off. MAXTEMP triggered !"); + } } void min_temp_error(uint8_t e) { digitalWrite(heater_pin_map[e], 0); - SERIAL_ERROR_START; - SERIAL_ERRORLN(e); - SERIAL_ERRORLNPGM(": Extruder switched off. MINTEMP triggered !"); + if(IsStopped() == false) { + SERIAL_ERROR_START; + SERIAL_ERRORLN(e); + SERIAL_ERRORLNPGM(": Extruder switched off. MINTEMP triggered !"); + } } void bed_max_temp_error(void) { digitalWrite(HEATER_BED_PIN, 0); - SERIAL_ERROR_START; - SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!"); + if(IsStopped() == false) { + SERIAL_ERROR_START; + SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!"); + } } #define HEAT_INTERVAL 250 @@ -956,7 +962,7 @@ ISR(TIMER0_COMPB_vect) max_temp_error(e); #ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE { - kill();; + Stop();; } #endif } @@ -965,7 +971,7 @@ ISR(TIMER0_COMPB_vect) min_temp_error(e); #ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE { - kill(); + Stop(); } #endif } @@ -975,7 +981,7 @@ ISR(TIMER0_COMPB_vect) if(current_raw_bed >= bed_maxttemp) { target_raw_bed = 0; bed_max_temp_error(); - kill(); + Stop(); } #endif }