From 308cce734a4fe22d061637c3e82ee897422fae1e Mon Sep 17 00:00:00 2001 From: midopple Date: Sat, 21 Sep 2013 18:05:20 +0200 Subject: [PATCH] Version 1.3.24T / 21.09.2013 - M105 show same format as Marlin work better with new Pronterface - Optimize TEMP_RESIDENCY function at Command M109 --- Sprinter/Configuration.h | 8 ++-- Sprinter/Sprinter.pde | 89 ++++++++++++++++++++++++++++++++-------- Sprinter/heater.cpp | 11 +++++ 3 files changed, 89 insertions(+), 19 deletions(-) diff --git a/Sprinter/Configuration.h b/Sprinter/Configuration.h index 663e9aa..9b5c9f0 100644 --- a/Sprinter/Configuration.h +++ b/Sprinter/Configuration.h @@ -311,7 +311,7 @@ const int dropsegments=5; //everything with less than this number of steps will #define LED_PWM_FOR_BRIGHTNESS(brightness) ((64*brightness-1384)/(300-brightness)) #endif -// Change this value (range 30-255) to limit the current to the nozzle +// Change this value (range 30 - 255) to limit the current to the nozzle #define HEATER_CURRENT 255 // How often should the heater check for new temp readings, in milliseconds @@ -341,8 +341,9 @@ const int dropsegments=5; //everything with less than this number of steps will //#define WATCHPERIOD 5000 //5 seconds // Actual temperature must be close to target for this long before M109 returns success -//#define TEMP_RESIDENCY_TIME 20 // (seconds) -//#define TEMP_HYSTERESIS 5 // (C°) range of +/- temperatures considered "close" to the target one +#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_HYSTERESIS 3 // (C°) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the recidency timer x degC early. //// The minimal temperature defines the temperature below which the heater will not be enabled #define MINTEMP 5 @@ -352,6 +353,7 @@ const int dropsegments=5; //everything with less than this number of steps will // This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure! // You should use MINTEMP for thermistor short/failure protection. #define MAXTEMP 275 +#define MAXTEMP_BED 140 // Select one of these only to define how the nozzle temp is read. #define HEATER_USES_THERMISTOR diff --git a/Sprinter/Sprinter.pde b/Sprinter/Sprinter.pde index f1c24a8..852dce7 100644 --- a/Sprinter/Sprinter.pde +++ b/Sprinter/Sprinter.pde @@ -149,6 +149,10 @@ - Analog pins was added with the wrong pin number, needs to be offset +55 to protect against using the pin as a digital - Min step delay in microseconds (EXTEND_STEP_PULSE_USEC) + Version 1.3.24T / 21.09.2013 +- M105 show same format as Marlin work better with new Pronterface +- Optimize TEMP_RESIDENCY function + */ #include @@ -255,7 +259,7 @@ void __cxa_pure_virtual(){}; // M603 - Show Free Ram -#define _VERSION_TEXT "1.3.23T / 28.11.2012" +#define _VERSION_TEXT "1.3.24T / 21.09.2013" //Stepper Movement Variables char axis_codes[NUM_AXIS] = {'X', 'Y', 'Z', 'E'}; @@ -1508,6 +1512,18 @@ FORCE_INLINE void process_commands() #if (TEMP_0_PIN > -1) || defined (HEATER_USES_MAX6675) || defined HEATER_USES_AD595 showString(PSTR("ok T:")); Serial.print(hotendtC); + showString(PSTR(" /")); + Serial.print(analog2temp(target_raw)); + + #if TEMP_1_PIN > -1 || defined BED_USES_AD595 + showString(PSTR(" B:")); + Serial.print(bedtempC); + showString(PSTR(" /")); + Serial.print(analog2temp(target_bed_raw)); + #else + Serial.print(PSTR(" B:0 /0")); + #endif + #ifdef PIDTEMP showString(PSTR(" @:")); Serial.print(heater_duty); @@ -1523,23 +1539,40 @@ FORCE_INLINE void process_commands() showString(PSTR(",AU:")); Serial.print(autotemp_setpoint); #endif - #endif - #if TEMP_1_PIN > -1 || defined BED_USES_AD595 - showString(PSTR(" B:")); - Serial.println(bedtempC); #else - Serial.println(); + showString(PSTR(" @:0")); + #if (HEATER_0_PIN > -1) + if(READ(HEATER_0_PIN)) + Serial.println(255); + else + Serial.println(0); + #else + Serial.println(0); + #endif #endif + + showString(PSTR(" B@:")); + #if (HEATER_1_PIN > -1) + if(READ(HEATER_1_PIN)) + Serial.println(255); + else + Serial.println(0); + #else + Serial.println(0); + #endif #else #error No temperature source available #endif return; //break; - case 109: { // M109 - Wait for extruder heater to reach target. -#ifdef CHAIN_OF_COMMAND + case 109: // M109 - Wait for extruder heater to reach target. + { + #ifdef CHAIN_OF_COMMAND st_synchronize(); // wait for all movements to finish -#endif + #endif + if (code_seen('S')) target_raw = temp2analogh(target_temp = code_value()); + #ifdef WATCHPERIOD if(target_raw>current_raw) { @@ -1561,27 +1594,51 @@ FORCE_INLINE void process_commands() residencyStart = -1; /* continue to loop until we have reached the target temp _and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */ - while( (target_direction ? (current_raw < target_raw) : (current_raw > target_raw)) - || (residencyStart > -1 && (millis() - residencyStart) < TEMP_RESIDENCY_TIME*1000) ) { + while((residencyStart == -1) || + (residencyStart >= 0 && (((unsigned int) (millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))) ) { #else while ( target_direction ? (current_raw < target_raw) : (current_raw > target_raw) ) { - #endif - if( (millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up/cooling down + #endif //TEMP_RESIDENCY_TIME + //Print Temp Reading every 1 second while heating up/cooling down + if( (millis() - codenum) > 1000UL ) { showString(PSTR("T:")); + #ifndef TEMP_RESIDENCY_TIME Serial.println( analog2temp(current_raw) ); + #else + Serial.print( analog2temp(current_raw) ); + showString(PSTR(" E:0")); + showString(PSTR(" W:")); + if(residencyStart > -1) + { + codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (millis() - residencyStart)) / 1000UL; + Serial.print( codenum ); + } + else + { + Serial.print("?"); + } + + showString(PSTR(" D:")); + Serial.println( analog2temp(current_raw) - analog2temp(target_raw) ); + #endif codenum = millis(); } + + //Call Heatercontrol manage_heater(); + #if (MINIMUM_FAN_START_SPEED > 0) manage_fan_start_speed(); #endif #ifdef TEMP_RESIDENCY_TIME /* start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time or when current temp falls outside the hysteresis after target temp was reached */ - if ( (residencyStart == -1 && target_direction && current_raw >= target_raw) - || (residencyStart == -1 && !target_direction && current_raw <= target_raw) - || (residencyStart > -1 && labs(analog2temp(current_raw) - analog2temp(target_raw)) > TEMP_HYSTERESIS) ) { + + if ((residencyStart == -1 && target_direction && (analog2temp(current_raw) >= (analog2temp(target_raw)-TEMP_WINDOW))) || + (residencyStart == -1 && !target_direction && (analog2temp(current_raw) <= (analog2temp(target_raw)+TEMP_WINDOW))) || + (residencyStart > -1 && labs(analog2temp(current_raw) - analog2temp(target_raw)) > TEMP_HYSTERESIS) ) + { residencyStart = millis(); } #endif diff --git a/Sprinter/heater.cpp b/Sprinter/heater.cpp index 027d057..e591bae 100644 --- a/Sprinter/heater.cpp +++ b/Sprinter/heater.cpp @@ -104,6 +104,10 @@ unsigned long previous_millis_heater, previous_millis_bed_heater, previous_milli int maxttemp = temp2analogh(MAXTEMP); #endif +#ifdef MAXTEMP_BED + int maxttemp_bed = temp2analogBed(MAXTEMP_BED); +#endif + #define HEAT_INTERVAL 250 @@ -305,6 +309,9 @@ ISR(TIMER2_OVF_vect) // Some information see: // http://brettbeauregard.com/blog/2012/01/arduino-pid-autotune-library/ //------------------------------------------------------------------ + +//HEATER_CURRENT --> 255 + #ifdef PID_AUTOTUNE void PID_autotune(int PIDAT_test_temp) { @@ -742,7 +749,11 @@ void PID_autotune(int PIDAT_test_temp) #ifdef MINTEMP + #ifdef MAXTEMP_BED + if(current_bed_raw >= target_bed_raw || current_bed_raw < minttemp || current_bed_raw > maxttemp_bed) + #else if(current_bed_raw >= target_bed_raw || current_bed_raw < minttemp) + #endif #else if(current_bed_raw >= target_bed_raw) #endif