diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index 26360a514..cf431cc6f 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -177,7 +177,7 @@ static volatile bool temp_meas_ready = false; // Init min and max temp with extreme values to prevent false errors during startup static int minttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_LO_TEMP , HEATER_1_RAW_LO_TEMP , HEATER_2_RAW_LO_TEMP, HEATER_3_RAW_LO_TEMP); static int maxttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_HI_TEMP , HEATER_1_RAW_HI_TEMP , HEATER_2_RAW_HI_TEMP, HEATER_3_RAW_HI_TEMP); -static int minttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS( 0, 0, 0, 0 ); +static int minttemp[EXTRUDERS] = { 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 @@ -197,8 +197,8 @@ 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] = { 0 }; + unsigned long watchmillis[EXTRUDERS] = { 0 }; #endif //WATCH_TEMP_PERIOD #ifndef SOFT_PWM_SCALE @@ -661,12 +661,6 @@ void manage_heater() { updateTemperaturesFromRawValues(); - #ifdef HEATER_0_USES_MAX6675 - 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 - unsigned long ms = millis(); // Loop through all extruders @@ -1145,28 +1139,28 @@ void disable_heater() { for (int i=0; i 1 && HAS_TEMP_1 - target_temperature[1] = 0; - soft_pwm[1] = 0; - WRITE_HEATER_1(LOW); + DISABLE_HEATER(1); #endif #if EXTRUDERS > 2 && HAS_TEMP_2 - target_temperature[2] = 0; - soft_pwm[2] = 0; - WRITE_HEATER_2(LOW); + DISABLE_HEATER(2); #endif #if EXTRUDERS > 3 && HAS_TEMP_3 - target_temperature[3] = 0; - soft_pwm[3] = 0; - WRITE_HEATER_3(LOW); + DISABLE_HEATER(3); #endif #if HAS_TEMP_BED @@ -1257,9 +1251,15 @@ enum TempState { // Timer 0 is shared with millies // ISR(TIMER0_COMPB_vect) { + #ifdef TEMP_SENSOR_1_AS_REDUNDANT + #define TEMP_SENSOR_COUNT 2 + #else + #define TEMP_SENSOR_COUNT EXTRUDERS + #endif + //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_value[EXTRUDERS] = { 0 }; + static unsigned long raw_temp_value[TEMP_SENSOR_COUNT] = { 0 }; static unsigned long raw_temp_bed_value = 0; static TempState temp_state = StartupDelay; static unsigned char pwm_count = BIT(SOFT_PWM_SCALE); @@ -1475,6 +1475,7 @@ ISR(TIMER0_COMPB_vect) { #endif temp_state = PrepareTemp_BED; break; + case PrepareTemp_BED: #if HAS_TEMP_BED START_ADC(TEMP_BED_PIN); @@ -1488,6 +1489,7 @@ ISR(TIMER0_COMPB_vect) { #endif temp_state = PrepareTemp_1; break; + case PrepareTemp_1: #if HAS_TEMP_1 START_ADC(TEMP_1_PIN); @@ -1501,6 +1503,7 @@ ISR(TIMER0_COMPB_vect) { #endif temp_state = PrepareTemp_2; break; + case PrepareTemp_2: #if HAS_TEMP_2 START_ADC(TEMP_2_PIN); @@ -1514,6 +1517,7 @@ ISR(TIMER0_COMPB_vect) { #endif temp_state = PrepareTemp_3; break; + case PrepareTemp_3: #if HAS_TEMP_3 START_ADC(TEMP_3_PIN); @@ -1527,6 +1531,7 @@ ISR(TIMER0_COMPB_vect) { #endif temp_state = Prepare_FILWIDTH; break; + case Prepare_FILWIDTH: #if HAS_FILAMENT_SENSOR START_ADC(FILWIDTH_PIN); @@ -1545,6 +1550,7 @@ ISR(TIMER0_COMPB_vect) { temp_state = PrepareTemp_0; temp_count++; break; + case StartupDelay: temp_state = PrepareTemp_0; break; @@ -1554,7 +1560,7 @@ ISR(TIMER0_COMPB_vect) { // 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 @@ -1579,52 +1585,53 @@ ISR(TIMER0_COMPB_vect) { #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; - for (int i = 0; i < EXTRUDERS; i++) raw_temp_value[i] = 0; + for (int i = 0; i < TEMP_SENSOR_COUNT; i++) raw_temp_value[i] = 0; raw_temp_bed_value = 0; - #if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP - #define GE0 <= - #define LE0 >= + #ifdef HEATER_0_USES_MAX6675 + 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); #else - #define GE0 >= - #define LE0 <= + #if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP + #define GE0 <= + #else + #define GE0 >= + #endif + if (current_temperature_raw[0] GE0 maxttemp_raw[0]) max_temp_error(0); + if (minttemp_raw[0] GE0 current_temperature_raw[0]) min_temp_error(0); #endif - if (current_temperature_raw[0] GE0 maxttemp_raw[0]) max_temp_error(0); - if (current_temperature_raw[0] LE0 minttemp_raw[0]) min_temp_error(0); #if EXTRUDERS > 1 #if HEATER_1_RAW_LO_TEMP > HEATER_1_RAW_HI_TEMP #define GE1 <= - #define LE1 >= #else #define GE1 >= - #define LE1 <= #endif if (current_temperature_raw[1] GE1 maxttemp_raw[1]) max_temp_error(1); - if (current_temperature_raw[1] LE1 minttemp_raw[1]) min_temp_error(1); + if (minttemp_raw[1] GE0 current_temperature_raw[1]) min_temp_error(1); + #if EXTRUDERS > 2 #if HEATER_2_RAW_LO_TEMP > HEATER_2_RAW_HI_TEMP #define GE2 <= - #define LE2 >= #else #define GE2 >= - #define LE2 <= #endif if (current_temperature_raw[2] GE2 maxttemp_raw[2]) max_temp_error(2); - if (current_temperature_raw[2] LE2 minttemp_raw[2]) min_temp_error(2); + if (minttemp_raw[2] GE0 current_temperature_raw[2]) min_temp_error(2); + #if EXTRUDERS > 3 #if HEATER_3_RAW_LO_TEMP > HEATER_3_RAW_HI_TEMP #define GE3 <= - #define LE3 >= #else #define GE3 >= - #define LE3 <= #endif if (current_temperature_raw[3] GE3 maxttemp_raw[3]) max_temp_error(3); - if (current_temperature_raw[3] LE3 minttemp_raw[3]) min_temp_error(3); + if (minttemp_raw[3] GE0 current_temperature_raw[3]) min_temp_error(3); + #endif // EXTRUDERS > 3 #endif // EXTRUDERS > 2 #endif // EXTRUDERS > 1 @@ -1632,10 +1639,8 @@ ISR(TIMER0_COMPB_vect) { #if defined(BED_MAXTEMP) && (TEMP_SENSOR_BED != 0) #if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP #define GEBED <= - #define LEBED >= #else #define GEBED >= - #define LEBED <= #endif if (current_temperature_bed_raw GEBED bed_maxttemp_raw) { target_temperature_bed = 0;