diff --git a/Release/Duet-0.6-0.8.5/RepRapFirmware-1.16beta2.bin b/Release/Duet-0.6-0.8.5/RepRapFirmware-1.16beta3.bin similarity index 68% rename from Release/Duet-0.6-0.8.5/RepRapFirmware-1.16beta2.bin rename to Release/Duet-0.6-0.8.5/RepRapFirmware-1.16beta3.bin index 7c4d288..5afe3ac 100644 Binary files a/Release/Duet-0.6-0.8.5/RepRapFirmware-1.16beta2.bin and b/Release/Duet-0.6-0.8.5/RepRapFirmware-1.16beta3.bin differ diff --git a/Release/Duet-WiFi/DuetWiFiFirmware-1.16-alpha1.bin b/Release/Duet-WiFi/DuetWiFiFirmware-1.16-alpha1.bin deleted file mode 100644 index 9a446b0..0000000 Binary files a/Release/Duet-WiFi/DuetWiFiFirmware-1.16-alpha1.bin and /dev/null differ diff --git a/Release/Duet-WiFi/DuetWiFiFirmware-1.16beta2.bin b/Release/Duet-WiFi/DuetWiFiFirmware-1.16beta3.bin similarity index 58% rename from Release/Duet-WiFi/DuetWiFiFirmware-1.16beta2.bin rename to Release/Duet-WiFi/DuetWiFiFirmware-1.16beta3.bin index b7f0270..46ae85d 100644 Binary files a/Release/Duet-WiFi/DuetWiFiFirmware-1.16beta2.bin and b/Release/Duet-WiFi/DuetWiFiFirmware-1.16beta3.bin differ diff --git a/src/Configuration.h b/src/Configuration.h index 1514d5f..f4b1b07 100644 --- a/src/Configuration.h +++ b/src/Configuration.h @@ -26,11 +26,11 @@ Licence: GPL // Firmware name is now defined in the Pins file #ifndef VERSION -# define VERSION "1.16beta2" +# define VERSION "1.16beta3" #endif #ifndef DATE -# define DATE "2016-10-19" +# define DATE "2016-10-20" #endif #define AUTHORS "reprappro, dc42, zpl, t3p3, dnewman" diff --git a/src/DuetNG/SX1509B.cpp b/src/DuetNG/SX1509B.cpp new file mode 100644 index 0000000..7f171f1 --- /dev/null +++ b/src/DuetNG/SX1509B.cpp @@ -0,0 +1,36 @@ +/* + * SX1509B.cpp + * + * Created on: 19 Oct 2016 + * Author: David + */ + +#include "SX1509B.h" + +const uint8_t DueXnAddress = 0x3E; // address of the SX1509B on the DueX0/DueX2/DueX5 + +// Initialise the device and identify which expansion board (if any) is attached +ExpansionBoardType SX1509B::Init() +{ + Wire.begin(); // initialise TWI as master + + Wire.beginTransmission(DueXnAddress); // start a block + + // Return codes from Wire.endTransmission are: + // 0: success + // 1: data too long to fit in transmit buffer + // 2: received NACK on transmit of address + // 3: received NACK on transmit of data + // 4: other error + // We assume that any return code other than 0 means the device was not found. + if (Wire.endTransmission() != 0) + { + // No device found at that address, or a serious error + return ExpansionBoardType::none; + } + + return ExpansionBoardType::none; //TODO +} + + +// End diff --git a/src/DuetNG/SX1509B.h b/src/DuetNG/SX1509B.h new file mode 100644 index 0000000..2fd141e --- /dev/null +++ b/src/DuetNG/SX1509B.h @@ -0,0 +1,27 @@ +/* + * SX1509B.h + * + * Created on: 19 Oct 2016 + * Author: David + */ + +#ifndef SRC_DUETNG_SX1509B_H_ +#define SRC_DUETNG_SX1509B_H_ + +#include "Wire.h" + +enum class ExpansionBoardType : uint8_t +{ + none, + DueX0, + DueX2, + DueX5 +}; + +class SX1509B +{ +public: + ExpansionBoardType Init(); // Initialise the device and identify which expansion board (if any) is attached +}; + +#endif /* SRC_DUETNG_SX1509B_H_ */ diff --git a/src/GCodes/GCodes.cpp b/src/GCodes/GCodes.cpp index b3c8ed2..8909771 100644 --- a/src/GCodes/GCodes.cpp +++ b/src/GCodes/GCodes.cpp @@ -3244,7 +3244,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply) reply.copy("Steps/mm: "); for (size_t axis = 0; axis < numAxes; ++axis) { - reply.catf("%c: %.3f, ", platform->DriveStepsPerUnit(axis)); + reply.catf("%c: %.3f, ", axisLetters[axis], platform->DriveStepsPerUnit(axis)); } reply.catf("E: "); for (size_t drive = numAxes; drive < DRIVES; drive++) @@ -3846,8 +3846,9 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply) reply.printf("Accelerations: "); for (size_t axis = 0; axis < numAxes; ++axis) { - reply.catf("%c: %.1f, ", platform->Acceleration(axis) / distanceScale); + reply.catf("%c: %.1f, ", axisLetters[axis], platform->Acceleration(axis) / distanceScale); } + reply.cat("E: "); for (size_t drive = numAxes; drive < DRIVES; drive++) { reply.catf("%.1f", platform->Acceleration(drive) / distanceScale); @@ -3864,7 +3865,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply) case 203: // Set/print maximum feedrates { bool seen = false; - for (size_t axis = 0; axis < numAxes; axis++) + for (size_t axis = 0; axis < numAxes; ++axis) { if (gb->Seen(axisLetters[axis])) { @@ -3888,9 +3889,9 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply) if (!seen) { reply.copy("Maximum feedrates: "); - for (size_t axis = 0; axis < numAxes; axis++) + for (size_t axis = 0; axis < numAxes; ++axis) { - reply.catf("%c: %.1f, ", platform->MaxFeedrate(axis) / (distanceScale * secondsToMinutes)); + reply.catf("%c: %.1f, ", axisLetters[axis], platform->MaxFeedrate(axis) / (distanceScale * secondsToMinutes)); } reply.cat("E: "); for (size_t drive = numAxes; drive < DRIVES; drive++) @@ -4697,7 +4698,7 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply) reply.copy("Maximum jerk rates: "); for (size_t axis = 0; axis < numAxes; ++axis) { - reply.catf("%c: %.1f, ", platform->ConfiguredInstantDv(axis) / (distanceScale * secondsToMinutes)); + reply.catf("%c: %.1f, ", axisLetters[axis], platform->ConfiguredInstantDv(axis) / (distanceScale * secondsToMinutes)); } reply.cat("E:"); char sep = ' '; @@ -5170,6 +5171,10 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply) break; case 584: // Set axis/extruder to stepper driver(s) mapping + if (!AllMovesAreFinishedAndMoveBufferIsLoaded()) // we also rely on this to retrieve the current motor positions to moveBuffer + { + return false; + } { bool seen = false, badDrive = false; for (size_t drive = 0; drive < MAX_AXES; ++drive) @@ -5204,9 +5209,10 @@ bool GCodes::HandleMcode(GCodeBuffer* gb, StringRef& reply) { while (numAxes <= drive) { - moveBuffer.coords[numAxes] = 0.0; // user has defined a new axis + moveBuffer.coords[numAxes] = 0.0; // user has defined a new axis, so set its position ++numAxes; } + SetPositions(moveBuffer.coords); // tell the Move system where any new axes are platform->SetAxisDriversConfig(drive, config); } } diff --git a/src/Movement/DDA.cpp b/src/Movement/DDA.cpp index c20a2d0..cd0daed 100644 --- a/src/Movement/DDA.cpp +++ b/src/Movement/DDA.cpp @@ -633,7 +633,8 @@ bool DDA::FetchEndPosition(volatile int32_t ep[DRIVES], volatile float endCoords } if (endCoordinatesValid) { - for (size_t axis = 0; axis < MAX_AXES; ++axis) + const size_t numAxes = reprap.GetGCodes()->GetNumAxes(); + for (size_t axis = 0; axis < numAxes; ++axis) { endCoords[axis] = endCoordinates[axis]; } @@ -654,7 +655,7 @@ void DDA::SetPositions(const float move[DRIVES], size_t numDrives) // Get a Cartesian end coordinate from this move float DDA::GetEndCoordinate(size_t drive, bool disableDeltaMapping) -pre(disableDeltaMapping || drive < AXES) +pre(disableDeltaMapping || drive < MAX_AXES) { if (disableDeltaMapping) { diff --git a/src/Movement/Move.cpp b/src/Movement/Move.cpp index c666ffe..6cf2bb6 100644 --- a/src/Movement/Move.cpp +++ b/src/Movement/Move.cpp @@ -527,8 +527,8 @@ void Move::MachineToEndPoint(const int32_t motorPos[], float machinePos[], size_ } } - // Convert the extruders - for (size_t drive = reprap.GetGCodes()->GetNumAxes(); drive < numDrives; ++drive) + // Convert any additional axes and the extruders + for (size_t drive = MIN_AXES; drive < numDrives; ++drive) { machinePos[drive] = motorPos[drive]/stepsPerUnit[drive]; } @@ -1220,18 +1220,7 @@ void Move::HitLowStop(size_t axis, DDA* hitDDA) { if (axis < reprap.GetGCodes()->GetNumAxes() && !IsDeltaMode()) // should always be true { - float hitPoint; - if (axis == Z_AXIS) - { - // Special case of doing a G1 S1 Z move on a Cartesian printer. This is not how we normally home the Z axis, we use G30 instead. - // But I think it used to work, so let's not break it. - hitPoint = reprap.GetPlatform()->ZProbeStopHeight(); - } - else - { - hitPoint = reprap.GetPlatform()->AxisMinimum(axis); - } - JustHomed(axis, hitPoint, hitDDA); + JustHomed(axis, reprap.GetPlatform()->AxisMinimum(axis), hitDDA); } } @@ -1323,7 +1312,7 @@ void Move::GetCurrentUserPosition(float m[DRIVES], uint8_t moveType) const // Interrupts are assumed enabled on entry, so do not call this from an ISR void Move::LiveCoordinates(float m[DRIVES]) { - // The live coordinates and live endpoints are modified by the ISR, to be careful to get a self-consistent set of them + // The live coordinates and live endpoints are modified by the ISR, so be careful to get a self-consistent set of them cpu_irq_disable(); if (liveCoordinatesValid) { diff --git a/src/Platform.cpp b/src/Platform.cpp index a2c88ef..12ea66b 100644 --- a/src/Platform.cpp +++ b/src/Platform.cpp @@ -26,8 +26,8 @@ #include "sam/drivers/hsmci/hsmci.h" #include "sd_mmc.h" -#if defined(DUET_NG) && !defined(PROTOTYPE_1) -# include +#if defined(DUET_NG) +# include "TMC2660.h" #endif #ifdef DUET_NG @@ -213,7 +213,7 @@ void Platform::Init() fileStructureInitialised = true; -#if !defined(DUET_NG) || defined(PROTOTYPE_1) +#if !defined(DUET_NG) mcpDuet.begin(); // only call begin once in the entire execution, this begins the I2C comms on that channel for all objects mcpExpansion.setMCP4461Address(0x2E); // not required for mcpDuet, as this uses the default address #endif @@ -237,7 +237,7 @@ void Platform::Init() ARRAY_INIT(driveStepsPerUnit, DRIVE_STEPS_PER_UNIT); ARRAY_INIT(instantDvs, INSTANT_DVS); -#if !defined(DUET_NG) || defined(PROTOTYPE_1) +#if !defined(DUET_NG) ARRAY_INIT(potWipes, POT_WIPES); senseResistor = SENSE_RESISTOR; maxStepperDigipotVoltage = MAX_STEPPER_DIGIPOT_VOLTAGE; @@ -337,7 +337,24 @@ void Platform::Init() slowDrivers = 0; // assume no drivers need extended step pulse timing #ifdef DUET_NG - numTMC2660Drivers = 5; // until we have the DueX5 expansion board, assume that additional drivers are dumb enable/step/dir ones + // Test for presence of a DueX2 or DueX5 expansion board and work out how many TMC2660 drivers we have + ExpansionBoardType et = expansion.Init(); + switch (et) + { + case ExpansionBoardType::DueX2: + numTMC2660Drivers = 7; + break; + case ExpansionBoardType::DueX5: + numTMC2660Drivers = 10; + break; + case ExpansionBoardType::none: + case ExpansionBoardType::DueX0: + default: + numTMC2660Drivers = 5; // assume that additional drivers are dumb enable/step/dir ones + break; + } + + // Initialise TMC2660 drivers driversPowered = false; TMC2660::Init(ENABLE_PINS, numTMC2660Drivers); #endif @@ -1781,7 +1798,7 @@ void Platform::EnableDriver(size_t driver) driverState[driver] = DriverStatus::enabled; UpdateMotorCurrent(driver); // the current may have been reduced by the idle timeout -#if defined(DUET_NG) && !defined(PROTOTYPE_1) +#if defined(DUET_NG) if (driver < numTMC2660Drivers) { TMC2660::EnableDrive(driver, true); @@ -1790,7 +1807,7 @@ void Platform::EnableDriver(size_t driver) { #endif digitalWrite(ENABLE_PINS[driver], enableValues[driver]); -#if defined(DUET_NG) && !defined(PROTOTYPE_1) +#if defined(DUET_NG) } #endif } @@ -1801,7 +1818,7 @@ void Platform::DisableDriver(size_t driver) { if (driver < DRIVES) { -#if defined(DUET_NG) && !defined(PROTOTYPE_1) +#if defined(DUET_NG) if (driver < numTMC2660Drivers) { TMC2660::EnableDrive(driver, false); @@ -1810,7 +1827,7 @@ void Platform::DisableDriver(size_t driver) { #endif digitalWrite(ENABLE_PINS[driver], !enableValues[driver]); -#if defined(DUET_NG) && !defined(PROTOTYPE_1) +#if defined(DUET_NG) } #endif driverState[driver] = DriverStatus::disabled; @@ -1915,7 +1932,7 @@ void Platform::UpdateMotorCurrent(size_t driver) current *= motorCurrentFraction[driver]; } -#if defined(DUET_NG) && !defined(PROTOTYPE_1) +#if defined(DUET_NG) if (driver < numTMC2660Drivers) { TMC2660::SetCurrent(driver, current); @@ -1999,7 +2016,7 @@ bool Platform::SetDriverMicrostepping(size_t driver, int microsteps, int mode) { if (driver < DRIVES) { -#if defined(DUET_NG) && !defined(PROTOTYPE_1) +#if defined(DUET_NG) if (driver < numTMC2660Drivers) { return TMC2660::SetMicrostepping(driver, microsteps, mode); @@ -2010,7 +2027,7 @@ bool Platform::SetDriverMicrostepping(size_t driver, int microsteps, int mode) // Other drivers only support x16 microstepping. // We ignore the interpolation on/off parameter so that e.g. M350 I1 E16:128 won't give an error if E1 supports interpolation but E0 doesn't. return microsteps == 16; -#if defined(DUET_NG) && !defined(PROTOTYPE_1) +#if defined(DUET_NG) } #endif } @@ -2040,7 +2057,7 @@ bool Platform::SetMicrostepping(size_t drive, int microsteps, int mode) // Get the microstepping for a driver unsigned int Platform::GetDriverMicrostepping(size_t driver, bool& interpolation) const { -#if defined(DUET_NG) && !defined(PROTOTYPE_1) +#if defined(DUET_NG) if (driver < numTMC2660Drivers) { return TMC2660::GetMicrostepping(driver, interpolation); @@ -2537,11 +2554,7 @@ void Platform::SetBoardType(BoardType bt) if (bt == BoardType::Auto) { #ifdef DUET_NG -# ifdef PROTOTYPE_1 - board = BoardType::DuetWiFi_06; -# else board = BoardType::DuetWiFi_10; -# endif #elif defined(__RADDS__) board = BoardType::RADDS_15; #else @@ -2572,11 +2585,7 @@ const char* Platform::GetElectronicsString() const switch (board) { #ifdef DUET_NG -# ifdef PROTOTYPE_1 - case BoardType::DuetWiFi_06: return "Duet WiFi 0.6"; -# else case BoardType::DuetWiFi_10: return "Duet WiFi 1.0"; -# endif #elif defined(__RADDS__) case BoardType::RADDS_15: return "RADDS 1.5"; #else @@ -2594,11 +2603,7 @@ const char* Platform::GetBoardString() const switch (board) { #ifdef DUET_NG -# ifdef PROTOTYPE_1 - case BoardType::DuetWiFi_06: return "duetwifi06"; -# else case BoardType::DuetWiFi_10: return "duetwifi10"; -# endif #elif defined(__RADDS__) case BoardType::RADDS_15: return "radds15"; #else diff --git a/src/Platform.h b/src/Platform.h index fd2bca7..120a871 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -50,7 +50,9 @@ Licence: GPL #include "OutputMemory.h" #include "Libraries/Fatfs/ff.h" -#if !defined(DUET_NG) || defined(PROTOTYPE_1) +#if defined(DUET_NG) +# include "SX1509B.h" +#else # include "Libraries/MCP4461/MCP4461.h" #endif @@ -186,11 +188,7 @@ enum class BoardType : uint8_t { Auto = 0, #ifdef DUET_NG -# ifdef PROTOTYPE_1 - DuetWiFi_06 = 1 -# else DuetWiFi_10 = 1 -# endif #elif defined(__RADDS__) RADDS_15 = 1 #else @@ -757,11 +755,11 @@ private: float idleCurrentFactor; float maxAverageAcceleration; - // Digipots - -#if defined(DUET_NG) && !defined(PROTOTYPE_1) +#if defined(DUET_NG) + SX1509B expansion; // I/O expander on DueXn board size_t numTMC2660Drivers; // the number of TMC2660 drivers we have, the remaining are simple enable/step/dir drivers #else + // Digipots MCP4461 mcpDuet; MCP4461 mcpExpansion; Pin potWipes[8]; // we have only 8 digipots, on the Duet 0.8.5 we use the DAC for the 9th