From 9c9726d4697debc4324bbce41560d94553a3d2b0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 24 Feb 2015 04:46:11 -0800 Subject: [PATCH 01/12] Cleanup of temperature code - Reduce calls to millis() - General cleanup of manage_heaters - General cleanup of pid autotune - Formatting here & there - Macros to clean up and shrink ISR code (reduced by ~364 lines) --- Marlin/pins_RUMBA.h | 4 + Marlin/temperature.cpp | 2006 ++++++++++++++++------------------------ Marlin/temperature.h | 111 +-- 3 files changed, 864 insertions(+), 1257 deletions(-) diff --git a/Marlin/pins_RUMBA.h b/Marlin/pins_RUMBA.h index 8828ef32dc..ce96d750d3 100644 --- a/Marlin/pins_RUMBA.h +++ b/Marlin/pins_RUMBA.h @@ -6,6 +6,10 @@ #error Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu. #endif +#if EXTRUDERS > 3 + #error RUMBA supports up to 3 extruders. Comment this line to keep going. +#endif + #define X_STEP_PIN 17 #define X_DIR_PIN 16 #define X_ENABLE_PIN 48 diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index d50c4265b0..5afc7fc471 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -71,7 +71,7 @@ float current_temperature_bed = 0.0; unsigned char soft_pwm_bed; #ifdef BABYSTEPPING - volatile int babystepsTodo[3]={0,0,0}; + volatile int babystepsTodo[3] = { 0 }; #endif #ifdef FILAMENT_SENSOR @@ -123,33 +123,33 @@ static volatile bool temp_meas_ready = false; #endif #if EXTRUDERS > 4 - # error Unsupported number of extruders + #error Unsupported number of extruders #elif EXTRUDERS > 3 - # define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2, v3, v4 } + #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2, v3, v4 } #elif EXTRUDERS > 2 - # define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2, v3 } + #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2, v3 } #elif EXTRUDERS > 1 - # define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2 } + #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2 } #else - # define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1 } + #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1 } #endif #ifdef PIDTEMP -#ifdef PID_PARAMS_PER_EXTRUDER - float Kp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kp, DEFAULT_Kp, DEFAULT_Kp, DEFAULT_Kp); - float Ki[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Ki*PID_dT, DEFAULT_Ki*PID_dT, DEFAULT_Ki*PID_dT, DEFAULT_Ki*PID_dT); - float Kd[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kd / PID_dT, DEFAULT_Kd / PID_dT, DEFAULT_Kd / PID_dT, DEFAULT_Kd / PID_dT); - #ifdef PID_ADD_EXTRUSION_RATE - float Kc[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kc, DEFAULT_Kc, DEFAULT_Kc, DEFAULT_Kc); - #endif // PID_ADD_EXTRUSION_RATE -#else //PID_PARAMS_PER_EXTRUDER - float Kp = DEFAULT_Kp; - float Ki = DEFAULT_Ki * PID_dT; - float Kd = DEFAULT_Kd / PID_dT; - #ifdef PID_ADD_EXTRUSION_RATE - float Kc = DEFAULT_Kc; - #endif // PID_ADD_EXTRUSION_RATE -#endif // PID_PARAMS_PER_EXTRUDER + #ifdef PID_PARAMS_PER_EXTRUDER + float Kp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kp, DEFAULT_Kp, DEFAULT_Kp, DEFAULT_Kp); + float Ki[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Ki*PID_dT, DEFAULT_Ki*PID_dT, DEFAULT_Ki*PID_dT, DEFAULT_Ki*PID_dT); + float Kd[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kd / PID_dT, DEFAULT_Kd / PID_dT, DEFAULT_Kd / PID_dT, DEFAULT_Kd / PID_dT); + #ifdef PID_ADD_EXTRUSION_RATE + float Kc[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kc, DEFAULT_Kc, DEFAULT_Kc, DEFAULT_Kc); + #endif // PID_ADD_EXTRUSION_RATE + #else //PID_PARAMS_PER_EXTRUDER + float Kp = DEFAULT_Kp; + float Ki = DEFAULT_Ki * PID_dT; + float Kd = DEFAULT_Kd / PID_dT; + #ifdef PID_ADD_EXTRUSION_RATE + float Kc = DEFAULT_Kc; + #endif // PID_ADD_EXTRUSION_RATE + #endif // PID_PARAMS_PER_EXTRUDER #endif //PIDTEMP // Init min and max temp with extreme values to prevent false errors during startup @@ -159,7 +159,7 @@ static int minttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS( 0, 0, 0, 0 ); static int maxttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS( 16383, 16383, 16383, 16383 ); //static int bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP; /* No bed mintemp error implemented?!? */ #ifdef BED_MAXTEMP -static int bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP; + static int bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP; #endif #ifdef TEMP_SENSOR_1_AS_REDUNDANT @@ -175,12 +175,12 @@ static float analog2tempBed(int raw); static void updateTemperaturesFromRawValues(); #ifdef WATCH_TEMP_PERIOD -int watch_start_temp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0,0); -unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0,0); + int watch_start_temp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0,0); + unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0,0); #endif //WATCH_TEMP_PERIOD #ifndef SOFT_PWM_SCALE -#define SOFT_PWM_SCALE 0 + #define SOFT_PWM_SCALE 0 #endif #ifdef FILAMENT_SENSOR @@ -191,6 +191,13 @@ unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0,0); static int read_max6675(); #endif +#define HAS_TEMP_0 (defined(TEMP_0_PIN) && TEMP_0_PIN > -1) +#define HAS_TEMP_1 (defined(TEMP_1_PIN) && TEMP_1_PIN > -1) +#define HAS_TEMP_2 (defined(TEMP_2_PIN) && TEMP_2_PIN > -1) +#define HAS_TEMP_3 (defined(TEMP_3_PIN) && TEMP_3_PIN > -1) +#define HAS_TEMP_BED (defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1) +#define HAS_FILAMENT_SENSOR (defined(FILAMENT_SENSOR) && defined(FILWIDTH_PIN) && FILWIDTH_PIN > -1) + //=========================================================================== //============================= functions ============================ //=========================================================================== @@ -198,109 +205,100 @@ unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0,0); void PID_autotune(float temp, int extruder, int ncycles) { float input = 0.0; - int cycles=0; + int cycles = 0; bool heating = true; - unsigned long temp_millis = millis(); - unsigned long t1=temp_millis; - unsigned long t2=temp_millis; - long t_high = 0; - long t_low = 0; + unsigned long temp_millis = millis(), t1 = temp_millis, t2 = temp_millis; + long t_high = 0, t_low = 0; long bias, d; float Ku, Tu; float Kp, Ki, Kd; float max = 0, min = 10000; -#if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_3_AUTO_FAN_PIN) && EXTRUDER_3_AUTO_FAN_PIN > -1) - unsigned long extruder_autofan_last_check = millis(); -#endif - - if ((extruder >= EXTRUDERS) - #if (TEMP_BED_PIN <= -1) - ||(extruder < 0) + #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ + (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \ + (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) || \ + (defined(EXTRUDER_3_AUTO_FAN_PIN) && EXTRUDER_3_AUTO_FAN_PIN > -1) + unsigned long extruder_autofan_last_check = temp_millis; #endif - ){ - SERIAL_ECHOLN("PID Autotune failed. Bad extruder number."); - return; - } - - SERIAL_ECHOLN("PID Autotune start"); - - disable_heater(); // switch off all heaters. - if (extruder<0) - { - soft_pwm_bed = (MAX_BED_POWER)/2; - bias = d = (MAX_BED_POWER)/2; - } - else - { - soft_pwm[extruder] = (PID_MAX)/2; - bias = d = (PID_MAX)/2; + if (extruder >= EXTRUDERS + #if !HAS_TEMP_BED + || extruder < 0 + #endif + ) { + SERIAL_ECHOLN("PID Autotune failed. Bad extruder number."); + return; } + + SERIAL_ECHOLN("PID Autotune start"); + disable_heater(); // switch off all heaters. + if (extruder < 0) + soft_pwm_bed = bias = d = MAX_BED_POWER / 2; + else + soft_pwm[extruder] = bias = d = PID_MAX / 2; + // PID Tuning loop + for(;;) { - for(;;) { + unsigned long ms = millis(); - if(temp_meas_ready == true) { // temp sample ready + if (temp_meas_ready == true) { // temp sample ready updateTemperaturesFromRawValues(); input = (extruder<0)?current_temperature_bed:current_temperature[extruder]; - max=max(max,input); - min=min(min,input); + max = max(max, input); + min = min(min, input); #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \ (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) || \ (defined(EXTRUDER_3_AUTO_FAN_PIN) && EXTRUDER_3_AUTO_FAN_PIN > -1) - if(millis() - extruder_autofan_last_check > 2500) { - checkExtruderAutoFans(); - extruder_autofan_last_check = millis(); - } + if (ms > extruder_autofan_last_check + 2500) { + checkExtruderAutoFans(); + extruder_autofan_last_check = ms; + } #endif - if(heating == true && input > temp) { - if(millis() - t2 > 5000) { - heating=false; - if (extruder<0) + if (heating == true && input > temp) { + if (ms - t2 > 5000) { + heating = false; + if (extruder < 0) soft_pwm_bed = (bias - d) >> 1; else soft_pwm[extruder] = (bias - d) >> 1; - t1=millis(); - t_high=t1 - t2; - max=temp; + t1 = ms; + t_high = t1 - t2; + max = temp; } } - if(heating == false && input < temp) { - if(millis() - t1 > 5000) { - heating=true; - t2=millis(); - t_low=t2 - t1; - if(cycles > 0) { + if (heating == false && input < temp) { + if (ms - t1 > 5000) { + heating = true; + t2 = ms; + t_low = t2 - t1; + if (cycles > 0) { + long max_pow = extruder < 0 ? MAX_BED_POWER : PID_MAX; bias += (d*(t_high - t_low))/(t_low + t_high); - bias = constrain(bias, 20 ,(extruder<0?(MAX_BED_POWER):(PID_MAX))-20); - if(bias > (extruder<0?(MAX_BED_POWER):(PID_MAX))/2) d = (extruder<0?(MAX_BED_POWER):(PID_MAX)) - 1 - bias; - else d = bias; + bias = constrain(bias, 20, max_pow - 20); + d = (bias > max_pow / 2) ? max_pow - 1 - bias : bias; SERIAL_PROTOCOLPGM(" bias: "); SERIAL_PROTOCOL(bias); - SERIAL_PROTOCOLPGM(" d: "); SERIAL_PROTOCOL(d); - SERIAL_PROTOCOLPGM(" min: "); SERIAL_PROTOCOL(min); - SERIAL_PROTOCOLPGM(" max: "); SERIAL_PROTOCOLLN(max); - if(cycles > 2) { - Ku = (4.0*d)/(3.14159*(max-min)/2.0); - Tu = ((float)(t_low + t_high)/1000.0); + SERIAL_PROTOCOLPGM(" d: "); SERIAL_PROTOCOL(d); + SERIAL_PROTOCOLPGM(" min: "); SERIAL_PROTOCOL(min); + SERIAL_PROTOCOLPGM(" max: "); SERIAL_PROTOCOLLN(max); + if (cycles > 2) { + Ku = (4.0 * d) / (3.14159265 * (max - min) / 2.0); + Tu = ((float)(t_low + t_high) / 1000.0); SERIAL_PROTOCOLPGM(" Ku: "); SERIAL_PROTOCOL(Ku); SERIAL_PROTOCOLPGM(" Tu: "); SERIAL_PROTOCOLLN(Tu); - Kp = 0.6*Ku; - Ki = 2*Kp/Tu; - Kd = Kp*Tu/8; + Kp = 0.6 * Ku; + Ki = 2 * Kp / Tu; + Kd = Kp * Tu / 8; SERIAL_PROTOCOLLNPGM(" Classic PID "); SERIAL_PROTOCOLPGM(" Kp: "); SERIAL_PROTOCOLLN(Kp); SERIAL_PROTOCOLPGM(" Ki: "); SERIAL_PROTOCOLLN(Ki); @@ -323,40 +321,43 @@ void PID_autotune(float temp, int extruder, int ncycles) */ } } - if (extruder<0) + if (extruder < 0) soft_pwm_bed = (bias + d) >> 1; else soft_pwm[extruder] = (bias + d) >> 1; cycles++; - min=temp; + min = temp; } } } - if(input > (temp + 20)) { + if (input > temp + 20) { SERIAL_PROTOCOLLNPGM("PID Autotune failed! Temperature too high"); return; } - if(millis() - temp_millis > 2000) { + // Every 2 seconds... + if (ms - temp_millis > 2000) { int p; - if (extruder<0){ - p=soft_pwm_bed; + if (extruder < 0) { + p = soft_pwm_bed; SERIAL_PROTOCOLPGM("ok B:"); - }else{ - p=soft_pwm[extruder]; + } + else { + p = soft_pwm[extruder]; SERIAL_PROTOCOLPGM("ok T:"); } - - SERIAL_PROTOCOL(input); + + SERIAL_PROTOCOL(input); SERIAL_PROTOCOLPGM(" @:"); - SERIAL_PROTOCOLLN(p); + SERIAL_PROTOCOLLN(p); - temp_millis = millis(); - } - if(((millis() - t1) + (millis() - t2)) > (10L*60L*1000L*2L)) { + temp_millis = ms; + } // every 2 seconds + // Over 2 minutes? + if (((ms - t1) + (ms - t2)) > (10L*60L*1000L*2L)) { SERIAL_PROTOCOLLNPGM("PID Autotune failed! timeout"); return; } - if(cycles > ncycles) { + if (cycles > ncycles) { SERIAL_PROTOCOLLNPGM("PID Autotune finished! Put the last Kp, Ki and Kd constants from above into Configuration.h"); return; } @@ -364,22 +365,19 @@ void PID_autotune(float temp, int extruder, int ncycles) } } -void updatePID() -{ -#ifdef PIDTEMP - for(int e = 0; e < EXTRUDERS; e++) { - temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / PID_PARAM(Ki,e); - } -#endif -#ifdef PIDTEMPBED - temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / bedKi; -#endif +void updatePID() { + #ifdef PIDTEMP + for (int e = 0; e < EXTRUDERS; e++) { + temp_iState_max[e] = PID_INTEGRAL_DRIVE_MAX / PID_PARAM(Ki,e); + } + #endif + #ifdef PIDTEMPBED + temp_iState_max_bed = PID_INTEGRAL_DRIVE_MAX / bedKi; + #endif } - + int getHeaterPower(int heater) { - if (heater<0) - return soft_pwm_bed; - return soft_pwm[heater]; + return heater < 0 ? soft_pwm_bed : soft_pwm[heater]; } #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ @@ -473,47 +471,78 @@ void checkExtruderAutoFans() #endif // any extruder auto fan pins set -void manage_heater() -{ - float pid_input; - float pid_output; +// +// Error checking and Write Routines +// +#if !defined(HEATER_0_PIN) || HEATER_0_PIN < 0 + #error HEATER_0_PIN not defined for this board +#endif +#define WRITE_HEATER_0P(v) WRITE(HEATER_0_PIN, v) +#if EXTRUDERS > 1 || defined(HEATERS_PARALLEL) + #if !defined(HEATER_1_PIN) || HEATER_1_PIN < 0 + #error HEATER_1_PIN not defined for this board + #endif + #define WRITE_HEATER_1(v) WRITE(HEATER_1_PIN, v) + #if EXTRUDERS > 2 + #if !defined(HEATER_2_PIN) || HEATER_2_PIN < 0 + #error HEATER_2_PIN not defined for this board + #endif + #define WRITE_HEATER_2(v) WRITE(HEATER_2_PIN, v) + #if EXTRUDERS > 3 + #if !defined(HEATER_3_PIN) || HEATER_3_PIN < 0 + #error HEATER_3_PIN not defined for this board + #endif + #define WRITE_HEATER_3(v) WRITE(HEATER_3_PIN, v) + #endif + #endif +#endif +#ifdef HEATERS_PARALLEL + #define WRITE_HEATER_0(v) { WRITE_HEATER_0P(v); WRITE_HEATER_1(v); } +#else + #define WRITE_HEATER_0(v) WRITE_HEATER_0P(v) +#endif +#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + #define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, v) +#endif + +void manage_heater() { - if(temp_meas_ready != true) //better readability - return; + if (!temp_meas_ready) return; + + float pid_input, pid_output; updateTemperaturesFromRawValues(); #ifdef HEATER_0_USES_MAX6675 - if (current_temperature[0] > 1023 || current_temperature[0] > HEATER_0_MAXTEMP) { - max_temp_error(0); - } - if (current_temperature[0] == 0 || current_temperature[0] < HEATER_0_MINTEMP) { - min_temp_error(0); - } + float ct = current_temperature[0]; + if (ct > min(HEATER_0_MAXTEMP, 1023)) max_temp_error(0); + if (ct < max(HEATER_0_MINTEMP, 0.01)) min_temp_error(0); #endif //HEATER_0_USES_MAX6675 - for(int e = 0; e < EXTRUDERS; e++) - { + unsigned long ms = millis(); -#if defined (THERMAL_RUNAWAY_PROTECTION_PERIOD) && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0 - thermal_runaway_protection(&thermal_runaway_state_machine[e], &thermal_runaway_timer[e], current_temperature[e], target_temperature[e], e, THERMAL_RUNAWAY_PROTECTION_PERIOD, THERMAL_RUNAWAY_PROTECTION_HYSTERESIS); - #endif + // Loop through all extruders + for (int e = 0; e < EXTRUDERS; e++) { - #ifdef PIDTEMP - pid_input = current_temperature[e]; + #if defined (THERMAL_RUNAWAY_PROTECTION_PERIOD) && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0 + thermal_runaway_protection(&thermal_runaway_state_machine[e], &thermal_runaway_timer[e], current_temperature[e], target_temperature[e], e, THERMAL_RUNAWAY_PROTECTION_PERIOD, THERMAL_RUNAWAY_PROTECTION_HYSTERESIS); + #endif + + #ifdef PIDTEMP + pid_input = current_temperature[e]; - #ifndef PID_OPENLOOP + #ifndef PID_OPENLOOP pid_error[e] = target_temperature[e] - pid_input; - if(pid_error[e] > PID_FUNCTIONAL_RANGE) { + if (pid_error[e] > PID_FUNCTIONAL_RANGE) { pid_output = BANG_MAX; pid_reset[e] = true; } - else if(pid_error[e] < -PID_FUNCTIONAL_RANGE || target_temperature[e] == 0) { + else if (pid_error[e] < -PID_FUNCTIONAL_RANGE || target_temperature[e] == 0) { pid_output = 0; pid_reset[e] = true; } else { - if(pid_reset[e] == true) { + if (pid_reset[e] == true) { temp_iState[e] = 0.0; pid_reset[e] = false; } @@ -524,69 +553,66 @@ void manage_heater() //K1 defined in Configuration.h in the PID settings #define K2 (1.0-K1) - dTerm[e] = (PID_PARAM(Kd,e) * (pid_input - temp_dState[e]))*K2 + (K1 * dTerm[e]); + dTerm[e] = (PID_PARAM(Kd,e) * (pid_input - temp_dState[e])) * K2 + (K1 * dTerm[e]); pid_output = pTerm[e] + iTerm[e] - dTerm[e]; if (pid_output > PID_MAX) { - if (pid_error[e] > 0 ) temp_iState[e] -= pid_error[e]; // conditional un-integration - pid_output=PID_MAX; - } else if (pid_output < 0){ - if (pid_error[e] < 0 ) temp_iState[e] -= pid_error[e]; // conditional un-integration - pid_output=0; + if (pid_error[e] > 0) temp_iState[e] -= pid_error[e]; // conditional un-integration + pid_output = PID_MAX; + } + else if (pid_output < 0) { + if (pid_error[e] < 0) temp_iState[e] -= pid_error[e]; // conditional un-integration + pid_output = 0; } } temp_dState[e] = pid_input; - #else - pid_output = constrain(target_temperature[e], 0, PID_MAX); - #endif //PID_OPENLOOP - #ifdef PID_DEBUG - SERIAL_ECHO_START; - SERIAL_ECHO(" PID_DEBUG "); - SERIAL_ECHO(e); - SERIAL_ECHO(": Input "); - SERIAL_ECHO(pid_input); - SERIAL_ECHO(" Output "); - SERIAL_ECHO(pid_output); - SERIAL_ECHO(" pTerm "); - SERIAL_ECHO(pTerm[e]); - SERIAL_ECHO(" iTerm "); - SERIAL_ECHO(iTerm[e]); - SERIAL_ECHO(" dTerm "); - SERIAL_ECHOLN(dTerm[e]); - #endif //PID_DEBUG - #else /* PID off */ - pid_output = 0; - if(current_temperature[e] < target_temperature[e]) { - pid_output = PID_MAX; - } - #endif + #else + pid_output = constrain(target_temperature[e], 0, PID_MAX); + #endif //PID_OPENLOOP + + #ifdef PID_DEBUG + SERIAL_ECHO_START; + SERIAL_ECHO(" PID_DEBUG "); + SERIAL_ECHO(e); + SERIAL_ECHO(": Input "); + SERIAL_ECHO(pid_input); + SERIAL_ECHO(" Output "); + SERIAL_ECHO(pid_output); + SERIAL_ECHO(" pTerm "); + SERIAL_ECHO(pTerm[e]); + SERIAL_ECHO(" iTerm "); + SERIAL_ECHO(iTerm[e]); + SERIAL_ECHO(" dTerm "); + SERIAL_ECHOLN(dTerm[e]); + #endif //PID_DEBUG + + #else /* PID off */ + + pid_output = 0; + if (current_temperature[e] < target_temperature[e]) pid_output = PID_MAX; + + #endif // Check if temperature is within the correct range - if((current_temperature[e] > minttemp[e]) && (current_temperature[e] < maxttemp[e])) - { - soft_pwm[e] = (int)pid_output >> 1; - } - else { - soft_pwm[e] = 0; - } + soft_pwm[e] = current_temperature[e] > minttemp[e] && current_temperature[e] < maxttemp[e] ? (int)pid_output >> 1 : 0; #ifdef WATCH_TEMP_PERIOD - if(watchmillis[e] && millis() - watchmillis[e] > WATCH_TEMP_PERIOD) - { - if(degHotend(e) < watch_start_temp[e] + WATCH_TEMP_INCREASE) - { - setTargetHotend(0, e); - LCD_MESSAGEPGM("Heating failed"); - SERIAL_ECHO_START; - SERIAL_ECHOLN("Heating failed"); - }else{ - watchmillis[e] = 0; + if (watchmillis[e] && ms > watchmillis[e] + WATCH_TEMP_PERIOD) { + if (degHotend(e) < watch_start_temp[e] + WATCH_TEMP_INCREASE) { + setTargetHotend(0, e); + LCD_MESSAGEPGM("Heating failed"); + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Heating failed"); } - } - #endif + else { + watchmillis[e] = 0; + } + } + #endif //WATCH_TEMP_PERIOD + #ifdef TEMP_SENSOR_1_AS_REDUNDANT - if(fabs(current_temperature[0] - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) { + if (fabs(current_temperature[0] - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) { disable_heater(); - if(IsStopped() == false) { + if (IsStopped() == false) { SERIAL_ERROR_START; SERIAL_ERRORLNPGM("Extruder switched off. Temperature difference between temp sensors is too high !"); LCD_ALERTMESSAGEPGM("Err: REDUNDANT TEMP ERROR"); @@ -595,24 +621,23 @@ void manage_heater() Stop(); #endif } - #endif - } // End extruder for loop + #endif //TEMP_SENSOR_1_AS_REDUNDANT + + } // Extruders Loop #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \ (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) - if(millis() - extruder_autofan_last_check > 2500) // only need to check fan state very infrequently - { - checkExtruderAutoFans(); - extruder_autofan_last_check = millis(); - } + if (ms > extruder_autofan_last_check + 2500) { // only need to check fan state very infrequently + checkExtruderAutoFans(); + extruder_autofan_last_check = ms; + } #endif #ifndef PIDTEMPBED - if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL) - return; - previous_millis_bed_heater = millis(); - #endif + if (ms < previous_millis_bed_heater + BED_CHECK_INTERVAL) return; + previous_millis_bed_heater = ms; + #endif //PIDTEMPBED #if TEMP_SENSOR_BED != 0 @@ -620,102 +645,75 @@ void manage_heater() thermal_runaway_protection(&thermal_runaway_bed_state_machine, &thermal_runaway_bed_timer, current_temperature_bed, target_temperature_bed, 9, THERMAL_RUNAWAY_PROTECTION_BED_PERIOD, THERMAL_RUNAWAY_PROTECTION_BED_HYSTERESIS); #endif - #ifdef PIDTEMPBED - pid_input = current_temperature_bed; - - #ifndef PID_OPENLOOP - pid_error_bed = target_temperature_bed - pid_input; - pTerm_bed = bedKp * pid_error_bed; - temp_iState_bed += pid_error_bed; - temp_iState_bed = constrain(temp_iState_bed, temp_iState_min_bed, temp_iState_max_bed); - iTerm_bed = bedKi * temp_iState_bed; - - //K1 defined in Configuration.h in the PID settings - #define K2 (1.0-K1) - dTerm_bed= (bedKd * (pid_input - temp_dState_bed))*K2 + (K1 * dTerm_bed); - temp_dState_bed = pid_input; - - pid_output = pTerm_bed + iTerm_bed - dTerm_bed; - if (pid_output > MAX_BED_POWER) { - if (pid_error_bed > 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration - pid_output=MAX_BED_POWER; - } else if (pid_output < 0){ - if (pid_error_bed < 0 ) temp_iState_bed -= pid_error_bed; // conditional un-integration - pid_output=0; - } + #ifdef PIDTEMPBED + pid_input = current_temperature_bed; + + #ifndef PID_OPENLOOP + pid_error_bed = target_temperature_bed - pid_input; + pTerm_bed = bedKp * pid_error_bed; + temp_iState_bed += pid_error_bed; + temp_iState_bed = constrain(temp_iState_bed, temp_iState_min_bed, temp_iState_max_bed); + iTerm_bed = bedKi * temp_iState_bed; + + //K1 defined in Configuration.h in the PID settings + #define K2 (1.0-K1) + dTerm_bed = (bedKd * (pid_input - temp_dState_bed))*K2 + (K1 * dTerm_bed); + temp_dState_bed = pid_input; + + pid_output = pTerm_bed + iTerm_bed - dTerm_bed; + if (pid_output > MAX_BED_POWER) { + if (pid_error_bed > 0) temp_iState_bed -= pid_error_bed; // conditional un-integration + pid_output = MAX_BED_POWER; + } + else if (pid_output < 0) { + if (pid_error_bed < 0) temp_iState_bed -= pid_error_bed; // conditional un-integration + pid_output = 0; + } - #else - pid_output = constrain(target_temperature_bed, 0, MAX_BED_POWER); - #endif //PID_OPENLOOP + #else + pid_output = constrain(target_temperature_bed, 0, MAX_BED_POWER); + #endif //PID_OPENLOOP - if((current_temperature_bed > BED_MINTEMP) && (current_temperature_bed < BED_MAXTEMP)) - { - soft_pwm_bed = (int)pid_output >> 1; - } - else { - soft_pwm_bed = 0; - } + soft_pwm_bed = current_temperature_bed > BED_MINTEMP && current_temperature_bed < BED_MAXTEMP ? (int)pid_output >> 1 : 0; #elif !defined(BED_LIMIT_SWITCHING) // Check if temperature is within the correct range - if((current_temperature_bed > BED_MINTEMP) && (current_temperature_bed < BED_MAXTEMP)) - { - if(current_temperature_bed >= target_temperature_bed) - { - soft_pwm_bed = 0; - } - else - { - soft_pwm_bed = MAX_BED_POWER>>1; - } + if (current_temperature_bed > BED_MINTEMP && current_temperature_bed < BED_MAXTEMP) { + soft_pwm_bed = current_temperature_bed >= target_temperature_bed ? 0 : MAX_BED_POWER >> 1; } - else - { + else { soft_pwm_bed = 0; - WRITE(HEATER_BED_PIN,LOW); + WRITE_HEATER_BED(LOW); } #else //#ifdef BED_LIMIT_SWITCHING // Check if temperature is within the correct band - if((current_temperature_bed > BED_MINTEMP) && (current_temperature_bed < BED_MAXTEMP)) - { - if(current_temperature_bed > target_temperature_bed + BED_HYSTERESIS) - { + if (current_temperature_bed > BED_MINTEMP && current_temperature_bed < BED_MAXTEMP) { + if (current_temperature_bed >= target_temperature_bed + BED_HYSTERESIS) soft_pwm_bed = 0; - } - else if(current_temperature_bed <= target_temperature_bed - BED_HYSTERESIS) - { - soft_pwm_bed = MAX_BED_POWER>>1; - } + else if (current_temperature_bed <= target_temperature_bed - BED_HYSTERESIS) + soft_pwm_bed = MAX_BED_POWER >> 1; } - else - { + else { soft_pwm_bed = 0; - WRITE(HEATER_BED_PIN,LOW); + WRITE_HEATER_BED(LOW); } #endif - #endif + #endif //TEMP_SENSOR_BED != 0 -//code for controlling the extruder rate based on the width sensor -#ifdef FILAMENT_SENSOR - if(filament_sensor) - { - meas_shift_index=delay_index1-meas_delay_cm; - if(meas_shift_index<0) - meas_shift_index = meas_shift_index + (MAX_MEASUREMENT_DELAY+1); //loop around buffer if needed - - //get the delayed info and add 100 to reconstitute to a percent of the nominal filament diameter - //then square it to get an area - - if(meas_shift_index<0) - meas_shift_index=0; - else if (meas_shift_index>MAX_MEASUREMENT_DELAY) - meas_shift_index=MAX_MEASUREMENT_DELAY; + // Control the extruder rate based on the width sensor + #ifdef FILAMENT_SENSOR + if (filament_sensor) { + meas_shift_index = delay_index1 - meas_delay_cm; + if (meas_shift_index < 0) meas_shift_index += MAX_MEASUREMENT_DELAY + 1; //loop around buffer if needed - volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] = pow((float)(100+measurement_delay[meas_shift_index])/100.0,2); - if (volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] <0.01) - volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM]=0.01; - } -#endif + // Get the delayed info and add 100 to reconstitute to a percent of + // the nominal filament diameter then square it to get an area + meas_shift_index = constrain(meas_shift_index, 0, MAX_MEASUREMENT_DELAY); + float vm = pow((measurement_delay[meas_shift_index] + 100.0) / 100.0, 2); + if (vm < 0.01) vm = 0.01; + volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] = vm; + } + #endif //FILAMENT_SENSOR } #define PGM_RD_W(x) (short)pgm_read_word(&x) @@ -812,7 +810,7 @@ static void updateTemperaturesFromRawValues() #ifdef TEMP_SENSOR_1_AS_REDUNDANT redundant_temperature = analog2temp(redundant_temperature_raw, 1); #endif - #if defined (FILAMENT_SENSOR) && (FILWIDTH_PIN > -1) //check if a sensor is supported + #if HAS_FILAMENT_SENSOR filament_width_meas = analog2widthFil(); #endif //Reset the watchdog after we know we have a temperature measurement. @@ -824,29 +822,22 @@ static void updateTemperaturesFromRawValues() } -// For converting raw Filament Width to milimeters #ifdef FILAMENT_SENSOR -float analog2widthFil() { -return current_raw_filwidth/16383.0*5.0; -//return current_raw_filwidth; -} - -// For converting raw Filament Width to a ratio -int widthFil_to_size_ratio() { - -float temp; - -temp=filament_width_meas; -if(filament_width_measMEASURED_UPPER_LIMIT) - temp= MEASURED_UPPER_LIMIT; + // Convert raw Filament Width to millimeters + float analog2widthFil() { + return current_raw_filwidth / 16383.0 * 5.0; + //return current_raw_filwidth; + } -return(filament_width_nominal/temp*100); - + // Convert raw Filament Width to a ratio + int widthFil_to_size_ratio() { + float temp = filament_width_meas; + if (temp < MEASURED_LOWER_LIMIT) temp = filament_width_nominal; //assume sensor cut out + else if (temp > MEASURED_UPPER_LIMIT) temp = MEASURED_UPPER_LIMIT; + return filament_width_nominal / temp * 100; + } -} #endif @@ -855,50 +846,50 @@ return(filament_width_nominal/temp*100); void tp_init() { -#if MB(RUMBA) && ((TEMP_SENSOR_0==-1)||(TEMP_SENSOR_1==-1)||(TEMP_SENSOR_2==-1)||(TEMP_SENSOR_BED==-1)) - //disable RUMBA JTAG in case the thermocouple extension is plugged on top of JTAG connector - MCUCR=(1< -1) + #if defined(HEATER_0_PIN) && (HEATER_0_PIN > -1) SET_OUTPUT(HEATER_0_PIN); #endif - #if defined(HEATER_1_PIN) && (HEATER_1_PIN > -1) + #if defined(HEATER_1_PIN) && (HEATER_1_PIN > -1) SET_OUTPUT(HEATER_1_PIN); #endif - #if defined(HEATER_2_PIN) && (HEATER_2_PIN > -1) + #if defined(HEATER_2_PIN) && (HEATER_2_PIN > -1) SET_OUTPUT(HEATER_2_PIN); #endif - #if defined(HEATER_3_PIN) && (HEATER_3_PIN > -1) + #if defined(HEATER_3_PIN) && (HEATER_3_PIN > -1) SET_OUTPUT(HEATER_3_PIN); #endif - #if defined(HEATER_BED_PIN) && (HEATER_BED_PIN > -1) + #if defined(HEATER_BED_PIN) && (HEATER_BED_PIN > -1) SET_OUTPUT(HEATER_BED_PIN); #endif - #if defined(FAN_PIN) && (FAN_PIN > -1) + #if defined(FAN_PIN) && (FAN_PIN > -1) SET_OUTPUT(FAN_PIN); #ifdef FAST_PWM_FAN - setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 + setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 #endif #ifdef FAN_SOFT_PWM - soft_pwm_fan = fanSpeedSoftPwm / 2; + soft_pwm_fan = fanSpeedSoftPwm / 2; #endif - #endif + #endif #ifdef HEATER_0_USES_MAX6675 @@ -921,57 +912,35 @@ void tp_init() #endif //HEATER_0_USES_MAX6675 + #ifdef DIDR2 + #define ANALOG_SELECT(pin) do{ if (pin < 8) DIDR0 |= 1 << pin; else DIDR2 |= 1 << (pin - 8); }while(0) + #else + #define ANALOG_SELECT(pin) do{ DIDR0 |= 1 << pin; }while(0) + #endif + // Set analog inputs ADCSRA = 1< -1) - #if TEMP_0_PIN < 8 - DIDR0 |= 1 << TEMP_0_PIN; - #else - DIDR2 |= 1<<(TEMP_0_PIN - 8); - #endif + #if HAS_TEMP_0 + ANALOG_SELECT(TEMP_0_PIN); #endif - #if defined(TEMP_1_PIN) && (TEMP_1_PIN > -1) - #if TEMP_1_PIN < 8 - DIDR0 |= 1< -1) - #if TEMP_2_PIN < 8 - DIDR0 |= 1 << TEMP_2_PIN; - #else - DIDR2 |= 1<<(TEMP_2_PIN - 8); - #endif + #if HAS_TEMP_2 + ANALOG_SELECT(TEMP_2_PIN); #endif - #if defined(TEMP_3_PIN) && (TEMP_3_PIN > -1) - #if TEMP_3_PIN < 8 - DIDR0 |= 1 << TEMP_3_PIN; - #else - DIDR2 |= 1<<(TEMP_3_PIN - 8); - #endif + #if HAS_TEMP_3 + ANALOG_SELECT(TEMP_3_PIN); #endif - #if defined(TEMP_BED_PIN) && (TEMP_BED_PIN > -1) - #if TEMP_BED_PIN < 8 - DIDR0 |= 1< -1) - #if FILWIDTH_PIN < 8 - DIDR0 |= 1< HEATER_0_MAXTEMP) { -#if HEATER_0_RAW_LO_TEMP < HEATER_0_RAW_HI_TEMP - maxttemp_raw[0] -= OVERSAMPLENR; -#else - maxttemp_raw[0] += OVERSAMPLENR; -#endif - } -#endif //MAXTEMP - -#if (EXTRUDERS > 1) && defined(HEATER_1_MINTEMP) - minttemp[1] = HEATER_1_MINTEMP; - while(analog2temp(minttemp_raw[1], 1) < HEATER_1_MINTEMP) { -#if HEATER_1_RAW_LO_TEMP < HEATER_1_RAW_HI_TEMP - minttemp_raw[1] += OVERSAMPLENR; -#else - minttemp_raw[1] -= OVERSAMPLENR; -#endif - } -#endif // MINTEMP 1 -#if (EXTRUDERS > 1) && defined(HEATER_1_MAXTEMP) - maxttemp[1] = HEATER_1_MAXTEMP; - while(analog2temp(maxttemp_raw[1], 1) > HEATER_1_MAXTEMP) { -#if HEATER_1_RAW_LO_TEMP < HEATER_1_RAW_HI_TEMP - maxttemp_raw[1] -= OVERSAMPLENR; -#else - maxttemp_raw[1] += OVERSAMPLENR; -#endif - } -#endif //MAXTEMP 1 - -#if (EXTRUDERS > 2) && defined(HEATER_2_MINTEMP) - minttemp[2] = HEATER_2_MINTEMP; - while(analog2temp(minttemp_raw[2], 2) < HEATER_2_MINTEMP) { -#if HEATER_2_RAW_LO_TEMP < HEATER_2_RAW_HI_TEMP - minttemp_raw[2] += OVERSAMPLENR; -#else - minttemp_raw[2] -= OVERSAMPLENR; -#endif - } -#endif //MINTEMP 2 -#if (EXTRUDERS > 2) && defined(HEATER_2_MAXTEMP) - maxttemp[2] = HEATER_2_MAXTEMP; - while(analog2temp(maxttemp_raw[2], 2) > HEATER_2_MAXTEMP) { -#if HEATER_2_RAW_LO_TEMP < HEATER_2_RAW_HI_TEMP - maxttemp_raw[2] -= OVERSAMPLENR; -#else - maxttemp_raw[2] += OVERSAMPLENR; -#endif - } -#endif //MAXTEMP 2 - -#if (EXTRUDERS > 3) && defined(HEATER_3_MINTEMP) - minttemp[3] = HEATER_3_MINTEMP; - while(analog2temp(minttemp_raw[3], 3) < HEATER_3_MINTEMP) { -#if HEATER_3_RAW_LO_TEMP < HEATER_3_RAW_HI_TEMP - minttemp_raw[3] += OVERSAMPLENR; -#else - minttemp_raw[3] -= OVERSAMPLENR; -#endif - } -#endif //MINTEMP 3 -#if (EXTRUDERS > 3) && defined(HEATER_3_MAXTEMP) - maxttemp[3] = HEATER_3_MAXTEMP; - while(analog2temp(maxttemp_raw[3], 3) > HEATER_3_MAXTEMP) { -#if HEATER_3_RAW_LO_TEMP < HEATER_3_RAW_HI_TEMP - maxttemp_raw[3] -= OVERSAMPLENR; -#else - maxttemp_raw[3] += OVERSAMPLENR; -#endif - } -#endif // MAXTEMP 3 - + #define TEMP_MIN_ROUTINE(NR) \ + minttemp[NR] = HEATER_ ## NR ## _MINTEMP; \ + while(analog2temp(minttemp_raw[NR], NR) < HEATER_ ## NR ## _MINTEMP) { \ + if (HEATER_ ## NR ## _RAW_LO_TEMP < HEATER_ ## NR ## _RAW_HI_TEMP) \ + minttemp_raw[NR] += OVERSAMPLENR; \ + else \ + minttemp_raw[NR] -= OVERSAMPLENR; \ + } + #define TEMP_MAX_ROUTINE(NR) \ + maxttemp[NR] = HEATER_ ## NR ## _MAXTEMP; \ + while(analog2temp(maxttemp_raw[NR], NR) > HEATER_ ## NR ## _MAXTEMP) { \ + if (HEATER_ ## NR ## _RAW_LO_TEMP < HEATER_ ## NR ## _RAW_HI_TEMP) \ + maxttemp_raw[NR] -= OVERSAMPLENR; \ + else \ + maxttemp_raw[NR] += OVERSAMPLENR; \ + } -#ifdef BED_MINTEMP - /* No bed MINTEMP error implemented?!? */ /* - while(analog2tempBed(bed_minttemp_raw) < BED_MINTEMP) { -#if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP - bed_minttemp_raw += OVERSAMPLENR; -#else - bed_minttemp_raw -= OVERSAMPLENR; -#endif - } - */ -#endif //BED_MINTEMP -#ifdef BED_MAXTEMP - while(analog2tempBed(bed_maxttemp_raw) > BED_MAXTEMP) { -#if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP - bed_maxttemp_raw -= OVERSAMPLENR; -#else - bed_maxttemp_raw += OVERSAMPLENR; -#endif - } -#endif //BED_MAXTEMP + #ifdef HEATER_0_MINTEMP + TEMP_MIN_ROUTINE(0); + #endif + #ifdef HEATER_0_MAXTEMP + TEMP_MAX_ROUTINE(0); + #endif + #if EXTRUDERS > 1 + #ifdef HEATER_1_MINTEMP + TEMP_MIN_ROUTINE(1); + #endif + #ifdef HEATER_1_MAXTEMP + TEMP_MAX_ROUTINE(1); + #endif + #if EXTRUDERS > 2 + #ifdef HEATER_2_MINTEMP + TEMP_MIN_ROUTINE(2); + #endif + #ifdef HEATER_2_MAXTEMP + TEMP_MAX_ROUTINE(2); + #endif + #if EXTRUDERS > 3 + #ifdef HEATER_3_MINTEMP + TEMP_MIN_ROUTINE(3); + #endif + #ifdef HEATER_3_MAXTEMP + TEMP_MAX_ROUTINE(3); + #endif + #endif // EXTRUDERS > 3 + #endif // EXTRUDERS > 2 + #endif // EXTRUDERS > 1 + + #ifdef BED_MINTEMP + /* No bed MINTEMP error implemented?!? */ /* + while(analog2tempBed(bed_minttemp_raw) < BED_MINTEMP) { + #if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP + bed_minttemp_raw += OVERSAMPLENR; + #else + bed_minttemp_raw -= OVERSAMPLENR; + #endif + } + */ + #endif //BED_MINTEMP + #ifdef BED_MAXTEMP + while(analog2tempBed(bed_maxttemp_raw) > BED_MAXTEMP) { + #if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP + bed_maxttemp_raw -= OVERSAMPLENR; + #else + bed_maxttemp_raw += OVERSAMPLENR; + #endif + } + #endif //BED_MAXTEMP } -void setWatch() -{ -#ifdef WATCH_TEMP_PERIOD - for (int e = 0; e < EXTRUDERS; e++) - { - if(degHotend(e) < degTargetHotend(e) - (WATCH_TEMP_INCREASE * 2)) - { - watch_start_temp[e] = degHotend(e); - watchmillis[e] = millis(); - } - } -#endif +void setWatch() { + #ifdef WATCH_TEMP_PERIOD + unsigned long ms = millis(); + for (int e = 0; e < EXTRUDERS; e++) { + if (degHotend(e) < degTargetHotend(e) - (WATCH_TEMP_INCREASE * 2)) { + watch_start_temp[e] = degHotend(e); + watchmillis[e] = ms; + } + } + #endif } -#if defined (THERMAL_RUNAWAY_PROTECTION_PERIOD) && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0 +#if defined(THERMAL_RUNAWAY_PROTECTION_PERIOD) && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0 void thermal_runaway_protection(int *state, unsigned long *timer, float temperature, float target_temperature, int heater_id, int period_seconds, int hysteresis_degc) { /* @@ -1135,11 +1065,13 @@ void thermal_runaway_protection(int *state, unsigned long *timer, float temperat if (temperature >= target_temperature) *state = 2; break; case 2: // "Temperature Stable" state + { + unsigned long ms = millis(); if (temperature >= (target_temperature - hysteresis_degc)) { - *timer = millis(); + *timer = ms; } - else if ( (millis() - *timer) > ((unsigned long) period_seconds) * 1000) + else if ( (ms - *timer) > ((unsigned long) period_seconds) * 1000) { SERIAL_ERROR_START; SERIAL_ERRORLNPGM("Thermal Runaway, system stopped! Heater_ID: "); @@ -1160,56 +1092,47 @@ void thermal_runaway_protection(int *state, unsigned long *timer, float temperat lcd_update(); } } - break; + } break; } } -#endif +#endif //THERMAL_RUNAWAY_PROTECTION_PERIOD -void disable_heater() -{ - for(int i=0;i -1 - target_temperature[0]=0; - soft_pwm[0]=0; - #if defined(HEATER_0_PIN) && HEATER_0_PIN > -1 - WRITE(HEATER_0_PIN,LOW); - #endif - #endif - - #if defined(TEMP_1_PIN) && TEMP_1_PIN > -1 && EXTRUDERS > 1 - target_temperature[1]=0; - soft_pwm[1]=0; - #if defined(HEATER_1_PIN) && HEATER_1_PIN > -1 - WRITE(HEATER_1_PIN,LOW); - #endif + + #if HAS_TEMP_0 + target_temperature[0] = 0; + soft_pwm[0] = 0; + WRITE_HEATER_0P(LOW); // If HEATERS_PARALLEL should apply, change to WRITE_HEATER_0 #endif - - #if defined(TEMP_2_PIN) && TEMP_2_PIN > -1 && EXTRUDERS > 2 - target_temperature[2]=0; - soft_pwm[2]=0; - #if defined(HEATER_2_PIN) && HEATER_2_PIN > -1 - WRITE(HEATER_2_PIN,LOW); - #endif + + #if EXTRUDERS > 1 && HAS_TEMP_1 + target_temperature[1] = 0; + soft_pwm[1] = 0; + WRITE_HEATER_1(LOW); #endif - #if defined(TEMP_3_PIN) && TEMP_3_PIN > -1 && EXTRUDERS > 3 - target_temperature[3]=0; - soft_pwm[3]=0; - #if defined(HEATER_3_PIN) && HEATER_3_PIN > -1 - WRITE(HEATER_3_PIN,LOW); - #endif - #endif + #if EXTRUDERS > 2 && HAS_TEMP_2 + target_temperature[2] = 0; + soft_pwm[2] = 0; + WRITE_HEATER_2(LOW); + #endif + #if EXTRUDERS > 3 && HAS_TEMP_3 + target_temperature[3] = 0; + soft_pwm[3] = 0; + WRITE_HEATER_3(LOW); + #endif - #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1 - target_temperature_bed=0; - soft_pwm_bed=0; - #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 - WRITE(HEATER_BED_PIN,LOW); + #if HAS_TEMP_BED + target_temperature_bed = 0; + soft_pwm_bed = 0; + #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + WRITE_HEATER_BED(LOW); #endif - #endif + #endif } void max_temp_error(uint8_t e) { @@ -1239,10 +1162,10 @@ void min_temp_error(uint8_t e) { } void bed_max_temp_error(void) { -#if HEATER_BED_PIN > -1 - WRITE(HEATER_BED_PIN, 0); -#endif - if(IsStopped() == false) { + #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + WRITE_HEATER_BED(0); + #endif + if (IsStopped() == false) { SERIAL_ERROR_START; SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!"); LCD_ALERTMESSAGEPGM("Err: MAXTEMP BED"); @@ -1253,66 +1176,81 @@ void bed_max_temp_error(void) { } #ifdef HEATER_0_USES_MAX6675 -#define MAX6675_HEAT_INTERVAL 250 -long max6675_previous_millis = MAX6675_HEAT_INTERVAL; -int max6675_temp = 2000; + #define MAX6675_HEAT_INTERVAL 250 + long max6675_previous_millis = MAX6675_HEAT_INTERVAL; + int max6675_temp = 2000; -static int read_max6675() -{ - if (millis() - max6675_previous_millis < MAX6675_HEAT_INTERVAL) - return max6675_temp; - - max6675_previous_millis = millis(); - max6675_temp = 0; + static int read_max6675() { + + unsigned long ms = millis(); + if (ms < max6675_previous_millis + MAX6675_HEAT_INTERVAL) + return max6675_temp; - #ifdef PRR - PRR &= ~(1<> 3; - } + #ifdef PRR + PRR &= ~(1<> 3; + } + + return max6675_temp; + } + +#endif //HEATER_0_USES_MAX6675 + +enum TempState { + PrepareTemp_0, + MeasureTemp_0, + PrepareTemp_BED, + MeasureTemp_BED, + PrepareTemp_1, + MeasureTemp_1, + PrepareTemp_2, + MeasureTemp_2, + PrepareTemp_3, + MeasureTemp_3, + Prepare_FILWIDTH, + Measure_FILWIDTH, + StartupDelay // Startup, delay initial temp reading a tiny bit so the hardware can settle +}; + +// // Timer 0 is shared with millies -ISR(TIMER0_COMPB_vect) -{ +// +ISR(TIMER0_COMPB_vect) { //these variables are only accesible from the ISR, but static, so they don't lose their value static unsigned char temp_count = 0; static unsigned long raw_temp_0_value = 0; @@ -1320,542 +1258,324 @@ ISR(TIMER0_COMPB_vect) static unsigned long raw_temp_2_value = 0; static unsigned long raw_temp_3_value = 0; static unsigned long raw_temp_bed_value = 0; - static unsigned char temp_state = 12; + static TempState temp_state = StartupDelay; static unsigned char pwm_count = (1 << SOFT_PWM_SCALE); - static unsigned char soft_pwm_0; -#ifdef SLOW_PWM_HEATERS - static unsigned char slow_pwm_count = 0; - static unsigned char state_heater_0 = 0; - static unsigned char state_timer_heater_0 = 0; -#endif - -#if (EXTRUDERS > 1) || defined(HEATERS_PARALLEL) - static unsigned char soft_pwm_1; -#ifdef SLOW_PWM_HEATERS - static unsigned char state_heater_1 = 0; - static unsigned char state_timer_heater_1 = 0; -#endif -#endif -#if EXTRUDERS > 2 - static unsigned char soft_pwm_2; -#ifdef SLOW_PWM_HEATERS - static unsigned char state_heater_2 = 0; - static unsigned char state_timer_heater_2 = 0; -#endif -#endif -#if EXTRUDERS > 3 - static unsigned char soft_pwm_3; -#ifdef SLOW_PWM_HEATERS - static unsigned char state_heater_3 = 0; - static unsigned char state_timer_heater_3 = 0; -#endif -#endif -#if HEATER_BED_PIN > -1 - static unsigned char soft_pwm_b; -#ifdef SLOW_PWM_HEATERS - static unsigned char state_heater_b = 0; - static unsigned char state_timer_heater_b = 0; -#endif -#endif - -#if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1) - static unsigned long raw_filwidth_value = 0; //added for filament width sensor -#endif - -#ifndef SLOW_PWM_HEATERS - /* - * standard PWM modulation - */ - if(pwm_count == 0){ - soft_pwm_0 = soft_pwm[0]; - if(soft_pwm_0 > 0) { - WRITE(HEATER_0_PIN,1); -#ifdef HEATERS_PARALLEL - WRITE(HEATER_1_PIN,1); -#endif - } else WRITE(HEATER_0_PIN,0); - -#if EXTRUDERS > 1 - soft_pwm_1 = soft_pwm[1]; - if(soft_pwm_1 > 0) WRITE(HEATER_1_PIN,1); else WRITE(HEATER_1_PIN,0); -#endif -#if EXTRUDERS > 2 - soft_pwm_2 = soft_pwm[2]; - if(soft_pwm_2 > 0) WRITE(HEATER_2_PIN,1); else WRITE(HEATER_2_PIN,0); -#endif -#if EXTRUDERS > 3 - soft_pwm_3 = soft_pwm[3]; - if(soft_pwm_3 > 0) WRITE(HEATER_3_PIN,1); else WRITE(HEATER_3_PIN,0); -#endif - - -#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 - soft_pwm_b = soft_pwm_bed; - if(soft_pwm_b > 0) WRITE(HEATER_BED_PIN,1); else WRITE(HEATER_BED_PIN,0); -#endif -#ifdef FAN_SOFT_PWM - soft_pwm_fan = fanSpeedSoftPwm / 2; - if(soft_pwm_fan > 0) WRITE(FAN_PIN,1); else WRITE(FAN_PIN,0); -#endif - } - if(soft_pwm_0 < pwm_count) { - WRITE(HEATER_0_PIN,0); -#ifdef HEATERS_PARALLEL - WRITE(HEATER_1_PIN,0); -#endif - } + // Static members for each heater + #ifdef SLOW_PWM_HEATERS + static unsigned char slow_pwm_count = 0; + #define ISR_STATICS(n) \ + static unsigned char soft_pwm_ ## n; \ + static unsigned char state_heater_ ## n = 0; \ + static unsigned char state_timer_heater_ ## n = 0 + #else + #define ISR_STATICS(n) static unsigned char soft_pwm_ ## n + #endif -#if EXTRUDERS > 1 - if(soft_pwm_1 < pwm_count) WRITE(HEATER_1_PIN,0); -#endif -#if EXTRUDERS > 2 - if(soft_pwm_2 < pwm_count) WRITE(HEATER_2_PIN,0); -#endif -#if EXTRUDERS > 3 - if(soft_pwm_3 < pwm_count) WRITE(HEATER_3_PIN,0); -#endif + // Statics per heater + ISR_STATICS(0); + #if (EXTRUDERS > 1) || defined(HEATERS_PARALLEL) + ISR_STATICS(1); + #if EXTRUDERS > 2 + ISR_STATICS(2); + #if EXTRUDERS > 3 + ISR_STATICS(3); + #endif + #endif + #endif + #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + ISR_STATICS(BED); + #endif -#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 - if(soft_pwm_b < pwm_count) WRITE(HEATER_BED_PIN,0); -#endif -#ifdef FAN_SOFT_PWM - if(soft_pwm_fan < pwm_count) WRITE(FAN_PIN,0); -#endif - - pwm_count += (1 << SOFT_PWM_SCALE); - pwm_count &= 0x7f; + #if HAS_FILAMENT_SENSOR + static unsigned long raw_filwidth_value = 0; + #endif -#else //ifndef SLOW_PWM_HEATERS - /* - * SLOW PWM HEATERS - * - * for heaters drived by relay - */ -#ifndef MIN_STATE_TIME -#define MIN_STATE_TIME 16 // MIN_STATE_TIME * 65.5 = time in milliseconds -#endif - if (slow_pwm_count == 0) { - // EXTRUDER 0 - soft_pwm_0 = soft_pwm[0]; - if (soft_pwm_0 > 0) { - // turn ON heather only if the minimum time is up - if (state_timer_heater_0 == 0) { - // if change state set timer - if (state_heater_0 == 0) { - state_timer_heater_0 = MIN_STATE_TIME; - } - state_heater_0 = 1; - WRITE(HEATER_0_PIN, 1); -#ifdef HEATERS_PARALLEL - WRITE(HEATER_1_PIN, 1); -#endif - } - } else { - // turn OFF heather only if the minimum time is up - if (state_timer_heater_0 == 0) { - // if change state set timer - if (state_heater_0 == 1) { - state_timer_heater_0 = MIN_STATE_TIME; - } - state_heater_0 = 0; - WRITE(HEATER_0_PIN, 0); -#ifdef HEATERS_PARALLEL - WRITE(HEATER_1_PIN, 0); -#endif - } - } - -#if EXTRUDERS > 1 - // EXTRUDER 1 - soft_pwm_1 = soft_pwm[1]; - if (soft_pwm_1 > 0) { - // turn ON heather only if the minimum time is up - if (state_timer_heater_1 == 0) { - // if change state set timer - if (state_heater_1 == 0) { - state_timer_heater_1 = MIN_STATE_TIME; - } - state_heater_1 = 1; - WRITE(HEATER_1_PIN, 1); - } - } else { - // turn OFF heather only if the minimum time is up - if (state_timer_heater_1 == 0) { - // if change state set timer - if (state_heater_1 == 1) { - state_timer_heater_1 = MIN_STATE_TIME; - } - state_heater_1 = 0; - WRITE(HEATER_1_PIN, 0); + #ifndef SLOW_PWM_HEATERS + /** + * standard PWM modulation + */ + if (pwm_count == 0) { + soft_pwm_0 = soft_pwm[0]; + if (soft_pwm_0 > 0) { + WRITE_HEATER_0(1); } - } -#endif - -#if EXTRUDERS > 2 - // EXTRUDER 2 - soft_pwm_2 = soft_pwm[2]; - if (soft_pwm_2 > 0) { - // turn ON heather only if the minimum time is up - if (state_timer_heater_2 == 0) { - // if change state set timer - if (state_heater_2 == 0) { - state_timer_heater_2 = MIN_STATE_TIME; - } - state_heater_2 = 1; - WRITE(HEATER_2_PIN, 1); - } - } else { - // turn OFF heather only if the minimum time is up - if (state_timer_heater_2 == 0) { - // if change state set timer - if (state_heater_2 == 1) { - state_timer_heater_2 = MIN_STATE_TIME; - } - state_heater_2 = 0; - WRITE(HEATER_2_PIN, 0); - } - } -#endif + else WRITE_HEATER_0P(0); // If HEATERS_PARALLEL should apply, change to WRITE_HEATER_0 + + #if EXTRUDERS > 1 + soft_pwm_1 = soft_pwm[1]; + WRITE_HEATER_1(soft_pwm_1 > 0 ? 1 : 0); + #if EXTRUDERS > 2 + soft_pwm_2 = soft_pwm[2]; + WRITE_HEATER_2(soft_pwm_2 > 0 ? 1 : 0); + #if EXTRUDERS > 3 + soft_pwm_3 = soft_pwm[3]; + WRITE_HEATER_3(soft_pwm_3 > 0 ? 1 : 0); + #endif + #endif + #endif -#if EXTRUDERS > 3 - // EXTRUDER 3 - soft_pwm_3 = soft_pwm[3]; - if (soft_pwm_3 > 0) { - // turn ON heather only if the minimum time is up - if (state_timer_heater_3 == 0) { - // if change state set timer - if (state_heater_3 == 0) { - state_timer_heater_3 = MIN_STATE_TIME; - } - state_heater_3 = 1; - WRITE(HEATER_3_PIN, 1); - } - } else { - // turn OFF heather only if the minimum time is up - if (state_timer_heater_3 == 0) { - // if change state set timer - if (state_heater_3 == 1) { - state_timer_heater_3 = MIN_STATE_TIME; - } - state_heater_3 = 0; - WRITE(HEATER_3_PIN, 0); - } + #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + soft_pwm_BED = soft_pwm_bed; + WRITE_HEATER_BED(soft_pwm_BED > 0 ? 1 : 0); + #endif + #ifdef FAN_SOFT_PWM + soft_pwm_fan = fanSpeedSoftPwm / 2; + WRITE(FAN_PIN, soft_pwm_fan > 0 ? 1 : 0); + #endif } -#endif -#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 - // BED - soft_pwm_b = soft_pwm_bed; - if (soft_pwm_b > 0) { - // turn ON heather only if the minimum time is up - if (state_timer_heater_b == 0) { - // if change state set timer - if (state_heater_b == 0) { - state_timer_heater_b = MIN_STATE_TIME; - } - state_heater_b = 1; - WRITE(HEATER_BED_PIN, 1); - } - } else { - // turn OFF heather only if the minimum time is up - if (state_timer_heater_b == 0) { - // if change state set timer - if (state_heater_b == 1) { - state_timer_heater_b = MIN_STATE_TIME; - } - state_heater_b = 0; - WRITE(HEATER_BED_PIN, 0); - } - } -#endif - } // if (slow_pwm_count == 0) - - // EXTRUDER 0 - if (soft_pwm_0 < slow_pwm_count) { - // turn OFF heather only if the minimum time is up - if (state_timer_heater_0 == 0) { - // if change state set timer - if (state_heater_0 == 1) { - state_timer_heater_0 = MIN_STATE_TIME; - } - state_heater_0 = 0; - WRITE(HEATER_0_PIN, 0); -#ifdef HEATERS_PARALLEL - WRITE(HEATER_1_PIN, 0); -#endif - } - } + if (soft_pwm_0 < pwm_count) { WRITE_HEATER_0(0); } + #if EXTRUDERS > 1 + if (soft_pwm_1 < pwm_count) WRITE_HEATER_1(0); + #if EXTRUDERS > 2 + if (soft_pwm_2 < pwm_count) WRITE_HEATER_2(0); + #if EXTRUDERS > 3 + if (soft_pwm_3 < pwm_count) WRITE_HEATER_3(0); + #endif + #endif + #endif + + #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + if (soft_pwm_BED < pwm_count) WRITE_HEATER_BED(0); + #endif + + #ifdef FAN_SOFT_PWM + if (soft_pwm_fan < pwm_count) WRITE(FAN_PIN, 0); + #endif -#if EXTRUDERS > 1 - // EXTRUDER 1 - if (soft_pwm_1 < slow_pwm_count) { - // turn OFF heather only if the minimum time is up - if (state_timer_heater_1 == 0) { - // if change state set timer - if (state_heater_1 == 1) { - state_timer_heater_1 = MIN_STATE_TIME; - } - state_heater_1 = 0; - WRITE(HEATER_1_PIN, 0); - } - } -#endif + pwm_count += (1 << SOFT_PWM_SCALE); + pwm_count &= 0x7f; -#if EXTRUDERS > 2 - // EXTRUDER 2 - if (soft_pwm_2 < slow_pwm_count) { - // turn OFF heather only if the minimum time is up - if (state_timer_heater_2 == 0) { - // if change state set timer - if (state_heater_2 == 1) { - state_timer_heater_2 = MIN_STATE_TIME; - } - state_heater_2 = 0; - WRITE(HEATER_2_PIN, 0); - } - } -#endif + #else // SLOW_PWM_HEATERS + /* + * SLOW PWM HEATERS + * + * for heaters drived by relay + */ + #ifndef MIN_STATE_TIME + #define MIN_STATE_TIME 16 // MIN_STATE_TIME * 65.5 = time in milliseconds + #endif -#if EXTRUDERS > 3 - // EXTRUDER 3 - if (soft_pwm_3 < slow_pwm_count) { - // turn OFF heather only if the minimum time is up - if (state_timer_heater_3 == 0) { - // if change state set timer - if (state_heater_3 == 1) { - state_timer_heater_3 = MIN_STATE_TIME; + // Macros for Slow PWM timer logic - HEATERS_PARALLEL applies + #define _SLOW_PWM_ROUTINE(NR, src) \ + soft_pwm_ ## NR = src; \ + if (soft_pwm_ ## NR > 0) { \ + if (state_timer_heater_ ## NR == 0) { \ + if (state_heater_ ## NR == 0) state_timer_heater_ ## NR = MIN_STATE_TIME; \ + state_heater_ ## NR = 1; \ + WRITE_HEATER_ ## NR(1); \ + } \ + } \ + else { \ + if (state_timer_heater_ ## NR == 0) { \ + if (state_heater_ ## NR == 1) state_timer_heater_ ## NR = MIN_STATE_TIME; \ + state_heater_ ## NR = 0; \ + WRITE_HEATER_ ## NR(0); \ + } \ } - state_heater_3 = 0; - WRITE(HEATER_3_PIN, 0); - } - } -#endif - -#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 - // BED - if (soft_pwm_b < slow_pwm_count) { - // turn OFF heather only if the minimum time is up - if (state_timer_heater_b == 0) { - // if change state set timer - if (state_heater_b == 1) { - state_timer_heater_b = MIN_STATE_TIME; + #define SLOW_PWM_ROUTINE(n) _SLOW_PWM_ROUTINE(n, soft_pwm[n]) + + #define PWM_OFF_ROUTINE(NR) \ + if (soft_pwm_ ## NR < slow_pwm_count) { \ + if (state_timer_heater_ ## NR == 0) { \ + if (state_heater_ ## NR == 1) state_timer_heater_ ## NR = MIN_STATE_TIME; \ + state_heater_ ## NR = 0; \ + WRITE_HEATER_ ## NR (0); \ + } \ } - state_heater_b = 0; - WRITE(HEATER_BED_PIN, 0); - } - } -#endif - -#ifdef FAN_SOFT_PWM - if (pwm_count == 0){ - soft_pwm_fan = fanSpeedSoftPwm / 2; - if (soft_pwm_fan > 0) WRITE(FAN_PIN,1); else WRITE(FAN_PIN,0); - } - if (soft_pwm_fan < pwm_count) WRITE(FAN_PIN,0); -#endif - - pwm_count += (1 << SOFT_PWM_SCALE); - pwm_count &= 0x7f; - - // increment slow_pwm_count only every 64 pwm_count circa 65.5ms - if ((pwm_count % 64) == 0) { - slow_pwm_count++; - slow_pwm_count &= 0x7f; - - // Extruder 0 - if (state_timer_heater_0 > 0) { - state_timer_heater_0--; - } - -#if EXTRUDERS > 1 - // Extruder 1 - if (state_timer_heater_1 > 0) - state_timer_heater_1--; -#endif - -#if EXTRUDERS > 2 - // Extruder 2 - if (state_timer_heater_2 > 0) - state_timer_heater_2--; -#endif -#if EXTRUDERS > 3 - // Extruder 3 - if (state_timer_heater_3 > 0) - state_timer_heater_3--; -#endif + if (slow_pwm_count == 0) { + + SLOW_PWM_ROUTINE(0); // EXTRUDER 0 + #if EXTRUDERS > 1 + SLOW_PWM_ROUTINE(1); // EXTRUDER 1 + #if EXTRUDERS > 2 + SLOW_PWM_ROUTINE(2); // EXTRUDER 2 + #if EXTRUDERS > 3 + SLOW_PWM_ROUTINE(3); // EXTRUDER 3 + #endif + #endif + #endif + #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + _SLOW_PWM_ROUTINE(BED, soft_pwm_bed); // BED + #endif + + } // slow_pwm_count == 0 + + PWM_OFF_ROUTINE(0); // EXTRUDER 0 + #if EXTRUDERS > 1 + PWM_OFF_ROUTINE(1); // EXTRUDER 1 + #if EXTRUDERS > 2 + PWM_OFF_ROUTINE(2); // EXTRUDER 2 + #if EXTRUDERS > 3 + PWM_OFF_ROUTINE(3); // EXTRUDER 3 + #endif + #endif + #endif + #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + PWM_OFF_ROUTINE(BED); // BED + #endif + + #ifdef FAN_SOFT_PWM + if (pwm_count == 0) { + soft_pwm_fan = fanSpeedSoftPwm / 2; + WRITE(FAN_PIN, soft_pwm_fan > 0 ? 1 : 0); + } + if (soft_pwm_fan < pwm_count) WRITE(FAN_PIN, 0); + #endif //FAN_SOFT_PWM + + pwm_count += (1 << SOFT_PWM_SCALE); + pwm_count &= 0x7f; + + // increment slow_pwm_count only every 64 pwm_count circa 65.5ms + if ((pwm_count % 64) == 0) { + slow_pwm_count++; + slow_pwm_count &= 0x7f; -#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 - // Bed - if (state_timer_heater_b > 0) - state_timer_heater_b--; -#endif - } //if ((pwm_count % 64) == 0) { - -#endif //ifndef SLOW_PWM_HEATERS + // EXTRUDER 0 + if (state_timer_heater_0 > 0) state_timer_heater_0--; + #if EXTRUDERS > 1 // EXTRUDER 1 + if (state_timer_heater_1 > 0) state_timer_heater_1--; + #if EXTRUDERS > 2 // EXTRUDER 2 + if (state_timer_heater_2 > 0) state_timer_heater_2--; + #if EXTRUDERS > 3 // EXTRUDER 3 + if (state_timer_heater_3 > 0) state_timer_heater_3--; + #endif + #endif + #endif + #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 // BED + if (state_timer_heater_BED > 0) state_timer_heater_BED--; + #endif + } // (pwm_count % 64) == 0 + #endif // SLOW_PWM_HEATERS + + #define SET_ADMUX_ADCSRA(pin) ADMUX = (1 << REFS0) | (pin & 0x07); ADCSRA |= 1< 7) ADCSRB = 1 << MUX5; else ADCSRB = 0; SET_ADMUX_ADCSRA(pin) + #else + #define SET_ADCSRB(pin) ADCSRB = 0; SET_ADMUX_ADCSRA(pin) + #endif + switch(temp_state) { - case 0: // Prepare TEMP_0 - #if defined(TEMP_0_PIN) && (TEMP_0_PIN > -1) - #if TEMP_0_PIN > 7 - ADCSRB = 1< -1) + case MeasureTemp_0: + #if HAS_TEMP_0 raw_temp_0_value += ADC; #endif - temp_state = 2; + temp_state = PrepareTemp_BED; break; - case 2: // Prepare TEMP_BED - #if defined(TEMP_BED_PIN) && (TEMP_BED_PIN > -1) - #if TEMP_BED_PIN > 7 - ADCSRB = 1< -1) + case MeasureTemp_BED: + #if HAS_TEMP_BED raw_temp_bed_value += ADC; #endif - temp_state = 4; + temp_state = PrepareTemp_1; break; - case 4: // Prepare TEMP_1 - #if defined(TEMP_1_PIN) && (TEMP_1_PIN > -1) - #if TEMP_1_PIN > 7 - ADCSRB = 1< -1) + case MeasureTemp_1: + #if HAS_TEMP_1 raw_temp_1_value += ADC; #endif - temp_state = 6; + temp_state = PrepareTemp_2; break; - case 6: // Prepare TEMP_2 - #if defined(TEMP_2_PIN) && (TEMP_2_PIN > -1) - #if TEMP_2_PIN > 7 - ADCSRB = 1< -1) + case MeasureTemp_2: + #if HAS_TEMP_2 raw_temp_2_value += ADC; #endif - temp_state = 8; + temp_state = PrepareTemp_3; break; - case 8: // Prepare TEMP_3 - #if defined(TEMP_3_PIN) && (TEMP_3_PIN > -1) - #if TEMP_3_PIN > 7 - ADCSRB = 1< -1) + case MeasureTemp_3: + #if HAS_TEMP_3 raw_temp_3_value += ADC; #endif - temp_state = 10; //change so that Filament Width is also measured + temp_state = Prepare_FILWIDTH; break; - case 10: //Prepare FILWIDTH - #if defined(FILWIDTH_PIN) && (FILWIDTH_PIN> -1) - #if FILWIDTH_PIN>7 - ADCSRB = 1< -1) - //raw_filwidth_value += ADC; //remove to use an IIR filter approach - if(ADC>102) //check that ADC is reading a voltage > 0.5 volts, otherwise don't take in the data. - { - raw_filwidth_value= raw_filwidth_value-(raw_filwidth_value>>7); //multipliy raw_filwidth_value by 127/128 - - raw_filwidth_value= raw_filwidth_value + ((unsigned long)ADC<<7); //add new ADC reading + case Prepare_FILWIDTH: + #if HAS_FILAMENT_SENSOR + SET_ADCSRB(FILWIDTH_PIN); + #endif + lcd_buttons_update(); + temp_state = Measure_FILWIDTH; + break; + case Measure_FILWIDTH: + #if HAS_FILAMENT_SENSOR + // raw_filwidth_value += ADC; //remove to use an IIR filter approach + if (ADC > 102) { //check that ADC is reading a voltage > 0.5 volts, otherwise don't take in the data. + raw_filwidth_value -= (raw_filwidth_value>>7); //multiply raw_filwidth_value by 127/128 + raw_filwidth_value += ((unsigned long)ADC<<7); //add new ADC reading } - #endif - temp_state = 0; - - temp_count++; - break; - - - case 12: //Startup, delay initial temp reading a tiny bit so the hardware can settle. - temp_state = 0; + #endif + temp_state = PrepareTemp_0; + temp_count++; break; -// default: -// SERIAL_ERROR_START; -// SERIAL_ERRORLNPGM("Temp measurement error!"); -// break; - } + case StartupDelay: + temp_state = PrepareTemp_0; + break; + + // default: + // SERIAL_ERROR_START; + // SERIAL_ERRORLNPGM("Temp measurement error!"); + // break; + } // switch(temp_state) - if(temp_count >= OVERSAMPLENR) // 10 * 16 * 1/(16000000/64/256) = 164ms. - { - if (!temp_meas_ready) //Only update the raw values if they have been read. Else we could be updating them during reading. - { -#ifndef HEATER_0_USES_MAX6675 - current_temperature_raw[0] = raw_temp_0_value; -#endif -#if EXTRUDERS > 1 - current_temperature_raw[1] = raw_temp_1_value; -#endif -#ifdef TEMP_SENSOR_1_AS_REDUNDANT - redundant_temperature_raw = raw_temp_1_value; -#endif -#if EXTRUDERS > 2 - current_temperature_raw[2] = raw_temp_2_value; -#endif -#if EXTRUDERS > 3 - current_temperature_raw[3] = raw_temp_3_value; -#endif + if (temp_count >= OVERSAMPLENR) { // 10 * 16 * 1/(16000000/64/256) = 164ms. + if (!temp_meas_ready) { //Only update the raw values if they have been read. Else we could be updating them during reading. + #ifndef HEATER_0_USES_MAX6675 + current_temperature_raw[0] = raw_temp_0_value; + #endif + #if EXTRUDERS > 1 + current_temperature_raw[1] = raw_temp_1_value; + #if EXTRUDERS > 2 + current_temperature_raw[2] = raw_temp_2_value; + #if EXTRUDERS > 3 + current_temperature_raw[3] = raw_temp_3_value; + #endif + #endif + #endif + #ifdef TEMP_SENSOR_1_AS_REDUNDANT + redundant_temperature_raw = raw_temp_1_value; + #endif current_temperature_bed_raw = raw_temp_bed_value; - } + } //!temp_meas_ready -//Add similar code for Filament Sensor - can be read any time since IIR filtering is used -#if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1) - current_raw_filwidth = raw_filwidth_value>>10; //need to divide to get to 0-16384 range since we used 1/128 IIR filter approach -#endif - + // Filament Sensor - can be read any time since IIR filtering is used + #if HAS_FILAMENT_SENSOR + current_raw_filwidth = raw_filwidth_value >> 10; // Divide to get to 0-16384 range since we used 1/128 IIR filter approach + #endif temp_meas_ready = true; temp_count = 0; @@ -1865,131 +1585,47 @@ ISR(TIMER0_COMPB_vect) raw_temp_3_value = 0; raw_temp_bed_value = 0; -#if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP - if(current_temperature_raw[0] <= maxttemp_raw[0]) { -#else - if(current_temperature_raw[0] >= maxttemp_raw[0]) { -#endif -#ifndef HEATER_0_USES_MAX6675 - max_temp_error(0); -#endif - } -#if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP - if(current_temperature_raw[0] >= minttemp_raw[0]) { -#else - if(current_temperature_raw[0] <= minttemp_raw[0]) { -#endif -#ifndef HEATER_0_USES_MAX6675 - min_temp_error(0); -#endif - } - + #if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP + #define MAXTEST <= + #define MINTEST >= + #else + #define MAXTEST >= + #define MINTEST <= + #endif -#if EXTRUDERS > 1 -#if HEATER_1_RAW_LO_TEMP > HEATER_1_RAW_HI_TEMP - if(current_temperature_raw[1] <= maxttemp_raw[1]) { -#else - if(current_temperature_raw[1] >= maxttemp_raw[1]) { -#endif - max_temp_error(1); - } -#if HEATER_1_RAW_LO_TEMP > HEATER_1_RAW_HI_TEMP - if(current_temperature_raw[1] >= minttemp_raw[1]) { -#else - if(current_temperature_raw[1] <= minttemp_raw[1]) { -#endif - min_temp_error(1); - } -#endif -#if EXTRUDERS > 2 -#if HEATER_2_RAW_LO_TEMP > HEATER_2_RAW_HI_TEMP - if(current_temperature_raw[2] <= maxttemp_raw[2]) { -#else - if(current_temperature_raw[2] >= maxttemp_raw[2]) { -#endif - max_temp_error(2); - } -#if HEATER_2_RAW_LO_TEMP > HEATER_2_RAW_HI_TEMP - if(current_temperature_raw[2] >= minttemp_raw[2]) { -#else - if(current_temperature_raw[2] <= minttemp_raw[2]) { -#endif - min_temp_error(2); + for (int i=0; i 3 -#if HEATER_3_RAW_LO_TEMP > HEATER_3_RAW_HI_TEMP - if(current_temperature_raw[3] <= maxttemp_raw[3]) { -#else - if(current_temperature_raw[3] >= maxttemp_raw[3]) { -#endif - max_temp_error(3); - } -#if HEATER_3_RAW_LO_TEMP > HEATER_3_RAW_HI_TEMP - if(current_temperature_raw[3] >= minttemp_raw[3]) { -#else - if(current_temperature_raw[3] <= minttemp_raw[3]) { -#endif - min_temp_error(3); - } -#endif - + /* No bed MINTEMP error? */ + #if defined(BED_MAXTEMP) && (TEMP_SENSOR_BED != 0) + if (current_temperature_bed_raw MAXTEST bed_maxttemp_raw) { + target_temperature_bed = 0; + bed_max_temp_error(); + } + #endif + } // temp_count >= OVERSAMPLENR - /* No bed MINTEMP error? */ -#if defined(BED_MAXTEMP) && (TEMP_SENSOR_BED != 0) -# if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP - if(current_temperature_bed_raw <= bed_maxttemp_raw) { -#else - if(current_temperature_bed_raw >= bed_maxttemp_raw) { -#endif - target_temperature_bed = 0; - bed_max_temp_error(); - } -#endif - } - -#ifdef BABYSTEPPING - for(uint8_t axis=0;axis<3;axis++) - { - int curTodo=babystepsTodo[axis]; //get rid of volatile for performance - - if(curTodo>0) - { - babystep(axis,/*fwd*/true); - babystepsTodo[axis]--; //less to do next time - } - else - if(curTodo<0) - { - babystep(axis,/*fwd*/false); - babystepsTodo[axis]++; //less to do next time + #ifdef BABYSTEPPING + for (uint8_t axis=X_AXIS; axis<=Z_AXIS; axis++) { + int curTodo=babystepsTodo[axis]; //get rid of volatile for performance + + if (curTodo > 0) { + babystep(axis,/*fwd*/true); + babystepsTodo[axis]--; //less to do next time + } + else if(curTodo < 0) { + babystep(axis,/*fwd*/false); + babystepsTodo[axis]++; //less to do next time + } } - } -#endif //BABYSTEPPING + #endif //BABYSTEPPING } #ifdef PIDTEMP -// Apply the scale factors to the PID values - - -float scalePID_i(float i) -{ - return i*PID_dT; -} - -float unscalePID_i(float i) -{ - return i/PID_dT; -} - -float scalePID_d(float d) -{ - return d/PID_dT; -} - -float unscalePID_d(float d) -{ - return d*PID_dT; -} - + // Apply the scale factors to the PID values + float scalePID_i(float i) { return i * PID_dT; } + float unscalePID_i(float i) { return i / PID_dT; } + float scalePID_d(float d) { return d / PID_dT; } + float unscalePID_d(float d) { return d * PID_dT; } #endif //PIDTEMP diff --git a/Marlin/temperature.h b/Marlin/temperature.h index b05cb2ef49..b29fc2b572 100644 --- a/Marlin/temperature.h +++ b/Marlin/temperature.h @@ -85,55 +85,25 @@ extern float current_temperature_bed; //inline so that there is no performance decrease. //deg=degreeCelsius -FORCE_INLINE float degHotend(uint8_t extruder) { - return current_temperature[extruder]; -}; +FORCE_INLINE float degHotend(uint8_t extruder) { return current_temperature[extruder]; } +FORCE_INLINE float degBed() { return current_temperature_bed; } #ifdef SHOW_TEMP_ADC_VALUES - FORCE_INLINE float rawHotendTemp(uint8_t extruder) { - return current_temperature_raw[extruder]; - }; - - FORCE_INLINE float rawBedTemp() { - return current_temperature_bed_raw; - }; + FORCE_INLINE float rawHotendTemp(uint8_t extruder) { return current_temperature_raw[extruder]; } + FORCE_INLINE float rawBedTemp() { return current_temperature_bed_raw; } #endif -FORCE_INLINE float degBed() { - return current_temperature_bed; -}; - -FORCE_INLINE float degTargetHotend(uint8_t extruder) { - return target_temperature[extruder]; -}; - -FORCE_INLINE float degTargetBed() { - return target_temperature_bed; -}; - -FORCE_INLINE void setTargetHotend(const float &celsius, uint8_t extruder) { - target_temperature[extruder] = celsius; -}; - -FORCE_INLINE void setTargetBed(const float &celsius) { - target_temperature_bed = celsius; -}; +FORCE_INLINE float degTargetHotend(uint8_t extruder) { return target_temperature[extruder]; } +FORCE_INLINE float degTargetBed() { return target_temperature_bed; } -FORCE_INLINE bool isHeatingHotend(uint8_t extruder){ - return target_temperature[extruder] > current_temperature[extruder]; -}; +FORCE_INLINE void setTargetHotend(const float &celsius, uint8_t extruder) { target_temperature[extruder] = celsius; } +FORCE_INLINE void setTargetBed(const float &celsius) { target_temperature_bed = celsius; } -FORCE_INLINE bool isHeatingBed() { - return target_temperature_bed > current_temperature_bed; -}; +FORCE_INLINE bool isHeatingHotend(uint8_t extruder) { return target_temperature[extruder] > current_temperature[extruder]; } +FORCE_INLINE bool isHeatingBed() { return target_temperature_bed > current_temperature_bed; } -FORCE_INLINE bool isCoolingHotend(uint8_t extruder) { - return target_temperature[extruder] < current_temperature[extruder]; -}; - -FORCE_INLINE bool isCoolingBed() { - return target_temperature_bed < current_temperature_bed; -}; +FORCE_INLINE bool isCoolingHotend(uint8_t extruder) { return target_temperature[extruder] < current_temperature[extruder]; } +FORCE_INLINE bool isCoolingBed() { return target_temperature_bed < current_temperature_bed; } #define degHotend0() degHotend(0) #define degTargetHotend0() degTargetHotend(0) @@ -141,38 +111,36 @@ FORCE_INLINE bool isCoolingBed() { #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) + #define degHotend1() degHotend(1) + #define degTargetHotend1() degTargetHotend(1) + #define setTargetHotend1(_celsius) setTargetHotend((_celsius), 1) + #define isHeatingHotend1() isHeatingHotend(1) + #define isCoolingHotend1() isCoolingHotend(1) #else -#define setTargetHotend1(_celsius) do{}while(0) + #define setTargetHotend1(_celsius) do{}while(0) #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) + #define degHotend2() degHotend(2) + #define degTargetHotend2() degTargetHotend(2) + #define setTargetHotend2(_celsius) setTargetHotend((_celsius), 2) + #define isHeatingHotend2() isHeatingHotend(2) + #define isCoolingHotend2() isCoolingHotend(2) #else -#define setTargetHotend2(_celsius) do{}while(0) + #define setTargetHotend2(_celsius) do{}while(0) #endif #if EXTRUDERS > 3 -#define degHotend3() degHotend(3) -#define degTargetHotend3() degTargetHotend(3) -#define setTargetHotend3(_celsius) setTargetHotend((_celsius), 3) -#define isHeatingHotend3() isHeatingHotend(3) -#define isCoolingHotend3() isCoolingHotend(3) + #define degHotend3() degHotend(3) + #define degTargetHotend3() degTargetHotend(3) + #define setTargetHotend3(_celsius) setTargetHotend((_celsius), 3) + #define isHeatingHotend3() isHeatingHotend(3) + #define isCoolingHotend3() isCoolingHotend(3) #else -#define setTargetHotend3(_celsius) do{}while(0) + #define setTargetHotend3(_celsius) do{}while(0) #endif #if EXTRUDERS > 4 -#error Invalid number of extruders + #error Invalid number of extruders #endif - - int getHeaterPower(int heater); void disable_heater(); void setWatch(); @@ -189,15 +157,14 @@ static bool thermal_runaway = false; #endif #endif -FORCE_INLINE void autotempShutdown(){ -#ifdef AUTOTEMP - if(autotemp_enabled) - { - autotemp_enabled=false; - if(degTargetHotend(active_extruder)>autotemp_min) - setTargetHotend(0,active_extruder); - } -#endif +FORCE_INLINE void autotempShutdown() { + #ifdef AUTOTEMP + if (autotemp_enabled) { + autotemp_enabled = false; + if (degTargetHotend(active_extruder) > autotemp_min) + setTargetHotend(0, active_extruder); + } + #endif } void PID_autotune(float temp, int extruder, int ncycles); From aa9c1f1bedf57a593b3a7b2c6d9f9008b0d8e8f0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 24 Feb 2015 05:38:10 -0800 Subject: [PATCH 02/12] Better name for ADC macro --- Marlin/temperature.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index 5afc7fc471..5d4b9afd32 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -1453,15 +1453,15 @@ ISR(TIMER0_COMPB_vect) { #define SET_ADMUX_ADCSRA(pin) ADMUX = (1 << REFS0) | (pin & 0x07); ADCSRA |= 1< 7) ADCSRB = 1 << MUX5; else ADCSRB = 0; SET_ADMUX_ADCSRA(pin) + #define START_ADC(pin) if (pin > 7) ADCSRB = 1 << MUX5; else ADCSRB = 0; SET_ADMUX_ADCSRA(pin) #else - #define SET_ADCSRB(pin) ADCSRB = 0; SET_ADMUX_ADCSRA(pin) + #define START_ADC(pin) ADCSRB = 0; SET_ADMUX_ADCSRA(pin) #endif switch(temp_state) { case PrepareTemp_0: #if HAS_TEMP_0 - SET_ADCSRB(TEMP_0_PIN); + START_ADC(TEMP_0_PIN); #endif lcd_buttons_update(); temp_state = MeasureTemp_0; @@ -1474,7 +1474,7 @@ ISR(TIMER0_COMPB_vect) { break; case PrepareTemp_BED: #if HAS_TEMP_BED - SET_ADCSRB(TEMP_BED_PIN); + START_ADC(TEMP_BED_PIN); #endif lcd_buttons_update(); temp_state = MeasureTemp_BED; @@ -1487,7 +1487,7 @@ ISR(TIMER0_COMPB_vect) { break; case PrepareTemp_1: #if HAS_TEMP_1 - SET_ADCSRB(TEMP_1_PIN); + START_ADC(TEMP_1_PIN); #endif lcd_buttons_update(); temp_state = MeasureTemp_1; @@ -1500,7 +1500,7 @@ ISR(TIMER0_COMPB_vect) { break; case PrepareTemp_2: #if HAS_TEMP_2 - SET_ADCSRB(TEMP_2_PIN); + START_ADC(TEMP_2_PIN); #endif lcd_buttons_update(); temp_state = MeasureTemp_2; @@ -1513,7 +1513,7 @@ ISR(TIMER0_COMPB_vect) { break; case PrepareTemp_3: #if HAS_TEMP_3 - SET_ADCSRB(TEMP_3_PIN); + START_ADC(TEMP_3_PIN); #endif lcd_buttons_update(); temp_state = MeasureTemp_3; @@ -1526,7 +1526,7 @@ ISR(TIMER0_COMPB_vect) { break; case Prepare_FILWIDTH: #if HAS_FILAMENT_SENSOR - SET_ADCSRB(FILWIDTH_PIN); + START_ADC(FILWIDTH_PIN); #endif lcd_buttons_update(); temp_state = Measure_FILWIDTH; From fd1ea9d56f0191a0958032d0587a7567ce2dea3e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 24 Feb 2015 23:03:08 -0800 Subject: [PATCH 03/12] Move literal strings to language files --- Marlin/language.h | 37 +++++++++++++++++++++ Marlin/language_en.h | 50 +++++++++++++++++++--------- Marlin/temperature.cpp | 75 +++++++++++++++++++++--------------------- 3 files changed, 109 insertions(+), 53 deletions(-) diff --git a/Marlin/language.h b/Marlin/language.h index e13fc3176e..f554c6ae1b 100644 --- a/Marlin/language.h +++ b/Marlin/language.h @@ -159,6 +159,43 @@ #define MSG_ERR_EEPROM_WRITE "Error writing to EEPROM!" +// temperature.cpp strings +#define MSG_PID_AUTOTUNE "PID Autotune" +#define MSG_PID_AUTOTUNE_START MSG_PID_AUTOTUNE " start" +#define MSG_PID_AUTOTUNE_FAILED MSG_PID_AUTOTUNE " failed!" +#define MSG_PID_BAD_EXTRUDER_NUM MSG_PID_AUTOTUNE_FAILED " Bad extruder number" +#define MSG_PID_TEMP_TOO_HIGH MSG_PID_AUTOTUNE_FAILED " Temperature too high" +#define MSG_PID_TIMEOUT MSG_PID_AUTOTUNE_FAILED " timeout" +#define MSG_BIAS " bias: " +#define MSG_D " d: " +#define MSG_MIN " min: " +#define MSG_MAX " max: " +#define MSG_KU " Ku: " +#define MSG_TU " Tu: " +#define MSG_CLASSIC_PID " Classic PID " +#define MSG_KP " Kp: " +#define MSG_KI " Ki: " +#define MSG_KD " Kd: " +#define MSG_OK_B "ok B:" +#define MSG_OK_T "ok T:" +#define MSG_AT " @:" +#define MSG_PID_AUTOTUNE_FINISHED MSG_PID_AUTOTUNE " finished! Put the last Kp, Ki and Kd constants from above into Configuration.h" +#define MSG_PID_DEBUG " PID_DEBUG " +#define MSG_PID_DEBUG_INPUT ": Input " +#define MSG_PID_DEBUG_OUTPUT " Output " +#define MSG_PID_DEBUG_PTERM " pTerm " +#define MSG_PID_DEBUG_ITERM " iTerm " +#define MSG_PID_DEBUG_DTERM " dTerm " +#define MSG_HEATING_FAILED "Heating failed" +#define MSG_EXTRUDER_SWITCHED_OFF "Extruder switched off. Temperature difference between temp sensors is too high !" + +#define MSG_INVALID_EXTRUDER_NUM " - Invalid extruder number !" +#define MSG_THERMAL_RUNAWAY_STOP "Thermal Runaway, system stopped! Heater_ID: " +#define MSG_SWITCHED_OFF_MAX " switched off. MAXTEMP triggered !!" +#define MSG_MINTEMP_EXTRUDER_OFF ": Extruder switched off. MINTEMP triggered !" +#define MSG_MAXTEMP_EXTRUDER_OFF ": Extruder" MSG_SWITCHED_OFF_MAX +#define MSG_MAXTEMP_BED_OFF "Heated bed" MSG_SWITCHED_OFF_MAX + // LCD Menu Messages // Add your own character. Reference: https://github.com/MarlinFirmware/Marlin/pull/1434 photos diff --git a/Marlin/language_en.h b/Marlin/language_en.h index 5d38aa9705..1ba950af9b 100644 --- a/Marlin/language_en.h +++ b/Marlin/language_en.h @@ -255,7 +255,7 @@ #define MSG_VOLUMETRIC "Filament" #endif #ifndef MSG_VOLUMETRIC_ENABLED -#define MSG_VOLUMETRIC_ENABLED "E in mm" STR_h3 +#define MSG_VOLUMETRIC_ENABLED "E in mm" STR_h3 #endif #ifndef MSG_FILAMENT_SIZE_EXTRUDER_0 #define MSG_FILAMENT_SIZE_EXTRUDER_0 "Fil. Dia. 1" @@ -383,23 +383,41 @@ #ifndef MSG_ENDSTOP_ABORT #define MSG_ENDSTOP_ABORT "Endstop abort" #endif +#ifndef MSG_HEATING_FAILED_LCD +#define MSG_HEATING_FAILED_LCD "Heating failed" +#endif +#ifndef MSG_ERR_REDUNDANT_TEMP +#define MSG_ERR_REDUNDANT_TEMP "Err: REDUNDANT TEMP ERROR" +#endif +#ifndef MSG_THERMAL_RUNAWAY +#define MSG_THERMAL_RUNAWAY "THERMAL RUNAWAY" +#endif +#ifndef MSG_ERR_MAXTEMP +#define MSG_ERR_MAXTEMP "Err: MAXTEMP" +#endif +#ifndef MSG_ERR_MINTEMP +#define MSG_ERR_MINTEMP "Err: MINTEMP" +#endif +#ifndef MSG_ERR_MAXTEMP_BED +#define MSG_ERR_MAXTEMP_BED "Err: MAXTEMP BED" +#endif #ifdef DELTA_CALIBRATION_MENU - #ifndef MSG_DELTA_CALIBRATE - #define MSG_DELTA_CALIBRATE "Delta Calibration" - #endif - #ifndef MSG_DELTA_CALIBRATE_X - #define MSG_DELTA_CALIBRATE_X "Calibrate X" - #endif - #ifndef MSG_DELTA_CALIBRATE_Y - #define MSG_DELTA_CALIBRATE_Y "Calibrate Y" - #endif - #ifndef MSG_DELTA_CALIBRATE_Z - #define MSG_DELTA_CALIBRATE_Z "Calibrate Z" - #endif - #ifndef MSG_DELTA_CALIBRATE_CENTER - #define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center" - #endif + #ifndef MSG_DELTA_CALIBRATE + #define MSG_DELTA_CALIBRATE "Delta Calibration" + #endif + #ifndef MSG_DELTA_CALIBRATE_X + #define MSG_DELTA_CALIBRATE_X "Calibrate X" + #endif + #ifndef MSG_DELTA_CALIBRATE_Y + #define MSG_DELTA_CALIBRATE_Y "Calibrate Y" + #endif + #ifndef MSG_DELTA_CALIBRATE_Z + #define MSG_DELTA_CALIBRATE_Z "Calibrate Z" + #endif + #ifndef MSG_DELTA_CALIBRATE_CENTER + #define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center" + #endif #endif // DELTA_CALIBRATION_MENU #endif // LANGUAGE_EN_H diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index 5d4b9afd32..c453950a6b 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -33,6 +33,7 @@ #include "ultralcd.h" #include "temperature.h" #include "watchdog.h" +#include "language.h" #include "Sd2PinMap.h" @@ -228,11 +229,11 @@ void PID_autotune(float temp, int extruder, int ncycles) || extruder < 0 #endif ) { - SERIAL_ECHOLN("PID Autotune failed. Bad extruder number."); + SERIAL_ECHOLN(MSG_PID_BAD_EXTRUDER_NUM); return; } - SERIAL_ECHOLN("PID Autotune start"); + SERIAL_ECHOLN(MSG_PID_AUTOTUNE_START); disable_heater(); // switch off all heaters. @@ -287,22 +288,22 @@ void PID_autotune(float temp, int extruder, int ncycles) bias = constrain(bias, 20, max_pow - 20); d = (bias > max_pow / 2) ? max_pow - 1 - bias : bias; - SERIAL_PROTOCOLPGM(" bias: "); SERIAL_PROTOCOL(bias); - SERIAL_PROTOCOLPGM(" d: "); SERIAL_PROTOCOL(d); - SERIAL_PROTOCOLPGM(" min: "); SERIAL_PROTOCOL(min); - SERIAL_PROTOCOLPGM(" max: "); SERIAL_PROTOCOLLN(max); + SERIAL_PROTOCOLPGM(MSG_BIAS); SERIAL_PROTOCOL(bias); + SERIAL_PROTOCOLPGM(MSG_D); SERIAL_PROTOCOL(d); + SERIAL_PROTOCOLPGM(MSG_MIN); SERIAL_PROTOCOL(min); + SERIAL_PROTOCOLPGM(MSG_MAX); SERIAL_PROTOCOLLN(max); if (cycles > 2) { Ku = (4.0 * d) / (3.14159265 * (max - min) / 2.0); Tu = ((float)(t_low + t_high) / 1000.0); - SERIAL_PROTOCOLPGM(" Ku: "); SERIAL_PROTOCOL(Ku); - SERIAL_PROTOCOLPGM(" Tu: "); SERIAL_PROTOCOLLN(Tu); + SERIAL_PROTOCOLPGM(MSG_KU); SERIAL_PROTOCOL(Ku); + SERIAL_PROTOCOLPGM(MSG_TU); SERIAL_PROTOCOLLN(Tu); Kp = 0.6 * Ku; Ki = 2 * Kp / Tu; Kd = Kp * Tu / 8; - SERIAL_PROTOCOLLNPGM(" Classic PID "); - SERIAL_PROTOCOLPGM(" Kp: "); SERIAL_PROTOCOLLN(Kp); - SERIAL_PROTOCOLPGM(" Ki: "); SERIAL_PROTOCOLLN(Ki); - SERIAL_PROTOCOLPGM(" Kd: "); SERIAL_PROTOCOLLN(Kd); + SERIAL_PROTOCOLLNPGM(MSG_CLASSIC_PID); + SERIAL_PROTOCOLPGM(MSG_KP); SERIAL_PROTOCOLLN(Kp); + SERIAL_PROTOCOLPGM(MSG_KI); SERIAL_PROTOCOLLN(Ki); + SERIAL_PROTOCOLPGM(MSG_KD); SERIAL_PROTOCOLLN(Kd); /* Kp = 0.33*Ku; Ki = Kp/Tu; @@ -331,7 +332,7 @@ void PID_autotune(float temp, int extruder, int ncycles) } } if (input > temp + 20) { - SERIAL_PROTOCOLLNPGM("PID Autotune failed! Temperature too high"); + SERIAL_PROTOCOLLNPGM(MSG_PID_TEMP_TOO_HIGH); return; } // Every 2 seconds... @@ -339,26 +340,26 @@ void PID_autotune(float temp, int extruder, int ncycles) int p; if (extruder < 0) { p = soft_pwm_bed; - SERIAL_PROTOCOLPGM("ok B:"); + SERIAL_PROTOCOLPGM(MSG_OK_B); } else { p = soft_pwm[extruder]; - SERIAL_PROTOCOLPGM("ok T:"); + SERIAL_PROTOCOLPGM(MSG_OK_T); } SERIAL_PROTOCOL(input); - SERIAL_PROTOCOLPGM(" @:"); + SERIAL_PROTOCOLPGM(MSG_AT); SERIAL_PROTOCOLLN(p); temp_millis = ms; } // every 2 seconds // Over 2 minutes? if (((ms - t1) + (ms - t2)) > (10L*60L*1000L*2L)) { - SERIAL_PROTOCOLLNPGM("PID Autotune failed! timeout"); + SERIAL_PROTOCOLLNPGM(MSG_PID_TIMEOUT); return; } if (cycles > ncycles) { - SERIAL_PROTOCOLLNPGM("PID Autotune finished! Put the last Kp, Ki and Kd constants from above into Configuration.h"); + SERIAL_PROTOCOLLNPGM(MSG_PID_AUTOTUNE_FINISHED); return; } lcd_update(); @@ -571,17 +572,17 @@ void manage_heater() { #ifdef PID_DEBUG SERIAL_ECHO_START; - SERIAL_ECHO(" PID_DEBUG "); + SERIAL_ECHO(MSG_PID_DEBUG); SERIAL_ECHO(e); - SERIAL_ECHO(": Input "); + SERIAL_ECHO(MSG_PID_DEBUG_INPUT); SERIAL_ECHO(pid_input); - SERIAL_ECHO(" Output "); + SERIAL_ECHO(MSG_PID_DEBUG_OUTPUT); SERIAL_ECHO(pid_output); - SERIAL_ECHO(" pTerm "); + SERIAL_ECHO(MSG_PID_DEBUG_PTERM); SERIAL_ECHO(pTerm[e]); - SERIAL_ECHO(" iTerm "); + SERIAL_ECHO(MSG_PID_DEBUG_ITERM); SERIAL_ECHO(iTerm[e]); - SERIAL_ECHO(" dTerm "); + SERIAL_ECHO(MSG_PID_DEBUG_DTERM); SERIAL_ECHOLN(dTerm[e]); #endif //PID_DEBUG @@ -599,9 +600,9 @@ void manage_heater() { if (watchmillis[e] && ms > watchmillis[e] + WATCH_TEMP_PERIOD) { if (degHotend(e) < watch_start_temp[e] + WATCH_TEMP_INCREASE) { setTargetHotend(0, e); - LCD_MESSAGEPGM("Heating failed"); + LCD_MESSAGEPGM(MSG_HEATING_FAILED_LCD); // translatable SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Heating failed"); + SERIAL_ECHOLNPGM(MSG_HEATING_FAILED); } else { watchmillis[e] = 0; @@ -614,8 +615,8 @@ void manage_heater() { disable_heater(); if (IsStopped() == false) { SERIAL_ERROR_START; - SERIAL_ERRORLNPGM("Extruder switched off. Temperature difference between temp sensors is too high !"); - LCD_ALERTMESSAGEPGM("Err: REDUNDANT TEMP ERROR"); + SERIAL_ERRORLNPGM(MSG_EXTRUDER_SWITCHED_OFF); + LCD_ALERTMESSAGEPGM(MSG_ERR_REDUNDANT_TEMP); // translatable } #ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE Stop(); @@ -728,7 +729,7 @@ static float analog2temp(int raw, uint8_t e) { { SERIAL_ERROR_START; SERIAL_ERROR((int)e); - SERIAL_ERRORLNPGM(" - Invalid extruder number !"); + SERIAL_ERRORLNPGM(MSG_INVALID_EXTRUDER_NUM); kill(); return 0.0; } @@ -1074,9 +1075,9 @@ void thermal_runaway_protection(int *state, unsigned long *timer, float temperat else if ( (ms - *timer) > ((unsigned long) period_seconds) * 1000) { SERIAL_ERROR_START; - SERIAL_ERRORLNPGM("Thermal Runaway, system stopped! Heater_ID: "); + SERIAL_ERRORLNPGM(MSG_THERMAL_RUNAWAY_STOP); SERIAL_ERRORLN((int)heater_id); - LCD_ALERTMESSAGEPGM("THERMAL RUNAWAY"); + LCD_ALERTMESSAGEPGM(MSG_THERMAL_RUNAWAY); // translatable thermal_runaway = true; while(1) { @@ -1140,8 +1141,8 @@ void max_temp_error(uint8_t e) { if(IsStopped() == false) { SERIAL_ERROR_START; SERIAL_ERRORLN((int)e); - SERIAL_ERRORLNPGM(": Extruder switched off. MAXTEMP triggered !"); - LCD_ALERTMESSAGEPGM("Err: MAXTEMP"); + SERIAL_ERRORLNPGM(MSG_MAXTEMP_EXTRUDER_OFF); + LCD_ALERTMESSAGEPGM(MSG_ERR_MAXTEMP); // translatable } #ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE Stop(); @@ -1153,8 +1154,8 @@ void min_temp_error(uint8_t e) { if(IsStopped() == false) { SERIAL_ERROR_START; SERIAL_ERRORLN((int)e); - SERIAL_ERRORLNPGM(": Extruder switched off. MINTEMP triggered !"); - LCD_ALERTMESSAGEPGM("Err: MINTEMP"); + SERIAL_ERRORLNPGM(MSG_MINTEMP_EXTRUDER_OFF); + LCD_ALERTMESSAGEPGM(MSG_ERR_MINTEMP); // translatable } #ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE Stop(); @@ -1167,8 +1168,8 @@ void bed_max_temp_error(void) { #endif if (IsStopped() == false) { SERIAL_ERROR_START; - SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!"); - LCD_ALERTMESSAGEPGM("Err: MAXTEMP BED"); + SERIAL_ERRORLNPGM(MSG_MAXTEMP_BED_OFF); + LCD_ALERTMESSAGEPGM(MSG_ERR_MAXTEMP_BED); // translatable } #ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE Stop(); From 864dddc878442a3b36e642d89a197494e3d56549 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 26 Feb 2015 00:33:30 -0800 Subject: [PATCH 04/12] Macros to the top, a few HAS_* macros --- Marlin/temperature.cpp | 189 +++++++++++++++++++++-------------------- 1 file changed, 97 insertions(+), 92 deletions(-) diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index c453950a6b..a074f3d5db 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -37,6 +37,36 @@ #include "Sd2PinMap.h" +//=========================================================================== +//================================== macros ================================= +//=========================================================================== + +#if EXTRUDERS > 4 + #error Unsupported number of extruders +#elif EXTRUDERS > 3 + #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2, v3, v4 } +#elif EXTRUDERS > 2 + #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2, v3 } +#elif EXTRUDERS > 1 + #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2 } +#else + #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1 } +#endif + +#define PIN_EXISTS(PIN) (defined(PIN) && PIN >= 0) +#define HAS_TEMP_0 PIN_EXISTS(TEMP_0_PIN) +#define HAS_TEMP_1 PIN_EXISTS(TEMP_1_PIN) +#define HAS_TEMP_2 PIN_EXISTS(TEMP_2_PIN) +#define HAS_TEMP_3 PIN_EXISTS(TEMP_3_PIN) +#define HAS_TEMP_BED PIN_EXISTS(TEMP_BED_PIN) +#define HAS_FILAMENT_SENSOR (defined(FILAMENT_SENSOR) && PIN_EXISTS(FILWIDTH_PIN)) +#define HAS_HEATER_0 PIN_EXISTS(HEATER_0_PIN) +#define HAS_HEATER_1 PIN_EXISTS(HEATER_1_PIN) +#define HAS_HEATER_2 PIN_EXISTS(HEATER_2_PIN) +#define HAS_HEATER_3 PIN_EXISTS(HEATER_3_PIN) +#define HAS_HEATER_BED PIN_EXISTS(HEATER_BED_PIN) +#define HAS_AUTO_FAN PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ + PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) //=========================================================================== //============================= public variables ============================ @@ -117,24 +147,11 @@ static volatile bool temp_meas_ready = false; #ifdef FAN_SOFT_PWM static unsigned char soft_pwm_fan; #endif -#if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) +#if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ + PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) static unsigned long extruder_autofan_last_check; #endif -#if EXTRUDERS > 4 - #error Unsupported number of extruders -#elif EXTRUDERS > 3 - #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2, v3, v4 } -#elif EXTRUDERS > 2 - #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2, v3 } -#elif EXTRUDERS > 1 - #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1, v2 } -#else - #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1 } -#endif - #ifdef PIDTEMP #ifdef PID_PARAMS_PER_EXTRUDER float Kp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(DEFAULT_Kp, DEFAULT_Kp, DEFAULT_Kp, DEFAULT_Kp); @@ -192,13 +209,6 @@ static void updateTemperaturesFromRawValues(); static int read_max6675(); #endif -#define HAS_TEMP_0 (defined(TEMP_0_PIN) && TEMP_0_PIN > -1) -#define HAS_TEMP_1 (defined(TEMP_1_PIN) && TEMP_1_PIN > -1) -#define HAS_TEMP_2 (defined(TEMP_2_PIN) && TEMP_2_PIN > -1) -#define HAS_TEMP_3 (defined(TEMP_3_PIN) && TEMP_3_PIN > -1) -#define HAS_TEMP_BED (defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1) -#define HAS_FILAMENT_SENSOR (defined(FILAMENT_SENSOR) && defined(FILWIDTH_PIN) && FILWIDTH_PIN > -1) - //=========================================================================== //============================= functions ============================ //=========================================================================== @@ -217,10 +227,8 @@ void PID_autotune(float temp, int extruder, int ncycles) float Kp, Ki, Kd; float max = 0, min = 10000; - #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_3_AUTO_FAN_PIN) && EXTRUDER_3_AUTO_FAN_PIN > -1) + #if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ + PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) unsigned long extruder_autofan_last_check = temp_millis; #endif @@ -255,10 +263,8 @@ void PID_autotune(float temp, int extruder, int ncycles) max = max(max, input); min = min(min, input); - #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_3_AUTO_FAN_PIN) && EXTRUDER_3_AUTO_FAN_PIN > -1) + #if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ + PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) if (ms > extruder_autofan_last_check + 2500) { checkExtruderAutoFans(); extruder_autofan_last_check = ms; @@ -336,7 +342,7 @@ void PID_autotune(float temp, int extruder, int ncycles) return; } // Every 2 seconds... - if (ms - temp_millis > 2000) { + if (ms > temp_millis + 2000) { int p; if (extruder < 0) { p = soft_pwm_bed; @@ -381,11 +387,10 @@ int getHeaterPower(int heater) { return heater < 0 ? soft_pwm_bed : soft_pwm[heater]; } -#if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) +#if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ + PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) - #if defined(FAN_PIN) && FAN_PIN > -1 + #if PIN_EXISTS(FAN_PIN) #if EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN #error "You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to FAN_PIN" #endif @@ -411,11 +416,11 @@ void checkExtruderAutoFans() uint8_t fanState = 0; // which fan pins need to be turned on? - #if defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1 + #if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) if (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE) fanState |= 1; #endif - #if defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1 + #if PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) if (current_temperature[1] > EXTRUDER_AUTO_FAN_TEMPERATURE) { if (EXTRUDER_1_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN) @@ -424,7 +429,7 @@ void checkExtruderAutoFans() fanState |= 2; } #endif - #if defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1 + #if PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) if (current_temperature[2] > EXTRUDER_AUTO_FAN_TEMPERATURE) { if (EXTRUDER_2_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN) @@ -435,7 +440,7 @@ void checkExtruderAutoFans() fanState |= 4; } #endif - #if defined(EXTRUDER_3_AUTO_FAN_PIN) && EXTRUDER_3_AUTO_FAN_PIN > -1 + #if PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) if (current_temperature[3] > EXTRUDER_AUTO_FAN_TEMPERATURE) { if (EXTRUDER_3_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN) @@ -450,19 +455,19 @@ void checkExtruderAutoFans() #endif // update extruder auto fan states - #if defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1 + #if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) setExtruderAutoFanState(EXTRUDER_0_AUTO_FAN_PIN, (fanState & 1) != 0); #endif - #if defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1 + #if PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) if (EXTRUDER_1_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN) setExtruderAutoFanState(EXTRUDER_1_AUTO_FAN_PIN, (fanState & 2) != 0); #endif - #if defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1 + #if PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) if (EXTRUDER_2_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN && EXTRUDER_2_AUTO_FAN_PIN != EXTRUDER_1_AUTO_FAN_PIN) setExtruderAutoFanState(EXTRUDER_2_AUTO_FAN_PIN, (fanState & 4) != 0); #endif - #if defined(EXTRUDER_3_AUTO_FAN_PIN) && EXTRUDER_3_AUTO_FAN_PIN > -1 + #if PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) if (EXTRUDER_3_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN && EXTRUDER_3_AUTO_FAN_PIN != EXTRUDER_1_AUTO_FAN_PIN && EXTRUDER_3_AUTO_FAN_PIN != EXTRUDER_2_AUTO_FAN_PIN) @@ -475,22 +480,22 @@ void checkExtruderAutoFans() // // Error checking and Write Routines // -#if !defined(HEATER_0_PIN) || HEATER_0_PIN < 0 +#if !HAS_HEATER_0 #error HEATER_0_PIN not defined for this board #endif #define WRITE_HEATER_0P(v) WRITE(HEATER_0_PIN, v) #if EXTRUDERS > 1 || defined(HEATERS_PARALLEL) - #if !defined(HEATER_1_PIN) || HEATER_1_PIN < 0 + #if !HAS_HEATER_1 #error HEATER_1_PIN not defined for this board #endif #define WRITE_HEATER_1(v) WRITE(HEATER_1_PIN, v) #if EXTRUDERS > 2 - #if !defined(HEATER_2_PIN) || HEATER_2_PIN < 0 + #if !HAS_HEATER_2 #error HEATER_2_PIN not defined for this board #endif #define WRITE_HEATER_2(v) WRITE(HEATER_2_PIN, v) #if EXTRUDERS > 3 - #if !defined(HEATER_3_PIN) || HEATER_3_PIN < 0 + #if !HAS_HEATER_3 #error HEATER_3_PIN not defined for this board #endif #define WRITE_HEATER_3(v) WRITE(HEATER_3_PIN, v) @@ -502,7 +507,7 @@ void checkExtruderAutoFans() #else #define WRITE_HEATER_0(v) WRITE_HEATER_0P(v) #endif -#if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 +#if HAS_HEATER_BED #define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, v) #endif @@ -626,9 +631,8 @@ void manage_heater() { } // Extruders Loop - #if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN > -1) || \ - (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN > -1) + #if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ + PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) if (ms > extruder_autofan_last_check + 2500) { // only need to check fan state very infrequently checkExtruderAutoFans(); extruder_autofan_last_check = ms; @@ -680,7 +684,7 @@ void manage_heater() { #elif !defined(BED_LIMIT_SWITCHING) // Check if temperature is within the correct range if (current_temperature_bed > BED_MINTEMP && current_temperature_bed < BED_MAXTEMP) { - soft_pwm_bed = current_temperature_bed >= target_temperature_bed ? 0 : MAX_BED_POWER >> 1; + soft_pwm_bed = current_temperature_bed < target_temperature_bed ? MAX_BED_POWER >> 1 : 0; } else { soft_pwm_bed = 0; @@ -707,9 +711,9 @@ void manage_heater() { meas_shift_index = delay_index1 - meas_delay_cm; if (meas_shift_index < 0) meas_shift_index += MAX_MEASUREMENT_DELAY + 1; //loop around buffer if needed - // Get the delayed info and add 100 to reconstitute to a percent of + // Get the delayed info and add 100 to reconstitute to a percent of // the nominal filament diameter then square it to get an area - meas_shift_index = constrain(meas_shift_index, 0, MAX_MEASUREMENT_DELAY); + meas_shift_index = constrain(meas_shift_index, 0, MAX_MEASUREMENT_DELAY); float vm = pow((measurement_delay[meas_shift_index] + 100.0) / 100.0, 2); if (vm < 0.01) vm = 0.01; volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM] = vm; @@ -722,9 +726,9 @@ void manage_heater() { // For hot end temperature measurement. static float analog2temp(int raw, uint8_t e) { #ifdef TEMP_SENSOR_1_AS_REDUNDANT - if(e > EXTRUDERS) + if (e > EXTRUDERS) #else - if(e >= EXTRUDERS) + if (e >= EXTRUDERS) #endif { SERIAL_ERROR_START; @@ -798,28 +802,26 @@ static float analog2tempBed(int raw) { /* Called to get the raw values into the the actual temperatures. The raw values are created in interrupt context, and this function is called from normal context as it is too slow to run in interrupts and will block the stepper routine otherwise */ -static void updateTemperaturesFromRawValues() -{ - #ifdef HEATER_0_USES_MAX6675 - current_temperature_raw[0] = read_max6675(); - #endif - for(uint8_t e=0;e -1) + #if HAS_HEATER_0 SET_OUTPUT(HEATER_0_PIN); #endif - #if defined(HEATER_1_PIN) && (HEATER_1_PIN > -1) + #if HAS_HEATER_1 SET_OUTPUT(HEATER_1_PIN); #endif - #if defined(HEATER_2_PIN) && (HEATER_2_PIN > -1) + #if HAS_HEATER_2 SET_OUTPUT(HEATER_2_PIN); #endif - #if defined(HEATER_3_PIN) && (HEATER_3_PIN > -1) + #if HAS_HEATER_3 SET_OUTPUT(HEATER_3_PIN); #endif - #if defined(HEATER_BED_PIN) && (HEATER_BED_PIN > -1) + #if HAS_HEATER_BED SET_OUTPUT(HEATER_BED_PIN); #endif - #if defined(FAN_PIN) && (FAN_PIN > -1) + #if PIN_EXISTS(FAN_PIN) SET_OUTPUT(FAN_PIN); #ifdef FAST_PWM_FAN setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 @@ -1130,7 +1132,7 @@ void disable_heater() { #if HAS_TEMP_BED target_temperature_bed = 0; soft_pwm_bed = 0; - #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + #if HAS_HEATER_BED WRITE_HEATER_BED(LOW); #endif #endif @@ -1163,7 +1165,7 @@ void min_temp_error(uint8_t e) { } void bed_max_temp_error(void) { - #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + #if HAS_HEATER_BED WRITE_HEATER_BED(0); #endif if (IsStopped() == false) { @@ -1232,6 +1234,9 @@ void bed_max_temp_error(void) { #endif //HEATER_0_USES_MAX6675 +/** + * Stages in the ISR loop + */ enum TempState { PrepareTemp_0, MeasureTemp_0, @@ -1284,7 +1289,7 @@ ISR(TIMER0_COMPB_vect) { #endif #endif #endif - #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + #if HAS_HEATER_BED ISR_STATICS(BED); #endif @@ -1316,7 +1321,7 @@ ISR(TIMER0_COMPB_vect) { #endif #endif - #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + #if HAS_HEATER_BED soft_pwm_BED = soft_pwm_bed; WRITE_HEATER_BED(soft_pwm_BED > 0 ? 1 : 0); #endif @@ -1337,7 +1342,7 @@ ISR(TIMER0_COMPB_vect) { #endif #endif - #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + #if HAS_HEATER_BED if (soft_pwm_BED < pwm_count) WRITE_HEATER_BED(0); #endif @@ -1398,7 +1403,7 @@ ISR(TIMER0_COMPB_vect) { #endif #endif #endif - #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + #if HAS_HEATER_BED _SLOW_PWM_ROUTINE(BED, soft_pwm_bed); // BED #endif @@ -1414,7 +1419,7 @@ ISR(TIMER0_COMPB_vect) { #endif #endif #endif - #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 + #if HAS_HEATER_BED PWM_OFF_ROUTINE(BED); // BED #endif @@ -1445,7 +1450,7 @@ ISR(TIMER0_COMPB_vect) { #endif #endif #endif - #if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 // BED + #if HAS_HEATER_BED if (state_timer_heater_BED > 0) state_timer_heater_BED--; #endif } // (pwm_count % 64) == 0 From 1a7b0d9a3740f55ad11b300b68c128fcb4e971d0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 26 Feb 2015 01:14:59 -0800 Subject: [PATCH 05/12] Redo HAS_* macros to fix define error --- Marlin/temperature.cpp | 88 ++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index a074f3d5db..c2f536bcf0 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -53,20 +53,23 @@ #define ARRAY_BY_EXTRUDERS(v1, v2, v3, v4) { v1 } #endif -#define PIN_EXISTS(PIN) (defined(PIN) && PIN >= 0) -#define HAS_TEMP_0 PIN_EXISTS(TEMP_0_PIN) -#define HAS_TEMP_1 PIN_EXISTS(TEMP_1_PIN) -#define HAS_TEMP_2 PIN_EXISTS(TEMP_2_PIN) -#define HAS_TEMP_3 PIN_EXISTS(TEMP_3_PIN) -#define HAS_TEMP_BED PIN_EXISTS(TEMP_BED_PIN) -#define HAS_FILAMENT_SENSOR (defined(FILAMENT_SENSOR) && PIN_EXISTS(FILWIDTH_PIN)) -#define HAS_HEATER_0 PIN_EXISTS(HEATER_0_PIN) -#define HAS_HEATER_1 PIN_EXISTS(HEATER_1_PIN) -#define HAS_HEATER_2 PIN_EXISTS(HEATER_2_PIN) -#define HAS_HEATER_3 PIN_EXISTS(HEATER_3_PIN) -#define HAS_HEATER_BED PIN_EXISTS(HEATER_BED_PIN) -#define HAS_AUTO_FAN PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ - PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) +#define HAS_TEMP_0 (defined(TEMP_0_PIN) && TEMP_0_PIN >= 0) +#define HAS_TEMP_1 (defined(TEMP_1_PIN) && TEMP_1_PIN >= 0) +#define HAS_TEMP_2 (defined(TEMP_2_PIN) && TEMP_2_PIN >= 0) +#define HAS_TEMP_3 (defined(TEMP_3_PIN) && TEMP_3_PIN >= 0) +#define HAS_TEMP_BED (defined(TEMP_BED_PIN) && TEMP_BED_PIN >= 0) +#define HAS_FILAMENT_SENSOR (defined(FILAMENT_SENSOR) && defined(FILWIDTH_PIN) && FILWIDTH_PIN >= 0) +#define HAS_HEATER_0 (defined(HEATER_0_PIN) && HEATER_0_PIN >= 0) +#define HAS_HEATER_1 (defined(HEATER_1_PIN) && HEATER_1_PIN >= 0) +#define HAS_HEATER_2 (defined(HEATER_2_PIN) && HEATER_2_PIN >= 0) +#define HAS_HEATER_3 (defined(HEATER_3_PIN) && HEATER_3_PIN >= 0) +#define HAS_HEATER_BED (defined(HEATER_BED_PIN) && HEATER_BED_PIN >= 0) +#define HAS_AUTO_FAN_0 (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN >= 0) +#define HAS_AUTO_FAN_1 (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN >= 0) +#define HAS_AUTO_FAN_2 (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN >= 0) +#define HAS_AUTO_FAN_3 (defined(EXTRUDER_3_AUTO_FAN_PIN) && EXTRUDER_3_AUTO_FAN_PIN >= 0) +#define HAS_AUTO_FAN HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 +#define HAS_FAN (defined(FAN_PIN) && FAN_PIN >= 0) //=========================================================================== //============================= public variables ============================ @@ -147,8 +150,7 @@ static volatile bool temp_meas_ready = false; #ifdef FAN_SOFT_PWM static unsigned char soft_pwm_fan; #endif -#if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ - PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) +#if HAS_AUTO_FAN static unsigned long extruder_autofan_last_check; #endif @@ -227,8 +229,7 @@ void PID_autotune(float temp, int extruder, int ncycles) float Kp, Ki, Kd; float max = 0, min = 10000; - #if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ - PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) + #if HAS_AUTO_FAN unsigned long extruder_autofan_last_check = temp_millis; #endif @@ -263,8 +264,7 @@ void PID_autotune(float temp, int extruder, int ncycles) max = max(max, input); min = min(min, input); - #if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ - PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) + #if HAS_AUTO_FAN if (ms > extruder_autofan_last_check + 2500) { checkExtruderAutoFans(); extruder_autofan_last_check = ms; @@ -387,19 +387,21 @@ int getHeaterPower(int heater) { return heater < 0 ? soft_pwm_bed : soft_pwm[heater]; } -#if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ - PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) +#if HAS_AUTO_FAN - #if PIN_EXISTS(FAN_PIN) - #if EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN + #if HAS_FAN + #if EXTRUDER_0_AUTO_FAN_PIN == FAN_PIN #error "You cannot set EXTRUDER_0_AUTO_FAN_PIN equal to FAN_PIN" #endif - #if EXTRUDER_1_AUTO_FAN_PIN == FAN_PIN + #if EXTRUDER_1_AUTO_FAN_PIN == FAN_PIN #error "You cannot set EXTRUDER_1_AUTO_FAN_PIN equal to FAN_PIN" #endif - #if EXTRUDER_2_AUTO_FAN_PIN == FAN_PIN + #if EXTRUDER_2_AUTO_FAN_PIN == FAN_PIN #error "You cannot set EXTRUDER_2_AUTO_FAN_PIN equal to FAN_PIN" #endif + #if EXTRUDER_3_AUTO_FAN_PIN == FAN_PIN + #error "You cannot set EXTRUDER_3_AUTO_FAN_PIN equal to FAN_PIN" + #endif #endif void setExtruderAutoFanState(int pin, bool state) @@ -416,20 +418,20 @@ void checkExtruderAutoFans() uint8_t fanState = 0; // which fan pins need to be turned on? - #if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) + #if HAS_AUTO_FAN_0 if (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE) fanState |= 1; #endif - #if PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) + #if HAS_AUTO_FAN_1 if (current_temperature[1] > EXTRUDER_AUTO_FAN_TEMPERATURE) { - if (EXTRUDER_1_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN) + if (EXTRUDER_1_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN) fanState |= 1; else fanState |= 2; } #endif - #if PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) + #if HAS_AUTO_FAN_2 if (current_temperature[2] > EXTRUDER_AUTO_FAN_TEMPERATURE) { if (EXTRUDER_2_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN) @@ -440,7 +442,7 @@ void checkExtruderAutoFans() fanState |= 4; } #endif - #if PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) + #if HAS_AUTO_FAN_3 if (current_temperature[3] > EXTRUDER_AUTO_FAN_TEMPERATURE) { if (EXTRUDER_3_AUTO_FAN_PIN == EXTRUDER_0_AUTO_FAN_PIN) @@ -455,19 +457,19 @@ void checkExtruderAutoFans() #endif // update extruder auto fan states - #if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) + #if HAS_AUTO_FAN_0 setExtruderAutoFanState(EXTRUDER_0_AUTO_FAN_PIN, (fanState & 1) != 0); #endif - #if PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) + #if HAS_AUTO_FAN_1 if (EXTRUDER_1_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN) setExtruderAutoFanState(EXTRUDER_1_AUTO_FAN_PIN, (fanState & 2) != 0); #endif - #if PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) + #if HAS_AUTO_FAN_2 if (EXTRUDER_2_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN && EXTRUDER_2_AUTO_FAN_PIN != EXTRUDER_1_AUTO_FAN_PIN) setExtruderAutoFanState(EXTRUDER_2_AUTO_FAN_PIN, (fanState & 4) != 0); #endif - #if PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) + #if HAS_AUTO_FAN_3 if (EXTRUDER_3_AUTO_FAN_PIN != EXTRUDER_0_AUTO_FAN_PIN && EXTRUDER_3_AUTO_FAN_PIN != EXTRUDER_1_AUTO_FAN_PIN && EXTRUDER_3_AUTO_FAN_PIN != EXTRUDER_2_AUTO_FAN_PIN) @@ -510,6 +512,9 @@ void checkExtruderAutoFans() #if HAS_HEATER_BED #define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, v) #endif +#if HAS_FAN + #define WRITE_FAN(v) WRITE(FAN_PIN, v) +#endif void manage_heater() { @@ -631,8 +636,7 @@ void manage_heater() { } // Extruders Loop - #if PIN_EXISTS(EXTRUDER_0_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_1_AUTO_FAN_PIN) || \ - PIN_EXISTS(EXTRUDER_2_AUTO_FAN_PIN) || PIN_EXISTS(EXTRUDER_3_AUTO_FAN_PIN) + #if HAS_AUTO_FAN if (ms > extruder_autofan_last_check + 2500) { // only need to check fan state very infrequently checkExtruderAutoFans(); extruder_autofan_last_check = ms; @@ -884,7 +888,7 @@ void tp_init() #if HAS_HEATER_BED SET_OUTPUT(HEATER_BED_PIN); #endif - #if PIN_EXISTS(FAN_PIN) + #if HAS_FAN SET_OUTPUT(FAN_PIN); #ifdef FAST_PWM_FAN setPwmFrequency(FAN_PIN, 1); // No prescaling. Pwm frequency = F_CPU/256/8 @@ -1327,7 +1331,7 @@ ISR(TIMER0_COMPB_vect) { #endif #ifdef FAN_SOFT_PWM soft_pwm_fan = fanSpeedSoftPwm / 2; - WRITE(FAN_PIN, soft_pwm_fan > 0 ? 1 : 0); + WRITE_FAN(soft_pwm_fan > 0 ? 1 : 0); #endif } @@ -1347,7 +1351,7 @@ ISR(TIMER0_COMPB_vect) { #endif #ifdef FAN_SOFT_PWM - if (soft_pwm_fan < pwm_count) WRITE(FAN_PIN, 0); + if (soft_pwm_fan < pwm_count) WRITE_FAN(0); #endif pwm_count += (1 << SOFT_PWM_SCALE); @@ -1426,9 +1430,9 @@ ISR(TIMER0_COMPB_vect) { #ifdef FAN_SOFT_PWM if (pwm_count == 0) { soft_pwm_fan = fanSpeedSoftPwm / 2; - WRITE(FAN_PIN, soft_pwm_fan > 0 ? 1 : 0); + WRITE_FAN(soft_pwm_fan > 0 ? 1 : 0); } - if (soft_pwm_fan < pwm_count) WRITE(FAN_PIN, 0); + if (soft_pwm_fan < pwm_count) WRITE_FAN(0); #endif //FAN_SOFT_PWM pwm_count += (1 << SOFT_PWM_SCALE); From c7fb1b70f25894025f03a88cfee1131708ba04ca Mon Sep 17 00:00:00 2001 From: chrono Date: Sun, 1 Mar 2015 09:54:36 +0000 Subject: [PATCH 06/12] Initial Configuration.h for Felix 2.0/3.0 --- Marlin/Configuration.h | 80 ++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 8c12b0f85d..d0931084e4 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -8,7 +8,7 @@ //=========================================================================== /* Here are some standard links for getting your machine calibrated: - * http://reprap.org/wiki/Calibration + * http://reprap.org/wiki/Calibration * http://youtu.be/wAL9d7FgInk * http://calculator.josefprusa.cz * http://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide @@ -59,7 +59,7 @@ Here are some standard links for getting your machine calibrated: // The following define selects which electronics board you have. // Please choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_ULTIMAKER + #define MOTHERBOARD BOARD_FELIX2 #endif // Define this to set a custom name for your generic Mendel, @@ -79,7 +79,7 @@ Here are some standard links for getting your machine calibrated: #define POWER_SUPPLY 1 // Define this to have the electronics keep the power supply off on startup. If you don't know what this is leave it. -// #define PS_DEFAULT_OFF +#define PS_DEFAULT_OFF //=========================================================================== //============================= Thermal Settings ============================ @@ -104,7 +104,7 @@ Here are some standard links for getting your machine calibrated: // 10 is 100k RS thermistor 198-961 (4.7k pullup) // 11 is 100k beta 3950 1% thermistor (4.7k pullup) // 12 is 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) -// 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" +// 13 is 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" // 20 is the PT100 circuit found in the Ultimainboard V2.x // 60 is 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 // @@ -118,16 +118,16 @@ Here are some standard links for getting your machine calibrated: // 1010 is Pt1000 with 1k pullup (non standard) // 147 is Pt100 with 4k7 pullup // 110 is Pt100 with 1k pullup (non standard) -// 998 and 999 are Dummy Tables. They will ALWAYS read 25°C or the temperature defined below. +// 998 and 999 are Dummy Tables. They will ALWAYS read 25°C or the temperature defined below. // Use it for Testing or Development purposes. NEVER for production machine. // #define DUMMY_THERMISTOR_998_VALUE 25 // #define DUMMY_THERMISTOR_999_VALUE 100 -#define TEMP_SENSOR_0 -1 -#define TEMP_SENSOR_1 -1 +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 1 #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 -#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_BED 1 // This makes temp sensor 1 a redundant sensor for sensor 0. If the temperatures difference between these sensors is to high the print will be aborted. //#define TEMP_SENSOR_1_AS_REDUNDANT @@ -187,10 +187,10 @@ Here are some standard links for getting your machine calibrated: #define PID_dT ((OVERSAMPLENR * 10.0)/(F_CPU / 64.0 / 256.0)) //sampling period of the temperature routine // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it -// Ultimaker - #define DEFAULT_Kp 22.2 - #define DEFAULT_Ki 1.08 - #define DEFAULT_Kd 114 +// Felix 2.0+ electronics with v4 Hotend +#define DEFAULT_Kp 12 +#define DEFAULT_Ki 0.84 +#define DEFAULT_Kd 85 // MakerGear // #define DEFAULT_Kp 7.0 @@ -263,15 +263,15 @@ The issue: If a thermistor come off, it will read a lower temperature than actua The system will turn the heater on forever, burning up the filament and anything else around. -After the temperature reaches the target for the first time, this feature will -start measuring for how long the current temperature stays below the target +After the temperature reaches the target for the first time, this feature will +start measuring for how long the current temperature stays below the target minus _HYSTERESIS (set_temperature - THERMAL_RUNAWAY_PROTECTION_HYSTERESIS). If it stays longer than _PERIOD, it means the thermistor temperature cannot catch up with the target, so something *may be* wrong. Then, to be on the safe side, the system will he halt. -Bear in mind the count down will just start AFTER the first time the +Bear in mind the count down will just start AFTER the first time the thermistor temperature is over the target, so you will have no problem if your extruder heater takes 2 minutes to hit the target on heating. @@ -321,13 +321,13 @@ your extruder heater takes 2 minutes to hit the target on heating. #endif // The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins. -const bool X_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. -const bool Y_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. -const bool Z_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +const bool X_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. +const bool Y_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. +const bool Z_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. -//#define DISABLE_MAX_ENDSTOPS +#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MIN_ENDSTOPS // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 @@ -344,7 +344,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of #define DISABLE_INACTIVE_EXTRUDER true //disable only inactive extruders and keep active extruder enabled #define INVERT_X_DIR true // 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 true // 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_E0_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false #define INVERT_E1_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false @@ -361,11 +361,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of #define max_software_endstops true // If true, axis won't move to coordinates greater than the defined lengths below. // Travel limits after homing (units are in mm) -#define X_MAX_POS 205 +#define X_MAX_POS 245 #define X_MIN_POS 0 #define Y_MAX_POS 205 #define Y_MIN_POS 0 -#define Z_MAX_POS 200 +#define Z_MAX_POS 235 #define Z_MIN_POS 0 #define X_MAX_LENGTH (X_MAX_POS - X_MIN_POS) @@ -378,7 +378,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of //=========================================================================== //#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable (remove // at the start of the line) -#define Z_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. +//#define Z_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. #ifdef ENABLE_AUTO_BED_LEVELING @@ -487,9 +487,9 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of #endif #endif - + #endif - + #endif // ENABLE_AUTO_BED_LEVELING @@ -510,12 +510,13 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of // default settings -#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200.0*8/3,760*1.1} // default steps per unit for Ultimaker +// default steps per unit for Felix 2.0/3.0: 0.00249mm x/y rounding error with 3mm pitch HTD belt and 14 tooth pulleys. 0 z error. +#define DEFAULT_AXIS_STEPS_PER_UNIT {76.190476, 76.190476, 1600, 164} #define DEFAULT_MAX_FEEDRATE {500, 500, 5, 25} // (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 {5000,5000,100,80000} // 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_ACCELERATION 3000 // X, Y, Z and E max acceleration in mm/s^2 for printing moves -#define DEFAULT_RETRACT_ACCELERATION 3000 // X, Y, Z and E max acceleration in mm/s^2 for retracts +#define DEFAULT_ACCELERATION 1750 //1500 // X, Y, Z and E max acceleration in mm/s^2 for printing moves +#define DEFAULT_RETRACT_ACCELERATION 5000 // X, Y, Z and E max acceleration in mm/s^2 for r retracts // Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). // The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). @@ -524,8 +525,8 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of // #define EXTRUDER_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis // The speed change that does not require acceleration (i.e. the software might assume it can be done instantaneously) -#define DEFAULT_XYJERK 20.0 // (mm/sec) -#define DEFAULT_ZJERK 0.4 // (mm/sec) +#define DEFAULT_XYJERK 10 // (mm/sec) +#define DEFAULT_ZJERK 0.3 //0.4 // (mm/sec) #define DEFAULT_EJERK 5.0 // (mm/sec) @@ -570,7 +571,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of //#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) // Character based displays can have different extended charsets. -#define DISPLAY_CHARSET_HD44780_JAPAN // "ääööüüß23°" +//#define DISPLAY_CHARSET_HD44780_JAPAN // "ääööüüß23°" //#define DISPLAY_CHARSET_HD44780_WESTERN // "ÄäÖöÜüß²³°" if you see a '~' instead of a 'arrow_right' at the right of submenuitems - this is the right one. //#define ULTRA_LCD //general LCD support, also 16x2 @@ -636,13 +637,13 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of #define ULTRA_LCD //general LCD support, also 16x2 #define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) #define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. - + #ifdef miniVIKI #define DEFAULT_LCD_CONTRAST 95 #else #define DEFAULT_LCD_CONTRAST 40 #endif - + #define ENCODER_PULSES_PER_STEP 4 #define ENCODER_STEPS_PER_MENU_ITEM 1 #endif @@ -733,7 +734,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of // Shift register panels // --------------------- // 2 wire Non-latching LCD SR from: -// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection //#define SAV_3DLCD #ifdef SAV_3DLCD @@ -774,7 +775,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of #endif // Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino -//#define FAST_PWM_FAN +#define FAST_PWM_FAN // Temperature status LEDs that display the hotend and bet temperature. // If all hotends and bed temperature and temperature setpoint are < 54C then the BLUE led is on. @@ -831,9 +832,9 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of * Support for a filament diameter sensor * Also allows adjustment of diameter at print time (vs at slicing) * Single extruder only at this point (extruder 0) - * + * * Motherboards - * 34 - RAMPS1.4 - uses Analog input 5 on the AUX2 connector + * 34 - RAMPS1.4 - uses Analog input 5 on the AUX2 connector * 81 - Printrboard - Uses Analog input 2 on the Exp1 connector (version B,C,D,E) * 301 - Rambo - uses Analog input 3 * Note may require analog pins to be defined for different motherboards @@ -850,7 +851,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of #define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) //defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially +#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially //When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. //#define FILAMENT_LCD_DISPLAY @@ -864,3 +865,4 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of #include "thermistortables.h" #endif //__CONFIGURATION_H + From 3eafea840d61b42d0697f6c445516a20ced1fec2 Mon Sep 17 00:00:00 2001 From: chrono Date: Sun, 1 Mar 2015 11:04:02 +0100 Subject: [PATCH 07/12] Minor fixes in Configuration.h --- Marlin/Configuration.h | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index d0931084e4..12240a3019 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -70,7 +70,7 @@ Here are some standard links for getting your machine calibrated: // #define MACHINE_UUID "00000000-0000-0000-0000-000000000000" // This defines the number of extruders -#define EXTRUDERS 1 +#define EXTRUDERS 2 //// The following define selects which power supply you have. Please choose the one that matches your setup // 1 = ATX @@ -134,7 +134,7 @@ Here are some standard links for getting your machine calibrated: #define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 // Actual temperature must be close to target for this long before M109 returns success -#define TEMP_RESIDENCY_TIME 10 // (seconds) +#define TEMP_RESIDENCY_TIME 15 // (seconds) #define TEMP_HYSTERESIS 3 // (degC) range of +/- temperatures considered "close" to the target one #define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. @@ -186,21 +186,11 @@ Here are some standard links for getting your machine calibrated: #define K1 0.95 //smoothing factor within the PID #define PID_dT ((OVERSAMPLENR * 10.0)/(F_CPU / 64.0 / 256.0)) //sampling period of the temperature routine -// If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it -// Felix 2.0+ electronics with v4 Hotend -#define DEFAULT_Kp 12 -#define DEFAULT_Ki 0.84 -#define DEFAULT_Kd 85 - -// MakerGear -// #define DEFAULT_Kp 7.0 -// #define DEFAULT_Ki 0.1 -// #define DEFAULT_Kd 12 - -// Mendel Parts V9 on 12V -// #define DEFAULT_Kp 63.0 -// #define DEFAULT_Ki 2.25 -// #define DEFAULT_Kd 440 + // Felix 2.0+ electronics with v4 Hotend + #define DEFAULT_Kp 12 + #define DEFAULT_Ki 0.84 + #define DEFAULT_Kd 85 + #endif // PIDTEMP //=========================================================================== @@ -783,7 +773,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of //#define TEMP_STAT_LEDS // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency -// which is not ass annoying as with the hardware PWM. On the other hand, if this frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency // is too low, you should also increment SOFT_PWM_SCALE. //#define FAN_SOFT_PWM @@ -857,12 +847,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of //#define FILAMENT_LCD_DISPLAY - - - - #include "Configuration_adv.h" #include "thermistortables.h" #endif //__CONFIGURATION_H - From 875812d3467ec21197b15c38acd367c85aba5494 Mon Sep 17 00:00:00 2001 From: chrono Date: Sun, 1 Mar 2015 11:15:17 +0100 Subject: [PATCH 08/12] Updated package info --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c804d53b0c..f415629674 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,14 @@ -# Marlin 3D Printer Firmware +# Marlin 3D Printer Firmware Package for Felix 2.0/3.0 + +## Felix Modifications + +This is a snapshot of upstream Marlin from 20150301 modified to be +used directly with Felix Electronic Boards and Printers. Dual-Head +has been activated but is not tested. Neither are LCD and SDCARD +since Ocotprint is in use here. A pull-request to have direct +upstream hardware support has already been submitted. + + * [Configuration & Compilation](/Documentation/Compilation.md) @@ -41,7 +51,7 @@ The current Marlin dev team consists of: - Erik van der Zalm ([@ErikZalm](https://github.com/ErikZalm)) - [@daid](https://github.com/daid) - + Sprinters lead developers are Kliment and caru. Grbls lead developer is Simen Svale Skogsrud. Sonney Jeon (Chamnit) improved some parts of grbl From e30bfedce4d3565e880cd76589665f322c6ef788 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 1 Mar 2015 19:57:35 -0800 Subject: [PATCH 09/12] Fix undefined *_PROBE_BED_POSITION error --- Marlin/Marlin_main.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index f986ee68ab..8390a5f840 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -1734,16 +1734,6 @@ void process_commands() SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN); break; // abort G29, since we don't know where we are } - int left_probe_bed_position=LEFT_PROBE_BED_POSITION; - int right_probe_bed_position=RIGHT_PROBE_BED_POSITION; - int back_probe_bed_position=BACK_PROBE_BED_POSITION; - int front_probe_bed_position=FRONT_PROBE_BED_POSITION; - int auto_bed_leveling_grid_points=AUTO_BED_LEVELING_GRID_POINTS; - if (code_seen('L')) left_probe_bed_position=(int)code_value(); - if (code_seen('R')) right_probe_bed_position=(int)code_value(); - if (code_seen('B')) back_probe_bed_position=(int)code_value(); - if (code_seen('F')) front_probe_bed_position=(int)code_value(); - if (code_seen('P')) auto_bed_leveling_grid_points=(int)code_value(); #ifdef Z_PROBE_SLED dock_sled(false); @@ -1764,6 +1754,16 @@ void process_commands() feedrate = homing_feedrate[Z_AXIS]; #ifdef AUTO_BED_LEVELING_GRID // probe at the points of a lattice grid + int left_probe_bed_position=LEFT_PROBE_BED_POSITION; + int right_probe_bed_position=RIGHT_PROBE_BED_POSITION; + int back_probe_bed_position=BACK_PROBE_BED_POSITION; + int front_probe_bed_position=FRONT_PROBE_BED_POSITION; + int auto_bed_leveling_grid_points=AUTO_BED_LEVELING_GRID_POINTS; + if (code_seen('L')) left_probe_bed_position=(int)code_value(); + if (code_seen('R')) right_probe_bed_position=(int)code_value(); + if (code_seen('B')) back_probe_bed_position=(int)code_value(); + if (code_seen('F')) front_probe_bed_position=(int)code_value(); + if (code_seen('P')) auto_bed_leveling_grid_points=(int)code_value(); int xGridSpacing = (right_probe_bed_position - left_probe_bed_position) / (auto_bed_leveling_grid_points-1); int yGridSpacing = (back_probe_bed_position - front_probe_bed_position) / (auto_bed_leveling_grid_points-1); From f171656f8e0f72ae0294220e4e1086db5b8c38e5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 2 Mar 2015 07:06:01 -0800 Subject: [PATCH 10/12] Cleanup of cardreader.* - Apply standards to cardreader.* - Fix minor issues with cardreader.cpp - Apply standards to some other stale regions --- Marlin/BlinkM.cpp | 9 +- Marlin/BlinkM.h | 7 +- Marlin/ConfigurationStore.h | 6 +- Marlin/cardreader.cpp | 626 ++++++++++++++---------------------- Marlin/cardreader.h | 64 ++-- Marlin/digipot_mcp4451.cpp | 77 +++-- 6 files changed, 325 insertions(+), 464 deletions(-) diff --git a/Marlin/BlinkM.cpp b/Marlin/BlinkM.cpp index de604ecd35..b340f968c0 100644 --- a/Marlin/BlinkM.cpp +++ b/Marlin/BlinkM.cpp @@ -5,16 +5,9 @@ #include "Marlin.h" #ifdef BLINKM -#if (ARDUINO >= 100) - # include "Arduino.h" -#else - # include "WProgram.h" -#endif - #include "BlinkM.h" -void SendColors(byte red, byte grn, byte blu) -{ +void SendColors(byte red, byte grn, byte blu) { Wire.begin(); Wire.beginTransmission(0x09); Wire.write('o'); //to disable ongoing script, only needs to be used once diff --git a/Marlin/BlinkM.h b/Marlin/BlinkM.h index 5136828782..5b802b718b 100644 --- a/Marlin/BlinkM.h +++ b/Marlin/BlinkM.h @@ -2,13 +2,12 @@ BlinkM.h Library header file for BlinkM library */ -#if (ARDUINO >= 100) - # include "Arduino.h" +#if ARDUINO >= 100 + #include "Arduino.h" #else - # include "WProgram.h" + #include "WProgram.h" #endif #include "Wire.h" void SendColors(byte red, byte grn, byte blu); - diff --git a/Marlin/ConfigurationStore.h b/Marlin/ConfigurationStore.h index d117d37fb2..3dc4a92cfd 100644 --- a/Marlin/ConfigurationStore.h +++ b/Marlin/ConfigurationStore.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_STORE_H -#define CONFIG_STORE_H +#ifndef CONFIGURATIONSTORE_H +#define CONFIGURATIONSTORE_H #include "Configuration.h" @@ -19,4 +19,4 @@ void Config_ResetDefault(); FORCE_INLINE void Config_RetrieveSettings() { Config_ResetDefault(); Config_PrintSettings(); } #endif -#endif // __CONFIG_STORE_H +#endif //CONFIGURATIONSTORE_H diff --git a/Marlin/cardreader.cpp b/Marlin/cardreader.cpp index a2dd67831b..ad79892b59 100644 --- a/Marlin/cardreader.cpp +++ b/Marlin/cardreader.cpp @@ -7,91 +7,69 @@ #ifdef SDSUPPORT +CardReader::CardReader() { + filesize = 0; + sdpos = 0; + sdprinting = false; + cardOK = false; + saving = false; + logging = false; + workDirDepth = 0; + file_subcall_ctr = 0; + memset(workDirParents, 0, sizeof(workDirParents)); - -CardReader::CardReader() -{ - filesize = 0; - sdpos = 0; - sdprinting = false; - cardOK = false; - saving = false; - logging = false; - autostart_atmillis=0; - workDirDepth = 0; - file_subcall_ctr=0; - memset(workDirParents, 0, sizeof(workDirParents)); - - autostart_stilltocheck=true; //the SD start is delayed, because otherwise the serial cannot answer fast enough to make contact with the host software. - autostart_index=0; + autostart_stilltocheck = true; //the SD start is delayed, because otherwise the serial cannot answer fast enough to make contact with the host software. + autostart_index = 0; //power to SD reader #if SDPOWER > -1 - SET_OUTPUT(SDPOWER); - WRITE(SDPOWER,HIGH); + SET_OUTPUT(SDPOWER); + WRITE(SDPOWER, HIGH); #endif //SDPOWER - - autostart_atmillis=millis()+5000; + + autostart_atmillis = millis() + 5000; } -char *createFilename(char *buffer,const dir_t &p) //buffer>12characters -{ - char *pos=buffer; - for (uint8_t i = 0; i < 11; i++) - { - if (p.name[i] == ' ')continue; - if (i == 8) - { - *pos++='.'; - } - *pos++=p.name[i]; +char *createFilename(char *buffer, const dir_t &p) { //buffer > 12characters + char *pos = buffer; + for (uint8_t i = 0; i < 11; i++) { + if (p.name[i] == ' ') continue; + if (i == 8) *pos++ = '.'; + *pos++ = p.name[i]; } - *pos++=0; + *pos++ = 0; return buffer; } - -void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=NULL*/) -{ +void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=NULL*/) { dir_t p; - uint8_t cnt=0; - - while (parent.readDir(p, longFilename) > 0) - { - if( DIR_IS_SUBDIR(&p) && lsAction!=LS_Count && lsAction!=LS_GetFilename) // hence LS_SerialPrint - { + uint8_t cnt = 0; + while (parent.readDir(p, longFilename) > 0) { + if (DIR_IS_SUBDIR(&p) && lsAction != LS_Count && lsAction != LS_GetFilename) { // hence LS_SerialPrint char path[FILENAME_LENGTH*2]; char lfilename[FILENAME_LENGTH]; - createFilename(lfilename,p); - - path[0]=0; - if(prepend[0]==0) //avoid leading / if already in prepend - { - strcat(path,"/"); - } - strcat(path,prepend); - strcat(path,lfilename); - strcat(path,"/"); - + createFilename(lfilename, p); + + path[0] = 0; + if (prepend[0] == 0) strcat(path, "/"); //avoid leading / if already in prepend + strcat(path, prepend); + strcat(path, lfilename); + strcat(path, "/"); + //Serial.print(path); - + SdFile dir; - if(!dir.open(parent,lfilename, O_READ)) - { - if(lsAction==LS_SerialPrint) - { + if (!dir.open(parent, lfilename, O_READ)) { + if (lsAction == LS_SerialPrint) { SERIAL_ECHO_START; SERIAL_ECHOLN(MSG_SD_CANT_OPEN_SUBDIR); SERIAL_ECHOLN(lfilename); } } - lsDive(path,dir); + lsDive(path, dir); //close done automatically by destructor of SdFile - - } - else - { + else { char pn0 = p.name[0]; if (pn0 == DIR_NAME_FREE) break; if (pn0 == DIR_NAME_DELETED || pn0 == '.' || pn0 == '_') continue; @@ -99,384 +77,313 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m if (lf0 == '.' || lf0 == '_') continue; if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue; - filenameIsDir=DIR_IS_SUBDIR(&p); - - - if(!filenameIsDir) - { - if(p.name[8]!='G') continue; - if(p.name[9]=='~') continue; - } - //if(cnt++!=nr) continue; - createFilename(filename,p); - if(lsAction==LS_SerialPrint) - { + + filenameIsDir = DIR_IS_SUBDIR(&p); + + if (!filenameIsDir && (p.name[8] != 'G' || p.name[9] == '~')) continue; + + //if (cnt++ != nr) continue; + createFilename(filename, p); + if (lsAction == LS_SerialPrint) { SERIAL_PROTOCOL(prepend); SERIAL_PROTOCOLLN(filename); } - else if(lsAction==LS_Count) - { + else if (lsAction == LS_Count) { nrFiles++; - } - else if(lsAction==LS_GetFilename) - { + } + else if (lsAction == LS_GetFilename) { if (match != NULL) { if (strcasecmp(match, filename) == 0) return; } else if (cnt == nrFiles) return; cnt++; - } } } } -void CardReader::ls() -{ - lsAction=LS_SerialPrint; - if(lsAction==LS_Count) - nrFiles=0; - +void CardReader::ls() { + lsAction = LS_SerialPrint; root.rewind(); - lsDive("",root); + lsDive("", root); } - -void CardReader::initsd() -{ +void CardReader::initsd() { cardOK = false; - if(root.isOpen()) - root.close(); -#ifdef SDSLOW - if (!card.init(SPI_HALF_SPEED,SDSS) - #if defined(LCD_SDSS) && (LCD_SDSS != SDSS) - && !card.init(SPI_HALF_SPEED,LCD_SDSS) - #endif - ) -#else - if (!card.init(SPI_FULL_SPEED,SDSS) - #if defined(LCD_SDSS) && (LCD_SDSS != SDSS) - && !card.init(SPI_FULL_SPEED,LCD_SDSS) + if (root.isOpen()) root.close(); + + #ifdef SDSLOW + #define SPI_SPEED SPI_HALF_SPEED + #else + #define SPI_SPEED SPI_FULL_SPEED #endif - ) -#endif - { + + if (!card.init(SPI_SPEED,SDSS) + #if defined(LCD_SDSS) && (LCD_SDSS != SDSS) + && !card.init(SPI_SPEED, LCD_SDSS) + #endif + ) { //if (!card.init(SPI_HALF_SPEED,SDSS)) SERIAL_ECHO_START; SERIAL_ECHOLNPGM(MSG_SD_INIT_FAIL); } - else if (!volume.init(&card)) - { + else if (!volume.init(&card)) { SERIAL_ERROR_START; SERIAL_ERRORLNPGM(MSG_SD_VOL_INIT_FAIL); } - else if (!root.openRoot(&volume)) - { + else if (!root.openRoot(&volume)) { SERIAL_ERROR_START; SERIAL_ERRORLNPGM(MSG_SD_OPENROOT_FAIL); } - else - { + else { cardOK = true; SERIAL_ECHO_START; SERIAL_ECHOLNPGM(MSG_SD_CARD_OK); } - workDir=root; - curDir=&root; + workDir = root; + curDir = &root; /* - if(!workDir.openRoot(&volume)) - { + if (!workDir.openRoot(&volume)) { SERIAL_ECHOLNPGM(MSG_SD_WORKDIR_FAIL); } */ - } -void CardReader::setroot() -{ - /*if(!workDir.openRoot(&volume)) - { +void CardReader::setroot() { + /*if (!workDir.openRoot(&volume)) { SERIAL_ECHOLNPGM(MSG_SD_WORKDIR_FAIL); }*/ - workDir=root; - - curDir=&workDir; + workDir = root; + curDir = &workDir; } -void CardReader::release() -{ + +void CardReader::release() { sdprinting = false; cardOK = false; } -void CardReader::startFileprint() -{ - if(cardOK) - { +void CardReader::startFileprint() { + if (cardOK) { sdprinting = true; } } -void CardReader::pauseSDPrint() -{ - if(sdprinting) - { - sdprinting = false; - } +void CardReader::pauseSDPrint() { + if (sdprinting) sdprinting = false; } - -void CardReader::openLogFile(char* name) -{ +void CardReader::openLogFile(char* name) { logging = true; openFile(name, false); } -void CardReader::getAbsFilename(char *t) -{ - uint8_t cnt=0; - *t='/';t++;cnt++; - for(uint8_t i=0;i(int)SD_PROCEDURE_DEPTH-1) - { +void CardReader::openFile(char* name, bool read, bool replace_current/*=true*/) { + if (!cardOK) return; + if (file.isOpen()) { //replacing current file by new file, or subfile call + if (!replace_current) { + if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) { SERIAL_ERROR_START; SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:"); SERIAL_ERRORLN(SD_PROCEDURE_DEPTH); kill(); return; } - + SERIAL_ECHO_START; SERIAL_ECHOPGM("SUBROUTINE CALL target:\""); SERIAL_ECHO(name); SERIAL_ECHOPGM("\" parent:\""); - + //store current filename and position getAbsFilename(filenames[file_subcall_ctr]); - + SERIAL_ECHO(filenames[file_subcall_ctr]); SERIAL_ECHOPGM("\" pos"); SERIAL_ECHOLN(sdpos); - filespos[file_subcall_ctr]=sdpos; + filespos[file_subcall_ctr] = sdpos; file_subcall_ctr++; } - else - { + else { SERIAL_ECHO_START; SERIAL_ECHOPGM("Now doing file: "); SERIAL_ECHOLN(name); } file.close(); } - else //opening fresh file - { - file_subcall_ctr=0; //resetting procedure depth in case user cancels print while in procedure + else { //opening fresh file + file_subcall_ctr = 0; //resetting procedure depth in case user cancels print while in procedure SERIAL_ECHO_START; SERIAL_ECHOPGM("Now fresh file: "); SERIAL_ECHOLN(name); } sdprinting = false; - - + SdFile myDir; - curDir=&root; - char *fname=name; - - char *dirname_start,*dirname_end; - if(name[0]=='/') - { - dirname_start=strchr(name,'/')+1; - while(dirname_start>0) - { - dirname_end=strchr(dirname_start,'/'); - //SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start-name)); - //SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end-name)); - if(dirname_end>0 && dirname_end>dirname_start) - { + curDir = &root; + char *fname = name; + + char *dirname_start, *dirname_end; + if (name[0] == '/') { + dirname_start = &name[1]; + while(dirname_start > 0) { + dirname_end = strchr(dirname_start, '/'); + //SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start - name)); + //SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end - name)); + if (dirname_end > 0 && dirname_end > dirname_start) { char subdirname[FILENAME_LENGTH]; - strncpy(subdirname, dirname_start, dirname_end-dirname_start); - subdirname[dirname_end-dirname_start]=0; + strncpy(subdirname, dirname_start, dirname_end - dirname_start); + subdirname[dirname_end - dirname_start] = 0; SERIAL_ECHOLN(subdirname); - if(!myDir.open(curDir,subdirname,O_READ)) - { + if (!myDir.open(curDir, subdirname, O_READ)) { SERIAL_PROTOCOLPGM(MSG_SD_OPEN_FILE_FAIL); SERIAL_PROTOCOL(subdirname); SERIAL_PROTOCOLLNPGM("."); return; } - else - { + else { //SERIAL_ECHOLN("dive ok"); } - - curDir=&myDir; - dirname_start=dirname_end+1; + + curDir = &myDir; + dirname_start = dirname_end + 1; } - else // the reminder after all /fsa/fdsa/ is the filename - { - fname=dirname_start; - //SERIAL_ECHOLN("remaider"); + else { // the remainder after all /fsa/fdsa/ is the filename + fname = dirname_start; + //SERIAL_ECHOLN("remainder"); //SERIAL_ECHOLN(fname); break; } - } } - else //relative path - { - curDir=&workDir; + else { //relative path + curDir = &workDir; } - if(read) - { - if (file.open(curDir, fname, O_READ)) - { + + if (read) { + if (file.open(curDir, fname, O_READ)) { filesize = file.fileSize(); SERIAL_PROTOCOLPGM(MSG_SD_FILE_OPENED); SERIAL_PROTOCOL(fname); SERIAL_PROTOCOLPGM(MSG_SD_SIZE); SERIAL_PROTOCOLLN(filesize); sdpos = 0; - + SERIAL_PROTOCOLLNPGM(MSG_SD_FILE_SELECTED); getfilename(0, fname); lcd_setstatus(longFilename[0] ? longFilename : fname); } - else - { + else { SERIAL_PROTOCOLPGM(MSG_SD_OPEN_FILE_FAIL); SERIAL_PROTOCOL(fname); SERIAL_PROTOCOLLNPGM("."); } } - else - { //write - if (!file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) - { + else { //write + if (!file.open(curDir, fname, O_CREAT | O_APPEND | O_WRITE | O_TRUNC)) { SERIAL_PROTOCOLPGM(MSG_SD_OPEN_FILE_FAIL); SERIAL_PROTOCOL(fname); SERIAL_PROTOCOLLNPGM("."); } - else - { + else { saving = true; SERIAL_PROTOCOLPGM(MSG_SD_WRITE_TO_FILE); SERIAL_PROTOCOLLN(name); lcd_setstatus(fname); } } - } -void CardReader::removeFile(char* name) -{ - if(!cardOK) - return; +void CardReader::removeFile(char* name) { + if (!cardOK) return; + file.close(); sdprinting = false; - - + SdFile myDir; - curDir=&root; - char *fname=name; - - char *dirname_start,*dirname_end; - if(name[0]=='/') - { - dirname_start=strchr(name,'/')+1; - while(dirname_start>0) - { - dirname_end=strchr(dirname_start,'/'); - //SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start-name)); - //SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end-name)); - if(dirname_end>0 && dirname_end>dirname_start) - { + curDir = &root; + char *fname = name; + + char *dirname_start, *dirname_end; + if (name[0] == '/') { + dirname_start = strchr(name, '/') + 1; + while (dirname_start > 0) { + dirname_end = strchr(dirname_start, '/'); + //SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start - name)); + //SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end - name)); + if (dirname_end > 0 && dirname_end > dirname_start) { char subdirname[FILENAME_LENGTH]; - strncpy(subdirname, dirname_start, dirname_end-dirname_start); - subdirname[dirname_end-dirname_start]=0; + strncpy(subdirname, dirname_start, dirname_end - dirname_start); + subdirname[dirname_end - dirname_start] = 0; SERIAL_ECHOLN(subdirname); - if(!myDir.open(curDir,subdirname,O_READ)) - { + if (!myDir.open(curDir, subdirname, O_READ)) { SERIAL_PROTOCOLPGM("open failed, File: "); SERIAL_PROTOCOL(subdirname); SERIAL_PROTOCOLLNPGM("."); return; } - else - { + else { //SERIAL_ECHOLN("dive ok"); } - - curDir=&myDir; - dirname_start=dirname_end+1; + + curDir = &myDir; + dirname_start = dirname_end + 1; } - else // the reminder after all /fsa/fdsa/ is the filename - { - fname=dirname_start; - //SERIAL_ECHOLN("remaider"); + else { // the remainder after all /fsa/fdsa/ is the filename + fname = dirname_start; + //SERIAL_ECHOLN("remainder"); //SERIAL_ECHOLN(fname); break; } - } } - else //relative path - { - curDir=&workDir; + else { // relative path + curDir = &workDir; + } + + if (file.remove(curDir, fname)) { + SERIAL_PROTOCOLPGM("File deleted:"); + SERIAL_PROTOCOLLN(fname); + sdpos = 0; + } + else { + SERIAL_PROTOCOLPGM("Deletion failed, File: "); + SERIAL_PROTOCOL(fname); + SERIAL_PROTOCOLLNPGM("."); } - if (file.remove(curDir, fname)) - { - SERIAL_PROTOCOLPGM("File deleted:"); - SERIAL_PROTOCOLLN(fname); - sdpos = 0; - } - else - { - SERIAL_PROTOCOLPGM("Deletion failed, File: "); - SERIAL_PROTOCOL(fname); - SERIAL_PROTOCOLLNPGM("."); - } - } -void CardReader::getStatus() -{ - if(cardOK){ +void CardReader::getStatus() { + if (cardOK) { SERIAL_PROTOCOLPGM(MSG_SD_PRINTING_BYTE); SERIAL_PROTOCOL(sdpos); SERIAL_PROTOCOLPGM("/"); SERIAL_PROTOCOLLN(filesize); } - else{ + else { SERIAL_PROTOCOLLNPGM(MSG_SD_NOT_PRINTING); } } -void CardReader::write_command(char *buf) -{ + +void CardReader::write_command(char *buf) { char* begin = buf; char* npos = 0; char* end = buf + strlen(buf) - 1; file.writeError = false; - if((npos = strchr(buf, 'N')) != NULL) - { + if ((npos = strchr(buf, 'N')) != NULL) { begin = strchr(npos, ' ') + 1; end = strchr(npos, '*') - 1; } @@ -484,162 +391,129 @@ void CardReader::write_command(char *buf) end[2] = '\n'; end[3] = '\0'; file.write(begin); - if (file.writeError) - { + if (file.writeError) { SERIAL_ERROR_START; SERIAL_ERRORLNPGM(MSG_SD_ERR_WRITE_TO_FILE); } } +void CardReader::checkautostart(bool force) { + if (!force && (!autostart_stilltocheck || autostart_atmillis < millis())) + return; -void CardReader::checkautostart(bool force) -{ - if(!force) - { - if(!autostart_stilltocheck) - return; - if(autostart_atmillis 0) - { - for(int8_t i=0;i<(int8_t)strlen((char*)p.name);i++) - p.name[i]=tolower(p.name[i]); - //Serial.print((char*)p.name); - //Serial.print(" "); - //Serial.println(autoname); - if(p.name[9]!='~') //skip safety copies - if(strncmp((char*)p.name,autoname,5)==0) - { - char cmd[30]; + bool found = false; + while (root.readDir(p, NULL) > 0) { + for (int8_t i = 0; i < (int8_t)strlen((char*)p.name); i++) p.name[i] = tolower(p.name[i]); + if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) { + char cmd[30]; sprintf_P(cmd, PSTR("M23 %s"), autoname); enquecommand(cmd); enquecommands_P(PSTR("M24")); - found=true; + found = true; } } - if(!found) - autostart_index=-1; + if (!found) + autostart_index = -1; else autostart_index++; } -void CardReader::closefile(bool store_location) -{ +void CardReader::closefile(bool store_location) { file.sync(); file.close(); - saving = false; - logging = false; - - if(store_location) - { + saving = logging = false; + + if (store_location) { //future: store printer state, filename and position for continuing a stopped print // so one can unplug the printer and continue printing the next day. - } - - } -void CardReader::getfilename(uint16_t nr, const char * const match/*=NULL*/) -{ - curDir=&workDir; - lsAction=LS_GetFilename; - nrFiles=nr; +/** + * Get the name of a file in the current directory by index + */ +void CardReader::getfilename(uint16_t nr, const char * const match/*=NULL*/) { + curDir = &workDir; + lsAction = LS_GetFilename; + nrFiles = nr; curDir->rewind(); - lsDive("",*curDir,match); - + lsDive("", *curDir, match); } -uint16_t CardReader::getnrfilenames() -{ - curDir=&workDir; - lsAction=LS_Count; - nrFiles=0; +uint16_t CardReader::getnrfilenames() { + curDir = &workDir; + lsAction = LS_Count; + nrFiles = 0; curDir->rewind(); - lsDive("",*curDir); + lsDive("", *curDir); //SERIAL_ECHOLN(nrFiles); return nrFiles; } -void CardReader::chdir(const char * relpath) -{ +void CardReader::chdir(const char * relpath) { SdFile newfile; - SdFile *parent=&root; - - if(workDir.isOpen()) - parent=&workDir; - - if(!newfile.open(*parent,relpath, O_READ)) - { - SERIAL_ECHO_START; - SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR); - SERIAL_ECHOLN(relpath); + SdFile *parent = &root; + + if (workDir.isOpen()) parent = &workDir; + + if (!newfile.open(*parent, relpath, O_READ)) { + SERIAL_ECHO_START; + SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR); + SERIAL_ECHOLN(relpath); } - else - { + else { if (workDirDepth < MAX_DIR_DEPTH) { - for (int d = ++workDirDepth; d--;) - workDirParents[d+1] = workDirParents[d]; - workDirParents[0]=*parent; + ++workDirDepth; + for (int d = workDirDepth; d--;) workDirParents[d + 1] = workDirParents[d]; + workDirParents[0] = *parent; } - workDir=newfile; + workDir = newfile; } } -void CardReader::updir() -{ - if(workDirDepth > 0) - { +void CardReader::updir() { + if (workDirDepth > 0) { --workDirDepth; workDir = workDirParents[0]; - int d; for (int d = 0; d < workDirDepth; d++) workDirParents[d] = workDirParents[d+1]; } } - -void CardReader::printingHasFinished() -{ - st_synchronize(); - if(file_subcall_ctr>0) //heading up to a parent file that called current as a procedure. - { - file.close(); - file_subcall_ctr--; - openFile(filenames[file_subcall_ctr],true,true); - setIndex(filespos[file_subcall_ctr]); - startFileprint(); - } - else - { - quickStop(); - file.close(); - sdprinting = false; - if(SD_FINISHED_STEPPERRELEASE) - { - //finishAndDisableSteppers(); - enquecommands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); - } - autotempShutdown(); +void CardReader::printingHasFinished() { + st_synchronize(); + if (file_subcall_ctr > 0) { // Heading up to a parent file that called current as a procedure. + file.close(); + file_subcall_ctr--; + openFile(filenames[file_subcall_ctr], true, true); + setIndex(filespos[file_subcall_ctr]); + startFileprint(); + } + else { + quickStop(); + file.close(); + sdprinting = false; + if (SD_FINISHED_STEPPERRELEASE) { + //finishAndDisableSteppers(); + enquecommands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); } + autotempShutdown(); + } } + #endif //SDSUPPORT diff --git a/Marlin/cardreader.h b/Marlin/cardreader.h index a1da3d64a3..b55d09a65a 100644 --- a/Marlin/cardreader.h +++ b/Marlin/cardreader.h @@ -3,21 +3,21 @@ #ifdef SDSUPPORT -#define MAX_DIR_DEPTH 10 +#define MAX_DIR_DEPTH 10 // Maximum folder depth #include "SdFile.h" -enum LsAction {LS_SerialPrint,LS_Count,LS_GetFilename}; -class CardReader -{ +enum LsAction { LS_SerialPrint, LS_Count, LS_GetFilename }; + +class CardReader { public: CardReader(); - + void initsd(); void write_command(char *buf); //files auto[0-9].g on the sd card are performed in a row //this is to delay autostart and hence the initialisaiton of the sd card to some seconds after the normal init, so the device is available quick after a reset - void checkautostart(bool x); + void checkautostart(bool x); void openFile(char* name,bool read,bool replace_current=true); void openLogFile(char* name); void removeFile(char* name); @@ -30,9 +30,8 @@ public: void getfilename(uint16_t nr, const char* const match=NULL); uint16_t getnrfilenames(); - + void getAbsFilename(char *t); - void ls(); void chdir(const char * relpath); @@ -41,56 +40,52 @@ public: FORCE_INLINE bool isFileOpen() { return file.isOpen(); } - FORCE_INLINE bool eof() { return sdpos>=filesize ;}; - FORCE_INLINE int16_t get() { sdpos = file.curPosition();return (int16_t)file.read();}; - FORCE_INLINE void setIndex(long index) {sdpos = index;file.seekSet(index);}; - FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;}; - FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;}; + FORCE_INLINE bool eof() { return sdpos >= filesize; } + FORCE_INLINE int16_t get() { sdpos = file.curPosition(); return (int16_t)file.read(); } + FORCE_INLINE void setIndex(long index) { sdpos = index; file.seekSet(index); } + FORCE_INLINE uint8_t percentDone() { return (isFileOpen() && filesize) ? sdpos / ((filesize + 99) / 100) : 0; } + FORCE_INLINE char* getWorkDirName() { workDir.getFilename(filename); return filename; } public: - bool saving; - bool logging; - bool sdprinting; - bool cardOK; - char filename[FILENAME_LENGTH]; - char longFilename[LONG_FILENAME_LENGTH]; - bool filenameIsDir; + bool saving, logging, sdprinting, cardOK, filenameIsDir; + char filename[FILENAME_LENGTH], longFilename[LONG_FILENAME_LENGTH]; int autostart_index; private: - SdFile root,*curDir,workDir,workDirParents[MAX_DIR_DEPTH]; + SdFile root, *curDir, workDir, workDirParents[MAX_DIR_DEPTH]; uint16_t workDirDepth; Sd2Card card; SdVolume volume; SdFile file; #define SD_PROCEDURE_DEPTH 1 - #define MAXPATHNAMELENGTH (FILENAME_LENGTH*MAX_DIR_DEPTH+MAX_DIR_DEPTH+1) + #define MAXPATHNAMELENGTH (FILENAME_LENGTH*MAX_DIR_DEPTH + MAX_DIR_DEPTH + 1) uint8_t file_subcall_ctr; uint32_t filespos[SD_PROCEDURE_DEPTH]; char filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; uint32_t filesize; - //int16_t n; unsigned long autostart_atmillis; - uint32_t sdpos ; + uint32_t sdpos; bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware. - + LsAction lsAction; //stored for recursion. - int16_t nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory. + uint16_t nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory. char* diveDirName; void lsDive(const char *prepend, SdFile parent, const char * const match=NULL); }; + extern CardReader card; + #define IS_SD_PRINTING (card.sdprinting) #if (SDCARDDETECT > -1) -# ifdef SDCARDDETECTINVERTED -# define IS_SD_INSERTED (READ(SDCARDDETECT)!=0) -# else -# define IS_SD_INSERTED (READ(SDCARDDETECT)==0) -# endif //SDCARDTETECTINVERTED + #ifdef SDCARDDETECTINVERTED + #define IS_SD_INSERTED (READ(SDCARDDETECT) != 0) + #else + #define IS_SD_INSERTED (READ(SDCARDDETECT) == 0) + #endif #else -//If we don't have a card detect line, aways asume the card is inserted -# define IS_SD_INSERTED true + //No card detect line? Assume the card is inserted. + #define IS_SD_INSERTED true #endif #else @@ -98,4 +93,5 @@ extern CardReader card; #define IS_SD_PRINTING (false) #endif //SDSUPPORT -#endif + +#endif //__CARDREADER_H diff --git a/Marlin/digipot_mcp4451.cpp b/Marlin/digipot_mcp4451.cpp index 0ced287aa0..22d2700253 100644 --- a/Marlin/digipot_mcp4451.cpp +++ b/Marlin/digipot_mcp4451.cpp @@ -1,59 +1,58 @@ #include "Configuration.h" #ifdef DIGIPOT_I2C + #include "Stream.h" #include "utility/twi.h" #include "Wire.h" // Settings for the I2C based DIGIPOT (MCP4451) on Azteeg X3 Pro #if MB(5DPRINT) -#define DIGIPOT_I2C_FACTOR 117.96 -#define DIGIPOT_I2C_MAX_CURRENT 1.736 + #define DIGIPOT_I2C_FACTOR 117.96 + #define DIGIPOT_I2C_MAX_CURRENT 1.736 #else -#define DIGIPOT_I2C_FACTOR 106.7 -#define DIGIPOT_I2C_MAX_CURRENT 2.5 + #define DIGIPOT_I2C_FACTOR 106.7 + #define DIGIPOT_I2C_MAX_CURRENT 2.5 #endif -static byte current_to_wiper( float current ){ - return byte(ceil(float((DIGIPOT_I2C_FACTOR*current)))); +static byte current_to_wiper(float current) { + return byte(ceil(float((DIGIPOT_I2C_FACTOR*current)))); } -static void i2c_send(byte addr, byte a, byte b) -{ - Wire.beginTransmission(addr); - Wire.write(a); - Wire.write(b); - Wire.endTransmission(); +static void i2c_send(byte addr, byte a, byte b) { + Wire.beginTransmission(addr); + Wire.write(a); + Wire.write(b); + Wire.endTransmission(); } // This is for the MCP4451 I2C based digipot -void digipot_i2c_set_current( int channel, float current ) -{ - current = min( (float) max( current, 0.0f ), DIGIPOT_I2C_MAX_CURRENT); - // these addresses are specific to Azteeg X3 Pro, can be set to others, - // In this case first digipot is at address A0=0, A1= 0, second one is at A0=0, A1= 1 - byte addr= 0x2C; // channel 0-3 - if(channel >= 4) { - addr= 0x2E; // channel 4-7 - channel-= 4; - } - - // Initial setup - i2c_send( addr, 0x40, 0xff ); - i2c_send( addr, 0xA0, 0xff ); - - // Set actual wiper value - byte addresses[4] = { 0x00, 0x10, 0x60, 0x70 }; - i2c_send( addr, addresses[channel], current_to_wiper(current) ); +void digipot_i2c_set_current(int channel, float current) { + current = min( (float) max( current, 0.0f ), DIGIPOT_I2C_MAX_CURRENT); + // these addresses are specific to Azteeg X3 Pro, can be set to others, + // In this case first digipot is at address A0=0, A1= 0, second one is at A0=0, A1= 1 + byte addr = 0x2C; // channel 0-3 + if (channel >= 4) { + addr = 0x2E; // channel 4-7 + channel -= 4; + } + + // Initial setup + i2c_send(addr, 0x40, 0xff); + i2c_send(addr, 0xA0, 0xff); + + // Set actual wiper value + byte addresses[4] = { 0x00, 0x10, 0x60, 0x70 }; + i2c_send(addr, addresses[channel], current_to_wiper(current)); } -void digipot_i2c_init() -{ - const float digipot_motor_current[] = DIGIPOT_I2C_MOTOR_CURRENTS; - Wire.begin(); - // setup initial currents as defined in Configuration_adv.h - for(int i=0;i<=sizeof(digipot_motor_current)/sizeof(float);i++) { - digipot_i2c_set_current(i, digipot_motor_current[i]); - } +void digipot_i2c_init() { + const float digipot_motor_current[] = DIGIPOT_I2C_MOTOR_CURRENTS; + Wire.begin(); + // setup initial currents as defined in Configuration_adv.h + for(int i = 0; i <= sizeof(digipot_motor_current) / sizeof(float); i++) { + digipot_i2c_set_current(i, digipot_motor_current[i]); + } } -#endif + +#endif //DIGIPOT_I2C From 20e59dc61e3bdcf30d08576f7b3183a7537021cc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 2 Mar 2015 07:56:11 -0800 Subject: [PATCH 11/12] Don't skip files starting with underscores --- Marlin/cardreader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/cardreader.cpp b/Marlin/cardreader.cpp index ad79892b59..7ee7df40ba 100644 --- a/Marlin/cardreader.cpp +++ b/Marlin/cardreader.cpp @@ -72,9 +72,9 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m else { char pn0 = p.name[0]; if (pn0 == DIR_NAME_FREE) break; - if (pn0 == DIR_NAME_DELETED || pn0 == '.' || pn0 == '_') continue; + if (pn0 == DIR_NAME_DELETED || pn0 == '.') continue; char lf0 = longFilename[0]; - if (lf0 == '.' || lf0 == '_') continue; + if (lf0 == '.') continue; if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue; From 715104e4775125dc46919c6af68d24e77232ed48 Mon Sep 17 00:00:00 2001 From: alexborro Date: Mon, 2 Mar 2015 13:36:58 -0300 Subject: [PATCH 12/12] Fix Endstop check for CoreXY bots. The X_Axis could not home to min while Y_Max endstop was trigged. --- Marlin/Marlin.h | 4 +- Marlin/stepper.cpp | 147 ++++++++++++++++++++++----------------------- 2 files changed, 73 insertions(+), 78 deletions(-) diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index 25c77c4ee7..f335a338d7 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -180,8 +180,8 @@ void manage_inactivity(bool ignore_stepper_queue=false); #define disable_e3() /* nothing */ #endif -enum AxisEnum {X_AXIS=0, Y_AXIS=1, Z_AXIS=2, E_AXIS=3, X_HEAD=4, Y_HEAD=5}; - +enum AxisEnum {X_AXIS=0, Y_AXIS=1, Z_AXIS=2, E_AXIS=3, X_HEAD=4, Y_HEAD=5}; +//X_HEAD and Y_HEAD is used for systems that don't have a 1:1 relationship between X_AXIS and X Head movement, like CoreXY bots. void FlushSerialRequestResend(); void ClearToSend(); diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp index 8e49d2b3be..12ebd8dac8 100644 --- a/Marlin/stepper.cpp +++ b/Marlin/stepper.cpp @@ -399,89 +399,84 @@ ISR(TIMER1_COMPA_vect) count_direction[Y_AXIS]=1; } - // Set direction en check limit switches - #ifndef COREXY - if ((out_bits & (1<active_extruder == 0 && X_HOME_DIR == -1) - || (current_block->active_extruder != 0 && X2_HOME_DIR == -1)) - #endif - { - #if defined(X_MIN_PIN) && X_MIN_PIN > -1 - bool x_min_endstop=(READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING); - if(x_min_endstop && old_x_min_endstop && (current_block->steps_x > 0)) { - endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; - endstop_x_hit=true; - step_events_completed = current_block->step_event_count; + #ifndef COREXY + if ((out_bits & (1<steps_x == current_block->steps_y) && ((out_bits & (1<>X_AXIS != (out_bits & (1<>Y_AXIS))) // AlexBorro: If DeltaX == -DeltaY, the movement is only in Y axis + if ((out_bits & (1<active_extruder == 0 && X_HOME_DIR == -1) || (current_block->active_extruder != 0 && X2_HOME_DIR == -1)) + #endif + { + #if defined(X_MIN_PIN) && X_MIN_PIN > -1 + bool x_min_endstop=(READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING); + if(x_min_endstop && old_x_min_endstop && (current_block->steps_x > 0)) + { + endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; + endstop_x_hit=true; + step_events_completed = current_block->step_event_count; + } + old_x_min_endstop = x_min_endstop; + #endif } - old_x_min_endstop = x_min_endstop; - #endif } - } - } - else - { // +direction - CHECK_ENDSTOPS - { - #ifdef DUAL_X_CARRIAGE - // with 2 x-carriages, endstops are only checked in the homing direction for the active extruder - if ((current_block->active_extruder == 0 && X_HOME_DIR == 1) - || (current_block->active_extruder != 0 && X2_HOME_DIR == 1)) - #endif - { - #if defined(X_MAX_PIN) && X_MAX_PIN > -1 - bool x_max_endstop=(READ(X_MAX_PIN) != X_MAX_ENDSTOP_INVERTING); - if(x_max_endstop && old_x_max_endstop && (current_block->steps_x > 0)){ - endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; - endstop_x_hit=true; - step_events_completed = current_block->step_event_count; + else + { // +direction + #ifdef DUAL_X_CARRIAGE + // with 2 x-carriages, endstops are only checked in the homing direction for the active extruder + if ((current_block->active_extruder == 0 && X_HOME_DIR == 1) || (current_block->active_extruder != 0 && X2_HOME_DIR == 1)) + #endif + { + #if defined(X_MAX_PIN) && X_MAX_PIN > -1 + bool x_max_endstop=(READ(X_MAX_PIN) != X_MAX_ENDSTOP_INVERTING); + if(x_max_endstop && old_x_max_endstop && (current_block->steps_x > 0)) + { + endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; + endstop_x_hit=true; + step_events_completed = current_block->step_event_count; + } + old_x_max_endstop = x_max_endstop; + #endif } - old_x_max_endstop = x_max_endstop; - #endif } - } - } - #ifndef COREXY - if ((out_bits & (1< -1 - bool y_min_endstop=(READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING); - if(y_min_endstop && old_y_min_endstop && (current_block->steps_y > 0)) { - endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; - endstop_y_hit=true; - step_events_completed = current_block->step_event_count; - } - old_y_min_endstop = y_min_endstop; - #endif - } - } - else - { // +direction - CHECK_ENDSTOPS - { - #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 - bool y_max_endstop=(READ(Y_MAX_PIN) != Y_MAX_ENDSTOP_INVERTING); - if(y_max_endstop && old_y_max_endstop && (current_block->steps_y > 0)){ - endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; - endstop_y_hit=true; - step_events_completed = current_block->step_event_count; - } - old_y_max_endstop = y_max_endstop; + #ifndef COREXY + if ((out_bits & (1<steps_x == current_block->steps_y) && ((out_bits & (1<>X_AXIS == (out_bits & (1<>Y_AXIS))) // AlexBorro: If DeltaX == DeltaY, the movement is only in X axis + if ((out_bits & (1< -1 + bool y_min_endstop=(READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING); + if(y_min_endstop && old_y_min_endstop && (current_block->steps_y > 0)) + { + endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; + endstop_y_hit=true; + step_events_completed = current_block->step_event_count; + } + old_y_min_endstop = y_min_endstop; + #endif + } + else + { // +direction + #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 + bool y_max_endstop=(READ(Y_MAX_PIN) != Y_MAX_ENDSTOP_INVERTING); + if(y_max_endstop && old_y_max_endstop && (current_block->steps_y > 0)) + { + endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; + endstop_y_hit=true; + step_events_completed = current_block->step_event_count; + } + old_y_max_endstop = y_max_endstop; + #endif + + } } if ((out_bits & (1<