diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 9eb6f07d..a93e6567 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -499,6 +499,7 @@ void raise_z_above(float target, bool plan=true); extern "C" void softReset(); void stack_error(); +void pullup_error(bool fromTempISR); extern uint32_t IP_address; diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 9d0f7591..077a93f6 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1758,6 +1758,10 @@ void stack_error() { crash_and_burn(dump_crash_reason::stack_error); } +void pullup_error(bool fromTempISR) { + crash_and_burn(fromTempISR ? dump_crash_reason::bad_pullup_temp_isr : dump_crash_reason::bad_pullup_step_isr); +} + void trace(); diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index 49701107..befd1e57 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -327,7 +327,13 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP | 0x0D05 3333 | uint32_t | EEPROM_JOB_ID | ??? | 00 00 00 00h | Job ID used by host software | D3 only | D3 Ax0d05 C4 | 0x0D04 3332 | uint8_t | EEPROM_ECOOL_ENABLE | ffh 255 | ^ | Disable extruder motor scaling for non-farm print | LCD menu | D3 Ax0d04 C1 | ^ | ^ | ^ | 2ah 42 | ^ | Enable extruder motor scaling for non-farm print | ^ | D3 Ax0d04 C1 -| 0x0D03 3321 | uint8_t | EEPROM_FW_CRASH_FLAG | 01h 1 | ff/00 | Last FW crash reason (dump_crash_reason) | D21/D22 | D3 Ax0d03 C1 +| 0x0D03 3321 | uint8_t | EEPROM_FW_CRASH_FLAG | ffh 255 | ffh 255 | Last FW crash reason (dump_crash_reason) | D21/D22 | D3 Ax0d03 C1 +| ^ | ^ | ^ | 00h 0 | ^ | manual | ^ | ^ +| ^ | ^ | ^ | 01h 1 | ^ | stack_error | ^ | ^ +| ^ | ^ | ^ | 02h 2 | ^ | watchdog | ^ | ^ +| ^ | ^ | ^ | 03h 3 | ^ | bad_isr | ^ | ^ +| ^ | ^ | ^ | 04h 4 | ^ | bad_pullup_temp_isr | ^ | ^ +| ^ | ^ | ^ | 05h 5 | ^ | bad_pullup_step_isr | ^ | ^ | Address begin | Bit/Type | Name | Valid values | Default/FactoryReset | Description | Gcode/Function| Debug code | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: diff --git a/Firmware/stepper.cpp b/Firmware/stepper.cpp index c9cb8beb..615e8cf7 100644 --- a/Firmware/stepper.cpp +++ b/Firmware/stepper.cpp @@ -299,6 +299,15 @@ ISR(TIMER1_COMPA_vect) { if (sp < SP_min) SP_min = sp; #endif //DEBUG_STACK_MONITOR +#ifdef DEBUG_PULLUP_CRASH + // check for faulty pull-ups enabled on thermistor inputs + if ((PORTF & (uint8_t)(ADC_DIDR_MSK & 0xff)) || (PORTK & (uint8_t)((ADC_DIDR_MSK >> 8) & 0xff))) + pullup_error(false); +#else + PORTF &= ~(uint8_t)(ADC_DIDR_MSK & 0xff); + PORTK &= ~(uint8_t)((ADC_DIDR_MSK >> 8) & 0xff); +#endif // DEBUG_PULLUP_CRASH + #ifdef LIN_ADVANCE advance_isr_scheduler(); #else diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index cf208a36..891f5560 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -1683,6 +1683,16 @@ void adc_ready(void) //callback from adc when sampling finished FORCE_INLINE static void temperature_isr() { +#ifdef DEBUG_PULLUP_CRASH + // check for faulty pull-ups enabled on thermistor inputs + if ((PORTF & (uint8_t)(ADC_DIDR_MSK & 0xff)) || (PORTK & (uint8_t)((ADC_DIDR_MSK >> 8) & 0xff))) + pullup_error(true); +#else + PORTF &= ~(uint8_t)(ADC_DIDR_MSK & 0xff); + PORTK &= ~(uint8_t)((ADC_DIDR_MSK >> 8) & 0xff); +#endif // DEBUG_PULLUP_CRASH + + if (!temp_meas_ready) adc_cycle(); lcd_buttons_update(); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 80eca1ad..a6f9f6c3 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1848,6 +1848,11 @@ static void lcd_stack_crash() } #endif +#ifdef DEBUG_PULLUP_CRASH +void TestPullupCrash() { + PORTF |= 0x01; +} +#endif // DEBUG_PULLUP_CRASH //! @brief Show Support Menu //! @@ -2058,7 +2063,6 @@ static void lcd_support_menu() #endif /* DEBUG_BUILD */ #endif //MK1BP - MENU_END(); } @@ -8975,7 +8979,11 @@ void lcd_experimental_menu() #ifdef TMC2130 MENU_ITEM_TOGGLE_P(_N("E-cool mode"), UserECoolEnabled()?_T(MSG_ON):_T(MSG_OFF), UserECool_toggle);////MSG_MENU_ECOOL c=18 #endif - + +#ifdef DEBUG_PULLUP_CRASH + MENU_ITEM_FUNCTION_P(_N("Test Pullup Crash"), TestPullupCrash); +#endif // DEBUG_PULLUP_CRASH + #ifdef PRUSA_SN_SUPPORT MENU_ITEM_FUNCTION_P(_N("Fake serial number"), WorkaroundPrusaSN);////MSG_WORKAROUND_PRUSA_SN c=18 #endif //PRUSA_SN_SUPPORT diff --git a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h index aacb7cb7..063faea6 100644 --- a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h @@ -168,6 +168,8 @@ #define DEBUG_DCODE3 #define DEBUG_DCODE6 +//#define DEBUG_PULLUP_CRASH //Test Pullup crash + //#define DEBUG_BUILD //#define DEBUG_SEC_LANG //secondary language debug output at startup //#define DEBUG_XFLASH //debug external spi flash diff --git a/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h index 8659c582..266606ff 100644 --- a/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h @@ -170,6 +170,8 @@ #define DEBUG_DCODE3 #define DEBUG_DCODE6 +//#define DEBUG_PULLUP_CRASH //Test Pullup crash + //#define DEBUG_BUILD //#define DEBUG_SEC_LANG //secondary language debug output at startup //#define DEBUG_XFLASH //debug external spi flash diff --git a/Firmware/xflash_dump.h b/Firmware/xflash_dump.h index 6ece99c6..d68b3639 100644 --- a/Firmware/xflash_dump.h +++ b/Firmware/xflash_dump.h @@ -8,6 +8,8 @@ enum class dump_crash_reason : uint8_t stack_error, watchdog, bad_isr, + bad_pullup_temp_isr, + bad_pullup_step_isr, }; #ifdef XFLASH_DUMP