|
|
@ -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<EXTRUDERS; i++) setTargetHotend(0, i); |
|
|
|
setTargetBed(0); |
|
|
|
|
|
|
|
#define DISABLE_HEATER(NR) { \ |
|
|
|
target_temperature[NR] = 0; \ |
|
|
|
soft_pwm[NR] = 0; \ |
|
|
|
WRITE_HEATER_ ## NR (LOW); \ |
|
|
|
} |
|
|
|
|
|
|
|
#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
|
|
|
|
WRITE_HEATER_0P(LOW); // Should HEATERS_PARALLEL apply here? Then change to DISABLE_HEATER(0)
|
|
|
|
#endif |
|
|
|
|
|
|
|
#if EXTRUDERS > 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; |
|
|
|