From 55d66751edb41773dd95230f08f16a59b15c5b74 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 11 Jan 2025 12:50:17 +1100 Subject: [PATCH 1/3] Update I2C_Wrapper.cpp --- source/Core/BSP/Pinecilv2/I2C_Wrapper.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/Core/BSP/Pinecilv2/I2C_Wrapper.cpp b/source/Core/BSP/Pinecilv2/I2C_Wrapper.cpp index 93d11ae5b2..af5efbf7c4 100644 --- a/source/Core/BSP/Pinecilv2/I2C_Wrapper.cpp +++ b/source/Core/BSP/Pinecilv2/I2C_Wrapper.cpp @@ -40,10 +40,10 @@ bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t read_address, uint8_t *p_b i2cCfg.data = p_buffer; i2cCfg.subAddrSize = 1; // one byte address - taskENTER_CRITICAL(); + vTaskSuspendAll(); /* --------------- */ err = I2C_MasterReceiveBlocking(I2C0_ID, &i2cCfg); - taskEXIT_CRITICAL(); + xTaskResumeAll(); bool res = err == SUCCESS; if (!res) { I2C_Unstick(); @@ -65,10 +65,10 @@ bool FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, uint8_t *p_bu i2cCfg.data = p_buffer; i2cCfg.subAddrSize = 1; // one byte address - taskENTER_CRITICAL(); + vTaskSuspendAll(); /* --------------- */ err = I2C_MasterSendBlocking(I2C0_ID, &i2cCfg); - taskEXIT_CRITICAL(); + xTaskResumeAll(); bool res = err == SUCCESS; if (!res) { I2C_Unstick(); From 86fdab7d04f06a45ad3af3ee9a80ea3387133c2b Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 11 Jan 2025 12:56:00 +1100 Subject: [PATCH 2/3] Use the ADC_MAX_READING value --- source/Core/Threads/PIDThread.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Core/Threads/PIDThread.cpp b/source/Core/Threads/PIDThread.cpp index c7b2711877..3c27fc8948 100644 --- a/source/Core/Threads/PIDThread.cpp +++ b/source/Core/Threads/PIDThread.cpp @@ -249,7 +249,7 @@ void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const uint3 static bool haveSeenDelta = false; // Check for readings being pegged at the top of the ADC while the heater is off - if (!thisCycleIsHeating && (getTipRawTemp(0) > (0x7FFF - 16))) { + if (!thisCycleIsHeating && (getTipRawTemp(0) > (ADC_MAX_READING - 8))) { heaterThermalRunaway = true; } From b9bbf5855649949d355503896c2021a5078fe746 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sat, 11 Jan 2025 13:12:02 +1100 Subject: [PATCH 3/3] Use runaway counter trigger --- source/Core/Threads/PIDThread.cpp | 31 ++++++++++++------- source/Core/Threads/UI/logic/OperatingModes.h | 2 +- source/Core/Threads/UI/logic/Soldering.cpp | 8 ++--- .../Threads/UI/logic/SolderingProfile.cpp | 6 ++-- .../UI/logic/utils/SolderingCommon.cpp | 2 +- 5 files changed, 28 insertions(+), 21 deletions(-) diff --git a/source/Core/Threads/PIDThread.cpp b/source/Core/Threads/PIDThread.cpp index 3c27fc8948..e7183248ac 100644 --- a/source/Core/Threads/PIDThread.cpp +++ b/source/Core/Threads/PIDThread.cpp @@ -22,12 +22,12 @@ #endif #endif -static TickType_t powerPulseWaitUnit = 25 * TICKS_100MS; // 2.5 s -static TickType_t powerPulseDurationUnit = (5 * TICKS_100MS) / 2; // 250 ms -TaskHandle_t pidTaskNotification = NULL; -volatile TemperatureType_t currentTempTargetDegC = 0; // Current temperature target in C -int32_t powerSupplyWattageLimit = 0; -bool heaterThermalRunaway = false; +static TickType_t powerPulseWaitUnit = 25 * TICKS_100MS; // 2.5 s +static TickType_t powerPulseDurationUnit = (5 * TICKS_100MS) / 2; // 250 ms +TaskHandle_t pidTaskNotification = NULL; +volatile TemperatureType_t currentTempTargetDegC = 0; // Current temperature target in C +int32_t powerSupplyWattageLimit = 0; +uint8_t heaterThermalRunawayCounter = 0; static int32_t getPIDResultX10Watts(TemperatureType_t set_point, TemperatureType_t current_value); static void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const uint32_t x10WattsOut); @@ -71,7 +71,8 @@ void startPIDTask(void const *argument __unused) { #endif #endif - int32_t x10WattsOut = 0; + int32_t x10WattsOut = 0; + TickType_t lastThermalRunawayDecay = xTaskGetTickCount(); for (;;) { x10WattsOut = 0; @@ -105,6 +106,12 @@ void startPIDTask(void const *argument __unused) { #ifdef DEBUG_UART_OUTPUT log_system_state(x10WattsOut); #endif + if (xTaskGetTickCount() - lastThermalRunawayDecay > TICKS_SECOND) { + lastThermalRunawayDecay = xTaskGetTickCount(); + if (heaterThermalRunawayCounter > 0) { + heaterThermalRunawayCounter--; + } + } } } @@ -249,8 +256,8 @@ void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const uint3 static bool haveSeenDelta = false; // Check for readings being pegged at the top of the ADC while the heater is off - if (!thisCycleIsHeating && (getTipRawTemp(0) > (ADC_MAX_READING - 8))) { - heaterThermalRunaway = true; + if (!thisCycleIsHeating && (getTipRawTemp(0) > (ADC_MAX_READING - 8)) && heaterThermalRunawayCounter < 255) { + heaterThermalRunawayCounter++; } if (haveSeenDelta) { @@ -277,8 +284,8 @@ void detectThermalRunaway(const TemperatureType_t currentTipTempInC, const uint3 TemperatureType_t delta = tipTempMax - tiptempMin; haveSeenDelta = true; - if (delta < THERMAL_RUNAWAY_TEMP_C) { - heaterThermalRunaway = true; + if (delta < THERMAL_RUNAWAY_TEMP_C && heaterThermalRunawayCounter < 255) { + heaterThermalRunawayCounter++; } } } @@ -322,7 +329,7 @@ void setOutputx10WattsViaFilters(int32_t x10WattsOut) { if (getTipRawTemp(0) > (0x7FFF - 32)) { x10WattsOut = 0; } - if (heaterThermalRunaway) { + if (heaterThermalRunawayCounter > 8) { x10WattsOut = 0; } #ifdef SLEW_LIMIT diff --git a/source/Core/Threads/UI/logic/OperatingModes.h b/source/Core/Threads/UI/logic/OperatingModes.h index 379094e488..3b38bb92ae 100644 --- a/source/Core/Threads/UI/logic/OperatingModes.h +++ b/source/Core/Threads/UI/logic/OperatingModes.h @@ -83,5 +83,5 @@ OperatingMode showWarnings(const ButtonState buttons, guiContext *cxt); // Common helpers int8_t getPowerSourceNumber(void); // Returns number ID of power source -extern bool heaterThermalRunaway; +extern uint8_t heaterThermalRunawayCounter; #endif diff --git a/source/Core/Threads/UI/logic/Soldering.cpp b/source/Core/Threads/UI/logic/Soldering.cpp index 45483d1544..587308a94e 100644 --- a/source/Core/Threads/UI/logic/Soldering.cpp +++ b/source/Core/Threads/UI/logic/Soldering.cpp @@ -161,10 +161,10 @@ OperatingMode gui_solderingMode(const ButtonState buttons, guiContext *cxt) { return OperatingMode::Sleeping; } - if (heaterThermalRunaway) { - currentTempTargetDegC = 0; // heater control off - heaterThermalRunaway = false; - cxt->transitionMode = TransitionAnimation::Right; + if (heaterThermalRunawayCounter > 8) { + currentTempTargetDegC = 0; // heater control off + heaterThermalRunawayCounter = 0; + cxt->transitionMode = TransitionAnimation::Right; return OperatingMode::ThermalRunaway; } return handleSolderingButtons(buttons, cxt); diff --git a/source/Core/Threads/UI/logic/SolderingProfile.cpp b/source/Core/Threads/UI/logic/SolderingProfile.cpp index 01ca7ced09..606175cf82 100644 --- a/source/Core/Threads/UI/logic/SolderingProfile.cpp +++ b/source/Core/Threads/UI/logic/SolderingProfile.cpp @@ -159,9 +159,9 @@ OperatingMode gui_solderingProfileMode(const ButtonState buttons, guiContext *cx setBuzzer(false); return OperatingMode::HomeScreen; } - if (heaterThermalRunaway) { - currentTempTargetDegC = 0; // heater control off - heaterThermalRunaway = false; + if (heaterThermalRunawayCounter > 8) { + currentTempTargetDegC = 0; // heater control off + heaterThermalRunawayCounter = 0; return OperatingMode::ThermalRunaway; } diff --git a/source/Core/Threads/UI/logic/utils/SolderingCommon.cpp b/source/Core/Threads/UI/logic/utils/SolderingCommon.cpp index 9425c90f98..e10df25c77 100644 --- a/source/Core/Threads/UI/logic/utils/SolderingCommon.cpp +++ b/source/Core/Threads/UI/logic/utils/SolderingCommon.cpp @@ -9,7 +9,7 @@ #include "history.hpp" #include "ui_drawing.hpp" -extern bool heaterThermalRunaway; +extern uint8_t heaterThermalRunawayCounter; bool checkExitSoldering(void) { #ifdef POW_DC