TMC connection test, spreadCycle parameters, improved debugging (#12616)

This commit is contained in:
teemuatlut
2018-12-10 04:54:48 +02:00
committed by Scott Lahteine
parent 97de9d54a5
commit 55144284c2
71 changed files with 917 additions and 452 deletions

View File

@ -34,7 +34,10 @@
#if ENABLED(TMC_DEBUG)
#include "../module/planner.h"
static bool report_tmc_status; // = false;
#include "../libs/hex_print_routines.h"
#if ENABLED(MONITOR_DRIVER_STATUS)
static bool report_tmc_status; // = false;
#endif
#endif
/**
@ -130,7 +133,7 @@
if (data.is_s2ga) SERIAL_ECHOLNPGM("short to ground (coil A)");
if (data.is_s2gb) SERIAL_ECHOLNPGM("short to ground (coil B)");
#if ENABLED(TMC_DEBUG)
tmc_report_all();
tmc_report_all(true, true, true, true);
#endif
kill(PSTR("Driver error"));
}
@ -326,16 +329,28 @@
TMC_S2VSB,
TMC_S2VSA
};
static void drv_status_print_hex(const uint32_t drv_status) {
for (int B = 24; B >= 8; B -= 8){
SERIAL_PRINT((drv_status >> (B + 4)) & 0xF, HEX);
SERIAL_PRINT((drv_status >> B) & 0xF, HEX);
SERIAL_CHAR(':');
}
SERIAL_PRINT((drv_status >> 4) & 0xF, HEX);
SERIAL_PRINT((drv_status) & 0xF, HEX);
SERIAL_EOL();
}
enum TMC_get_registers_enum : char {
TMC_AXIS_CODES,
TMC_GET_GCONF,
TMC_GET_IHOLD_IRUN,
TMC_GET_GSTAT,
TMC_GET_IOIN,
TMC_GET_TPOWERDOWN,
TMC_GET_TSTEP,
TMC_GET_TPWMTHRS,
TMC_GET_TCOOLTHRS,
TMC_GET_THIGH,
TMC_GET_CHOPCONF,
TMC_GET_COOLCONF,
TMC_GET_PWMCONF,
TMC_GET_PWM_SCALE,
TMC_GET_DRV_STATUS,
TMC_GET_DRVCONF,
TMC_GET_DRVCTRL,
TMC_GET_DRVSTATUS,
TMC_GET_SGCSCONF,
TMC_GET_SMARTEN
};
template<class TMC>
static void print_vsense(TMC &st) { serialprintPGM(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); }
@ -480,125 +495,146 @@
case TMC_S2GA: if (st.s2ga()) SERIAL_CHAR('X'); break;
case TMC_DRV_OTPW: if (st.otpw()) SERIAL_CHAR('X'); break;
case TMC_OT: if (st.ot()) SERIAL_CHAR('X'); break;
case TMC_DRV_STATUS_HEX:
case TMC_DRV_STATUS_HEX: {
const uint32_t drv_status = st.DRV_STATUS();
SERIAL_CHAR('\t');
st.printLabel();
SERIAL_ECHOPGM("\t0x");
drv_status_print_hex(st.DRV_STATUS());
SERIAL_CHAR('\t');
print_hex_long(drv_status, ':');
if (drv_status == 0xFFFFFFFF || drv_status == 0) SERIAL_ECHOPGM("\t Bad response!");
SERIAL_EOL();
break;
}
default: _tmc_parse_drv_status(st, i); break;
}
}
static void tmc_debug_loop(const TMC_debug_enum i) {
#if AXIS_IS_TMC(X)
tmc_status(stepperX, i, planner.settings.axis_steps_per_mm[X_AXIS]);
#endif
#if AXIS_IS_TMC(X2)
tmc_status(stepperX2, i, planner.settings.axis_steps_per_mm[X_AXIS]);
#endif
static void tmc_debug_loop(const TMC_debug_enum i, const bool print_x, const bool print_y, const bool print_z, const bool print_e) {
if (print_x) {
#if AXIS_IS_TMC(X)
tmc_status(stepperX, i, planner.settings.axis_steps_per_mm[X_AXIS]);
#endif
#if AXIS_IS_TMC(X2)
tmc_status(stepperX2, i, planner.settings.axis_steps_per_mm[X_AXIS]);
#endif
}
#if AXIS_IS_TMC(Y)
tmc_status(stepperY, i, planner.settings.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_IS_TMC(Y2)
tmc_status(stepperY2, i, planner.settings.axis_steps_per_mm[Y_AXIS]);
#endif
if (print_y) {
#if AXIS_IS_TMC(Y)
tmc_status(stepperY, i, planner.settings.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_IS_TMC(Y2)
tmc_status(stepperY2, i, planner.settings.axis_steps_per_mm[Y_AXIS]);
#endif
}
#if AXIS_IS_TMC(Z)
tmc_status(stepperZ, i, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(Z2)
tmc_status(stepperZ2, i, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(Z3)
tmc_status(stepperZ3, i, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
if (print_z) {
#if AXIS_IS_TMC(Z)
tmc_status(stepperZ, i, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(Z2)
tmc_status(stepperZ2, i, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(Z3)
tmc_status(stepperZ3, i, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
}
#if AXIS_IS_TMC(E0)
tmc_status(stepperE0, i, planner.settings.axis_steps_per_mm[E_AXIS]);
#endif
#if AXIS_IS_TMC(E1)
tmc_status(stepperE1, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 1
#endif
]);
#endif
#if AXIS_IS_TMC(E2)
tmc_status(stepperE2, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 2
#endif
]);
#endif
#if AXIS_IS_TMC(E3)
tmc_status(stepperE3, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 3
#endif
]);
#endif
#if AXIS_IS_TMC(E4)
tmc_status(stepperE4, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 4
#endif
]);
#endif
#if AXIS_IS_TMC(E5)
tmc_status(stepperE5, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 5
#endif
]);
#endif
if (print_e) {
#if AXIS_IS_TMC(E0)
tmc_status(stepperE0, i, planner.settings.axis_steps_per_mm[E_AXIS]);
#endif
#if AXIS_IS_TMC(E1)
tmc_status(stepperE1, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 1
#endif
]);
#endif
#if AXIS_IS_TMC(E2)
tmc_status(stepperE2, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 2
#endif
]);
#endif
#if AXIS_IS_TMC(E3)
tmc_status(stepperE3, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 3
#endif
]);
#endif
#if AXIS_IS_TMC(E4)
tmc_status(stepperE4, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 4
#endif
]);
#endif
#if AXIS_IS_TMC(E5)
tmc_status(stepperE5, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 5
#endif
]);
#endif
}
SERIAL_EOL();
}
static void drv_status_loop(const TMC_drv_status_enum i) {
#if AXIS_IS_TMC(X)
tmc_parse_drv_status(stepperX, i);
#endif
#if AXIS_IS_TMC(X2)
tmc_parse_drv_status(stepperX2, i);
#endif
static void drv_status_loop(const TMC_drv_status_enum i, const bool print_x, const bool print_y, const bool print_z, const bool print_e) {
if (print_x) {
#if AXIS_IS_TMC(X)
tmc_parse_drv_status(stepperX, i);
#endif
#if AXIS_IS_TMC(X2)
tmc_parse_drv_status(stepperX2, i);
#endif
}
#if AXIS_IS_TMC(Y)
tmc_parse_drv_status(stepperY, i);
#endif
#if AXIS_IS_TMC(Y2)
tmc_parse_drv_status(stepperY2, i);
#endif
if (print_y) {
#if AXIS_IS_TMC(Y)
tmc_parse_drv_status(stepperY, i);
#endif
#if AXIS_IS_TMC(Y2)
tmc_parse_drv_status(stepperY2, i);
#endif
}
#if AXIS_IS_TMC(Z)
tmc_parse_drv_status(stepperZ, i);
#endif
#if AXIS_IS_TMC(Z2)
tmc_parse_drv_status(stepperZ2, i);
#endif
#if AXIS_IS_TMC(Z3)
tmc_parse_drv_status(stepperZ3, i);
#endif
if (print_z) {
#if AXIS_IS_TMC(Z)
tmc_parse_drv_status(stepperZ, i);
#endif
#if AXIS_IS_TMC(Z2)
tmc_parse_drv_status(stepperZ2, i);
#endif
#if AXIS_IS_TMC(Z3)
tmc_parse_drv_status(stepperZ3, i);
#endif
}
#if AXIS_IS_TMC(E0)
tmc_parse_drv_status(stepperE0, i);
#endif
#if AXIS_IS_TMC(E1)
tmc_parse_drv_status(stepperE1, i);
#endif
#if AXIS_IS_TMC(E2)
tmc_parse_drv_status(stepperE2, i);
#endif
#if AXIS_IS_TMC(E3)
tmc_parse_drv_status(stepperE3, i);
#endif
#if AXIS_IS_TMC(E4)
tmc_parse_drv_status(stepperE4, i);
#endif
#if AXIS_IS_TMC(E5)
tmc_parse_drv_status(stepperE5, i);
#endif
if (print_e) {
#if AXIS_IS_TMC(E0)
tmc_parse_drv_status(stepperE0, i);
#endif
#if AXIS_IS_TMC(E1)
tmc_parse_drv_status(stepperE1, i);
#endif
#if AXIS_IS_TMC(E2)
tmc_parse_drv_status(stepperE2, i);
#endif
#if AXIS_IS_TMC(E3)
tmc_parse_drv_status(stepperE3, i);
#endif
#if AXIS_IS_TMC(E4)
tmc_parse_drv_status(stepperE4, i);
#endif
#if AXIS_IS_TMC(E5)
tmc_parse_drv_status(stepperE5, i);
#endif
}
SERIAL_EOL();
}
@ -607,9 +643,9 @@
* M122 report functions
*/
void tmc_report_all() {
#define TMC_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_debug_loop(ITEM); }while(0)
#define DRV_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); drv_status_loop(ITEM); }while(0)
void tmc_report_all(bool print_x, const bool print_y, const bool print_z, const bool print_e) {
#define TMC_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_debug_loop(ITEM, print_x, print_y, print_z, print_e); }while(0)
#define DRV_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); drv_status_loop(ITEM, print_x, print_y, print_z, print_e); }while(0)
TMC_REPORT("\t", TMC_CODES);
TMC_REPORT("Enabled\t", TMC_ENABLED);
TMC_REPORT("Set current", TMC_CURRENT);
@ -661,6 +697,135 @@
SERIAL_EOL();
}
#define PRINT_TMC_REGISTER(REG_CASE) case TMC_GET_##REG_CASE: print_hex_long(st.REG_CASE(), ':'); break
#if HAS_DRIVER(TMC2130)
static void tmc_get_ic_registers(TMC2130Stepper &st, const TMC_get_registers_enum i) {
switch (i) {
PRINT_TMC_REGISTER(TCOOLTHRS);
PRINT_TMC_REGISTER(THIGH);
PRINT_TMC_REGISTER(COOLCONF);
default: SERIAL_CHAR('\t'); break;
}
}
#endif
#if HAS_DRIVER(TMC2208)
static void tmc_get_ic_registers(TMC2208Stepper, const TMC_get_registers_enum) { SERIAL_CHAR('\t'); }
#endif
#if HAS_TRINAMIC
template<class TMC>
static void tmc_get_registers(TMC &st, const TMC_get_registers_enum i) {
switch (i) {
case TMC_AXIS_CODES: SERIAL_CHAR('\t'); st.printLabel(); break;
PRINT_TMC_REGISTER(GCONF);
PRINT_TMC_REGISTER(IHOLD_IRUN);
PRINT_TMC_REGISTER(GSTAT);
PRINT_TMC_REGISTER(IOIN);
PRINT_TMC_REGISTER(TPOWERDOWN);
PRINT_TMC_REGISTER(TSTEP);
PRINT_TMC_REGISTER(TPWMTHRS);
PRINT_TMC_REGISTER(CHOPCONF);
PRINT_TMC_REGISTER(PWMCONF);
PRINT_TMC_REGISTER(PWM_SCALE);
PRINT_TMC_REGISTER(DRV_STATUS);
default: tmc_get_ic_registers(st, i); break;
}
SERIAL_CHAR('\t');
}
#endif
#if HAS_DRIVER(TMC2660)
template <char AXIS_LETTER, char DRIVER_ID>
static void tmc_get_registers(TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID> &st, const TMC_get_registers_enum i) {
switch (i) {
case TMC_AXIS_CODES: SERIAL_CHAR('\t'); st.printLabel(); break;
PRINT_TMC_REGISTER(DRVCONF);
PRINT_TMC_REGISTER(DRVCTRL);
PRINT_TMC_REGISTER(CHOPCONF);
PRINT_TMC_REGISTER(DRVSTATUS);
PRINT_TMC_REGISTER(SGCSCONF);
PRINT_TMC_REGISTER(SMARTEN);
default: SERIAL_CHAR('\t'); break;
}
SERIAL_CHAR('\t');
}
#endif
static void tmc_get_registers(TMC_get_registers_enum i, const bool print_x, const bool print_y, const bool print_z, const bool print_e) {
if (print_x) {
#if AXIS_IS_TMC(X)
tmc_get_registers(stepperX, i);
#endif
#if AXIS_IS_TMC(X2)
tmc_get_registers(stepperX2, i);
#endif
}
if (print_y) {
#if AXIS_IS_TMC(Y)
tmc_get_registers(stepperY, i);
#endif
#if AXIS_IS_TMC(Y2)
tmc_get_registers(stepperY2, i);
#endif
}
if (print_z) {
#if AXIS_IS_TMC(Z)
tmc_get_registers(stepperZ, i);
#endif
#if AXIS_IS_TMC(Z2)
tmc_get_registers(stepperZ2, i);
#endif
#if AXIS_IS_TMC(Z3)
tmc_get_registers(stepperZ3, i);
#endif
}
if (print_e) {
#if AXIS_IS_TMC(E0)
tmc_get_registers(stepperE0, i);
#endif
#if AXIS_IS_TMC(E1)
tmc_get_registers(stepperE1, i);
#endif
#if AXIS_IS_TMC(E2)
tmc_get_registers(stepperE2, i);
#endif
#if AXIS_IS_TMC(E3)
tmc_get_registers(stepperE3, i);
#endif
#if AXIS_IS_TMC(E4)
tmc_get_registers(stepperE4, i);
#endif
#if AXIS_IS_TMC(E5)
tmc_get_registers(stepperE5, i);
#endif
}
SERIAL_EOL();
}
void tmc_get_registers(bool print_x, bool print_y, bool print_z, bool print_e) {
#define _TMC_GET_REG(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_get_registers(ITEM, print_x, print_y, print_z, print_e); }while(0)
#define TMC_GET_REG(NAME, TABS) _TMC_GET_REG(STRINGIFY(NAME) TABS, TMC_GET_##NAME)
_TMC_GET_REG("\t", TMC_AXIS_CODES);
TMC_GET_REG(GCONF, "\t\t");
TMC_GET_REG(IHOLD_IRUN, "\t");
TMC_GET_REG(GSTAT, "\t\t");
TMC_GET_REG(IOIN, "\t\t");
TMC_GET_REG(TPOWERDOWN, "\t");
TMC_GET_REG(TSTEP, "\t\t");
TMC_GET_REG(TPWMTHRS, "\t");
TMC_GET_REG(TCOOLTHRS, "\t");
TMC_GET_REG(THIGH, "\t\t");
TMC_GET_REG(CHOPCONF, "\t");
TMC_GET_REG(COOLCONF, "\t");
TMC_GET_REG(PWMCONF, "\t");
TMC_GET_REG(PWM_SCALE, "\t");
TMC_GET_REG(DRV_STATUS, "\t");
}
#endif // TMC_DEBUG
#if USE_SENSORLESS
@ -736,4 +901,83 @@
}
#endif // TMC_HAS_SPI
template<typename TMC>
static bool test_connection(TMC &st) {
SERIAL_ECHOPGM("Testing ");
st.printLabel();
SERIAL_ECHOPGM(" connection... ");
const uint8_t test_result = st.test_connection();
if (test_result > 0) SERIAL_ECHOPGM("Error: All ");
const char *stat;
switch (test_result) {
default:
case 0: stat = PSTR("OK"); break;
case 1: stat = PSTR("HIGH"); break;
case 2: stat = PSTR("LOW"); break;
}
serialprintPGM(stat);
SERIAL_EOL();
return test_result;
}
void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z, const bool test_e) {
uint8_t axis_connection = 0;
if (test_x) {
#if AXIS_IS_TMC(X)
axis_connection += test_connection(stepperX);
#endif
#if AXIS_IS_TMC(X2)
axis_connection += test_connection(stepperX2);
#endif
}
if (test_y) {
#if AXIS_IS_TMC(Y)
axis_connection += test_connection(stepperY);
#endif
#if AXIS_IS_TMC(Y2)
axis_connection += test_connection(stepperY2);
#endif
}
if (test_z) {
#if AXIS_IS_TMC(Z)
axis_connection += test_connection(stepperZ);
#endif
#if AXIS_IS_TMC(Z2)
axis_connection += test_connection(stepperZ2);
#endif
#if AXIS_IS_TMC(Z3)
axis_connection += test_connection(stepperZ3);
#endif
}
if (test_e) {
#if AXIS_IS_TMC(E0)
axis_connection += test_connection(stepperE0);
#endif
#if AXIS_IS_TMC(E1)
axis_connection += test_connection(stepperE1);
#endif
#if AXIS_IS_TMC(E2)
axis_connection += test_connection(stepperE2);
#endif
#if AXIS_IS_TMC(E3)
axis_connection += test_connection(stepperE3);
#endif
#if AXIS_IS_TMC(E4)
axis_connection += test_connection(stepperE4);
#endif
#if AXIS_IS_TMC(E5)
axis_connection += test_connection(stepperE5);
#endif
}
if (axis_connection) ui.set_status_P(PSTR("TMC CONNECTION ERROR"));
}
#endif // HAS_TRINAMIC

View File

@ -22,6 +22,7 @@
#pragma once
#include "../inc/MarlinConfig.h"
#include "../lcd/ultralcd.h"
#if HAS_TRINAMIC
#include <TMCStepper.h>
#endif
@ -155,12 +156,14 @@ void tmc_set_sgt(TMC &st, const int8_t sgt_val) {
}
void monitor_tmc_driver();
void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z, const bool test_e);
#if ENABLED(TMC_DEBUG)
#if ENABLED(MONITOR_DRIVER_STATUS)
void tmc_set_report_status(const bool status);
#endif
void tmc_report_all();
void tmc_report_all(const bool print_x, const bool print_y, const bool print_z, const bool print_e);
void tmc_get_registers(const bool print_x, const bool print_y, const bool print_z, const bool print_e);
#endif
/**