diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 995daa7b8e..3374ba6217 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1814,8 +1814,12 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_1 is required with TEMP_SENSOR_1_AS_REDUNDANT." #endif -#if MAX6675_IS_MAX31865 && !(defined(MAX31865_SENSOR_OHMS) && defined(MAX31865_CALIBRATION_OHMS)) - #error "MAX31865_SENSOR_OHMS and MAX31865_CALIBRATION_OHMS must be set in Configuration.h when using a MAX31865 temperature sensor." +#if MAX6675_IS_MAX31865 && (!defined(MAX31865_SENSOR_OHMS_0) || !defined(MAX31865_CALIBRATION_OHMS_0)) //ga + #error "MAX31865_SENSOR_OHMS_0 and MAX31865_CALIBRATION_OHMS_0 must be set in Configuration.h when using a MAX31865 temperature sensor on TEMP_SENSOR_0." +#endif + +#if MAX6675_IS_MAX31865 && (!defined(MAX31865_SENSOR_OHMS_1) || !defined(MAX31865_CALIBRATION_OHMS_1)) && TEMP_SENSOR_1 == -5 //ga + #error "MAX31865_SENSOR_OHMS_1 and MAX31865_CALIBRATION_OHMS_1 must be set in Configuration.h when using a MAX31865 temperature sensor on TEMP_SENSOR_1." #endif /** diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index b476b35593..26c2ca60b2 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -49,6 +49,11 @@ #ifndef MAX31865_CS_PIN #define MAX31865_CS_PIN MAX6675_SS_PIN // HW:49 SW:65 for example #endif + #if TEMP_SENSOR_1 == -5 + #ifndef MAX31865_CS2_PIN + #define MAX31865_CS2_PIN MAX6675_SS2_PIN + #endif + #endif #ifndef MAX31865_MOSI_PIN #define MAX31865_MOSI_PIN MOSI_PIN // 63 #endif @@ -58,13 +63,24 @@ #ifndef MAX31865_SCK_PIN #define MAX31865_SCK_PIN MAX6675_SCK_PIN // 40 #endif - Adafruit_MAX31865 max31865 = Adafruit_MAX31865(MAX31865_CS_PIN + Adafruit_MAX31865 max31865_0 = Adafruit_MAX31865(MAX31865_CS_PIN //ga #if MAX31865_CS_PIN != MAX6675_SS_PIN , MAX31865_MOSI_PIN // For software SPI also set MOSI/MISO/SCK , MAX31865_MISO_PIN , MAX31865_SCK_PIN #endif ); + #if TEMP_SENSOR_1 == -5 //ga + #if MAX31865_CS2_PIN + Adafruit_MAX31865 max31865_1 = Adafruit_MAX31865(MAX31865_CS2_PIN + #if MAX31865_CS2_PIN != MAX6675_SS2_PIN + , MAX31865_MOSI_PIN // For software SPI also set MOSI/MISO/SCK + , MAX31865_MISO_PIN + , MAX31865_SCK_PIN + #endif + ); + #endif + #endif #endif #define MAX6675_SEPARATE_SPI (EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) && PINS_EXIST(MAX6675_SCK, MAX6675_DO)) @@ -1473,7 +1489,7 @@ void Temperature::manage_heater() { #elif HEATER_0_USES_MAX6675 return ( #if MAX6675_IS_MAX31865 - max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS) + max31865_0.temperature(MAX31865_SENSOR_OHMS_0, MAX31865_CALIBRATION_OHMS_0) //ga #else raw * 0.25 #endif @@ -1489,7 +1505,13 @@ void Temperature::manage_heater() { #if HEATER_1_USER_THERMISTOR return user_thermistor_to_deg_c(CTI_HOTEND_1, raw); #elif HEATER_1_USES_MAX6675 - return raw * 0.25; + return ( + #if TEMP_SENSOR_1 == -5 + max31865_1.temperature(MAX31865_SENSOR_OHMS_1, MAX31865_CALIBRATION_OHMS_1) //ga + #else + raw * 0.25 + #endif + ); #elif HEATER_1_USES_AD595 return TEMP_AD595(raw); #elif HEATER_1_USES_AD8495 @@ -1691,7 +1713,11 @@ void Temperature::updateTemperaturesFromRawValues() { */ void Temperature::init() { - TERN_(MAX6675_IS_MAX31865, max31865.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE + TERN_(MAX6675_IS_MAX31865, max31865_0.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE //ga + + #if TEMP_SENSOR_1 == -5 + TERN_(MAX6675_IS_MAX31865, max31865_1.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE //ga + #endif #if EARLY_WATCHDOG // Flag that the thermalManager should be running @@ -2221,6 +2247,11 @@ void Temperature::disable_all_heaters() { #define MAX6675_ERROR_MASK 7 #define MAX6675_DISCARD_BITS 18 #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 + #elif ENABLED(MAX6675_IS_MAX31865) //ga + static uint16_t max6675_temp = 2000; //from datasheet 16 bits D15-D0 + #define MAX6675_ERROR_MASK 1 //D0 Bit not used + #define MAX6675_DISCARD_BITS 1 //data is in D15-D1 + #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64 #else static uint16_t max6675_temp = 2000; #define MAX6675_ERROR_MASK 4 @@ -2242,8 +2273,16 @@ void Temperature::disable_all_heaters() { next_max6675_ms[hindex] = ms + MAX6675_HEAT_INTERVAL; - #if MAX6675_IS_MAX31865 - max6675_temp = int(max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS)); + #if COUNT_6675 == 1 && MAX6675_IS_MAX31865 + max6675_temp = int(max31865_0.temperature(MAX31865_SENSOR_OHMS_0, MAX31865_CALIBRATION_OHMS_0)); //ga + #endif + + #if COUNT_6675 > 1 && MAX6675_IS_MAX31865 + #if hindex == 0 + max6675_temp = int(max31865_0.temperature(MAX31865_SENSOR_OHMS_0, MAX31865_CALIBRATION_OHMS_0)); //ga + #elif hindex == 1 + max6675_temp = int(max31865_1.temperature(MAX31865_SENSOR_OHMS_1, MAX31865_CALIBRATION_OHMS_1)); + #endif #endif // @@ -2285,7 +2324,18 @@ void Temperature::disable_all_heaters() { WRITE_MAX6675(HIGH); // disable TT_MAX6675 - if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max6675_temp & MAX6675_ERROR_MASK)) { + uint8_t fault = 1; + #if (COUNT_6675 == 1 && ENABLED(MAX6675_IS_MAX31865)) + fault = max31865_0.readFault(); + #elif ENABLED(MAX6675_IS_MAX31865) + #if hindex == 0 + fault = max31865_0.readFault(); //ga + #elif hindex == 1 + fault = max31865_1.readFault(); + #endif + #endif + + if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max6675_temp & MAX6675_ERROR_MASK) && fault) { //ga max6675_errors[hindex] += 1; if (max6675_errors[hindex] > THERMOCOUPLE_MAX_ERRORS) { SERIAL_ERROR_START(); @@ -2298,6 +2348,32 @@ void Temperature::disable_all_heaters() { SERIAL_ECHOLNPGM("Short to GND"); else if (max6675_temp & 4) SERIAL_ECHOLNPGM("Short to VCC"); + #elif MAX6675_ERROR_MASK == 1 //ga + if (fault) { + SERIAL_ECHOPAIR("MAX31865 Fault :(", fault, ") >>"); + if (fault & MAX31865_FAULT_HIGHTHRESH) + SERIAL_ECHOLNPGM("RTD High Threshold"); + else if (fault & MAX31865_FAULT_LOWTHRESH) + SERIAL_ECHOLNPGM("RTD Low Threshold"); + else if (fault & MAX31865_FAULT_REFINLOW) + SERIAL_ECHOLNPGM("REFIN- > 0.85 x Bias"); + else if (fault & MAX31865_FAULT_REFINHIGH) + SERIAL_ECHOLNPGM("REFIN- < 0.85 x Bias - FORCE- open"); + else if (fault & MAX31865_FAULT_RTDINLOW) + SERIAL_ECHOLNPGM("REFIN- < 0.85 x Bias - FORCE- open"); + else if (fault & MAX31865_FAULT_OVUV) + SERIAL_ECHOLNPGM("Under/Over voltage"); + + #if COUNT_6675 == 1 + max31865_0.clearFault(); + #else + #if hindex == 0 + max31865_0.clearFault(); + #elif hindex == 1 + max31865_1.clearFault(); + #endif + #endif + } #else SERIAL_ECHOLNPGM("MAX6675"); #endif