|
@@ -44,30 +44,44 @@
|
44
|
44
|
#include "../lcd/extui/ui_api.h"
|
45
|
45
|
#endif
|
46
|
46
|
|
47
|
|
-#if MAX6675_IS_MAX31865
|
|
47
|
+#if MAX6675_0_IS_MAX31865 || MAX6675_1_IS_MAX31865
|
48
|
48
|
#include <Adafruit_MAX31865.h>
|
49
|
|
- #ifndef MAX31865_CS_PIN
|
50
|
|
- #define MAX31865_CS_PIN MAX6675_SS_PIN // HW:49 SW:65 for example
|
|
49
|
+ #if MAX6675_0_IS_MAX31865 && !defined(MAX31865_CS_PIN) && PIN_EXISTS(MAX6675_SS)
|
|
50
|
+ #define MAX31865_CS_PIN MAX6675_SS_PIN
|
|
51
|
+ #endif
|
|
52
|
+ #if MAX6675_1_IS_MAX31865 && !defined(MAX31865_CS2_PIN) && PIN_EXISTS(MAX6675_SS2)
|
|
53
|
+ #define MAX31865_CS2_PIN MAX6675_SS2_PIN
|
51
|
54
|
#endif
|
52
|
55
|
#ifndef MAX31865_MOSI_PIN
|
53
|
|
- #define MAX31865_MOSI_PIN MOSI_PIN // 63
|
|
56
|
+ #define MAX31865_MOSI_PIN MOSI_PIN
|
54
|
57
|
#endif
|
55
|
58
|
#ifndef MAX31865_MISO_PIN
|
56
|
|
- #define MAX31865_MISO_PIN MAX6675_DO_PIN // 42
|
|
59
|
+ #define MAX31865_MISO_PIN MAX6675_DO_PIN
|
57
|
60
|
#endif
|
58
|
61
|
#ifndef MAX31865_SCK_PIN
|
59
|
|
- #define MAX31865_SCK_PIN MAX6675_SCK_PIN // 40
|
|
62
|
+ #define MAX31865_SCK_PIN MAX6675_SCK_PIN
|
|
63
|
+ #endif
|
|
64
|
+ #if MAX6675_0_IS_MAX31865 && PIN_EXISTS(MAX31865_CS)
|
|
65
|
+ #define HAS_MAX31865 1
|
|
66
|
+ Adafruit_MAX31865 max31865_0 = Adafruit_MAX31865(MAX31865_CS_PIN
|
|
67
|
+ #if MAX31865_CS_PIN != MAX6675_SS_PIN
|
|
68
|
+ , MAX31865_MOSI_PIN, MAX31865_MISO_PIN, MAX31865_SCK_PIN // For software SPI also set MOSI/MISO/SCK
|
|
69
|
+ #endif
|
|
70
|
+ );
|
|
71
|
+ #endif
|
|
72
|
+ #if MAX6675_1_IS_MAX31865 && PIN_EXISTS(MAX31865_CS2)
|
|
73
|
+ #define HAS_MAX31865 1
|
|
74
|
+ Adafruit_MAX31865 max31865_1 = Adafruit_MAX31865(MAX31865_CS2_PIN
|
|
75
|
+ #if MAX31865_CS2_PIN != MAX6675_SS2_PIN
|
|
76
|
+ , MAX31865_MOSI_PIN, MAX31865_MISO_PIN, MAX31865_SCK_PIN // For software SPI also set MOSI/MISO/SCK
|
|
77
|
+ #endif
|
|
78
|
+ );
|
60
|
79
|
#endif
|
61
|
|
- Adafruit_MAX31865 max31865 = Adafruit_MAX31865(MAX31865_CS_PIN
|
62
|
|
- #if MAX31865_CS_PIN != MAX6675_SS_PIN
|
63
|
|
- , MAX31865_MOSI_PIN // For software SPI also set MOSI/MISO/SCK
|
64
|
|
- , MAX31865_MISO_PIN
|
65
|
|
- , MAX31865_SCK_PIN
|
66
|
|
- #endif
|
67
|
|
- );
|
68
|
80
|
#endif
|
69
|
81
|
|
70
|
|
-#define MAX6675_SEPARATE_SPI (EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) && PINS_EXIST(MAX6675_SCK, MAX6675_DO))
|
|
82
|
+#if EITHER(HEATER_0_USES_MAX6675, HEATER_1_USES_MAX6675) && PINS_EXIST(MAX6675_SCK, MAX6675_DO)
|
|
83
|
+ #define MAX6675_SEPARATE_SPI 1
|
|
84
|
+#endif
|
71
|
85
|
|
72
|
86
|
#if MAX6675_SEPARATE_SPI
|
73
|
87
|
#include "../libs/private_spi.h"
|
|
@@ -1471,13 +1485,7 @@ void Temperature::manage_heater() {
|
1471
|
1485
|
#if HEATER_0_USER_THERMISTOR
|
1472
|
1486
|
return user_thermistor_to_deg_c(CTI_HOTEND_0, raw);
|
1473
|
1487
|
#elif HEATER_0_USES_MAX6675
|
1474
|
|
- return (
|
1475
|
|
- #if MAX6675_IS_MAX31865
|
1476
|
|
- max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS)
|
1477
|
|
- #else
|
1478
|
|
- raw * 0.25
|
1479
|
|
- #endif
|
1480
|
|
- );
|
|
1488
|
+ return TERN(MAX6675_0_IS_MAX31865, max31865_0.temperature(MAX31865_SENSOR_OHMS_0, MAX31865_CALIBRATION_OHMS_0), raw * 0.25);
|
1481
|
1489
|
#elif HEATER_0_USES_AD595
|
1482
|
1490
|
return TEMP_AD595(raw);
|
1483
|
1491
|
#elif HEATER_0_USES_AD8495
|
|
@@ -1489,7 +1497,7 @@ void Temperature::manage_heater() {
|
1489
|
1497
|
#if HEATER_1_USER_THERMISTOR
|
1490
|
1498
|
return user_thermistor_to_deg_c(CTI_HOTEND_1, raw);
|
1491
|
1499
|
#elif HEATER_1_USES_MAX6675
|
1492
|
|
- return raw * 0.25;
|
|
1500
|
+ return TERN(MAX6675_1_IS_MAX31865, max31865_1.temperature(MAX31865_SENSOR_OHMS_1, MAX31865_CALIBRATION_OHMS_1), raw * 0.25);
|
1493
|
1501
|
#elif HEATER_1_USES_AD595
|
1494
|
1502
|
return TEMP_AD595(raw);
|
1495
|
1503
|
#elif HEATER_1_USES_AD8495
|
|
@@ -1691,7 +1699,8 @@ void Temperature::updateTemperaturesFromRawValues() {
|
1691
|
1699
|
*/
|
1692
|
1700
|
void Temperature::init() {
|
1693
|
1701
|
|
1694
|
|
- TERN_(MAX6675_IS_MAX31865, max31865.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE
|
|
1702
|
+ TERN_(MAX6675_0_IS_MAX31865, max31865_0.begin(MAX31865_2WIRE)); // MAX31865_2WIRE, MAX31865_3WIRE, MAX31865_4WIRE
|
|
1703
|
+ TERN_(MAX6675_1_IS_MAX31865, max31865_1.begin(MAX31865_2WIRE));
|
1695
|
1704
|
|
1696
|
1705
|
#if EARLY_WATCHDOG
|
1697
|
1706
|
// Flag that the thermalManager should be running
|
|
@@ -2200,50 +2209,64 @@ void Temperature::disable_all_heaters() {
|
2200
|
2209
|
#define THERMOCOUPLE_MAX_ERRORS 15
|
2201
|
2210
|
#endif
|
2202
|
2211
|
|
2203
|
|
- int Temperature::read_max6675(
|
2204
|
|
- #if COUNT_6675 > 1
|
2205
|
|
- const uint8_t hindex
|
2206
|
|
- #endif
|
2207
|
|
- ) {
|
2208
|
|
- #if COUNT_6675 == 1
|
2209
|
|
- constexpr uint8_t hindex = 0;
|
2210
|
|
- #else
|
2211
|
|
- // Needed to return the correct temp when this is called too soon
|
2212
|
|
- static uint16_t max6675_temp_previous[COUNT_6675] = { 0 };
|
2213
|
|
- #endif
|
2214
|
|
-
|
2215
|
|
- static uint8_t max6675_errors[COUNT_6675] = { 0 };
|
2216
|
|
-
|
|
2212
|
+ int Temperature::read_max6675(TERN_(HAS_MULTI_6675, const uint8_t hindex/*=0*/)) {
|
2217
|
2213
|
#define MAX6675_HEAT_INTERVAL 250UL
|
2218
|
2214
|
|
2219
|
|
- #if MAX6675_IS_MAX31855
|
|
2215
|
+ #if MAX6675_0_IS_MAX31855 || MAX6675_1_IS_MAX31855
|
2220
|
2216
|
static uint32_t max6675_temp = 2000;
|
2221
|
2217
|
#define MAX6675_ERROR_MASK 7
|
2222
|
2218
|
#define MAX6675_DISCARD_BITS 18
|
2223
|
|
- #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64
|
|
2219
|
+ #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64
|
|
2220
|
+ #elif HAS_MAX31865
|
|
2221
|
+ static uint16_t max6675_temp = 2000; // From datasheet 16 bits D15-D0
|
|
2222
|
+ #define MAX6675_ERROR_MASK 1 // D0 Bit not used
|
|
2223
|
+ #define MAX6675_DISCARD_BITS 1 // Data is in D15-D1
|
|
2224
|
+ #define MAX6675_SPEED_BITS 3 // (_BV(SPR1)) // clock ÷ 64
|
2224
|
2225
|
#else
|
2225
|
2226
|
static uint16_t max6675_temp = 2000;
|
2226
|
2227
|
#define MAX6675_ERROR_MASK 4
|
2227
|
2228
|
#define MAX6675_DISCARD_BITS 3
|
2228
|
|
- #define MAX6675_SPEED_BITS 2 // (_BV(SPR0)) // clock ÷ 16
|
|
2229
|
+ #define MAX6675_SPEED_BITS 2 // (_BV(SPR0)) // clock ÷ 16
|
2229
|
2230
|
#endif
|
2230
|
2231
|
|
|
2232
|
+ #if HAS_MULTI_6675
|
|
2233
|
+ // Needed to return the correct temp when this is called between readings
|
|
2234
|
+ static uint16_t max6675_temp_previous[COUNT_6675] = { 0 };
|
|
2235
|
+ #define MAX6675_TEMP(I) max6675_temp_previous[I]
|
|
2236
|
+ #define MAX6675_SEL(A,B) (hindex ? (B) : (A))
|
|
2237
|
+ #define MAX6675_WRITE(V) do{ switch (hindex) { case 1: WRITE(MAX6675_SS2_PIN, V); break; default: WRITE(MAX6675_SS_PIN, V); } }while(0)
|
|
2238
|
+ #define MAX6675_SET_OUTPUT() do{ switch (hindex) { case 1: SET_OUTPUT(MAX6675_SS2_PIN); break; default: SET_OUTPUT(MAX6675_SS_PIN); } }while(0)
|
|
2239
|
+ #else
|
|
2240
|
+ constexpr uint8_t hindex = 0;
|
|
2241
|
+ #define MAX6675_TEMP(I) max6675_temp
|
|
2242
|
+ #if MAX6675_1_IS_MAX31865
|
|
2243
|
+ #define MAX6675_SEL(A,B) B
|
|
2244
|
+ #else
|
|
2245
|
+ #define MAX6675_SEL(A,B) A
|
|
2246
|
+ #endif
|
|
2247
|
+ #if HEATER_0_USES_MAX6675
|
|
2248
|
+ #define MAX6675_WRITE(V) WRITE(MAX6675_SS_PIN, V)
|
|
2249
|
+ #define MAX6675_SET_OUTPUT() SET_OUTPUT(MAX6675_SS_PIN)
|
|
2250
|
+ #else
|
|
2251
|
+ #define MAX6675_WRITE(V) WRITE(MAX6675_SS2_PIN, V)
|
|
2252
|
+ #define MAX6675_SET_OUTPUT() SET_OUTPUT(MAX6675_SS2_PIN)
|
|
2253
|
+ #endif
|
|
2254
|
+ #endif
|
|
2255
|
+
|
|
2256
|
+ static uint8_t max6675_errors[COUNT_6675] = { 0 };
|
|
2257
|
+
|
2231
|
2258
|
// Return last-read value between readings
|
2232
|
2259
|
static millis_t next_max6675_ms[COUNT_6675] = { 0 };
|
2233
|
2260
|
millis_t ms = millis();
|
2234
|
|
- if (PENDING(ms, next_max6675_ms[hindex]))
|
2235
|
|
- return int(
|
2236
|
|
- #if COUNT_6675 == 1
|
2237
|
|
- max6675_temp
|
2238
|
|
- #else
|
2239
|
|
- max6675_temp_previous[hindex] // Need to return the correct previous value
|
2240
|
|
- #endif
|
2241
|
|
- );
|
2242
|
|
-
|
|
2261
|
+ if (PENDING(ms, next_max6675_ms[hindex])) return int(MAX6675_TEMP(hindex));
|
2243
|
2262
|
next_max6675_ms[hindex] = ms + MAX6675_HEAT_INTERVAL;
|
2244
|
2263
|
|
2245
|
|
- #if MAX6675_IS_MAX31865
|
2246
|
|
- max6675_temp = int(max31865.temperature(MAX31865_SENSOR_OHMS, MAX31865_CALIBRATION_OHMS));
|
|
2264
|
+ #if HAS_MAX31865
|
|
2265
|
+ Adafruit_MAX31865 &maxref = MAX6675_SEL(max31865_0, max31865_1);
|
|
2266
|
+ max6675_temp = int(maxref.temperature(
|
|
2267
|
+ MAX6675_SEL(MAX31865_SENSOR_OHMS_0, MAX31865_SENSOR_OHMS_1),
|
|
2268
|
+ MAX6675_SEL(MAX31865_CALIBRATION_OHMS_0, MAX31865_CALIBRATION_OHMS_1)
|
|
2269
|
+ ));
|
2247
|
2270
|
#endif
|
2248
|
2271
|
|
2249
|
2272
|
//
|
|
@@ -2254,39 +2277,24 @@ void Temperature::disable_all_heaters() {
|
2254
|
2277
|
spiInit(MAX6675_SPEED_BITS);
|
2255
|
2278
|
#endif
|
2256
|
2279
|
|
2257
|
|
- #if COUNT_6675 > 1
|
2258
|
|
- #define WRITE_MAX6675(V) do{ switch (hindex) { case 1: WRITE(MAX6675_SS2_PIN, V); break; default: WRITE(MAX6675_SS_PIN, V); } }while(0)
|
2259
|
|
- #define SET_OUTPUT_MAX6675() do{ switch (hindex) { case 1: SET_OUTPUT(MAX6675_SS2_PIN); break; default: SET_OUTPUT(MAX6675_SS_PIN); } }while(0)
|
2260
|
|
- #elif HEATER_1_USES_MAX6675
|
2261
|
|
- #define WRITE_MAX6675(V) WRITE(MAX6675_SS2_PIN, V)
|
2262
|
|
- #define SET_OUTPUT_MAX6675() SET_OUTPUT(MAX6675_SS2_PIN)
|
2263
|
|
- #else
|
2264
|
|
- #define WRITE_MAX6675(V) WRITE(MAX6675_SS_PIN, V)
|
2265
|
|
- #define SET_OUTPUT_MAX6675() SET_OUTPUT(MAX6675_SS_PIN)
|
2266
|
|
- #endif
|
2267
|
|
-
|
2268
|
|
- SET_OUTPUT_MAX6675();
|
2269
|
|
- WRITE_MAX6675(LOW); // enable TT_MAX6675
|
|
2280
|
+ MAX6675_SET_OUTPUT();
|
|
2281
|
+ MAX6675_WRITE(LOW); // enable TT_MAX6675
|
2270
|
2282
|
|
2271
|
2283
|
DELAY_NS(100); // Ensure 100ns delay
|
2272
|
2284
|
|
2273
|
2285
|
// Read a big-endian temperature value
|
2274
|
2286
|
max6675_temp = 0;
|
2275
|
2287
|
for (uint8_t i = sizeof(max6675_temp); i--;) {
|
2276
|
|
- max6675_temp |= (
|
2277
|
|
- #if MAX6675_SEPARATE_SPI
|
2278
|
|
- max6675_spi.receive()
|
2279
|
|
- #else
|
2280
|
|
- spiRec()
|
2281
|
|
- #endif
|
2282
|
|
- );
|
|
2288
|
+ max6675_temp |= TERN(MAX6675_SEPARATE_SPI, max6675_spi.receive(), spiRec());
|
2283
|
2289
|
if (i > 0) max6675_temp <<= 8; // shift left if not the last byte
|
2284
|
2290
|
}
|
2285
|
2291
|
|
2286
|
|
- WRITE_MAX6675(HIGH); // disable TT_MAX6675
|
|
2292
|
+ MAX6675_WRITE(HIGH); // disable TT_MAX6675
|
|
2293
|
+
|
|
2294
|
+ const uint8_t fault_31865 = TERN1(HAS_MAX31865, maxref.readFault());
|
2287
|
2295
|
|
2288
|
|
- if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max6675_temp & MAX6675_ERROR_MASK)) {
|
2289
|
|
- max6675_errors[hindex] += 1;
|
|
2296
|
+ if (DISABLED(IGNORE_THERMOCOUPLE_ERRORS) && (max6675_temp & MAX6675_ERROR_MASK) && fault_31865) {
|
|
2297
|
+ max6675_errors[hindex]++;
|
2290
|
2298
|
if (max6675_errors[hindex] > THERMOCOUPLE_MAX_ERRORS) {
|
2291
|
2299
|
SERIAL_ERROR_START();
|
2292
|
2300
|
SERIAL_ECHOPGM("Temp measurement error! ");
|
|
@@ -2298,18 +2306,29 @@ void Temperature::disable_all_heaters() {
|
2298
|
2306
|
SERIAL_ECHOLNPGM("Short to GND");
|
2299
|
2307
|
else if (max6675_temp & 4)
|
2300
|
2308
|
SERIAL_ECHOLNPGM("Short to VCC");
|
|
2309
|
+ #elif HAS_MAX31865
|
|
2310
|
+ if (fault_31865) {
|
|
2311
|
+ maxref.clearFault();
|
|
2312
|
+ SERIAL_ECHOPAIR("MAX31865 Fault :(", fault_31865, ") >>");
|
|
2313
|
+ if (fault_31865 & MAX31865_FAULT_HIGHTHRESH)
|
|
2314
|
+ SERIAL_ECHOLNPGM("RTD High Threshold");
|
|
2315
|
+ else if (fault_31865 & MAX31865_FAULT_LOWTHRESH)
|
|
2316
|
+ SERIAL_ECHOLNPGM("RTD Low Threshold");
|
|
2317
|
+ else if (fault_31865 & MAX31865_FAULT_REFINLOW)
|
|
2318
|
+ SERIAL_ECHOLNPGM("REFIN- > 0.85 x Bias");
|
|
2319
|
+ else if (fault_31865 & MAX31865_FAULT_REFINHIGH)
|
|
2320
|
+ SERIAL_ECHOLNPGM("REFIN- < 0.85 x Bias - FORCE- open");
|
|
2321
|
+ else if (fault_31865 & MAX31865_FAULT_RTDINLOW)
|
|
2322
|
+ SERIAL_ECHOLNPGM("REFIN- < 0.85 x Bias - FORCE- open");
|
|
2323
|
+ else if (fault_31865 & MAX31865_FAULT_OVUV)
|
|
2324
|
+ SERIAL_ECHOLNPGM("Under/Over voltage");
|
|
2325
|
+ }
|
2301
|
2326
|
#else
|
2302
|
2327
|
SERIAL_ECHOLNPGM("MAX6675");
|
2303
|
2328
|
#endif
|
2304
|
2329
|
|
2305
|
2330
|
// Thermocouple open
|
2306
|
|
- max6675_temp = 4 * (
|
2307
|
|
- #if COUNT_6675 > 1
|
2308
|
|
- hindex ? HEATER_1_MAX6675_TMAX : HEATER_0_MAX6675_TMAX
|
2309
|
|
- #else
|
2310
|
|
- TERN(HEATER_1_USES_MAX6675, HEATER_1_MAX6675_TMAX, HEATER_0_MAX6675_TMAX)
|
2311
|
|
- #endif
|
2312
|
|
- );
|
|
2331
|
+ max6675_temp = 4 * MAX6675_SEL(HEATER_0_MAX6675_TMAX, HEATER_1_MAX6675_TMAX);
|
2313
|
2332
|
}
|
2314
|
2333
|
else
|
2315
|
2334
|
max6675_temp >>= MAX6675_DISCARD_BITS;
|
|
@@ -2319,13 +2338,11 @@ void Temperature::disable_all_heaters() {
|
2319
|
2338
|
max6675_errors[hindex] = 0;
|
2320
|
2339
|
}
|
2321
|
2340
|
|
2322
|
|
- #if ENABLED(MAX6675_IS_MAX31855)
|
|
2341
|
+ #if MAX6675_0_IS_MAX31855 || MAX6675_1_IS_MAX31855
|
2323
|
2342
|
if (max6675_temp & 0x00002000) max6675_temp |= 0xFFFFC000; // Support negative temperature
|
2324
|
2343
|
#endif
|
2325
|
2344
|
|
2326
|
|
- #if COUNT_6675 > 1
|
2327
|
|
- max6675_temp_previous[hindex] = max6675_temp;
|
2328
|
|
- #endif
|
|
2345
|
+ MAX6675_TEMP(hindex) = max6675_temp;
|
2329
|
2346
|
|
2330
|
2347
|
return int(max6675_temp);
|
2331
|
2348
|
}
|