5 Commits

Author SHA1 Message Date
David Ramiro
d5a5a05462 Merge branch 'master' into 12864-full 2019-03-28 12:05:17 +01:00
David Ramiro
17635865ca Merge branch 'master' into 12864-full 2019-03-27 16:12:07 +01:00
David Ramiro
0ca58ca7a6 Merge branch 'master' into 12864-full 2019-03-13 17:09:00 +01:00
David Ramiro
223d925160 Merge branch 'master' into 12864-full 2019-02-27 20:55:32 +01:00
David Ramiro
cd9751af41 Enable 12864 display 2019-02-22 17:06:23 +01:00
32 changed files with 1183 additions and 1329 deletions

View File

@@ -23,7 +23,7 @@ before_install:
install: install:
# #
# Install arduino 1.8.5 # Install arduino 1.8.5
- wget http://downloads.arduino.cc/arduino-1.8.5-linux64.tar.xz - wget http://downloads-02.arduino.cc/arduino-1.8.5-linux64.tar.xz
- tar xf arduino-1.8.5-linux64.tar.xz - tar xf arduino-1.8.5-linux64.tar.xz
- sudo mv arduino-1.8.5 /usr/local/share/arduino - sudo mv arduino-1.8.5 /usr/local/share/arduino
- ln -s /usr/local/share/arduino/arduino ${TRAVIS_BUILD_DIR}/buildroot/bin/arduino - ln -s /usr/local/share/arduino/arduino ${TRAVIS_BUILD_DIR}/buildroot/bin/arduino

View File

@@ -145,64 +145,48 @@ void AnycubicTFTClass::KillTFT()
void AnycubicTFTClass::StartPrint(){ void AnycubicTFTClass::StartPrint(){
// which kind of starting behaviour is needed? // are we resuming from a pause?
switch (ai3m_pause_state) { if (TFTstate==ANYCUBIC_TFT_STATE_SDPAUSE) {
case 0: // was that a regular pause?
// no pause, just a regular start if((!PausedByRunout) && (!PausedByFilamentChange) && (!PausedByNozzleTimeout)) {
starttime=millis();
card.startFileprint();
TFTstate=ANYCUBIC_TFT_STATE_SDPRINT;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
SERIAL_ECHOLNPGM("DEBUG: Regular Start");
#endif
break;
case 1:
// regular sd pause
enqueue_and_echo_commands_P(PSTR("M24")); // unpark nozzle enqueue_and_echo_commands_P(PSTR("M24")); // unpark nozzle
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
SERIAL_ECHOLNPGM("DEBUG: M24 Resume from regular pause"); SERIAL_ECHOLNPGM("DEBUG: M24 Resume from regular pause");
#endif #endif
IsParked=false; // remove parked flag IsParked=false; // remove parked flag
}
}
starttime=millis(); starttime=millis();
card.startFileprint(); // resume regularly #ifdef SDSUPPORT
TFTstate=ANYCUBIC_TFT_STATE_SDPRINT; // was that a regular pause or are we starting a print?
ai3m_pause_state = 0; if((!PausedByRunout) && (!PausedByFilamentChange) && (!PausedByNozzleTimeout)) {
#ifdef ANYCUBIC_TFT_DEBUG card.startFileprint(); // start or resume regularly
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state); }
SERIAL_EOL(); // resuming from a pause that was caused by filament runout
#endif else if((PausedByRunout) && (!PausedByFilamentChange) && (!PausedByNozzleTimeout)) {
break;
case 2:
// paused by M600
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
SERIAL_ECHOLNPGM("DEBUG: Start M108 routine");
#endif
FilamentChangeResume(); // enter display M108 routine
ai3m_pause_state = 0; // clear flag
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Filament Change Flag cleared");
#endif
break;
case 3:
// paused by filament runout
enqueue_and_echo_commands_P(PSTR("M24")); // unpark nozzle and resume enqueue_and_echo_commands_P(PSTR("M24")); // unpark nozzle and resume
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: M24 Resume from Filament Runout"); SERIAL_ECHOLNPGM("DEBUG: M24 Resume from Filament Runout");
#endif #endif
IsParked = false; // clear flags PausedByRunout = IsParked = false; // clear flags
ai3m_pause_state = 0;
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Filament Pause Flag cleared"); SERIAL_ECHOLNPGM("DEBUG: Filament Pause Flag cleared");
#endif #endif
break; }
case 4: // was M600 called and the nozzle is not timed out?
// nozzle was timed out before (M600), do not enter printing state yet else if((!PausedByRunout) && (PausedByFilamentChange) && (!PausedByNozzleTimeout)) {
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Start M108 routine");
#endif
FilamentChangeResume(); // enter display M108 routine
PausedByFilamentChange=false; // clear flag
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Filament Change Flag cleared");
#endif
}
#endif
if (PausedByNozzleTimeout) {
// nozzle was timed out before, do not enter printing state yet
TFTstate=ANYCUBIC_TFT_STATE_SDPAUSE_REQ; TFTstate=ANYCUBIC_TFT_STATE_SDPAUSE_REQ;
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Set Pause again because of timeout"); SERIAL_ECHOLNPGM("DEBUG: Set Pause again because of timeout");
@@ -210,61 +194,31 @@ void AnycubicTFTClass::StartPrint() {
// clear the timeout flag to ensure the print continues on the // clear the timeout flag to ensure the print continues on the
// next push of CONTINUE // next push of CONTINUE
ai3m_pause_state = 2; PausedByNozzleTimeout=false;
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Nozzle timeout flag cleared"); SERIAL_ECHOLNPGM("DEBUG: Nozzle timeout flag cleared");
#endif #endif
break; } else {
case 5: // regular resume/start or all specific resume routines are done,
// nozzle was timed out before (runout), do not enter printing state yet // set printing state again
TFTstate=ANYCUBIC_TFT_STATE_SDPAUSE_REQ; TFTstate=ANYCUBIC_TFT_STATE_SDPRINT;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Set Pause again because of timeout");
#endif
// clear the timeout flag to ensure the print continues on the
// next push of CONTINUE
ai3m_pause_state = 3;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Nozzle timeout flag cleared");
#endif
break;
default:
break;
} }
} }
void AnycubicTFTClass::PausePrint(){ void AnycubicTFTClass::PausePrint(){
#ifdef SDSUPPORT #ifdef SDSUPPORT
if(ai3m_pause_state < 2) { // is this a regular pause? if((!PausedByRunout)) { // is this a regular pause?
card.pauseSDPrint(); // pause print regularly card.pauseSDPrint(); // pause print regularly
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
SERIAL_ECHOLNPGM("DEBUG: Regular Pause"); SERIAL_ECHOLNPGM("DEBUG: Regular Pause");
#endif #endif
} else { // pause caused by filament runout } else { // pause caused by filament runout
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Filament Runout Pause"); SERIAL_ECHOLNPGM("DEBUG: Filament Runout Pause");
#endif #endif
// filament runout, retract and beep
enqueue_and_echo_commands_P(PSTR("G91")); // relative mode
enqueue_and_echo_commands_P(PSTR("G1 E-3 F1800")); // retract 3mm
enqueue_and_echo_commands_P(PSTR("G90")); // absolute mode
buzzer.tone(200, 1567);
buzzer.tone(200, 1174);
buzzer.tone(200, 1567);
buzzer.tone(200, 1174);
buzzer.tone(2000, 1567);
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Filament runout - Retract, beep and park.");
#endif
enqueue_and_echo_commands_P(PSTR("M25")); // pause print and park nozzle enqueue_and_echo_commands_P(PSTR("M25")); // pause print and park nozzle
ai3m_pause_state = 3;
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: M25 sent, parking nozzle"); SERIAL_ECHOLNPGM("DEBUG: M25 sent, parking nozzle");
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
#endif #endif
IsParked = true; IsParked = true;
// show filament runout prompt on screen // show filament runout prompt on screen
@@ -276,6 +230,24 @@ void AnycubicTFTClass::PausePrint() {
} }
#endif #endif
TFTstate=ANYCUBIC_TFT_STATE_SDPAUSE_REQ; TFTstate=ANYCUBIC_TFT_STATE_SDPAUSE_REQ;
#ifdef ANYCUBIC_FILAMENT_RUNOUT_SENSOR
// regular pause
if(FilamentTestStatus) {
ANYCUBIC_SERIAL_PROTOCOLPGM("J05");
ANYCUBIC_SERIAL_ENTER();
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("TFT Serial Debug: SD print paused... J05");
#endif
// pause because of filament sensor
} else {
// show filament runout prompt on screen
ANYCUBIC_SERIAL_PROTOCOLPGM("J23");
ANYCUBIC_SERIAL_ENTER();
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("TFT Serial Debug: Filament runout while printing... J23");
#endif
}
#endif
} }
void AnycubicTFTClass::StopPrint(){ void AnycubicTFTClass::StopPrint(){
@@ -287,18 +259,12 @@ void AnycubicTFTClass::StopPrint(){
#endif #endif
print_job_timer.stop(); print_job_timer.stop();
thermalManager.disable_all_heaters(); thermalManager.disable_all_heaters();
// we are not parked yet, do it in the display state routine IsParked = false; // we are not parked yet, do it in the display state routine
IsParked = false;
// turn off fan, cancel any heatups and set display state // turn off fan, cancel any heatups and set display state
#if FAN_COUNT > 0 #if FAN_COUNT > 0
for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0; for (uint8_t i = 0; i < FAN_COUNT; i++) fanSpeeds[i] = 0;
#endif #endif
wait_for_heatup=false; wait_for_heatup=false;
ai3m_pause_state = 0;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
#endif
TFTstate=ANYCUBIC_TFT_STATE_SDSTOP_REQ; TFTstate=ANYCUBIC_TFT_STATE_SDSTOP_REQ;
} }
@@ -323,11 +289,7 @@ void AnycubicTFTClass::FilamentChangeResume(){
void AnycubicTFTClass::FilamentChangePause(){ void AnycubicTFTClass::FilamentChangePause(){
// set filament change flag to ensure the M108 routine // set filament change flag to ensure the M108 routine
// gets used when the user hits CONTINUE // gets used when the user hits CONTINUE
ai3m_pause_state = 2; PausedByFilamentChange=true;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
#endif
// call M600 and set display state to paused // call M600 and set display state to paused
enqueue_and_echo_commands_P(PSTR("M600")); enqueue_and_echo_commands_P(PSTR("M600"));
@@ -351,19 +313,11 @@ void AnycubicTFTClass::ReheatNozzle(){
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Clear flags"); SERIAL_ECHOLNPGM("DEBUG: Clear flags");
#endif #endif
nozzle_timed_out = false;
// clear waiting flags // clear waiting flags
nozzle_timed_out = false;
wait_for_user = false; wait_for_user = false;
wait_for_heatup = false; wait_for_heatup = false;
// lower the pause flag by two to restore initial pause condition
if (ai3m_pause_state > 3) {
ai3m_pause_state -= 2;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: NTO done, AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
#endif
}
// set pause state to show CONTINUE button again // set pause state to show CONTINUE button again
TFTstate=ANYCUBIC_TFT_STATE_SDPAUSE_REQ; TFTstate=ANYCUBIC_TFT_STATE_SDPAUSE_REQ;
@@ -385,11 +339,6 @@ void AnycubicTFTClass::ParkAfterStop(){
} }
enqueue_and_echo_commands_P(PSTR("M84")); // disable stepper motors enqueue_and_echo_commands_P(PSTR("M84")); // disable stepper motors
enqueue_and_echo_commands_P(PSTR("M27")); // force report of SD status enqueue_and_echo_commands_P(PSTR("M27")); // force report of SD status
ai3m_pause_state = 0;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
#endif
} }
float AnycubicTFTClass::CodeValue() float AnycubicTFTClass::CodeValue()
@@ -409,7 +358,7 @@ void AnycubicTFTClass::HandleSpecialMenu()
SpecialMenu=true; SpecialMenu=true;
} else if (strcmp(SelectedDirectory, "<auto tune hotend pid>")==0) { } else if (strcmp(SelectedDirectory, "<auto tune hotend pid>")==0) {
SERIAL_PROTOCOLLNPGM("Special Menu: Auto Tune Hotend PID"); SERIAL_PROTOCOLLNPGM("Special Menu: Auto Tune Hotend PID");
enqueue_and_echo_commands_P(PSTR("M106 S204\nM303 E0 S210 C15 U1")); enqueue_and_echo_commands_P(PSTR("M106 S204\nM303 E0 S210 C6 U1"));
} else if (strcmp(SelectedDirectory, "<auto tune hotbed pid>")==0) { } else if (strcmp(SelectedDirectory, "<auto tune hotbed pid>")==0) {
SERIAL_PROTOCOLLNPGM("Special Menu: Auto Tune Hotbed Pid"); SERIAL_PROTOCOLLNPGM("Special Menu: Auto Tune Hotbed Pid");
enqueue_and_echo_commands_P(PSTR("M303 E-1 S60 C6 U1")); enqueue_and_echo_commands_P(PSTR("M303 E-1 S60 C6 U1"));
@@ -634,7 +583,7 @@ void AnycubicTFTClass::StateHandler()
if (card.isFileOpen()) { if (card.isFileOpen()) {
// File is still open --> paused // File is still open --> paused
TFTstate=ANYCUBIC_TFT_STATE_SDPAUSE; TFTstate=ANYCUBIC_TFT_STATE_SDPAUSE;
} else if ((!card.isFileOpen()) && (ai3m_pause_state == 0)) { } else {
// File is closed --> stopped // File is closed --> stopped
TFTstate=ANYCUBIC_TFT_STATE_IDLE; TFTstate=ANYCUBIC_TFT_STATE_IDLE;
ANYCUBIC_SERIAL_PROTOCOLPGM("J14");// J14 print done ANYCUBIC_SERIAL_PROTOCOLPGM("J14");// J14 print done
@@ -642,11 +591,6 @@ void AnycubicTFTClass::StateHandler()
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("TFT Serial Debug: SD print done... J14"); SERIAL_ECHOLNPGM("TFT Serial Debug: SD print done... J14");
#endif #endif
ai3m_pause_state = 0;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
#endif
} }
} }
#endif #endif
@@ -667,13 +611,9 @@ void AnycubicTFTClass::StateHandler()
#ifdef SDSUPPORT #ifdef SDSUPPORT
if((!card.sdprinting) && (!planner.movesplanned())) { if((!card.sdprinting) && (!planner.movesplanned())) {
// We have to wait until the sd card printing has been settled // We have to wait until the sd card printing has been settled
if(ai3m_pause_state < 2) { if((!PausedByRunout) && (!PausedByFilamentChange) && (!PausedByNozzleTimeout)) {
// no flags, this is a regular pause. // no flags, this is a regular pause.
ai3m_pause_state = 1;
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
SERIAL_ECHOLNPGM("DEBUG: Regular Pause requested"); SERIAL_ECHOLNPGM("DEBUG: Regular Pause requested");
#endif #endif
if(!IsParked) { if(!IsParked) {
@@ -681,6 +621,19 @@ void AnycubicTFTClass::StateHandler()
enqueue_and_echo_commands_P(PSTR("M125 L2")); enqueue_and_echo_commands_P(PSTR("M125 L2"));
IsParked = true; IsParked = true;
} }
} else if((PausedByRunout)) {
// filament runout, retract and beep
enqueue_and_echo_commands_P(PSTR("G91")); // relative mode
enqueue_and_echo_commands_P(PSTR("G1 E-3 F1800")); // retract 3mm
enqueue_and_echo_commands_P(PSTR("G90")); // absolute mode
buzzer.tone(200, 1567);
buzzer.tone(200, 1174);
buzzer.tone(200, 1567);
buzzer.tone(200, 1174);
buzzer.tone(2000, 1567);
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Filament runout - Retract, beep and park.");
#endif
} }
#ifdef ANYCUBIC_FILAMENT_RUNOUT_SENSOR #ifdef ANYCUBIC_FILAMENT_RUNOUT_SENSOR
if(FilamentTestStatus) { if(FilamentTestStatus) {
@@ -706,11 +659,6 @@ void AnycubicTFTClass::StateHandler()
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("TFT Serial Debug: SD print stopped... J16"); SERIAL_ECHOLNPGM("TFT Serial Debug: SD print stopped... J16");
#endif #endif
ai3m_pause_state = 0;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
#endif
} }
// did we park the hotend already? // did we park the hotend already?
if((!IsParked) && (!card.sdprinting) && (!planner.movesplanned())) { if((!IsParked) && (!card.sdprinting) && (!planner.movesplanned())) {
@@ -754,10 +702,9 @@ void AnycubicTFTClass::FilamentRunout()
SERIAL_ECHOLNPGM("DEBUG: 3000ms delay done"); SERIAL_ECHOLNPGM("DEBUG: 3000ms delay done");
#endif #endif
if((card.sdprinting==true)) { if((card.sdprinting==true)) {
ai3m_pause_state = 3; // set runout pause flag PausedByRunout=true; // set runout pause flag
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state); SERIAL_ECHOLNPGM("DEBUG: Filament Pause Flag set");
SERIAL_EOL();
#endif #endif
PausePrint(); PausePrint();
} else if((card.sdprinting==false)) { } else if((card.sdprinting==false)) {
@@ -930,11 +877,6 @@ void AnycubicTFTClass::GetCommandFromTFT()
} }
else else
{ {
ai3m_pause_state = 0;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
#endif
StopPrint(); StopPrint();
} }
#endif #endif
@@ -964,11 +906,6 @@ void AnycubicTFTClass::GetCommandFromTFT()
ANYCUBIC_SERIAL_PROTOCOLPGM("J16"); ANYCUBIC_SERIAL_PROTOCOLPGM("J16");
ANYCUBIC_SERIAL_ENTER(); ANYCUBIC_SERIAL_ENTER();
TFTstate=ANYCUBIC_TFT_STATE_IDLE; TFTstate=ANYCUBIC_TFT_STATE_IDLE;
ai3m_pause_state = 0;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
#endif
} }
#endif #endif
break; break;
@@ -1012,11 +949,6 @@ void AnycubicTFTClass::GetCommandFromTFT()
#ifdef SDSUPPORT #ifdef SDSUPPORT
if((!planner.movesplanned()) && (TFTstate!=ANYCUBIC_TFT_STATE_SDPAUSE) && (TFTstate!=ANYCUBIC_TFT_STATE_SDOUTAGE) && (card.isFileOpen())) if((!planner.movesplanned()) && (TFTstate!=ANYCUBIC_TFT_STATE_SDPAUSE) && (TFTstate!=ANYCUBIC_TFT_STATE_SDOUTAGE) && (card.isFileOpen()))
{ {
ai3m_pause_state = 0;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL();
#endif
StartPrint(); StartPrint();
IsParked = false; IsParked = false;
ANYCUBIC_SERIAL_PROTOCOLPGM("J04"); // J04 Starting Print ANYCUBIC_SERIAL_PROTOCOLPGM("J04"); // J04 Starting Print

View File

@@ -56,18 +56,9 @@ public:
void FilamentRunout(); void FilamentRunout();
void KillTFT(); void KillTFT();
char TFTstate=ANYCUBIC_TFT_STATE_IDLE; char TFTstate=ANYCUBIC_TFT_STATE_IDLE;
bool PausedByRunout=false;
/** bool PausedByFilamentChange=false;
* Anycubic TFT pause states: bool PausedByNozzleTimeout=false;
*
* 0 - printing / stopped
* 1 - regular pause
* 2 - M600 pause
* 3 - filament runout pause
* 4 - nozzle timeout on M600
* 5 - nozzle timeout on filament runout
*/
uint8_t ai3m_pause_state = 0;
private: private:
char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE];

View File

@@ -479,11 +479,8 @@
#define Z_SERVO_ANGLES { BLTOUCH_DEPLOY, BLTOUCH_STOW } #define Z_SERVO_ANGLES { BLTOUCH_DEPLOY, BLTOUCH_STOW }
#define BLTOUCH_DEPLOY 10 #define BLTOUCH_DEPLOY 10
#define BLTOUCH_SW_MODE 60
#define BLTOUCH_STOW 90 #define BLTOUCH_STOW 90
#define BLTOUCH_SELFTEST 120 #define BLTOUCH_SELFTEST 120
#define BLTOUCH_5V_MODE 140
#define BLTOUCH_OD_MODE 150
#define BLTOUCH_RESET 160 #define BLTOUCH_RESET 160
#define _TEST_BLTOUCH(P) (READ(P##_PIN) != P##_ENDSTOP_INVERTING) #define _TEST_BLTOUCH(P) (READ(P##_PIN) != P##_ENDSTOP_INVERTING)

View File

@@ -190,17 +190,11 @@
* Safe Homing Options * Safe Homing Options
*/ */
#if ENABLED(Z_SAFE_HOMING) #if ENABLED(Z_SAFE_HOMING)
#if ENABLED(AUTO_BED_LEVELING_UBL)
// Home close to center so grid points have z heights very close to 0
#define _SAFE_POINT(A) (((GRID_MAX_POINTS_##A) / 2) * (A##_BED_SIZE - 2 * (MESH_INSET)) / (GRID_MAX_POINTS_##A - 1) + MESH_INSET)
#else
#define _SAFE_POINT(A) A##_CENTER
#endif
#ifndef Z_SAFE_HOMING_X_POINT #ifndef Z_SAFE_HOMING_X_POINT
#define Z_SAFE_HOMING_X_POINT _SAFE_POINT(X) #define Z_SAFE_HOMING_X_POINT X_CENTER
#endif #endif
#ifndef Z_SAFE_HOMING_Y_POINT #ifndef Z_SAFE_HOMING_Y_POINT
#define Z_SAFE_HOMING_Y_POINT _SAFE_POINT(Y) #define Z_SAFE_HOMING_Y_POINT Y_CENTER
#endif #endif
#define X_TILT_FULCRUM Z_SAFE_HOMING_X_POINT #define X_TILT_FULCRUM Z_SAFE_HOMING_X_POINT
#define Y_TILT_FULCRUM Z_SAFE_HOMING_Y_POINT #define Y_TILT_FULCRUM Z_SAFE_HOMING_Y_POINT
@@ -423,9 +417,6 @@
* NOTE: Driver timing order is longest-to-shortest duration. * NOTE: Driver timing order is longest-to-shortest duration.
* Preserve this ordering when adding new drivers. * Preserve this ordering when adding new drivers.
*/ */
#define TRINAMICS (HAS_TRINAMIC || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE))
#ifndef MINIMUM_STEPPER_DIR_DELAY #ifndef MINIMUM_STEPPER_DIR_DELAY
#if HAS_DRIVER(TB6560) #if HAS_DRIVER(TB6560)
#define MINIMUM_STEPPER_DIR_DELAY 15000 #define MINIMUM_STEPPER_DIR_DELAY 15000
@@ -437,7 +428,7 @@
#define MINIMUM_STEPPER_DIR_DELAY 500 #define MINIMUM_STEPPER_DIR_DELAY 500
#elif HAS_DRIVER(A4988) #elif HAS_DRIVER(A4988)
#define MINIMUM_STEPPER_DIR_DELAY 200 #define MINIMUM_STEPPER_DIR_DELAY 200
#elif TRINAMICS #elif HAS_TRINAMIC || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE)
#define MINIMUM_STEPPER_DIR_DELAY 20 #define MINIMUM_STEPPER_DIR_DELAY 20
#else #else
#define MINIMUM_STEPPER_DIR_DELAY 200 // Expect at least 10µS since one Stepper ISR must transpire #define MINIMUM_STEPPER_DIR_DELAY 200 // Expect at least 10µS since one Stepper ISR must transpire
@@ -453,7 +444,7 @@
#define MINIMUM_STEPPER_PULSE 2 #define MINIMUM_STEPPER_PULSE 2
#elif HAS_DRIVER(A4988) || HAS_DRIVER(LV8729) #elif HAS_DRIVER(A4988) || HAS_DRIVER(LV8729)
#define MINIMUM_STEPPER_PULSE 1 #define MINIMUM_STEPPER_PULSE 1
#elif TRINAMICS #elif HAS_TRINAMIC || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE)
#define MINIMUM_STEPPER_PULSE 0 #define MINIMUM_STEPPER_PULSE 0
#else #else
#define MINIMUM_STEPPER_PULSE 1 #define MINIMUM_STEPPER_PULSE 1
@@ -469,7 +460,7 @@
#define MAXIMUM_STEPPER_RATE 150000 #define MAXIMUM_STEPPER_RATE 150000
#elif HAS_DRIVER(DRV8825) #elif HAS_DRIVER(DRV8825)
#define MAXIMUM_STEPPER_RATE 250000 #define MAXIMUM_STEPPER_RATE 250000
#elif TRINAMICS #elif HAS_TRINAMIC || HAS_DRIVER(TMC2660) || HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC26X_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE)
#define MAXIMUM_STEPPER_RATE 400000 #define MAXIMUM_STEPPER_RATE 400000
#elif HAS_DRIVER(A4988) #elif HAS_DRIVER(A4988)
#define MAXIMUM_STEPPER_RATE 500000 #define MAXIMUM_STEPPER_RATE 500000

View File

@@ -1,3 +1,5 @@
#include <U8glib.h>
/** /**
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
@@ -238,7 +240,7 @@
* *
* :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' } * :{ 0:'No power switch', 1:'ATX', 2:'X-Box 360' }
*/ */
#define POWER_SUPPLY 0 //#define POWER_SUPPLY 1
#if POWER_SUPPLY > 0 #if POWER_SUPPLY > 0
// Enable this option to leave the PSU off at startup. // Enable this option to leave the PSU off at startup.
@@ -380,9 +382,9 @@
// If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it
// i3 Mega stock v5 hotend, 40W heater cartridge (3.6Ω @ 22°C) // i3 Mega stock v5 hotend, 40W heater cartridge (3.6Ω @ 22°C)
#define DEFAULT_Kp 15.94 #define DEFAULT_Kp 18.58
#define DEFAULT_Ki 1.17 #define DEFAULT_Ki 1.38
#define DEFAULT_Kd 54.19 #define DEFAULT_Kd 62.40
// Ultimaker // Ultimaker
//#define DEFAULT_Kp 22.2 //#define DEFAULT_Kp 22.2
@@ -437,9 +439,9 @@
//#define PID_BED_DEBUG // Sends debug data to the serial port. //#define PID_BED_DEBUG // Sends debug data to the serial port.
//Anycubic i3 Mega Ultrabase (0.9Ω @ 22°C) //Anycubic i3 Mega Ultrabase (0.9Ω @ 22°C)
#define DEFAULT_bedKp 251.78 #define DEFAULT_bedKp 187.45
#define DEFAULT_bedKi 49.57 #define DEFAULT_bedKi 35.75
#define DEFAULT_bedKd 319.73 #define DEFAULT_bedKd 245.71
//120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
//from pidautotune //from pidautotune
@@ -621,7 +623,7 @@
* Override with M203 * Override with M203
* X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]]
*/ */
#define DEFAULT_MAX_FEEDRATE { 500, 500, 6, 60 } #define DEFAULT_MAX_FEEDRATE { 500, 120, 6, 60 }
/** /**
* Default Max Acceleration (change/s) change = mm/s * Default Max Acceleration (change/s) change = mm/s
@@ -629,7 +631,7 @@
* Override with M201 * Override with M201
* X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]] * X, Y, Z, E0 [, E1[, E2[, E3[, E4]]]]
*/ */
#define DEFAULT_MAX_ACCELERATION { 3000, 2000, 60, 10000 } #define DEFAULT_MAX_ACCELERATION { 2000, 1200, 60, 10000 }
/** /**
* Default Acceleration (change/s) change = mm/s * Default Acceleration (change/s) change = mm/s
@@ -639,9 +641,9 @@
* M204 R Retract Acceleration * M204 R Retract Acceleration
* M204 T Travel Acceleration * M204 T Travel Acceleration
*/ */
#define DEFAULT_ACCELERATION 1500 // X, Y, Z and E acceleration for printing moves #define DEFAULT_ACCELERATION 1200 // X, Y, Z and E acceleration for printing moves
#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts #define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts
#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves #define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z acceleration for travel (non printing) moves
/** /**
* Default Jerk (mm/s) * Default Jerk (mm/s)
@@ -651,8 +653,8 @@
* When changing speed and direction, if the difference is less than the * When changing speed and direction, if the difference is less than the
* value set here, it may happen instantaneously. * value set here, it may happen instantaneously.
*/ */
#define DEFAULT_XJERK 10.0 #define DEFAULT_XJERK 8.0
#define DEFAULT_YJERK 10.0 #define DEFAULT_YJERK 8.0
#define DEFAULT_ZJERK 0.4 #define DEFAULT_ZJERK 0.4
#define DEFAULT_EJERK 5.0 #define DEFAULT_EJERK 5.0
@@ -736,17 +738,6 @@
//#define BLTOUCH //#define BLTOUCH
#if ENABLED(BLTOUCH) #if ENABLED(BLTOUCH)
//#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed //#define BLTOUCH_DELAY 375 // (ms) Enable and increase if needed
/**
* BLTouch V3.0 and newer smart series
* For genuine BLTouch 3.0 sensors. Clones may be confused by 3.0 command angles. YMMV.
* If the pin trigger is not detected, first try swapping the black and white wires then toggle this.
*/
//#define BLTOUCH_V3
#if ENABLED(BLTOUCH_V3)
//#define BLTOUCH_FORCE_5V_MODE
//#define BLTOUCH_FORCE_OPEN_DRAIN_MODE
#endif
#endif #endif
/** /**
@@ -793,8 +784,8 @@
* O-- FRONT --+ * O-- FRONT --+
* (0,0) * (0,0)
*/ */
#define X_PROBE_OFFSET_FROM_EXTRUDER 10 // X offset: -left +right [of the nozzle] #define X_PROBE_OFFSET_FROM_EXTRUDER -9 // X offset: -left +right [of the nozzle]
#define Y_PROBE_OFFSET_FROM_EXTRUDER 10 // Y offset: -front +behind [the nozzle] #define Y_PROBE_OFFSET_FROM_EXTRUDER -22 // Y offset: -front +behind [the nozzle]
#define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle] #define Z_PROBE_OFFSET_FROM_EXTRUDER 0 // Z offset: -below +above [the nozzle]
// Certain types of probes need to stay away from edges // Certain types of probes need to stay away from edges
@@ -1119,7 +1110,7 @@
* Add a bed leveling sub-menu for ABL or MBL. * Add a bed leveling sub-menu for ABL or MBL.
* Include a guided procedure if manual probing is enabled. * Include a guided procedure if manual probing is enabled.
*/ */
//#define LCD_BED_LEVELING #define LCD_BED_LEVELING
#if ENABLED(LCD_BED_LEVELING) #if ENABLED(LCD_BED_LEVELING)
#define MBL_Z_STEP 0.025 // Step size while manually probing Z axis. #define MBL_Z_STEP 0.025 // Step size while manually probing Z axis.
@@ -1256,7 +1247,7 @@
// //
#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages #define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages
#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating //#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating
// //
// M100 Free Memory Watcher // M100 Free Memory Watcher
@@ -1414,7 +1405,7 @@
* *
* :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', 'test':'TEST' } * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cn':'Chinese', 'cz':'Czech', 'cz_utf8':'Czech (UTF8)', 'de':'German', 'el':'Greek', 'el-gr':'Greek (Greece)', 'es':'Spanish', 'es_utf8':'Spanish (UTF8)', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'fr_utf8':'French (UTF8)', 'gl':'Galician', 'hr':'Croatian', 'it':'Italian', 'kana':'Japanese', 'kana_utf8':'Japanese (UTF8)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt-br':'Portuguese (Brazilian)', 'pt-br_utf8':'Portuguese (Brazilian UTF8)', 'pt_utf8':'Portuguese (UTF8)', 'ru':'Russian', 'sk_utf8':'Slovak (UTF8)', 'tr':'Turkish', 'uk':'Ukrainian', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Taiwan)', 'test':'TEST' }
*/ */
//#define LCD_LANGUAGE en #define LCD_LANGUAGE en
/** /**
* LCD Character Set * LCD Character Set
@@ -1481,13 +1472,13 @@
// This option overrides the default number of encoder pulses needed to // This option overrides the default number of encoder pulses needed to
// produce one step. Should be increased for high-resolution encoders. // produce one step. Should be increased for high-resolution encoders.
// //
//#define ENCODER_PULSES_PER_STEP 4 #define ENCODER_PULSES_PER_STEP 4
// //
// Use this option to override the number of step signals required to // Use this option to override the number of step signals required to
// move between next/prev menu items. // move between next/prev menu items.
// //
//#define ENCODER_STEPS_PER_MENU_ITEM 1 #define ENCODER_STEPS_PER_MENU_ITEM 1
/** /**
* Encoder Direction Options * Encoder Direction Options
@@ -1692,7 +1683,7 @@
// RepRapDiscount FULL GRAPHIC Smart Controller // RepRapDiscount FULL GRAPHIC Smart Controller
// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller // http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller
// //
//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER #define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
// //
// ReprapWorld Graphical LCD // ReprapWorld Graphical LCD
@@ -1845,13 +1836,13 @@
// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency
// which is not as annoying as with the hardware PWM. On the other hand, if this frequency // which is not as annoying as with the hardware PWM. On the other hand, if this frequency
// is too low, you should also increment SOFT_PWM_SCALE. // is too low, you should also increment SOFT_PWM_SCALE.
//#define FAN_SOFT_PWM #define FAN_SOFT_PWM
// Incrementing this by 1 will double the software PWM frequency, // Incrementing this by 1 will double the software PWM frequency,
// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. // affecting heaters, and the fan if FAN_SOFT_PWM is enabled.
// However, control resolution will be halved for each increment; // However, control resolution will be halved for each increment;
// at zero value, there are 128 effective control positions. // at zero value, there are 128 effective control positions.
#define SOFT_PWM_SCALE 0 #define SOFT_PWM_SCALE 2
// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can // If SOFT_PWM_SCALE is set to a value higher than 0, dithering can
// be used to mitigate the associated resolution loss. If enabled, // be used to mitigate the associated resolution loss. If enabled,
@@ -1960,20 +1951,6 @@
// Only power servos during movement, otherwise leave off to prevent jitter // Only power servos during movement, otherwise leave off to prevent jitter
//#define DEACTIVATE_SERVOS_AFTER_MOVE //#define DEACTIVATE_SERVOS_AFTER_MOVE
/**
* Select your version of the Trigorilla (RAMPS1.4) board here.
*
* 0 = Default Trigorilla
* 1 = Newer Trigorilla v1.1 (first seen late 2018)
*
* The only major difference is a slight change on the servo pin mapping.
* This setting only is relevant if you want to use BLtouch or similar
* mods to be used via servo pins.
* The new version is to be identified by a "TRIGORILLA1.1" lettering
* on the upper left of the PCB silkscreen.
*/
#define TRIGORILLA_VERSION 0
// Enable Anycubic TFT // Enable Anycubic TFT
#define ANYCUBIC_TFT_MODEL #define ANYCUBIC_TFT_MODEL
#define ANYCUBIC_FILAMENT_RUNOUT_SENSOR #define ANYCUBIC_FILAMENT_RUNOUT_SENSOR

View File

@@ -1,4 +1,4 @@
/** /**
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* *
@@ -431,7 +431,7 @@
// @section extras // @section extras
// minimum time in microseconds that a movement needs to take if the buffer is emptied. // minimum time in microseconds that a movement needs to take if the buffer is emptied.
#define DEFAULT_MINSEGMENTTIME 20000 #define DEFAULT_MINSEGMENTTIME 50000
// If defined the movements slow down when the look ahead buffer is only half full // If defined the movements slow down when the look ahead buffer is only half full
#define SLOWDOWN #define SLOWDOWN
@@ -524,13 +524,13 @@
// @section lcd // @section lcd
// Include a page of printer information in the LCD Main Menu // Include a page of printer information in the LCD Main Menu
//#define LCD_INFO_MENU #define LCD_INFO_MENU
// Scroll a longer status message into view // Scroll a longer status message into view
//#define STATUS_MESSAGE_SCROLLING //#define STATUS_MESSAGE_SCROLLING
// On the Info Screen, display XY with one decimal place when possible // On the Info Screen, display XY with one decimal place when possible
//#define LCD_DECIMAL_SMALL_XY #define LCD_DECIMAL_SMALL_XY
// The timeout (in ms) to return to the status screen from sub-menus // The timeout (in ms) to return to the status screen from sub-menus
//#define LCD_TIMEOUT_TO_STATUS 15000 //#define LCD_TIMEOUT_TO_STATUS 15000
@@ -879,8 +879,8 @@
// @section serial // @section serial
// The ASCII buffer for serial input // The ASCII buffer for serial input
#define MAX_CMD_SIZE 128 #define MAX_CMD_SIZE 96
#define BUFSIZE 8 #define BUFSIZE 4
// Transmission to Host Buffer Size // Transmission to Host Buffer Size
// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. // To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0.
@@ -889,13 +889,13 @@
// For debug-echo: 128 bytes for the optimal speed. // For debug-echo: 128 bytes for the optimal speed.
// Other output doesn't need to be that speedy. // Other output doesn't need to be that speedy.
// :[0, 2, 4, 8, 16, 32, 64, 128, 256] // :[0, 2, 4, 8, 16, 32, 64, 128, 256]
#define TX_BUFFER_SIZE 4 #define TX_BUFFER_SIZE 0
// Host Receive Buffer Size // Host Receive Buffer Size
// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. // Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough.
// To use flow control, set this buffer size to at least 1024 bytes. // To use flow control, set this buffer size to at least 1024 bytes.
// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] // :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]
#define RX_BUFFER_SIZE 256 //#define RX_BUFFER_SIZE 32
#if RX_BUFFER_SIZE >= 1024 #if RX_BUFFER_SIZE >= 1024
// Enable to have the controller send XON/XOFF control characters to // Enable to have the controller send XON/XOFF control characters to

View File

@@ -609,7 +609,13 @@ uint8_t target_extruder;
#endif #endif
#if HAS_POWER_SWITCH #if HAS_POWER_SWITCH
bool powersupply_on; bool powersupply_on = (
#if ENABLED(PS_DEFAULT_OFF)
false
#else
true
#endif
);
#if ENABLED(AUTO_POWER_CONTROL) #if ENABLED(AUTO_POWER_CONTROL)
#define PSU_ON() powerManager.power_on() #define PSU_ON() powerManager.power_on()
#define PSU_OFF() powerManager.power_off() #define PSU_OFF() powerManager.power_off()
@@ -945,9 +951,9 @@ void setup_powerhold() {
#endif #endif
#if HAS_POWER_SWITCH #if HAS_POWER_SWITCH
#if ENABLED(PS_DEFAULT_OFF) #if ENABLED(PS_DEFAULT_OFF)
powersupply_on = true; PSU_OFF(); PSU_OFF();
#else #else
powersupply_on = false; PSU_ON(); PSU_ON();
#endif #endif
#endif #endif
} }
@@ -2100,18 +2106,8 @@ void clean_up_after_endstop_or_probe_move() {
} }
} }
#if ENABLED(BLTOUCH_FORCE_5V_MODE)
bltouch_command(BLTOUCH_5V_MODE);
#elif ENABLED(BLTOUCH_V3)
bltouch_command(BLTOUCH_OD_MODE);
#endif
bltouch_command(deploy ? BLTOUCH_DEPLOY : BLTOUCH_STOW); bltouch_command(deploy ? BLTOUCH_DEPLOY : BLTOUCH_STOW);
#if ENABLED(BLTOUCH_V3)
if (deploy) bltouch_command(BLTOUCH_SW_MODE);
#endif
#if ENABLED(DEBUG_LEVELING_FEATURE) #if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) { if (DEBUGGING(LEVELING)) {
SERIAL_ECHOPAIR("set_bltouch_deployed(", deploy); SERIAL_ECHOPAIR("set_bltouch_deployed(", deploy);
@@ -7222,6 +7218,10 @@ inline void gcode_M17() {
*/ */
static void wait_for_filament_reload(const int8_t max_beep_count=0) { static void wait_for_filament_reload(const int8_t max_beep_count=0) {
nozzle_timed_out = false; nozzle_timed_out = false;
nozzle_timed_out = false;
#ifdef ANYCUBIC_TFT_MODEL
AnycubicTFT.PausedByNozzleTimeout = false;
#endif
#if ENABLED(ULTIPANEL) #if ENABLED(ULTIPANEL)
lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT); lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INSERT);
@@ -7256,13 +7256,7 @@ inline void gcode_M17() {
if (nozzle_timed_out) { if (nozzle_timed_out) {
#ifdef ANYCUBIC_TFT_MODEL #ifdef ANYCUBIC_TFT_MODEL
if (AnycubicTFT.ai3m_pause_state < 3) { AnycubicTFT.PausedByNozzleTimeout=true;
AnycubicTFT.ai3m_pause_state += 2;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: NTO - AI3M Pause State set to: ", AnycubicTFT.ai3m_pause_state);
SERIAL_EOL();
#endif
}
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Nozzle timeout flag set"); SERIAL_ECHOLNPGM("DEBUG: Nozzle timeout flag set");
#endif #endif
@@ -7309,14 +7303,8 @@ inline void gcode_M17() {
wait_for_user = true; // Wait for user to load filament wait_for_user = true; // Wait for user to load filament
nozzle_timed_out = false; nozzle_timed_out = false;
#ifdef ANYCUBIC_TFT_MODEL
if (AnycubicTFT.ai3m_pause_state > 3) {
AnycubicTFT.ai3m_pause_state -= 2;
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: NTO - AI3M Pause State set to: ", AnycubicTFT.ai3m_pause_state); AnycubicTFT.PausedByNozzleTimeout = false;
SERIAL_EOL();
#endif
}
#endif #endif
#if HAS_BUZZER #if HAS_BUZZER
@@ -7353,13 +7341,7 @@ inline void gcode_M17() {
// Re-enable the heaters if they timed out // Re-enable the heaters if they timed out
nozzle_timed_out = false; nozzle_timed_out = false;
#ifdef ANYCUBIC_TFT_MODEL #ifdef ANYCUBIC_TFT_MODEL
if (AnycubicTFT.ai3m_pause_state > 3) { AnycubicTFT.PausedByNozzleTimeout = false;
AnycubicTFT.ai3m_pause_state -= 2;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: NTO - AI3M Pause State set to: ", AnycubicTFT.ai3m_pause_state);
SERIAL_EOL();
#endif
}
#endif #endif
HOTEND_LOOP() { HOTEND_LOOP() {
@@ -8594,7 +8576,7 @@ inline void gcode_M109() {
#endif #endif
// flush the serial buffer after heating to prevent lockup by m105 // flush the serial buffer after heating to prevent lockup by m105
//SERIAL_FLUSH(); SERIAL_FLUSH();
} }
@@ -8749,7 +8731,7 @@ inline void gcode_M109() {
#endif #endif
// flush the serial buffer after heating to prevent lockup by m105 // flush the serial buffer after heating to prevent lockup by m105
//SERIAL_FLUSH(); SERIAL_FLUSH();
} }
#endif // HAS_HEATED_BED #endif // HAS_HEATED_BED
@@ -10156,7 +10138,7 @@ inline void gcode_M226() {
NOLESS(thermalManager.lpq_len, 0); NOLESS(thermalManager.lpq_len, 0);
#endif #endif
thermalManager.update_pid(); thermalManager.updatePID();
SERIAL_ECHO_START(); SERIAL_ECHO_START();
#if ENABLED(PID_PARAMS_PER_HOTEND) #if ENABLED(PID_PARAMS_PER_HOTEND)
SERIAL_ECHOPAIR(" e:", e); // specify extruder in serial output SERIAL_ECHOPAIR(" e:", e); // specify extruder in serial output
@@ -10302,7 +10284,7 @@ inline void gcode_M303() {
KEEPALIVE_STATE(NOT_BUSY); KEEPALIVE_STATE(NOT_BUSY);
#endif #endif
thermalManager.pid_autotune(temp, e, c, u); thermalManager.PID_autotune(temp, e, c, u);
#if DISABLED(BUSY_WHILE_HEATING) #if DISABLED(BUSY_WHILE_HEATING)
KEEPALIVE_STATE(IN_HANDLER); KEEPALIVE_STATE(IN_HANDLER);
@@ -11036,13 +11018,6 @@ inline void gcode_M502() {
#ifdef ANYCUBIC_TFT_MODEL #ifdef ANYCUBIC_TFT_MODEL
#ifdef SDSUPPORT #ifdef SDSUPPORT
if (card.sdprinting) { // are we printing from sd? if (card.sdprinting) { // are we printing from sd?
if (AnycubicTFT.ai3m_pause_state < 2) {
AnycubicTFT.ai3m_pause_state = 2;
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: M600 - AI3M Pause State set to: ", AnycubicTFT.ai3m_pause_state);
SERIAL_EOL();
#endif
}
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Enter M600 TFTstate routine"); SERIAL_ECHOLNPGM("DEBUG: Enter M600 TFTstate routine");
#endif #endif
@@ -11050,7 +11025,10 @@ inline void gcode_M502() {
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Set TFTstate to SDPAUSE_REQ"); SERIAL_ECHOLNPGM("DEBUG: Set TFTstate to SDPAUSE_REQ");
#endif #endif
// set flag to ensure correct resume routine gets executed AnycubicTFT.PausedByFilamentChange=true; // set flag to ensure correct resume routine gets executed
#ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Set filament change flag");
#endif
} }
#endif #endif
#endif #endif
@@ -11503,11 +11481,9 @@ inline void gcode_M502() {
#if HAS_TRINAMIC #if HAS_TRINAMIC
#if ENABLED(TMC_DEBUG) #if ENABLED(TMC_DEBUG)
inline void gcode_M122() { inline void gcode_M122() {
#if ENABLED(MONITOR_DRIVER_STATUS)
if (parser.seen('S')) if (parser.seen('S'))
tmc_set_report_status(parser.value_bool()); tmc_set_report_status(parser.value_bool());
else else
#endif
tmc_report_all(); tmc_report_all();
} }
#endif // TMC_DEBUG #endif // TMC_DEBUG
@@ -11518,7 +11494,7 @@ inline void gcode_M502() {
* Report driver currents when no axis specified * Report driver currents when no axis specified
*/ */
inline void gcode_M906() { inline void gcode_M906() {
#define TMC_SAY_CURRENT(Q) tmc_get_current(stepper##Q) #define TMC_SAY_CURRENT(Q) tmc_get_current(stepper##Q, TMC_##Q)
#define TMC_SET_CURRENT(Q) tmc_set_current(stepper##Q, value) #define TMC_SET_CURRENT(Q) tmc_set_current(stepper##Q, value)
bool report = true; bool report = true;
@@ -11663,44 +11639,43 @@ inline void gcode_M502() {
#define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || (AXIS_DRIVER_TYPE(ST, TMC2208) && PIN_EXISTS(ST##_SERIAL_RX))) #define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || (AXIS_DRIVER_TYPE(ST, TMC2208) && PIN_EXISTS(ST##_SERIAL_RX)))
#define M91x_USE_E(N) (E_STEPPERS > N && M91x_USE(E##N)) #define M91x_USE_E(N) (E_STEPPERS > N && M91x_USE(E##N))
#if ENABLED(MONITOR_DRIVER_STATUS)
/** /**
* M911: Report TMC stepper driver overtemperature pre-warn flag * M911: Report TMC stepper driver overtemperature pre-warn flag
* This flag is held by the library, persisting until cleared by M912 * This flag is held by the library, persisting until cleared by M912
*/ */
inline void gcode_M911() { inline void gcode_M911() {
#if M91x_USE(X) #if M91x_USE(X)
tmc_report_otpw(stepperX); tmc_report_otpw(stepperX, TMC_X);
#endif #endif
#if M91x_USE(X2) #if M91x_USE(X2)
tmc_report_otpw(stepperX2); tmc_report_otpw(stepperX2, TMC_X2);
#endif #endif
#if M91x_USE(Y) #if M91x_USE(Y)
tmc_report_otpw(stepperY); tmc_report_otpw(stepperY, TMC_Y);
#endif #endif
#if M91x_USE(Y2) #if M91x_USE(Y2)
tmc_report_otpw(stepperY2); tmc_report_otpw(stepperY2, TMC_Y2);
#endif #endif
#if M91x_USE(Z) #if M91x_USE(Z)
tmc_report_otpw(stepperZ); tmc_report_otpw(stepperZ, TMC_Z);
#endif #endif
#if M91x_USE(Z2) #if M91x_USE(Z2)
tmc_report_otpw(stepperZ2); tmc_report_otpw(stepperZ2, TMC_Z2);
#endif #endif
#if M91x_USE_E(0) #if M91x_USE_E(0)
tmc_report_otpw(stepperE0); tmc_report_otpw(stepperE0, TMC_E0);
#endif #endif
#if M91x_USE_E(1) #if M91x_USE_E(1)
tmc_report_otpw(stepperE1); tmc_report_otpw(stepperE1, TMC_E1);
#endif #endif
#if M91x_USE_E(2) #if M91x_USE_E(2)
tmc_report_otpw(stepperE2); tmc_report_otpw(stepperE2, TMC_E2);
#endif #endif
#if M91x_USE_E(3) #if M91x_USE_E(3)
tmc_report_otpw(stepperE3); tmc_report_otpw(stepperE3, TMC_E3);
#endif #endif
#if M91x_USE_E(4) #if M91x_USE_E(4)
tmc_report_otpw(stepperE4); tmc_report_otpw(stepperE4, TMC_E4);
#endif #endif
} }
@@ -11726,30 +11701,30 @@ inline void gcode_M502() {
#if M91x_USE(X) || M91x_USE(X2) #if M91x_USE(X) || M91x_USE(X2)
const uint8_t xval = parser.byteval(axis_codes[X_AXIS], 10); const uint8_t xval = parser.byteval(axis_codes[X_AXIS], 10);
#if M91x_USE(X) #if M91x_USE(X)
if (hasNone || xval == 1 || (hasX && xval == 10)) tmc_clear_otpw(stepperX); if (hasNone || xval == 1 || (hasX && xval == 10)) tmc_clear_otpw(stepperX, TMC_X);
#endif #endif
#if M91x_USE(X2) #if M91x_USE(X2)
if (hasNone || xval == 2 || (hasX && xval == 10)) tmc_clear_otpw(stepperX2); if (hasNone || xval == 2 || (hasX && xval == 10)) tmc_clear_otpw(stepperX2, TMC_X2);
#endif #endif
#endif #endif
#if M91x_USE(Y) || M91x_USE(Y2) #if M91x_USE(Y) || M91x_USE(Y2)
const uint8_t yval = parser.byteval(axis_codes[Y_AXIS], 10); const uint8_t yval = parser.byteval(axis_codes[Y_AXIS], 10);
#if M91x_USE(Y) #if M91x_USE(Y)
if (hasNone || yval == 1 || (hasY && yval == 10)) tmc_clear_otpw(stepperY); if (hasNone || yval == 1 || (hasY && yval == 10)) tmc_clear_otpw(stepperY, TMC_Y);
#endif #endif
#if M91x_USE(Y2) #if M91x_USE(Y2)
if (hasNone || yval == 2 || (hasY && yval == 10)) tmc_clear_otpw(stepperY2); if (hasNone || yval == 2 || (hasY && yval == 10)) tmc_clear_otpw(stepperY2, TMC_Y2);
#endif #endif
#endif #endif
#if M91x_USE(Z) || M91x_USE(Z2) #if M91x_USE(Z) || M91x_USE(Z2)
const uint8_t zval = parser.byteval(axis_codes[Z_AXIS], 10); const uint8_t zval = parser.byteval(axis_codes[Z_AXIS], 10);
#if M91x_USE(Z) #if M91x_USE(Z)
if (hasNone || zval == 1 || (hasZ && zval == 10)) tmc_clear_otpw(stepperZ); if (hasNone || zval == 1 || (hasZ && zval == 10)) tmc_clear_otpw(stepperZ, TMC_Z);
#endif #endif
#if M91x_USE(Z2) #if M91x_USE(Z2)
if (hasNone || zval == 2 || (hasZ && zval == 10)) tmc_clear_otpw(stepperZ2); if (hasNone || zval == 2 || (hasZ && zval == 10)) tmc_clear_otpw(stepperZ2, TMC_Z2);
#endif #endif
#endif #endif
@@ -11757,32 +11732,31 @@ inline void gcode_M502() {
#if M91x_USE_E(0) || M91x_USE_E(1) || M91x_USE_E(2) || M91x_USE_E(3) || M91x_USE_E(4) #if M91x_USE_E(0) || M91x_USE_E(1) || M91x_USE_E(2) || M91x_USE_E(3) || M91x_USE_E(4)
const uint8_t eval = parser.byteval(axis_codes[E_AXIS], 10); const uint8_t eval = parser.byteval(axis_codes[E_AXIS], 10);
#if M91x_USE_E(0) #if M91x_USE_E(0)
if (hasNone || eval == 0 || (hasE && eval == 10)) tmc_clear_otpw(stepperE0); if (hasNone || eval == 0 || (hasE && eval == 10)) tmc_clear_otpw(stepperE0, TMC_E0);
#endif #endif
#if M91x_USE_E(1) #if M91x_USE_E(1)
if (hasNone || eval == 1 || (hasE && eval == 10)) tmc_clear_otpw(stepperE1); if (hasNone || eval == 1 || (hasE && eval == 10)) tmc_clear_otpw(stepperE1, TMC_E1);
#endif #endif
#if M91x_USE_E(2) #if M91x_USE_E(2)
if (hasNone || eval == 2 || (hasE && eval == 10)) tmc_clear_otpw(stepperE2); if (hasNone || eval == 2 || (hasE && eval == 10)) tmc_clear_otpw(stepperE2, TMC_E2);
#endif #endif
#if M91x_USE_E(3) #if M91x_USE_E(3)
if (hasNone || eval == 3 || (hasE && eval == 10)) tmc_clear_otpw(stepperE3); if (hasNone || eval == 3 || (hasE && eval == 10)) tmc_clear_otpw(stepperE3, TMC_E3);
#endif #endif
#if M91x_USE_E(4) #if M91x_USE_E(4)
if (hasNone || eval == 4 || (hasE && eval == 10)) tmc_clear_otpw(stepperE4); if (hasNone || eval == 4 || (hasE && eval == 10)) tmc_clear_otpw(stepperE4, TMC_E4);
#endif #endif
#endif #endif
} }
#endif
/** /**
* M913: Set HYBRID_THRESHOLD speed. * M913: Set HYBRID_THRESHOLD speed.
*/ */
#if ENABLED(HYBRID_THRESHOLD) #if ENABLED(HYBRID_THRESHOLD)
inline void gcode_M913() { inline void gcode_M913() {
#define TMC_SAY_PWMTHRS(A,Q) tmc_get_pwmthrs(stepper##Q, planner.axis_steps_per_mm[_AXIS(A)]) #define TMC_SAY_PWMTHRS(A,Q) tmc_get_pwmthrs(stepper##Q, TMC_##Q, planner.axis_steps_per_mm[_AXIS(A)])
#define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, value, planner.axis_steps_per_mm[_AXIS(A)]) #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, value, planner.axis_steps_per_mm[_AXIS(A)])
#define TMC_SAY_PWMTHRS_E(E) do{ const uint8_t extruder = E; tmc_get_pwmthrs(stepperE##E, planner.axis_steps_per_mm[E_AXIS_N]); }while(0) #define TMC_SAY_PWMTHRS_E(E) do{ const uint8_t extruder = E; tmc_get_pwmthrs(stepperE##E, TMC_E##E, planner.axis_steps_per_mm[E_AXIS_N]); }while(0)
#define TMC_SET_PWMTHRS_E(E) do{ const uint8_t extruder = E; tmc_set_pwmthrs(stepperE##E, value, planner.axis_steps_per_mm[E_AXIS_N]); }while(0) #define TMC_SET_PWMTHRS_E(E) do{ const uint8_t extruder = E; tmc_set_pwmthrs(stepperE##E, value, planner.axis_steps_per_mm[E_AXIS_N]); }while(0)
bool report = true; bool report = true;
@@ -11880,7 +11854,7 @@ inline void gcode_M502() {
*/ */
#if ENABLED(SENSORLESS_HOMING) #if ENABLED(SENSORLESS_HOMING)
inline void gcode_M914() { inline void gcode_M914() {
#define TMC_SAY_SGT(Q) tmc_get_sgt(stepper##Q) #define TMC_SAY_SGT(Q) tmc_get_sgt(stepper##Q, TMC_##Q)
#define TMC_SET_SGT(Q) tmc_set_sgt(stepper##Q, value) #define TMC_SET_SGT(Q) tmc_set_sgt(stepper##Q, value)
bool report = true; bool report = true;
@@ -11965,12 +11939,12 @@ inline void gcode_M502() {
} }
#if AXIS_IS_TMC(Z) #if AXIS_IS_TMC(Z)
const uint16_t Z_current_1 = stepperZ.getMilliamps(); const uint16_t Z_current_1 = stepperZ.getCurrent();
stepperZ.rms_current(_rms); stepperZ.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER);
#endif #endif
#if AXIS_IS_TMC(Z2) #if AXIS_IS_TMC(Z2)
const uint16_t Z2_current_1 = stepperZ2.getMilliamps(); const uint16_t Z2_current_1 = stepperZ2.getCurrent();
stepperZ2.rms_current(_rms); stepperZ2.setCurrent(_rms, R_SENSE, HOLD_MULTIPLIER);
#endif #endif
SERIAL_ECHOPAIR("\nCalibration current: Z", _rms); SERIAL_ECHOPAIR("\nCalibration current: Z", _rms);
@@ -11980,10 +11954,10 @@ inline void gcode_M502() {
do_blocking_move_to_z(Z_MAX_POS+_z); do_blocking_move_to_z(Z_MAX_POS+_z);
#if AXIS_IS_TMC(Z) #if AXIS_IS_TMC(Z)
stepperZ.rms_current(Z_current_1); stepperZ.setCurrent(Z_current_1, R_SENSE, HOLD_MULTIPLIER);
#endif #endif
#if AXIS_IS_TMC(Z2) #if AXIS_IS_TMC(Z2)
stepperZ2.rms_current(Z2_current_1); stepperZ2.setCurrent(Z2_current_1, R_SENSE, HOLD_MULTIPLIER);
#endif #endif
do_blocking_move_to_z(Z_MAX_POS); do_blocking_move_to_z(Z_MAX_POS);
@@ -13237,10 +13211,8 @@ void process_parsed_command() {
case 122: gcode_M122(); break; // M122: Debug TMC steppers case 122: gcode_M122(); break; // M122: Debug TMC steppers
#endif #endif
case 906: gcode_M906(); break; // M906: Set motor current in milliamps using axis codes X, Y, Z, E case 906: gcode_M906(); break; // M906: Set motor current in milliamps using axis codes X, Y, Z, E
#if ENABLED(MONITOR_DRIVER_STATUS)
case 911: gcode_M911(); break; // M911: Report TMC prewarn triggered flags case 911: gcode_M911(); break; // M911: Report TMC prewarn triggered flags
case 912: gcode_M912(); break; // M911: Clear TMC prewarn triggered flags case 912: gcode_M912(); break; // M911: Clear TMC prewarn triggered flags
#endif
#if ENABLED(HYBRID_THRESHOLD) #if ENABLED(HYBRID_THRESHOLD)
case 913: gcode_M913(); break; // M913: Set HYBRID_THRESHOLD speed. case 913: gcode_M913(); break; // M913: Set HYBRID_THRESHOLD speed.
#endif #endif
@@ -14769,7 +14741,7 @@ void prepare_move_to_destination() {
#if ENABLED(TEMP_STAT_LEDS) #if ENABLED(TEMP_STAT_LEDS)
static uint8_t red_led = -1; // Invalid value to force leds initializzation on startup static bool red_led = false;
static millis_t next_status_led_update_ms = 0; static millis_t next_status_led_update_ms = 0;
void handle_status_leds(void) { void handle_status_leds(void) {
@@ -14777,18 +14749,20 @@ void prepare_move_to_destination() {
next_status_led_update_ms += 500; // Update every 0.5s next_status_led_update_ms += 500; // Update every 0.5s
float max_temp = 0.0; float max_temp = 0.0;
#if HAS_HEATED_BED #if HAS_HEATED_BED
max_temp = MAX(thermalManager.degTargetBed(), thermalManager.degBed()); max_temp = MAX3(max_temp, thermalManager.degTargetBed(), thermalManager.degBed());
#endif #endif
HOTEND_LOOP() HOTEND_LOOP()
max_temp = MAX3(max_temp, thermalManager.degHotend(e), thermalManager.degTargetHotend(e)); max_temp = MAX3(max_temp, thermalManager.degHotend(e), thermalManager.degTargetHotend(e));
const uint8_t new_led = (max_temp > 55.0) ? HIGH : (max_temp < 54.0 || red_led == -1) ? LOW : red_led; const bool new_led = (max_temp > 55.0) ? true : (max_temp < 54.0) ? false : red_led;
if (new_led != red_led) { if (new_led != red_led) {
red_led = new_led; red_led = new_led;
#if PIN_EXISTS(STAT_LED_RED) #if PIN_EXISTS(STAT_LED_RED)
WRITE(STAT_LED_RED_PIN, new_led); WRITE(STAT_LED_RED_PIN, new_led ? HIGH : LOW);
#endif
#if PIN_EXISTS(STAT_LED_BLUE) #if PIN_EXISTS(STAT_LED_BLUE)
WRITE(STAT_LED_BLUE_PIN, !new_led); WRITE(STAT_LED_BLUE_PIN, new_led ? LOW : HIGH);
#endif
#else
WRITE(STAT_LED_BLUE_PIN, new_led ? HIGH : LOW);
#endif #endif
} }
} }
@@ -15196,6 +15170,7 @@ void stop() {
} }
} }
/** /**
* Marlin entry-point: Set up before the program loop * Marlin entry-point: Set up before the program loop
* - Set up the kill pin, filament runout, power hold * - Set up the kill pin, filament runout, power hold
@@ -15249,9 +15224,6 @@ void setup() {
// Prepare communication for TMC drivers // Prepare communication for TMC drivers
#if HAS_DRIVER(TMC2130) #if HAS_DRIVER(TMC2130)
#if DISABLED(TMC_USE_SW_SPI)
SPI.begin();
#endif
tmc_init_cs_pins(); tmc_init_cs_pins();
#endif #endif
#if HAS_DRIVER(TMC2208) #if HAS_DRIVER(TMC2208)
@@ -15473,6 +15445,7 @@ void setup() {
#endif #endif
} }
/** /**
* The main Marlin program loop * The main Marlin program loop
* *

View File

@@ -1,4 +1,4 @@
/** /**
* Marlin 3D Printer Firmware * Marlin 3D Printer Firmware
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
* *
@@ -41,7 +41,7 @@
* Defines the version of the Marlin-AI3M build. Not to be confused with * Defines the version of the Marlin-AI3M build. Not to be confused with
* Marlin's own build number, e.g. 1.1.9. * Marlin's own build number, e.g. 1.1.9.
*/ */
#define CUSTOM_BUILD_VERSION "v1.4.6" #define CUSTOM_BUILD_VERSION "v1.4.5"
/** /**
* Verbose version identifier which should contain a reference to the location * Verbose version identifier which should contain a reference to the location
@@ -54,7 +54,7 @@
* here we define this default string as the date where the latest release * here we define this default string as the date where the latest release
* version was tagged. * version was tagged.
*/ */
#define STRING_DISTRIBUTION_DATE "2019-04-03" #define STRING_DISTRIBUTION_DATE "2019-03-24"
/** /**
* Required minimum Configuration.h and Configuration_adv.h file versions. * Required minimum Configuration.h and Configuration_adv.h file versions.

View File

@@ -156,6 +156,6 @@
#define BOARD_TEENSY2 84 // Teensy++2.0 (AT90USB1286) - CLI compile: HARDWARE_MOTHERBOARD=84 make #define BOARD_TEENSY2 84 // Teensy++2.0 (AT90USB1286) - CLI compile: HARDWARE_MOTHERBOARD=84 make
#define BOARD_5DPRINT 88 // 5DPrint D8 Driver Board #define BOARD_5DPRINT 88 // 5DPrint D8 Driver Board
#define MB(board) (defined(BOARD_##board) && MOTHERBOARD==BOARD_##board) #define MB(board) (MOTHERBOARD==BOARD_##board)
#endif // __BOARDS_H #endif // __BOARDS_H

View File

@@ -64,9 +64,6 @@
#include "tmc_util.h" #include "tmc_util.h"
#define TMC_GET_PWMTHRS(A,Q) _tmc_thrs(stepper##Q.microsteps(), stepper##Q.TPWMTHRS(), planner.axis_steps_per_mm[_AXIS(A)]) #define TMC_GET_PWMTHRS(A,Q) _tmc_thrs(stepper##Q.microsteps(), stepper##Q.TPWMTHRS(), planner.axis_steps_per_mm[_AXIS(A)])
#endif #endif
typedef struct { uint16_t X, Y, Z, X2, Y2, Z2, E0, E1, E2, E3, E4; } tmc_stepper_current_t;
typedef struct { uint32_t X, Y, Z, X2, Y2, Z2, E0, E1, E2, E3, E4; } tmc_hybrid_threshold_t;
typedef struct { int16_t X, Y, Z; } tmc_sgt_t;
#if ENABLED(AUTO_BED_LEVELING_UBL) #if ENABLED(AUTO_BED_LEVELING_UBL)
#include "ubl.h" #include "ubl.h"
@@ -244,9 +241,9 @@ typedef struct SettingsDataStruct {
// HAS_TRINAMIC // HAS_TRINAMIC
// //
#define TMC_AXES (MAX_EXTRUDERS + 6) #define TMC_AXES (MAX_EXTRUDERS + 6)
tmc_stepper_current_t tmc_stepper_current; // M906 X Y Z X2 Y2 Z2 E0 E1 E2 E3 E4 uint16_t tmc_stepper_current[TMC_AXES]; // M906 X Y Z X2 Y2 Z2 E0 E1 E2 E3 E4
tmc_hybrid_threshold_t tmc_hybrid_threshold; // M913 X Y Z X2 Y2 Z2 E0 E1 E2 E3 E4 uint32_t tmc_hybrid_threshold[TMC_AXES]; // M913 X Y Z X2 Y2 Z2 E0 E1 E2 E3 E4
tmc_sgt_t tmc_sgt; // M914 X Y Z int16_t tmc_sgt[XYZ]; // M914 X Y Z
// //
// LIN_ADVANCE // LIN_ADVANCE
@@ -297,7 +294,7 @@ uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); }
#endif #endif
void MarlinSettings::postprocess() { void MarlinSettings::postprocess() {
const float oldpos[XYZE] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS] }; const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] };
// steps per s2 needs to be updated to agree with units per s2 // steps per s2 needs to be updated to agree with units per s2
planner.reset_acceleration_rates(); planner.reset_acceleration_rates();
@@ -311,7 +308,7 @@ void MarlinSettings::postprocess() {
#endif #endif
#if ENABLED(PIDTEMP) #if ENABLED(PIDTEMP)
thermalManager.update_pid(); thermalManager.updatePID();
#endif #endif
#if DISABLED(NO_VOLUMETRICS) #if DISABLED(NO_VOLUMETRICS)
@@ -455,11 +452,10 @@ void MarlinSettings::postprocess() {
EEPROM_WRITE(planner.min_travel_feedrate_mm_s); EEPROM_WRITE(planner.min_travel_feedrate_mm_s);
#if ENABLED(JUNCTION_DEVIATION) #if ENABLED(JUNCTION_DEVIATION)
const float planner_max_jerk[] = {
#if ENABLED(HANGPRINTER) #if ENABLED(HANGPRINTER)
const float planner_max_jerk[ABCDE] = {
float(DEFAULT_AJERK), float(DEFAULT_BJERK), float(DEFAULT_CJERK), float(DEFAULT_DJERK), float(DEFAULT_EJERK) float(DEFAULT_AJERK), float(DEFAULT_BJERK), float(DEFAULT_CJERK), float(DEFAULT_DJERK), float(DEFAULT_EJERK)
#else #else
const float planner_max_jerk[XYZE] = {
float(DEFAULT_XJERK), float(DEFAULT_YJERK), float(DEFAULT_ZJERK), float(DEFAULT_EJERK) float(DEFAULT_XJERK), float(DEFAULT_YJERK), float(DEFAULT_ZJERK), float(DEFAULT_EJERK)
#endif #endif
}; };
@@ -488,13 +484,11 @@ void MarlinSettings::postprocess() {
// Global Leveling // Global Leveling
// //
const float zfh = (
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
planner.z_fade_height const float zfh = planner.z_fade_height;
#else #else
10.0 const float zfh = 10.0;
#endif #endif
);
EEPROM_WRITE(zfh); EEPROM_WRITE(zfh);
// //
@@ -504,7 +498,7 @@ void MarlinSettings::postprocess() {
#if ENABLED(MESH_BED_LEVELING) #if ENABLED(MESH_BED_LEVELING)
// Compile time test that sizeof(mbl.z_values) is as expected // Compile time test that sizeof(mbl.z_values) is as expected
static_assert( static_assert(
sizeof(mbl.z_values) == (GRID_MAX_POINTS) * sizeof(mbl.z_values[0][0]), sizeof(mbl.z_values) == GRID_MAX_POINTS * sizeof(mbl.z_values[0][0]),
"MBL Z array is the wrong size." "MBL Z array is the wrong size."
); );
const uint8_t mesh_num_x = GRID_MAX_POINTS_X, mesh_num_y = GRID_MAX_POINTS_Y; const uint8_t mesh_num_x = GRID_MAX_POINTS_X, mesh_num_y = GRID_MAX_POINTS_Y;
@@ -546,7 +540,7 @@ void MarlinSettings::postprocess() {
#if ENABLED(AUTO_BED_LEVELING_BILINEAR) #if ENABLED(AUTO_BED_LEVELING_BILINEAR)
// Compile time test that sizeof(z_values) is as expected // Compile time test that sizeof(z_values) is as expected
static_assert( static_assert(
sizeof(z_values) == (GRID_MAX_POINTS) * sizeof(z_values[0][0]), sizeof(z_values) == GRID_MAX_POINTS * sizeof(z_values[0][0]),
"Bilinear Z array is the wrong size." "Bilinear Z array is the wrong size."
); );
const uint8_t grid_max_x = GRID_MAX_POINTS_X, grid_max_y = GRID_MAX_POINTS_Y; const uint8_t grid_max_x = GRID_MAX_POINTS_X, grid_max_y = GRID_MAX_POINTS_Y;
@@ -737,138 +731,169 @@ void MarlinSettings::postprocess() {
#endif #endif
// //
// Save TMC Configuration, and placeholder values // Save TMC2130 or TMC2208 Configuration, and placeholder values
// //
_FIELD_TEST(tmc_stepper_current); _FIELD_TEST(tmc_stepper_current);
tmc_stepper_current_t tmc_stepper_current = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; uint16_t tmc_stepper_current[TMC_AXES] = {
#if HAS_TRINAMIC #if HAS_TRINAMIC
#if AXIS_IS_TMC(X) #if AXIS_IS_TMC(X)
tmc_stepper_current.X = stepperX.getMilliamps(); stepperX.getCurrent(),
#else
0,
#endif #endif
#if AXIS_IS_TMC(Y) #if AXIS_IS_TMC(Y)
tmc_stepper_current.Y = stepperY.getMilliamps(); stepperY.getCurrent(),
#else
0,
#endif #endif
#if AXIS_IS_TMC(Z) #if AXIS_IS_TMC(Z)
tmc_stepper_current.Z = stepperZ.getMilliamps(); stepperZ.getCurrent(),
#else
0,
#endif #endif
#if AXIS_IS_TMC(X2) #if AXIS_IS_TMC(X2)
tmc_stepper_current.X2 = stepperX2.getMilliamps(); stepperX2.getCurrent(),
#else
0,
#endif #endif
#if AXIS_IS_TMC(Y2) #if AXIS_IS_TMC(Y2)
tmc_stepper_current.Y2 = stepperY2.getMilliamps(); stepperY2.getCurrent(),
#else
0,
#endif #endif
#if AXIS_IS_TMC(Z2) #if AXIS_IS_TMC(Z2)
tmc_stepper_current.Z2 = stepperZ2.getMilliamps(); stepperZ2.getCurrent(),
#else
0,
#endif #endif
#if MAX_EXTRUDERS
#if AXIS_IS_TMC(E0) #if AXIS_IS_TMC(E0)
tmc_stepper_current.E0 = stepperE0.getMilliamps(); stepperE0.getCurrent(),
#else
0,
#endif #endif
#if MAX_EXTRUDERS > 1
#if AXIS_IS_TMC(E1) #if AXIS_IS_TMC(E1)
tmc_stepper_current.E1 = stepperE1.getMilliamps(); stepperE1.getCurrent(),
#else
0,
#endif #endif
#if MAX_EXTRUDERS > 2
#if AXIS_IS_TMC(E2) #if AXIS_IS_TMC(E2)
tmc_stepper_current.E2 = stepperE2.getMilliamps(); stepperE2.getCurrent(),
#else
0,
#endif #endif
#if MAX_EXTRUDERS > 3
#if AXIS_IS_TMC(E3) #if AXIS_IS_TMC(E3)
tmc_stepper_current.E3 = stepperE3.getMilliamps(); stepperE3.getCurrent(),
#else
0,
#endif #endif
#if MAX_EXTRUDERS > 4
#if AXIS_IS_TMC(E4) #if AXIS_IS_TMC(E4)
tmc_stepper_current.E4 = stepperE4.getMilliamps(); stepperE4.getCurrent()
#else
0
#endif #endif
#endif // MAX_EXTRUDERS > 4 #else
#endif // MAX_EXTRUDERS > 3 0
#endif // MAX_EXTRUDERS > 2
#endif // MAX_EXTRUDERS > 1
#endif // MAX_EXTRUDERS
#endif #endif
};
EEPROM_WRITE(tmc_stepper_current); EEPROM_WRITE(tmc_stepper_current);
// //
// Save TMC Hybrid Threshold, and placeholder values // Save TMC2130 or TMC2208 Hybrid Threshold, and placeholder values
// //
_FIELD_TEST(tmc_hybrid_threshold); _FIELD_TEST(tmc_hybrid_threshold);
uint32_t tmc_hybrid_threshold[TMC_AXES] = {
#if ENABLED(HYBRID_THRESHOLD) #if ENABLED(HYBRID_THRESHOLD)
tmc_hybrid_threshold_t tmc_hybrid_threshold = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
#if AXIS_HAS_STEALTHCHOP(X) #if AXIS_HAS_STEALTHCHOP(X)
tmc_hybrid_threshold.X = TMC_GET_PWMTHRS(X, X); TMC_GET_PWMTHRS(X, X),
#else
X_HYBRID_THRESHOLD,
#endif #endif
#if AXIS_HAS_STEALTHCHOP(Y) #if AXIS_HAS_STEALTHCHOP(Y)
tmc_hybrid_threshold.Y = TMC_GET_PWMTHRS(Y, Y); TMC_GET_PWMTHRS(Y, Y),
#else
Y_HYBRID_THRESHOLD,
#endif #endif
#if AXIS_HAS_STEALTHCHOP(Z) #if AXIS_HAS_STEALTHCHOP(Z)
tmc_hybrid_threshold.Z = TMC_GET_PWMTHRS(Z, Z); TMC_GET_PWMTHRS(Z, Z),
#else
Z_HYBRID_THRESHOLD,
#endif #endif
#if AXIS_HAS_STEALTHCHOP(X2) #if AXIS_HAS_STEALTHCHOP(X2)
tmc_hybrid_threshold.X2 = TMC_GET_PWMTHRS(X, X2); TMC_GET_PWMTHRS(X, X2),
#else
X2_HYBRID_THRESHOLD,
#endif #endif
#if AXIS_HAS_STEALTHCHOP(Y2) #if AXIS_HAS_STEALTHCHOP(Y2)
tmc_hybrid_threshold.Y2 = TMC_GET_PWMTHRS(Y, Y2); TMC_GET_PWMTHRS(Y, Y2),
#else
Y2_HYBRID_THRESHOLD,
#endif #endif
#if AXIS_HAS_STEALTHCHOP(Z2) #if AXIS_HAS_STEALTHCHOP(Z2)
tmc_hybrid_threshold.Z2 = TMC_GET_PWMTHRS(Z, Z2); TMC_GET_PWMTHRS(Z, Z2),
#endif
#if MAX_EXTRUDERS
#if AXIS_HAS_STEALTHCHOP(E0)
tmc_hybrid_threshold.E0 = TMC_GET_PWMTHRS(E, E0);
#endif
#if MAX_EXTRUDERS > 1
#if AXIS_HAS_STEALTHCHOP(E1)
tmc_hybrid_threshold.E1 = TMC_GET_PWMTHRS(E, E1);
#endif
#if MAX_EXTRUDERS > 2
#if AXIS_HAS_STEALTHCHOP(E2)
tmc_hybrid_threshold.E2 = TMC_GET_PWMTHRS(E, E2);
#endif
#if MAX_EXTRUDERS > 3
#if AXIS_HAS_STEALTHCHOP(E3)
tmc_hybrid_threshold.E3 = TMC_GET_PWMTHRS(E, E3);
#endif
#if MAX_EXTRUDERS > 4
#if AXIS_HAS_STEALTHCHOP(E4)
tmc_hybrid_threshold.E4 = TMC_GET_PWMTHRS(E, E4);
#endif
#endif // MAX_EXTRUDERS > 4
#endif // MAX_EXTRUDERS > 3
#endif // MAX_EXTRUDERS > 2
#endif // MAX_EXTRUDERS > 1
#endif // MAX_EXTRUDERS
#else #else
const tmc_hybrid_threshold_t tmc_hybrid_threshold = { Z2_HYBRID_THRESHOLD,
.X = 100, .Y = 100, .Z = 3,
.X2 = 100, .Y2 = 100, .Z2 = 3,
.E0 = 30, .E1 = 30, .E2 = 30,
.E3 = 30, .E4 = 30
};
#endif #endif
#if AXIS_HAS_STEALTHCHOP(E0)
TMC_GET_PWMTHRS(E, E0),
#else
E0_HYBRID_THRESHOLD,
#endif
#if AXIS_HAS_STEALTHCHOP(E1)
TMC_GET_PWMTHRS(E, E1),
#else
E1_HYBRID_THRESHOLD,
#endif
#if AXIS_HAS_STEALTHCHOP(E2)
TMC_GET_PWMTHRS(E, E2),
#else
E2_HYBRID_THRESHOLD,
#endif
#if AXIS_HAS_STEALTHCHOP(E3)
TMC_GET_PWMTHRS(E, E3),
#else
E3_HYBRID_THRESHOLD,
#endif
#if AXIS_HAS_STEALTHCHOP(E4)
TMC_GET_PWMTHRS(E, E4)
#else
E4_HYBRID_THRESHOLD
#endif
#else
100, 100, 3, // X, Y, Z
100, 100, 3, // X2, Y2, Z2
30, 30, 30, 30, 30 // E0, E1, E2, E3, E4
#endif
};
EEPROM_WRITE(tmc_hybrid_threshold); EEPROM_WRITE(tmc_hybrid_threshold);
// //
// TMC Sensorless homing threshold // TMC2130 Sensorless homing threshold
// //
int16_t tmc_sgt[XYZ] = {
tmc_sgt_t tmc_sgt = { 0, 0, 0 }; #if ENABLED(SENSORLESS_HOMING)
#if USE_SENSORLESS
#if X_SENSORLESS #if X_SENSORLESS
tmc_sgt.X = stepperX.sgt(); stepperX.sgt(),
#else
0,
#endif #endif
#if Y_SENSORLESS #if Y_SENSORLESS
tmc_sgt.Y = stepperY.sgt(); stepperY.sgt(),
#else
0,
#endif #endif
#if Z_SENSORLESS #if Z_SENSORLESS
tmc_sgt.Z = stepperZ.sgt(); stepperZ.sgt()
#else
0
#endif #endif
#else
0
#endif #endif
};
EEPROM_WRITE(tmc_sgt); EEPROM_WRITE(tmc_sgt);
// //
@@ -1344,15 +1369,15 @@ void MarlinSettings::postprocess() {
if (!validating) reset_stepper_drivers(); if (!validating) reset_stepper_drivers();
// //
// TMC Stepper Settings // TMC2130 Stepper Settings
// //
_FIELD_TEST(tmc_stepper_current); _FIELD_TEST(tmc_stepper_current);
#if HAS_TRINAMIC #if HAS_TRINAMIC
#define SET_CURR(Q) stepper##Q.rms_current(currents.Q ? currents.Q : Q##_CURRENT) #define SET_CURR(Q) stepper##Q.setCurrent(currents[TMC_##Q] ? currents[TMC_##Q] : Q##_CURRENT, R_SENSE, HOLD_MULTIPLIER)
tmc_stepper_current_t currents; uint16_t currents[TMC_AXES];
EEPROM_READ(currents); EEPROM_READ(currents);
if (!validating) { if (!validating) {
#if AXIS_IS_TMC(X) #if AXIS_IS_TMC(X)
@@ -1395,8 +1420,8 @@ void MarlinSettings::postprocess() {
#endif #endif
#if ENABLED(HYBRID_THRESHOLD) #if ENABLED(HYBRID_THRESHOLD)
#define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, tmc_hybrid_threshold.Q, planner.axis_steps_per_mm[_AXIS(A)]) #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, tmc_hybrid_threshold[TMC_##Q], planner.axis_steps_per_mm[_AXIS(A)])
tmc_hybrid_threshold_t tmc_hybrid_threshold; uint32_t tmc_hybrid_threshold[TMC_AXES];
EEPROM_READ(tmc_hybrid_threshold); EEPROM_READ(tmc_hybrid_threshold);
if (!validating) { if (!validating) {
#if AXIS_HAS_STEALTHCHOP(X) #if AXIS_HAS_STEALTHCHOP(X)
@@ -1439,37 +1464,37 @@ void MarlinSettings::postprocess() {
#endif #endif
/* /*
* TMC Sensorless homing threshold. * TMC2130 Sensorless homing threshold.
* X and X2 use the same value * X and X2 use the same value
* Y and Y2 use the same value * Y and Y2 use the same value
* Z and Z2 use the same value * Z and Z2 use the same value
*/ */
tmc_sgt_t tmc_sgt; int16_t tmc_sgt[XYZ];
EEPROM_READ(tmc_sgt); EEPROM_READ(tmc_sgt);
#if ENABLED(SENSORLESS_HOMING) #if ENABLED(SENSORLESS_HOMING)
if (!validating) { if (!validating) {
#ifdef X_HOMING_SENSITIVITY #ifdef X_HOMING_SENSITIVITY
#if AXIS_HAS_STALLGUARD(X) #if AXIS_HAS_STALLGUARD(X)
stepperX.sgt(tmc_sgt.X); stepperX.sgt(tmc_sgt[0]);
#endif #endif
#if AXIS_HAS_STALLGUARD(X2) #if AXIS_HAS_STALLGUARD(X2)
stepperX2.sgt(tmc_sgt.X); stepperX2.sgt(tmc_sgt[0]);
#endif #endif
#endif #endif
#ifdef Y_HOMING_SENSITIVITY #ifdef Y_HOMING_SENSITIVITY
#if AXIS_HAS_STALLGUARD(Y) #if AXIS_HAS_STALLGUARD(Y)
stepperY.sgt(tmc_sgt.Y); stepperY.sgt(tmc_sgt[1]);
#endif #endif
#if AXIS_HAS_STALLGUARD(Y2) #if AXIS_HAS_STALLGUARD(Y2)
stepperY2.sgt(tmc_sgt.Y); stepperY2.sgt(tmc_sgt[1]);
#endif #endif
#endif #endif
#ifdef Z_HOMING_SENSITIVITY #ifdef Z_HOMING_SENSITIVITY
#if AXIS_HAS_STALLGUARD(Z) #if AXIS_HAS_STALLGUARD(Z)
stepperZ.sgt(tmc_sgt.Z); stepperZ.sgt(tmc_sgt[2]);
#endif #endif
#if AXIS_HAS_STALLGUARD(Z2) #if AXIS_HAS_STALLGUARD(Z2)
stepperZ2.sgt(tmc_sgt.Z); stepperZ2.sgt(tmc_sgt[2]);
#endif #endif
#endif #endif
} }
@@ -1813,7 +1838,8 @@ void MarlinSettings::reset() {
#endif #endif
#if ENABLED(DELTA) #if ENABLED(DELTA)
const float adj[ABC] = DELTA_ENDSTOP_ADJ, dta[ABC] = DELTA_TOWER_ANGLE_TRIM; const float adj[ABC] = DELTA_ENDSTOP_ADJ,
dta[ABC] = DELTA_TOWER_ANGLE_TRIM;
delta_height = DELTA_HEIGHT; delta_height = DELTA_HEIGHT;
COPY(delta_endstop_adj, adj); COPY(delta_endstop_adj, adj);
delta_radius = DELTA_RADIUS; delta_radius = DELTA_RADIUS;
@@ -2526,7 +2552,7 @@ void MarlinSettings::reset() {
#if HAS_TRINAMIC #if HAS_TRINAMIC
/** /**
* TMC stepper driver current * TMC2130 / TMC2208 stepper driver current
*/ */
if (!forReplay) { if (!forReplay) {
CONFIG_ECHO_START; CONFIG_ECHO_START;
@@ -2537,59 +2563,57 @@ void MarlinSettings::reset() {
say_M906(); say_M906();
#endif #endif
#if AXIS_IS_TMC(X) #if AXIS_IS_TMC(X)
SERIAL_ECHOPAIR(" X", stepperX.getMilliamps()); SERIAL_ECHOPAIR(" X", stepperX.getCurrent());
#endif #endif
#if AXIS_IS_TMC(Y) #if AXIS_IS_TMC(Y)
SERIAL_ECHOPAIR(" Y", stepperY.getMilliamps()); SERIAL_ECHOPAIR(" Y", stepperY.getCurrent());
#endif #endif
#if AXIS_IS_TMC(Z) #if AXIS_IS_TMC(Z)
SERIAL_ECHOPAIR(" Z", stepperZ.getMilliamps()); SERIAL_ECHOPAIR(" Z", stepperZ.getCurrent());
#endif #endif
#if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
SERIAL_EOL(); SERIAL_EOL();
#endif #endif
#if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
say_M906(); say_M906();
SERIAL_ECHOPGM(" I1"); SERIAL_ECHOPGM(" I1");
#endif #endif
#if AXIS_IS_TMC(X2) #if AXIS_IS_TMC(X2)
SERIAL_ECHOPAIR(" X", stepperX2.getMilliamps()); SERIAL_ECHOPAIR(" X", stepperX2.getCurrent());
#endif #endif
#if AXIS_IS_TMC(Y2) #if AXIS_IS_TMC(Y2)
SERIAL_ECHOPAIR(" Y", stepperY2.getMilliamps()); SERIAL_ECHOPAIR(" Y", stepperY2.getCurrent());
#endif #endif
#if AXIS_IS_TMC(Z2) #if AXIS_IS_TMC(Z2)
SERIAL_ECHOPAIR(" Z", stepperZ2.getMilliamps()); SERIAL_ECHOPAIR(" Z", stepperZ2.getCurrent());
#endif #endif
#if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
SERIAL_EOL(); SERIAL_EOL();
#endif #endif
#if AXIS_IS_TMC(E0) #if AXIS_IS_TMC(E0)
say_M906(); say_M906();
SERIAL_ECHOLNPAIR(" T0 E", stepperE0.getMilliamps()); SERIAL_ECHOLNPAIR(" T0 E", stepperE0.getCurrent());
#endif #endif
#if E_STEPPERS > 1 && AXIS_IS_TMC(E1) #if E_STEPPERS > 1 && AXIS_IS_TMC(E1)
say_M906(); say_M906();
SERIAL_ECHOLNPAIR(" T1 E", stepperE1.getMilliamps()); SERIAL_ECHOLNPAIR(" T1 E", stepperE1.getCurrent());
#endif #endif
#if E_STEPPERS > 2 && AXIS_IS_TMC(E2) #if E_STEPPERS > 2 && AXIS_IS_TMC(E2)
say_M906(); say_M906();
SERIAL_ECHOLNPAIR(" T2 E", stepperE2.getMilliamps()); SERIAL_ECHOLNPAIR(" T2 E", stepperE2.getCurrent());
#endif #endif
#if E_STEPPERS > 3 && AXIS_IS_TMC(E3) #if E_STEPPERS > 3 && AXIS_IS_TMC(E3)
say_M906(); say_M906();
SERIAL_ECHOLNPAIR(" T3 E", stepperE3.getMilliamps()); SERIAL_ECHOLNPAIR(" T3 E", stepperE3.getCurrent());
#endif #endif
#if E_STEPPERS > 4 && AXIS_IS_TMC(E4) #if E_STEPPERS > 4 && AXIS_IS_TMC(E4)
say_M906(); say_M906();
SERIAL_ECHOLNPAIR(" T4 E", stepperE4.getMilliamps()); SERIAL_ECHOLNPAIR(" T4 E", stepperE4.getCurrent());
#endif #endif
SERIAL_EOL(); SERIAL_EOL();
/** /**
* TMC Hybrid Threshold * TMC2130 / TMC2208 / TRAMS Hybrid Threshold
*/ */
#if ENABLED(HYBRID_THRESHOLD) #if ENABLED(HYBRID_THRESHOLD)
if (!forReplay) { if (!forReplay) {
@@ -2597,56 +2621,54 @@ void MarlinSettings::reset() {
SERIAL_ECHOLNPGM("Hybrid Threshold:"); SERIAL_ECHOLNPGM("Hybrid Threshold:");
} }
CONFIG_ECHO_START; CONFIG_ECHO_START;
#if AXIS_HAS_STEALTHCHOP(X) || AXIS_HAS_STEALTHCHOP(Y) || AXIS_HAS_STEALTHCHOP(Z) #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
say_M913(); say_M913();
#endif #endif
#if AXIS_HAS_STEALTHCHOP(X) #if AXIS_IS_TMC(X)
SERIAL_ECHOPAIR(" X", TMC_GET_PWMTHRS(X, X)); SERIAL_ECHOPAIR(" X", TMC_GET_PWMTHRS(X, X));
#endif #endif
#if AXIS_HAS_STEALTHCHOP(Y) #if AXIS_IS_TMC(Y)
SERIAL_ECHOPAIR(" Y", TMC_GET_PWMTHRS(Y, Y)); SERIAL_ECHOPAIR(" Y", TMC_GET_PWMTHRS(Y, Y));
#endif #endif
#if AXIS_HAS_STEALTHCHOP(Z) #if AXIS_IS_TMC(Z)
SERIAL_ECHOPAIR(" Z", TMC_GET_PWMTHRS(Z, Z)); SERIAL_ECHOPAIR(" Z", TMC_GET_PWMTHRS(Z, Z));
#endif #endif
#if AXIS_HAS_STEALTHCHOP(X) || AXIS_HAS_STEALTHCHOP(Y) || AXIS_HAS_STEALTHCHOP(Z) #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z)
SERIAL_EOL(); SERIAL_EOL();
#endif #endif
#if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
#if AXIS_HAS_STEALTHCHOP(X2) || AXIS_HAS_STEALTHCHOP(Y2) || AXIS_HAS_STEALTHCHOP(Z2)
say_M913(); say_M913();
SERIAL_ECHOPGM(" I1"); SERIAL_ECHOPGM(" I1");
#endif #endif
#if AXIS_HAS_STEALTHCHOP(X2) #if AXIS_IS_TMC(X2)
SERIAL_ECHOPAIR(" X", TMC_GET_PWMTHRS(X, X2)); SERIAL_ECHOPAIR(" X", TMC_GET_PWMTHRS(X, X2));
#endif #endif
#if AXIS_HAS_STEALTHCHOP(Y2) #if AXIS_IS_TMC(Y2)
SERIAL_ECHOPAIR(" Y", TMC_GET_PWMTHRS(Y, Y2)); SERIAL_ECHOPAIR(" Y", TMC_GET_PWMTHRS(Y, Y2));
#endif #endif
#if AXIS_HAS_STEALTHCHOP(Z2) #if AXIS_IS_TMC(Z2)
SERIAL_ECHOPAIR(" Z", TMC_GET_PWMTHRS(Z, Z2)); SERIAL_ECHOPAIR(" Z", TMC_GET_PWMTHRS(Z, Z2));
#endif #endif
#if AXIS_HAS_STEALTHCHOP(X2) || AXIS_HAS_STEALTHCHOP(Y2) || AXIS_HAS_STEALTHCHOP(Z2) #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2)
SERIAL_EOL(); SERIAL_EOL();
#endif #endif
#if AXIS_IS_TMC(E0)
#if AXIS_HAS_STEALTHCHOP(E0)
say_M913(); say_M913();
SERIAL_ECHOLNPAIR(" T0 E", TMC_GET_PWMTHRS(E, E0)); SERIAL_ECHOLNPAIR(" T0 E", TMC_GET_PWMTHRS(E, E0));
#endif #endif
#if E_STEPPERS > 1 && AXIS_HAS_STEALTHCHOP(E1) #if E_STEPPERS > 1 && AXIS_IS_TMC(E1)
say_M913(); say_M913();
SERIAL_ECHOLNPAIR(" T1 E", TMC_GET_PWMTHRS(E, E1)); SERIAL_ECHOLNPAIR(" T1 E", TMC_GET_PWMTHRS(E, E1));
#endif #endif
#if E_STEPPERS > 2 && AXIS_HAS_STEALTHCHOP(E2) #if E_STEPPERS > 2 && AXIS_IS_TMC(E2)
say_M913(); say_M913();
SERIAL_ECHOLNPAIR(" T2 E", TMC_GET_PWMTHRS(E, E2)); SERIAL_ECHOLNPAIR(" T2 E", TMC_GET_PWMTHRS(E, E2));
#endif #endif
#if E_STEPPERS > 3 && AXIS_HAS_STEALTHCHOP(E3) #if E_STEPPERS > 3 && AXIS_IS_TMC(E3)
say_M913(); say_M913();
SERIAL_ECHOLNPAIR(" T3 E", TMC_GET_PWMTHRS(E, E3)); SERIAL_ECHOLNPAIR(" T3 E", TMC_GET_PWMTHRS(E, E3));
#endif #endif
#if E_STEPPERS > 4 && AXIS_HAS_STEALTHCHOP(E4) #if E_STEPPERS > 4 && AXIS_IS_TMC(E4)
say_M913(); say_M913();
SERIAL_ECHOLNPAIR(" T4 E", TMC_GET_PWMTHRS(E, E4)); SERIAL_ECHOLNPAIR(" T4 E", TMC_GET_PWMTHRS(E, E4));
#endif #endif
@@ -2654,7 +2676,7 @@ void MarlinSettings::reset() {
#endif // HYBRID_THRESHOLD #endif // HYBRID_THRESHOLD
/** /**
* TMC Sensorless homing thresholds * TMC2130 Sensorless homing thresholds
*/ */
#if ENABLED(SENSORLESS_HOMING) #if ENABLED(SENSORLESS_HOMING)
if (!forReplay) { if (!forReplay) {

View File

@@ -31,9 +31,9 @@
#define TB6560 0x005 #define TB6560 0x005
#define TB6600 0x006 #define TB6600 0x006
#define TMC2100 0x007 #define TMC2100 0x007
#define TMC2130 2130 #define TMC2130 0x108
#define TMC2130_STANDALONE 0x008 #define TMC2130_STANDALONE 0x008
#define TMC2208 2208 #define TMC2208 0x109
#define TMC2208_STANDALONE 0x009 #define TMC2208_STANDALONE 0x009
#define TMC26X 0x10A #define TMC26X 0x10A
#define TMC26X_STANDALONE 0x00A #define TMC26X_STANDALONE 0x00A
@@ -45,7 +45,7 @@
#define AXIS_DRIVER_TYPE_X(T) _AXIS_DRIVER_TYPE(X,T) #define AXIS_DRIVER_TYPE_X(T) _AXIS_DRIVER_TYPE(X,T)
#define AXIS_DRIVER_TYPE_Y(T) _AXIS_DRIVER_TYPE(Y,T) #define AXIS_DRIVER_TYPE_Y(T) _AXIS_DRIVER_TYPE(Y,T)
#define AXIS_DRIVER_TYPE_Z(T) _AXIS_DRIVER_TYPE(Z,T) #define AXIS_DRIVER_TYPE_Z(T) _AXIS_DRIVER_TYPE(Z,T)
#define AXIS_DRIVER_TYPE_X2(T) ((ENABLED(X_DUAL_STEPPER_DRIVERS) || ENABLED(DUAL_X_CARRIAGE)) && _AXIS_DRIVER_TYPE(X2,T)) #define AXIS_DRIVER_TYPE_X2(T) (ENABLED(X_DUAL_STEPPER_DRIVERS) || ENABLED(DUAL_X_CARRIAGE)) && _AXIS_DRIVER_TYPE(X2,T)
#define AXIS_DRIVER_TYPE_Y2(T) (ENABLED(Y_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Y2,T)) #define AXIS_DRIVER_TYPE_Y2(T) (ENABLED(Y_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Y2,T))
#define AXIS_DRIVER_TYPE_Z2(T) (ENABLED(Z_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Z2,T)) #define AXIS_DRIVER_TYPE_Z2(T) (ENABLED(Z_DUAL_STEPPER_DRIVERS) && _AXIS_DRIVER_TYPE(Z2,T))
#define AXIS_DRIVER_TYPE_E0(T) (E_STEPPERS > 0 && _AXIS_DRIVER_TYPE(E0,T)) #define AXIS_DRIVER_TYPE_E0(T) (E_STEPPERS > 0 && _AXIS_DRIVER_TYPE(E0,T))

View File

@@ -289,9 +289,6 @@
#define MSG_B "Y" #define MSG_B "Y"
#define MSG_C "Z" #define MSG_C "Z"
#endif #endif
#define MSG_X2 "X2"
#define MSG_Y2 "Y2"
#define MSG_Z2 "Z2"
#define MSG_H1 "1" #define MSG_H1 "1"
#define MSG_H2 "2" #define MSG_H2 "2"
#define MSG_H3 "3" #define MSG_H3 "3"
@@ -302,7 +299,6 @@
#define MSG_N3 " 3" #define MSG_N3 " 3"
#define MSG_N4 " 4" #define MSG_N4 " 4"
#define MSG_N5 " 5" #define MSG_N5 " 5"
#define MSG_E0 "E0"
#define MSG_E1 "E1" #define MSG_E1 "E1"
#define MSG_E2 "E2" #define MSG_E2 "E2"
#define MSG_E3 "E3" #define MSG_E3 "E3"

View File

@@ -41,34 +41,33 @@
#define MSG_SD_INSERTED _UxGT("SD-Karte erkannt") #define MSG_SD_INSERTED _UxGT("SD-Karte erkannt")
#define MSG_SD_REMOVED _UxGT("SD-Karte entfernt") #define MSG_SD_REMOVED _UxGT("SD-Karte entfernt")
#define MSG_LCD_ENDSTOPS _UxGT("Endstopp") // Max length 8 characters #define MSG_LCD_ENDSTOPS _UxGT("Endstopp") // Max length 8 characters
#define MSG_LCD_SOFT_ENDSTOPS _UxGT("Soft-Endstopp")
#define MSG_MAIN _UxGT("Hauptmenü") #define MSG_MAIN _UxGT("Hauptmenü")
#define MSG_AUTOSTART _UxGT("Autostart") #define MSG_AUTOSTART _UxGT("Autostart")
#define MSG_DISABLE_STEPPERS _UxGT("Motoren deaktivieren") // M84 #define MSG_DISABLE_STEPPERS _UxGT("Motoren deaktivieren") // M84
#define MSG_DEBUG_MENU _UxGT("Debug-Menü") #define MSG_DEBUG_MENU _UxGT("Debug Menü")
#define MSG_PROGRESS_BAR_TEST _UxGT("Statusbalken-Test") #define MSG_PROGRESS_BAR_TEST _UxGT("Fortschrittsb. Test")
#define MSG_AUTO_HOME _UxGT("Home XYZ") // G28 #define MSG_AUTO_HOME _UxGT("Home") // G28
#define MSG_AUTO_HOME_X _UxGT("Home X") #define MSG_AUTO_HOME_X _UxGT("Home X")
#define MSG_AUTO_HOME_Y _UxGT("Home Y") #define MSG_AUTO_HOME_Y _UxGT("Home Y")
#define MSG_AUTO_HOME_Z _UxGT("Home Z") #define MSG_AUTO_HOME_Z _UxGT("Home Z")
#define MSG_TMC_Z_CALIBRATION _UxGT("Kalibriere Z") #define MSG_TMC_Z_CALIBRATION _UxGT("Kalibriere Z")
#define MSG_LEVEL_BED_HOMING _UxGT("Home XYZ") #define MSG_LEVEL_BED_HOMING _UxGT("Home XYZ")
#define MSG_LEVEL_BED_WAITING _UxGT("Klick zum Starten") #define MSG_LEVEL_BED_WAITING _UxGT("Klick für Start")
#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Nächste Koordinate") #define MSG_LEVEL_BED_NEXT_POINT _UxGT("Nächste Koordinate")
#define MSG_LEVEL_BED_DONE _UxGT("Nivellieren fertig!") #define MSG_LEVEL_BED_DONE _UxGT("Fertig")
#define MSG_Z_FADE_HEIGHT _UxGT("Ausblendhöhe") #define MSG_Z_FADE_HEIGHT _UxGT("Ausblendhöhe")
#define MSG_SET_HOME_OFFSETS _UxGT("Setze Homeversatz") #define MSG_SET_HOME_OFFSETS _UxGT("Setze Homeversatz")
#define MSG_HOME_OFFSETS_APPLIED _UxGT("Homeversatz aktiv") #define MSG_HOME_OFFSETS_APPLIED _UxGT("Homeversatz aktiv")
#define MSG_SET_ORIGIN _UxGT("Setze Nullpunkte") //"G92 X0 Y0 Z0" commented out in ultralcd.cpp #define MSG_SET_ORIGIN _UxGT("Setze Nullpunkt") //"G92 X0 Y0 Z0" commented out in ultralcd.cpp
#define MSG_PREHEAT_1 _UxGT("Vorwärmen PLA") #define MSG_PREHEAT_1 _UxGT("Vorwärmen PLA")
#define MSG_PREHEAT_1_N _UxGT("Vorwärmen PLA ") #define MSG_PREHEAT_1_N _UxGT("Vorwärmen PLA ")
#define MSG_PREHEAT_1_ALL _UxGT("Vorw. PLA Alles") #define MSG_PREHEAT_1_ALL _UxGT("Vorw. PLA Alle")
#define MSG_PREHEAT_1_END _UxGT("Vorw. PLA Extr.") #define MSG_PREHEAT_1_END _UxGT("Vorw. PLA Extr.")
#define MSG_PREHEAT_1_BEDONLY _UxGT("Vorw. PLA Bett") #define MSG_PREHEAT_1_BEDONLY _UxGT("Vorw. PLA Bett")
#define MSG_PREHEAT_1_SETTINGS _UxGT("Vorw. PLA Einst.") #define MSG_PREHEAT_1_SETTINGS _UxGT("Vorw. PLA Einst.")
#define MSG_PREHEAT_2 _UxGT("Vorwärmen ABS") #define MSG_PREHEAT_2 _UxGT("Vorwärmen ABS")
#define MSG_PREHEAT_2_N _UxGT("Vorwärmen ABS ") #define MSG_PREHEAT_2_N _UxGT("Vorwärmen ABS ")
#define MSG_PREHEAT_2_ALL _UxGT("Vorw. ABS Alles") #define MSG_PREHEAT_2_ALL _UxGT("Vorw. ABS Alle")
#define MSG_PREHEAT_2_END _UxGT("Vorw. ABS Extr.") #define MSG_PREHEAT_2_END _UxGT("Vorw. ABS Extr.")
#define MSG_PREHEAT_2_BEDONLY _UxGT("Vorw. ABS Bett") #define MSG_PREHEAT_2_BEDONLY _UxGT("Vorw. ABS Bett")
#define MSG_PREHEAT_2_SETTINGS _UxGT("Vorw. ABS Einst.") #define MSG_PREHEAT_2_SETTINGS _UxGT("Vorw. ABS Einst.")
@@ -76,102 +75,20 @@
#define MSG_SWITCH_PS_ON _UxGT("Netzteil ein") #define MSG_SWITCH_PS_ON _UxGT("Netzteil ein")
#define MSG_SWITCH_PS_OFF _UxGT("Netzteil aus") #define MSG_SWITCH_PS_OFF _UxGT("Netzteil aus")
#define MSG_EXTRUDE _UxGT("Extrudieren") #define MSG_EXTRUDE _UxGT("Extrudieren")
#define MSG_RETRACT _UxGT("Rückzug") #define MSG_RETRACT _UxGT("Retract")
#define MSG_MOVE_AXIS _UxGT("Achse Bewegen") #define MSG_MOVE_AXIS _UxGT("Bewegen")
#define MSG_BED_LEVELING _UxGT("Bett-Nivellierung") #define MSG_BED_LEVELING _UxGT("Bett Nivellierung")
#define MSG_LEVEL_BED _UxGT("Bett nivellieren") #define MSG_LEVEL_BED _UxGT("Bett nivellieren")
#define MSG_LEVEL_CORNERS _UxGT("Ecken nivellieren") #define MSG_LEVEL_CORNERS _UxGT("Ecken nivellieren")
#define MSG_NEXT_CORNER _UxGT("Nächste Ecke") #define MSG_NEXT_CORNER _UxGT("Nächste Ecke")
#define MSG_EDITING_STOPPED _UxGT("Netzbearb. angeh.") #define MSG_EDITING_STOPPED _UxGT("Netzbearb. angeh.")
#define MSG_USER_MENU _UxGT("Benutzer-Menü") #define MSG_USER_MENU _UxGT("Benutzer Menü")
#define MSG_UBL_DOING_G29 _UxGT("G29 ausführen")
#define MSG_UBL_UNHOMED _UxGT("Home XYZ zuerst")
#define MSG_UBL_TOOLS _UxGT("UBL-Werkzeuge")
#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling")
#define MSG_UBL_MANUAL_MESH _UxGT("Netz manuell erst.")
#define MSG_UBL_BC_INSERT _UxGT("Unterlegen & messen")
#define MSG_UBL_BC_INSERT2 _UxGT("Messen")
#define MSG_UBL_BC_REMOVE _UxGT("Entfernen & messen")
#define MSG_UBL_MOVING_TO_NEXT _UxGT("Nächster Punkt...")
#define MSG_UBL_ACTIVATE_MESH _UxGT("UBL aktivieren")
#define MSG_UBL_DEACTIVATE_MESH _UxGT("UBL deaktivieren")
#define MSG_UBL_SET_BED_TEMP _UxGT("Betttemperatur")
#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP
#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Hotend-Temp.")
#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP
#define MSG_UBL_MESH_EDIT _UxGT("Netz bearbeiten")
#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Eigenes Netz bearb.")
#define MSG_UBL_FINE_TUNE_MESH _UxGT("Feineinstellung...")
#define MSG_UBL_DONE_EDITING_MESH _UxGT("Bearbeitung beendet")
#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Eigenes Netz erst.")
#define MSG_UBL_BUILD_MESH_MENU _UxGT("Netz erstellen")
#define MSG_UBL_BUILD_PLA_MESH _UxGT("Netz erstellen PLA")
#define MSG_UBL_BUILD_ABS_MESH _UxGT("Netz erstellen ABS")
#define MSG_UBL_BUILD_COLD_MESH _UxGT("Netz erstellen kalt")
#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Netzhöhe einst.")
#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Höhe")
#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Netz validieren")
#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Netz validieren PLA")
#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Netz validieren ABS")
#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Eig. Netz validieren")
#define MSG_UBL_CONTINUE_MESH _UxGT("Netzerst. forts.")
#define MSG_UBL_MESH_LEVELING _UxGT("Netz-Nivellierung")
#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-Punkt-Nivell.")
#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Gitternetz-Nivell.")
#define MSG_UBL_MESH_LEVEL _UxGT("Netz nivellieren")
#define MSG_UBL_SIDE_POINTS _UxGT("Eckpunkte")
#define MSG_UBL_MAP_TYPE _UxGT("Kartentyp")
#define MSG_UBL_OUTPUT_MAP _UxGT("Karte ausgeben")
#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Ausgabe für Host")
#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Ausgabe für CSV")
#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Externe Sicherung")
#define MSG_UBL_INFO_UBL _UxGT("UBL-Info ausgeben")
#define MSG_UBL_EDIT_MESH_MENU _UxGT("Netz bearbeiten")
#define MSG_UBL_FILLIN_AMOUNT _UxGT("Menge an Füllung")
#define MSG_UBL_MANUAL_FILLIN _UxGT("Manuelles Füllung")
#define MSG_UBL_SMART_FILLIN _UxGT("Cleveres Füllen")
#define MSG_UBL_FILLIN_MESH _UxGT("Netz Füllen")
#define MSG_UBL_INVALIDATE_ALL _UxGT("Alles annullieren")
#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Nächstlieg. ann.")
#define MSG_UBL_FINE_TUNE_ALL _UxGT("Feineinst. Alles")
#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Feineinst. Nächstl.")
#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Netz-Speicherplatz")
#define MSG_UBL_STORAGE_SLOT _UxGT("Speicherort")
#define MSG_UBL_LOAD_MESH _UxGT("Bettnetz laden")
#define MSG_UBL_SAVE_MESH _UxGT("Bettnetz speichern")
#define MSG_MESH_LOADED _UxGT("Netz %i geladen")
#define MSG_MESH_SAVED _UxGT("Netz %i gespeichert")
#define MSG_NO_STORAGE _UxGT("Kein Speicher")
#define MSG_UBL_SAVE_ERROR _UxGT("ERR:UBL speichern")
#define MSG_UBL_RESTORE_ERROR _UxGT("ERR:UBL wiederherst.")
#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Versatz angehalten")
#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Schrittweises UBL")
#define MSG_LED_CONTROL _UxGT("LED-Steuerung")
#define MSG_LEDS _UxGT("Licht")
#define MSG_LED_PRESETS _UxGT("Licht-Einstellungen")
#define MSG_SET_LEDS_RED _UxGT("Rot")
#define MSG_SET_LEDS_ORANGE _UxGT("Orange")
#define MSG_SET_LEDS_YELLOW _UxGT("Gelb")
#define MSG_SET_LEDS_GREEN _UxGT("Grün")
#define MSG_SET_LEDS_BLUE _UxGT("Blau")
#define MSG_SET_LEDS_INDIGO _UxGT("Indigo")
#define MSG_SET_LEDS_VIOLET _UxGT("Violett")
#define MSG_SET_LEDS_WHITE _UxGT("Weiß")
#define MSG_SET_LEDS_DEFAULT _UxGT("Standard")
#define MSG_CUSTOM_LEDS _UxGT("Benutzerdef.")
#define MSG_INTENSITY_R _UxGT("Intensität Rot")
#define MSG_INTENSITY_G _UxGT("Intensität Grün")
#define MSG_INTENSITY_B _UxGT("Intensität Blau")
#define MSG_INTENSITY_W _UxGT("Intensität Weiß")
#define MSG_LED_BRIGHTNESS _UxGT("Helligkeit")
#define MSG_MOVING _UxGT("In Bewegung...") #define MSG_MOVING _UxGT("In Bewegung...")
#define MSG_FREE_XY _UxGT("Abstand XY") #define MSG_FREE_XY _UxGT("Abstand XY")
#define MSG_MOVE_X _UxGT("Bewege X") #define MSG_MOVE_X _UxGT("X")
#define MSG_MOVE_Y _UxGT("Bewege Y") #define MSG_MOVE_Y _UxGT("Y")
#define MSG_MOVE_Z _UxGT("Bewege Z") #define MSG_MOVE_Z _UxGT("Z")
#define MSG_MOVE_E _UxGT("Bewege Extruder") #define MSG_MOVE_E _UxGT("Extruder ")
#define MSG_MOVE_01MM _UxGT(" 0,1 mm") #define MSG_MOVE_01MM _UxGT(" 0,1 mm")
#define MSG_MOVE_1MM _UxGT(" 1,0 mm") #define MSG_MOVE_1MM _UxGT(" 1,0 mm")
#define MSG_MOVE_10MM _UxGT("10,0 mm") #define MSG_MOVE_10MM _UxGT("10,0 mm")
@@ -180,13 +97,13 @@
#define MSG_NOZZLE _UxGT("Düse") #define MSG_NOZZLE _UxGT("Düse")
#define MSG_BED _UxGT("Bett") #define MSG_BED _UxGT("Bett")
#define MSG_FAN_SPEED _UxGT("Lüfter") #define MSG_FAN_SPEED _UxGT("Lüfter")
#define MSG_EXTRA_FAN_SPEED _UxGT("Geschw. Extralüfter") #define MSG_EXTRA_FAN_SPEED _UxGT("Extra Lüfter")
#define MSG_FLOW _UxGT("Flussrate") #define MSG_FLOW _UxGT("Flussrate")
#define MSG_CONTROL _UxGT("Einstellungen") #define MSG_CONTROL _UxGT("Einstellungen")
#define MSG_MIN LCD_STR_THERMOMETER _UxGT(" min") #define MSG_MIN LCD_STR_THERMOMETER _UxGT(" min")
#define MSG_MAX LCD_STR_THERMOMETER _UxGT(" max") #define MSG_MAX LCD_STR_THERMOMETER _UxGT(" max")
#define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Faktor") #define MSG_FACTOR LCD_STR_THERMOMETER _UxGT(" Faktor")
#define MSG_AUTOTEMP _UxGT("Auto Temperatur") #define MSG_AUTOTEMP _UxGT("AutoTemp")
#define MSG_ON _UxGT("Ein") #define MSG_ON _UxGT("Ein")
#define MSG_OFF _UxGT("Aus") #define MSG_OFF _UxGT("Aus")
#define MSG_PID_P _UxGT("PID P") #define MSG_PID_P _UxGT("PID P")
@@ -194,7 +111,7 @@
#define MSG_PID_D _UxGT("PID D") #define MSG_PID_D _UxGT("PID D")
#define MSG_PID_C _UxGT("PID C") #define MSG_PID_C _UxGT("PID C")
#define MSG_SELECT _UxGT("Auswählen") #define MSG_SELECT _UxGT("Auswählen")
#define MSG_ACC _UxGT("Beschleunigung") #define MSG_ACC _UxGT("A")
#define MSG_JERK _UxGT("Jerk") #define MSG_JERK _UxGT("Jerk")
#if IS_KINEMATIC #if IS_KINEMATIC
#define MSG_VA_JERK _UxGT("V A Jerk") #define MSG_VA_JERK _UxGT("V A Jerk")
@@ -206,14 +123,13 @@
#define MSG_VC_JERK _UxGT("V Z Jerk") #define MSG_VC_JERK _UxGT("V Z Jerk")
#endif #endif
#define MSG_VE_JERK _UxGT("V E Jerk") #define MSG_VE_JERK _UxGT("V E Jerk")
#define MSG_JUNCTION_DEVIATION _UxGT("Junction Dev")
#define MSG_VELOCITY _UxGT("Geschwindigkeit") #define MSG_VELOCITY _UxGT("Geschwindigkeit")
#define MSG_VMAX _UxGT("V max ") // space intentional #define MSG_VMAX _UxGT("V max ") // space by purpose
#define MSG_VMIN _UxGT("V min") #define MSG_VMIN _UxGT("V min")
#define MSG_VTRAV_MIN _UxGT("V min Leerfahrt") #define MSG_VTRAV_MIN _UxGT("V min Leerfahrt")
#define MSG_ACCELERATION _UxGT("Beschleunigung") #define MSG_ACCELERATION _UxGT("Beschleunigung")
#define MSG_AMAX _UxGT("A max ") // space intentional #define MSG_AMAX _UxGT("A max ") // space by purpose
#define MSG_A_RETRACT _UxGT("A Rückzug") #define MSG_A_RETRACT _UxGT("A Retract")
#define MSG_A_TRAVEL _UxGT("A Leerfahrt") #define MSG_A_TRAVEL _UxGT("A Leerfahrt")
#define MSG_STEPS_PER_MM _UxGT("Steps/mm") #define MSG_STEPS_PER_MM _UxGT("Steps/mm")
#if IS_KINEMATIC #if IS_KINEMATIC
@@ -235,11 +151,11 @@
#define MSG_MOTION _UxGT("Bewegung") #define MSG_MOTION _UxGT("Bewegung")
#define MSG_FILAMENT _UxGT("Filament") #define MSG_FILAMENT _UxGT("Filament")
#define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm³") #define MSG_VOLUMETRIC_ENABLED _UxGT("E in mm³")
#define MSG_FILAMENT_DIAM _UxGT("Durchm. Filament") #define MSG_FILAMENT_DIAM _UxGT("D Fil.")
#define MSG_FILAMENT_UNLOAD _UxGT("Entladen mm") #define MSG_FILAMENT_UNLOAD _UxGT("Entladen mm")
#define MSG_FILAMENT_LOAD _UxGT("Laden mm") #define MSG_FILAMENT_LOAD _UxGT("Laden mm")
#define MSG_ADVANCE_K _UxGT("Vorschubfaktor") #define MSG_ADVANCE_K _UxGT("Advance Faktor")
#define MSG_CONTRAST _UxGT("LCD-Kontrast") #define MSG_CONTRAST _UxGT("LCD Kontrast")
#define MSG_STORE_EEPROM _UxGT("Konfig. speichern") #define MSG_STORE_EEPROM _UxGT("Konfig. speichern")
#define MSG_LOAD_EEPROM _UxGT("Konfig. laden") #define MSG_LOAD_EEPROM _UxGT("Konfig. laden")
#define MSG_RESTORE_FAILSAFE _UxGT("Standardwerte laden") #define MSG_RESTORE_FAILSAFE _UxGT("Standardwerte laden")
@@ -248,52 +164,49 @@
#define MSG_WATCH _UxGT("Info") #define MSG_WATCH _UxGT("Info")
#define MSG_PREPARE _UxGT("Vorbereitung") #define MSG_PREPARE _UxGT("Vorbereitung")
#define MSG_TUNE _UxGT("Justierung") #define MSG_TUNE _UxGT("Justierung")
#define MSG_PAUSE_PRINT _UxGT("SD-Druck pausieren") #define MSG_PAUSE_PRINT _UxGT("SD-Druck Pause")
#define MSG_RESUME_PRINT _UxGT("SD-Druck fortsetzen") #define MSG_RESUME_PRINT _UxGT("SD-Druck Fortsetzung")
#define MSG_STOP_PRINT _UxGT("SD-Druck abbrechen") #define MSG_STOP_PRINT _UxGT("SD-Druck Abbruch")
#define MSG_POWER_LOSS_RECOVERY _UxGT("Wiederh. n. Stroma.") #define MSG_CARD_MENU _UxGT("SD-Karte")
#define MSG_CARD_MENU _UxGT("Druck v. SD-Karte")
#define MSG_NO_CARD _UxGT("Keine SD-Karte") #define MSG_NO_CARD _UxGT("Keine SD-Karte")
#define MSG_DWELL _UxGT("Warten...") #define MSG_DWELL _UxGT("Warten...")
#define MSG_USERWAIT _UxGT("Klick zum Fortsetzen") #define MSG_USERWAIT _UxGT("Warte auf Nutzer")
#define MSG_PRINT_PAUSED _UxGT("Druck pausiert...") #define MSG_PRINT_PAUSED _UxGT("Druck pausiert")
#define MSG_PRINTING _UxGT("Druckt...")
#define MSG_PRINT_ABORTED _UxGT("Druck abgebrochen") #define MSG_PRINT_ABORTED _UxGT("Druck abgebrochen")
#define MSG_NO_MOVE _UxGT("Motoren angeschaltet") #define MSG_NO_MOVE _UxGT("Motoren eingeschaltet")
#define MSG_KILLED _UxGT("ABGEBROCHEN") #define MSG_KILLED _UxGT("ABGEBROCHEN")
#define MSG_STOPPED _UxGT("ANGEHALTEN") #define MSG_STOPPED _UxGT("ANGEHALTEN")
#define MSG_CONTROL_RETRACT _UxGT("Rückzug mm") #define MSG_CONTROL_RETRACT _UxGT("Retract mm")
#define MSG_CONTROL_RETRACT_SWAP _UxGT("Wechs. Rückzug mm") #define MSG_CONTROL_RETRACT_SWAP _UxGT("Wechs. Retract mm")
#define MSG_CONTROL_RETRACTF _UxGT("Rückzug V") #define MSG_CONTROL_RETRACTF _UxGT("Retract V")
#define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Z-Sprung mm") #define MSG_CONTROL_RETRACT_ZLIFT _UxGT("Z-Hop mm")
#define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm") #define MSG_CONTROL_RETRACT_RECOVER _UxGT("UnRet mm")
#define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Wechs. UnRet mm") #define MSG_CONTROL_RETRACT_RECOVER_SWAP _UxGT("Wechs. UnRet mm")
#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V") #define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V")
#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V") #define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V")
#define MSG_AUTORETRACT _UxGT("Autom. Rückzug") #define MSG_AUTORETRACT _UxGT("Autom. Retract")
#define MSG_FILAMENTCHANGE _UxGT("Filament wechseln") #define MSG_FILAMENTCHANGE _UxGT("Filament wechseln")
#define MSG_FILAMENTLOAD _UxGT("Filament laden") #define MSG_FILAMENTLOAD _UxGT("Filament laden")
#define MSG_FILAMENTUNLOAD _UxGT("Filament entladen") #define MSG_FILAMENTUNLOAD _UxGT("Filament entladen")
#define MSG_FILAMENTUNLOAD_ALL _UxGT("Alles entladen") #define MSG_FILAMENTUNLOAD_ALL _UxGT("Alles entladen")
#define MSG_INIT_SDCARD _UxGT("SD-Karte initialisi.") // Manually initialize the SD-card via user interface #define MSG_INIT_SDCARD _UxGT("SD-Karte erkennen") // Manually initialize the SD-card via user interface
#define MSG_CNG_SDCARD _UxGT("SD-Karte getauscht") // SD-card changed by user. For machines with no autocarddetect. Both send "M21" #define MSG_CNG_SDCARD _UxGT("SD-Karte getauscht") // SD-card changed by user. For machines with no autocarddetect. Both send "M21"
#define MSG_ZPROBE_OUT _UxGT("Z-Sonde außerhalb") #define MSG_ZPROBE_OUT _UxGT("Sensor ausserhalb")
#define MSG_SKEW_FACTOR _UxGT("Korrekturfaktor") #define MSG_SKEW_FACTOR _UxGT("Skew Faktor")
#define MSG_BLTOUCH _UxGT("BLTouch") #define MSG_BLTOUCH _UxGT("BLTouch")
#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Selbsttest") #define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Test")
#define MSG_BLTOUCH_RESET _UxGT("BLTouch zurücks.") #define MSG_BLTOUCH_RESET _UxGT("BLTouch Reset")
#define MSG_BLTOUCH_DEPLOY _UxGT("BLTouch ausfahren") #define MSG_BLTOUCH_DEPLOY _UxGT("BLTouch ausfahren")
#define MSG_BLTOUCH_STOW _UxGT("BLTouch einfahren") #define MSG_BLTOUCH_STOW _UxGT("BLTouch einfahren")
#define MSG_HOME _UxGT("Vorher") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST #define MSG_HOME _UxGT("Vorher") // Used as MSG_HOME " " MSG_X MSG_Y MSG_Z " " MSG_FIRST
#define MSG_FIRST _UxGT("homen") #define MSG_FIRST _UxGT("homen")
#define MSG_ZPROBE_ZOFFSET _UxGT("Sondenversatz Z") #define MSG_ZPROBE_ZOFFSET _UxGT("Z Versatz")
#define MSG_BABYSTEP_X _UxGT("Babystep X") #define MSG_BABYSTEP_X _UxGT("Babystep X")
#define MSG_BABYSTEP_Y _UxGT("Babystep Y") #define MSG_BABYSTEP_Y _UxGT("Babystep Y")
#define MSG_BABYSTEP_Z _UxGT("Babystep Z") #define MSG_BABYSTEP_Z _UxGT("Babystep Z")
#define MSG_ENDSTOP_ABORT _UxGT("Endstopp Abbr.") #define MSG_ENDSTOP_ABORT _UxGT("Endstopp-Abbr.")
#define MSG_HEATING_FAILED_LCD _UxGT("HEIZEN ERFOLGLOS") #define MSG_HEATING_FAILED_LCD _UxGT("HEIZEN FEHLGESCHLAGEN")
#define MSG_HEATING_FAILED_LCD_BED _UxGT("Bett heizen fehlge.") #define MSG_ERR_REDUNDANT_TEMP _UxGT("REDUND. TEMPERATURABWEICHUNG")
#define MSG_ERR_REDUNDANT_TEMP _UxGT("REDUND. TEMP-ABWEI.")
#define MSG_THERMAL_RUNAWAY LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT") #define MSG_THERMAL_RUNAWAY LCD_STR_THERMOMETER _UxGT(" NICHT ERREICHT")
#define MSG_THERMAL_RUNAWAY_BED _UxGT("BETT") MSG_THERMAL_RUNAWAY #define MSG_THERMAL_RUNAWAY_BED _UxGT("BETT") MSG_THERMAL_RUNAWAY
#define MSG_ERR_MAXTEMP LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN") #define MSG_ERR_MAXTEMP LCD_STR_THERMOMETER _UxGT(" ÜBERSCHRITTEN")
@@ -302,14 +215,12 @@
#define MSG_ERR_MINTEMP_BED _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN") #define MSG_ERR_MINTEMP_BED _UxGT("BETT ") LCD_STR_THERMOMETER _UxGT(" UNTERSCHRITTEN")
#define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST #define MSG_ERR_Z_HOMING MSG_HOME _UxGT(" ") MSG_X MSG_Y _UxGT(" ") MSG_FIRST
#define MSG_HALTED _UxGT("DRUCKER STOPP") #define MSG_HALTED _UxGT("DRUCKER STOPP")
#define MSG_PLEASE_RESET _UxGT("Bitte neustarten") #define MSG_PLEASE_RESET _UxGT("Bitte Resetten")
#define MSG_SHORT_DAY _UxGT("t") // One character only #define MSG_SHORT_DAY _UxGT("t") // One character only
#define MSG_SHORT_HOUR _UxGT("h") // One character only #define MSG_SHORT_HOUR _UxGT("h") // One character only
#define MSG_SHORT_MINUTE _UxGT("m") // One character only #define MSG_SHORT_MINUTE _UxGT("m") // One character only
#define MSG_HEATING _UxGT("Extr. heizt...") #define MSG_HEATING _UxGT("Extr. heizt...")
#define MSG_COOLING _UxGT("Extr. kühlt...")
#define MSG_BED_HEATING _UxGT("Bett heizt...") #define MSG_BED_HEATING _UxGT("Bett heizt...")
#define MSG_BED_COOLING _UxGT("Bett kühlt...")
#define MSG_DELTA_CALIBRATE _UxGT("Delta kalibrieren") #define MSG_DELTA_CALIBRATE _UxGT("Delta kalibrieren")
#define MSG_DELTA_CALIBRATE_X _UxGT("Kalibriere X") #define MSG_DELTA_CALIBRATE_X _UxGT("Kalibriere X")
#define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibriere Y") #define MSG_DELTA_CALIBRATE_Y _UxGT("Kalibriere Y")
@@ -318,93 +229,170 @@
#define MSG_DELTA_SETTINGS _UxGT("Delta Einst. anzeig.") #define MSG_DELTA_SETTINGS _UxGT("Delta Einst. anzeig.")
#define MSG_DELTA_AUTO_CALIBRATE _UxGT("Autom. Kalibrierung") #define MSG_DELTA_AUTO_CALIBRATE _UxGT("Autom. Kalibrierung")
#define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Delta Höhe setzen") #define MSG_DELTA_HEIGHT_CALIBRATE _UxGT("Delta Höhe setzen")
#define MSG_DELTA_Z_OFFSET_CALIBRATE _UxGT("Sondenversatz Z")
#define MSG_DELTA_DIAG_ROD _UxGT("Diag Rod") #define MSG_DELTA_DIAG_ROD _UxGT("Diag Rod")
#define MSG_DELTA_HEIGHT _UxGT("Höhe") #define MSG_DELTA_HEIGHT _UxGT("Höhe")
#define MSG_DELTA_RADIUS _UxGT("Radius") #define MSG_DELTA_RADIUS _UxGT("Radius")
#define MSG_INFO_MENU _UxGT("Über den Drucker") #define MSG_INFO_MENU _UxGT("Über den Drucker")
#define MSG_INFO_PRINTER_MENU _UxGT("Drucker-Info") #define MSG_INFO_PRINTER_MENU _UxGT("Drucker Info")
#define MSG_3POINT_LEVELING _UxGT("3-Punkt-Nivellierung") #define MSG_3POINT_LEVELING _UxGT("3-Punkt Nivellierung")
#define MSG_LINEAR_LEVELING _UxGT("Lineare Nivellierung") #define MSG_LINEAR_LEVELING _UxGT("Lineare Nivellierung")
#define MSG_BILINEAR_LEVELING _UxGT("Bilineare Nivell.") #define MSG_BILINEAR_LEVELING _UxGT("Bilineare Nivell.")
#define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling") #define MSG_UBL_LEVELING _UxGT("Unified Bed Leveling")
#define MSG_MESH_LEVELING _UxGT("Netz-Nivellierung") #define MSG_MESH_LEVELING _UxGT("Netz Nivellierung")
#define MSG_INFO_STATS_MENU _UxGT("Drucker-Statistik") #define MSG_INFO_STATS_MENU _UxGT("Drucker Statistik")
#define MSG_INFO_BOARD_MENU _UxGT("Board-Info") #define MSG_INFO_BOARD_MENU _UxGT("Board Info")
#define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistoren") #define MSG_INFO_THERMISTOR_MENU _UxGT("Thermistoren")
#define MSG_INFO_EXTRUDERS _UxGT("Extruder") #define MSG_INFO_EXTRUDERS _UxGT("Extruder")
#define MSG_INFO_BAUDRATE _UxGT("Baudrate") #define MSG_INFO_BAUDRATE _UxGT("Baud")
#define MSG_INFO_PROTOCOL _UxGT("Protokoll") #define MSG_INFO_PROTOCOL _UxGT("Protokoll")
#define MSG_CASE_LIGHT _UxGT("Beleuchtung") #define MSG_CASE_LIGHT _UxGT("Beleuchtung")
#define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Helligkeit") #define MSG_CASE_LIGHT_BRIGHTNESS _UxGT("Helligkeit")
#define MSG_UBL_DOING_G29 _UxGT("G29 UBL läuft!")
#define MSG_UBL_UNHOMED _UxGT("Erst XYZ homen")
#define MSG_UBL_TOOLS _UxGT("UBL Werkzeuge")
#define MSG_UBL_LEVEL_BED _UxGT("Unified Bed Leveling")
#define MSG_UBL_MANUAL_MESH _UxGT("Netz manuell erst.")
#define MSG_UBL_BC_INSERT _UxGT("Unterlegen & messen")
#define MSG_UBL_BC_INSERT2 _UxGT("Messen")
#define MSG_UBL_BC_REMOVE _UxGT("Entfernen & messen")
#define MSG_UBL_MOVING_TO_NEXT _UxGT("Nächster Punkt...")
#define MSG_UBL_ACTIVATE_MESH _UxGT("UBL aktivieren")
#define MSG_UBL_DEACTIVATE_MESH _UxGT("UBL deaktivieren")
#define MSG_UBL_SET_BED_TEMP _UxGT("Bett Temp.")
#define MSG_UBL_CUSTOM_BED_TEMP MSG_UBL_SET_BED_TEMP
#define MSG_UBL_SET_HOTEND_TEMP _UxGT("Hotend Temp.")
#define MSG_UBL_CUSTOM_HOTEND_TEMP MSG_UBL_SET_HOTEND_TEMP
#define MSG_UBL_MESH_EDIT _UxGT("Netz bearbeiten")
#define MSG_UBL_EDIT_CUSTOM_MESH _UxGT("Eigenes Netz bearb.")
#define MSG_UBL_FINE_TUNE_MESH _UxGT("Feineinstellung...")
#define MSG_UBL_DONE_EDITING_MESH _UxGT("Bearbeitung beendet")
#define MSG_UBL_BUILD_CUSTOM_MESH _UxGT("Eigenes Netz erst.")
#define MSG_UBL_BUILD_MESH_MENU _UxGT("Netz erstellen")
#define MSG_UBL_BUILD_PLA_MESH _UxGT("Netz erstellen PLA")
#define MSG_UBL_BUILD_ABS_MESH _UxGT("Netz erstellen ABS")
#define MSG_UBL_BUILD_COLD_MESH _UxGT("Netz erstellen kalt")
#define MSG_UBL_MESH_HEIGHT_ADJUST _UxGT("Netz Höhe einst.")
#define MSG_UBL_MESH_HEIGHT_AMOUNT _UxGT("Höhe")
#define MSG_UBL_VALIDATE_MESH_MENU _UxGT("Netz validieren")
#define MSG_UBL_VALIDATE_PLA_MESH _UxGT("Netz validieren PLA")
#define MSG_UBL_VALIDATE_ABS_MESH _UxGT("Netz validieren ABS")
#define MSG_UBL_VALIDATE_CUSTOM_MESH _UxGT("Eig. Netz validieren")
#define MSG_UBL_CONTINUE_MESH _UxGT("Netzerst. forts.")
#define MSG_UBL_MESH_LEVELING _UxGT("Netz Nivellierung")
#define MSG_UBL_3POINT_MESH_LEVELING _UxGT("3-Punkt Nivellierung")
#define MSG_UBL_GRID_MESH_LEVELING _UxGT("Gitternetz Nivell.")
#define MSG_UBL_MESH_LEVEL _UxGT("Netz nivellieren")
#define MSG_UBL_SIDE_POINTS _UxGT("Eckpunkte")
#define MSG_UBL_MAP_TYPE _UxGT("Kartentyp")
#define MSG_UBL_OUTPUT_MAP _UxGT("Karte ausgeben")
#define MSG_UBL_OUTPUT_MAP_HOST _UxGT("Ausgabe für Host")
#define MSG_UBL_OUTPUT_MAP_CSV _UxGT("Ausgabe für CSV")
#define MSG_UBL_OUTPUT_MAP_BACKUP _UxGT("Externe Sicherung")
#define MSG_UBL_INFO_UBL _UxGT("UBL Info ausgeben")
#define MSG_UBL_EDIT_MESH_MENU _UxGT("Netz bearbeiten")
#define MSG_UBL_FILLIN_AMOUNT _UxGT("Menge an Fill-in")
#define MSG_UBL_MANUAL_FILLIN _UxGT("Manuelles Fill-in")
#define MSG_UBL_SMART_FILLIN _UxGT("Kluges Fill-in")
#define MSG_UBL_FILLIN_MESH _UxGT("Fill-in Netz")
#define MSG_UBL_INVALIDATE_ALL _UxGT("Alles annullieren")
#define MSG_UBL_INVALIDATE_CLOSEST _UxGT("Nächstlieg. ann.")
#define MSG_UBL_FINE_TUNE_ALL _UxGT("Feineinstellung Alle")
#define MSG_UBL_FINE_TUNE_CLOSEST _UxGT("Feineinst. Nächstl.")
#define MSG_UBL_STORAGE_MESH_MENU _UxGT("Netz Speicherplatz")
#define MSG_UBL_STORAGE_SLOT _UxGT("Memory Slot")
#define MSG_UBL_LOAD_MESH _UxGT("Bett Netz laden")
#define MSG_UBL_SAVE_MESH _UxGT("Bett Netz speichern")
#define MSG_MESH_LOADED _UxGT("Netz %i geladen")
#define MSG_MESH_SAVED _UxGT("Netz %i gespeichert")
#define MSG_NO_STORAGE _UxGT("Kein Speicher")
#define MSG_UBL_SAVE_ERROR _UxGT("ERR:UBL speichern")
#define MSG_UBL_RESTORE_ERROR _UxGT("ERR:UBL wiederherst.")
#define MSG_UBL_Z_OFFSET_STOPPED _UxGT("Z-Versatz angehalten")
#define MSG_UBL_STEP_BY_STEP_MENU _UxGT("Schrittweises UBL")
#define MSG_LED_CONTROL _UxGT("LED Kontrolle")
#define MSG_LEDS _UxGT("Licht")
#define MSG_LED_PRESETS _UxGT("Licht Einstellungen")
#define MSG_SET_LEDS_RED _UxGT("Rot")
#define MSG_SET_LEDS_ORANGE _UxGT("Orange")
#define MSG_SET_LEDS_YELLOW _UxGT("Gelb")
#define MSG_SET_LEDS_GREEN _UxGT("Grün")
#define MSG_SET_LEDS_BLUE _UxGT("Blau")
#define MSG_SET_LEDS_INDIGO _UxGT("Indigo")
#define MSG_SET_LEDS_VIOLET _UxGT("Violett")
#define MSG_SET_LEDS_WHITE _UxGT("Weiß")
#define MSG_SET_LEDS_DEFAULT _UxGT("Standard")
#define MSG_CUSTOM_LEDS _UxGT("Benutzerdef.")
#define MSG_INTENSITY_R _UxGT("Intensität Rot")
#define MSG_INTENSITY_G _UxGT("Intensität Grün")
#define MSG_INTENSITY_B _UxGT("Intensität Blau")
#define MSG_INTENSITY_W _UxGT("Intensität Weiß")
#define MSG_LED_BRIGHTNESS _UxGT("Helligkeit")
#if LCD_WIDTH >= 20 #if LCD_WIDTH >= 20
#define MSG_INFO_PRINT_COUNT _UxGT("Gesamte Drucke") #define MSG_INFO_PRINT_COUNT _UxGT("Gesamte Drucke")
#define MSG_INFO_COMPLETED_PRINTS _UxGT("Komplette Drucke") #define MSG_INFO_COMPLETED_PRINTS _UxGT("Beendete Drucke")
#define MSG_INFO_PRINT_TIME _UxGT("Gesamte Druckzeit") #define MSG_INFO_PRINT_TIME _UxGT("Gesamte Druckzeit")
#define MSG_INFO_PRINT_LONGEST _UxGT("Längste Druckzeit") #define MSG_INFO_PRINT_LONGEST _UxGT("Längster Druckjob")
#define MSG_INFO_PRINT_FILAMENT _UxGT("Gesamt Extrudiert") #define MSG_INFO_PRINT_FILAMENT _UxGT("Gesamt Extrudiert")
#else #else
#define MSG_INFO_PRINT_COUNT _UxGT("Drucke") #define MSG_INFO_PRINT_COUNT _UxGT("Drucke")
#define MSG_INFO_COMPLETED_PRINTS _UxGT("Komplette") #define MSG_INFO_COMPLETED_PRINTS _UxGT("Komplett")
#define MSG_INFO_PRINT_TIME _UxGT("Gesamte") #define MSG_INFO_PRINT_TIME _UxGT("Gesamt ")
#define MSG_INFO_PRINT_LONGEST _UxGT("Längste") #define MSG_INFO_PRINT_LONGEST _UxGT("Längster")
#define MSG_INFO_PRINT_FILAMENT _UxGT("Extrud.") #define MSG_INFO_PRINT_FILAMENT _UxGT("Extrud.")
#endif #endif
#define MSG_INFO_MIN_TEMP _UxGT("Min Temp") #define MSG_INFO_MIN_TEMP _UxGT("Min Temp")
#define MSG_INFO_MAX_TEMP _UxGT("Max Temp") #define MSG_INFO_MAX_TEMP _UxGT("Max Temp")
#define MSG_INFO_PSU _UxGT("Netzteil") #define MSG_INFO_PSU _UxGT("Netzteil")
#define MSG_DRIVE_STRENGTH _UxGT("Motorleistung")
#define MSG_DRIVE_STRENGTH _UxGT("Motorströme")
#define MSG_DAC_PERCENT _UxGT("Treiber %") #define MSG_DAC_PERCENT _UxGT("Treiber %")
#define MSG_DAC_EEPROM_WRITE _UxGT("Werte speichern") #define MSG_DAC_EEPROM_WRITE _UxGT("Werte speichern")
#define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("DRUCK PAUSIERT") #define MSG_FILAMENT_CHANGE_HEADER_PAUSE _UxGT("DRUCK PAUSIERT")
#define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("FILAMENT LADEN") #define MSG_FILAMENT_CHANGE_HEADER_LOAD _UxGT("FILAMENT LADEN")
#define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("FILAMENT ENTLADEN") #define MSG_FILAMENT_CHANGE_HEADER_UNLOAD _UxGT("FILAMENT ENTLADEN")
#define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("FORTS. OPTIONEN:") #define MSG_FILAMENT_CHANGE_OPTION_HEADER _UxGT("FORTS. OPTIONEN:")
#define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Mehr entladen") #define MSG_FILAMENT_CHANGE_OPTION_PURGE _UxGT("Mehr entleeren")
#define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Druck weiter") #define MSG_FILAMENT_CHANGE_OPTION_RESUME _UxGT("Drucke weiter")
#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Düse: ") #define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Düse: ")
#define MSG_ERR_HOMING_FAILED _UxGT("Homing gescheitert") #define MSG_ERR_HOMING_FAILED _UxGT("Homing gescheitert")
#define MSG_ERR_PROBING_FAILED _UxGT("Probing gescheitert") #define MSG_ERR_PROBING_FAILED _UxGT("Probing gescheitert")
#define MSG_M600_TOO_COLD _UxGT("M600: zu kalt") #define MSG_M600_TOO_COLD _UxGT("M600: Zu kalt")
//
// Die Filament-Change-Bildschirme können bis zu 3 Zeilen auf einem 4-Zeilen-Display anzeigen
// ...oder 2 Zeilen auf einem 3-Zeilen-Display.
#if LCD_HEIGHT >= 4 #if LCD_HEIGHT >= 4
// Up to 3 lines allowed // Up to 3 lines allowed
#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Warte auf den") #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Warte auf den")
#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("Start des") #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("Start des")
#define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("Filamentwechsels...") #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("Filamentwechsels")
#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Filament einlegen")
#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("und Knopf drücken")
#define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("um fortzusetzen")
#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Knopf drücken um")
#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Düse aufzuheizen")
#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Düse heizt auf")
#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("bitte warten...")
#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Warte auf") #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Warte auf")
#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("Herausnahme") #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("Herausnahme")
#define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("des Filaments...") #define MSG_FILAMENT_CHANGE_UNLOAD_3 _UxGT("des Filaments...")
#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Filament einlegen")
#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("und Knopf")
#define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("drücken...")
#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Knopf drücken um")
#define MSG_FILAMENT_CHANGE_HEAT_2 _UxGT("Düse aufzuheizen.")
#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Düse heizt auf...")
#define MSG_FILAMENT_CHANGE_HEATING_2 _UxGT("Bitte warten...")
#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Warte auf") #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Warte auf")
#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("Laden des") #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("Laden des")
#define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("Filaments...") #define MSG_FILAMENT_CHANGE_LOAD_3 _UxGT("Filaments")
#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Warte auf") #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Warte auf")
#define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("Entladen des") #define MSG_FILAMENT_CHANGE_PURGE_2 _UxGT("Entleeren des")
#define MSG_FILAMENT_CHANGE_PURGE_3 _UxGT("Filaments...") #define MSG_FILAMENT_CHANGE_PURGE_3 _UxGT("Filaments")
#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Warte auf") #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Warte auf")
#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("Fortsetzen des") #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("Fortsetzung des")
#define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("Drucks...") #define MSG_FILAMENT_CHANGE_RESUME_3 _UxGT("Druckes...")
#else // LCD_HEIGHT < 4 #else // LCD_HEIGHT < 4
// Up to 2 lines allowed // Up to 2 lines allowed
#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Bitte warten...") #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Bitte warten...")
#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Auswerfen...")
#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Laden und Klick") #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Laden und Klick")
#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Klick zum Heizen")
#define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heizen...") #define MSG_FILAMENT_CHANGE_HEATING_1 _UxGT("Heizen...")
#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Entladen...")
#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Laden...") #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Laden...")
#define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Entladen...") #define MSG_FILAMENT_CHANGE_PURGE_1 _UxGT("Entleeren...")
#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Fortsetzen...") #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Fortsetzen...")
#endif // LCD_HEIGHT < 4 #endif // LCD_HEIGHT < 4

View File

@@ -34,26 +34,26 @@
#define DISPLAY_CHARSET_ISO10646_GREEK #define DISPLAY_CHARSET_ISO10646_GREEK
#define CHARSIZE 2 #define CHARSIZE 2
#define WELCOME_MSG MACHINE_NAME _UxGT(" έτοιμο.") #define WELCOME_MSG MACHINE_NAME _UxGT(" πανέτοιμος.")
#define MSG_SD_INSERTED _UxGT("Εισαγωγή κάρτας") #define MSG_SD_INSERTED _UxGT("Έχω καρτούλα")
#define MSG_SD_REMOVED _UxGT("Αφαίρεση κάρτας") #define MSG_SD_REMOVED _UxGT("Ωχ! Δεν εχω καρτα")
#define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters #define MSG_LCD_ENDSTOPS _UxGT("Endstops") // Max length 8 characters
#define MSG_MAIN _UxGT("Βασική Οθόνη") #define MSG_MAIN _UxGT("Βασική Οθόνη")
#define MSG_AUTOSTART _UxGT("Αυτόματη εκκίνηση") #define MSG_AUTOSTART _UxGT("Αυτόματη εκκίνηση")
#define MSG_DISABLE_STEPPERS _UxGT("Απενεργοποίηση βηματιστή") #define MSG_DISABLE_STEPPERS _UxGT("Ελευθέρωσέ με")
#define MSG_AUTO_HOME _UxGT("Αυτομ. επαναφορά στο αρχικό σημείο") #define MSG_AUTO_HOME _UxGT("Πάω σπίτι")
#define MSG_AUTO_HOME_X _UxGT("Αρχικό σημείο X") #define MSG_AUTO_HOME_X _UxGT("Αρχικό X")
#define MSG_AUTO_HOME_Y _UxGT("Αρχικό σημείο Y") #define MSG_AUTO_HOME_Y _UxGT("Αρχικό Y")
#define MSG_AUTO_HOME_Z _UxGT("Αρχικό σημείο Z") #define MSG_AUTO_HOME_Z _UxGT("Αρχικό Z")
#define MSG_TMC_Z_CALIBRATION _UxGT("Βαθμονόμηση Z") #define MSG_TMC_Z_CALIBRATION _UxGT("Βαθμονόμηση Z")
#define MSG_LEVEL_BED_HOMING _UxGT("Επαναφορά στο αρχικό σημείο ΧΥΖ") #define MSG_LEVEL_BED_HOMING _UxGT("Επαναφορά στο αρχικό σημείο ΧΥΖ")
#define MSG_LEVEL_BED_WAITING _UxGT("Κάντε κλικ για να ξεκινήσετε") #define MSG_LEVEL_BED_WAITING _UxGT("Πάτα το κουμπί και ΦΥΓΑΜΕ!!!")
#define MSG_LEVEL_BED_NEXT_POINT _UxGT("Επόμενο σημείο") #define MSG_LEVEL_BED_NEXT_POINT _UxGT("Πιο πέρα")
#define MSG_LEVEL_BED_DONE _UxGT("Ολοκλήρωση επιπεδοποίησης!") #define MSG_LEVEL_BED_DONE _UxGT("Τελείωσα, αδερφέ")
#define MSG_SET_HOME_OFFSETS _UxGT("Ορισμός βασικών μετατοπίσεων") #define MSG_SET_HOME_OFFSETS _UxGT("Ορισμός βασικών μετατοπίσεων")
#define MSG_HOME_OFFSETS_APPLIED _UxGT("Εφαρμόστηκαν οι μετατοπίσεις") #define MSG_HOME_OFFSETS_APPLIED _UxGT("Εφαρμόστηκαν οι μετατοπίσεις")
#define MSG_SET_ORIGIN _UxGT("Ορισμός προέλευσης") #define MSG_SET_ORIGIN _UxGT("Ορισμός προέλευσης")
#define MSG_PREHEAT_1 _UxGT("Προθέρμανση PLA") #define MSG_PREHEAT_1 _UxGT("Ζεσταίνω PLA")
#define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ") #define MSG_PREHEAT_1_N MSG_PREHEAT_1 _UxGT(" ")
#define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" όλα") #define MSG_PREHEAT_1_ALL MSG_PREHEAT_1 _UxGT(" όλα")
#define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" κλίνη") #define MSG_PREHEAT_1_BEDONLY MSG_PREHEAT_1 _UxGT(" κλίνη")
@@ -69,8 +69,8 @@
#define MSG_EXTRUDE _UxGT("Εξώθηση") #define MSG_EXTRUDE _UxGT("Εξώθηση")
#define MSG_RETRACT _UxGT("Ανάσυρση") #define MSG_RETRACT _UxGT("Ανάσυρση")
#define MSG_MOVE_AXIS _UxGT("Μετακίνηση άξονα") #define MSG_MOVE_AXIS _UxGT("Μετακίνηση άξονα")
#define MSG_BED_LEVELING _UxGT("Επιπεδοποίηση κλίνης") #define MSG_BED_LEVELING _UxGT("Σου ισιώνω κρεβάτι")
#define MSG_LEVEL_BED _UxGT("Επιπεδοποίηση κλίνης") #define MSG_LEVEL_BED _UxGT("Εδω το καλό κρεβάτι")
#define MSG_MOVE_X _UxGT("Μετακίνηση X") #define MSG_MOVE_X _UxGT("Μετακίνηση X")
#define MSG_MOVE_Y _UxGT("Μετακίνηση Y") #define MSG_MOVE_Y _UxGT("Μετακίνηση Y")
#define MSG_MOVE_Z _UxGT("Μετακίνηση Z") #define MSG_MOVE_Z _UxGT("Μετακίνηση Z")
@@ -79,9 +79,9 @@
#define MSG_MOVE_1MM _UxGT("Μετακίνηση 1μμ") #define MSG_MOVE_1MM _UxGT("Μετακίνηση 1μμ")
#define MSG_MOVE_10MM _UxGT("Μετακίνηση 10μμ") #define MSG_MOVE_10MM _UxGT("Μετακίνηση 10μμ")
#define MSG_SPEED _UxGT("Ταχύτητα") #define MSG_SPEED _UxGT("Ταχύτητα")
#define MSG_BED_Z _UxGT("Κλίνη Z") #define MSG_BED_Z _UxGT("Κρεβάτι Z")
#define MSG_NOZZLE _UxGT("Ακροφύσιο") #define MSG_NOZZLE _UxGT("Μύτη")
#define MSG_BED _UxGT("Κλίνη") #define MSG_BED _UxGT("Κρεβάτι")
#define MSG_FAN_SPEED _UxGT("Ταχύτητα ανεμιστήρα") #define MSG_FAN_SPEED _UxGT("Ταχύτητα ανεμιστήρα")
#define MSG_FLOW _UxGT("Ροή") #define MSG_FLOW _UxGT("Ροή")
#define MSG_CONTROL _UxGT("Έλεγχος") #define MSG_CONTROL _UxGT("Έλεγχος")
@@ -132,9 +132,9 @@
#define MSG_E5STEPS _UxGT("Bήματα Ε5 ανά μμ") #define MSG_E5STEPS _UxGT("Bήματα Ε5 ανά μμ")
#define MSG_TEMPERATURE _UxGT("Θερμοκρασία") #define MSG_TEMPERATURE _UxGT("Θερμοκρασία")
#define MSG_MOTION _UxGT("Κίνηση") #define MSG_MOTION _UxGT("Κίνηση")
#define MSG_FILAMENT _UxGT("Νήμα") #define MSG_FILAMENT _UxGT("Φιλαμεντ")
#define MSG_VOLUMETRIC_ENABLED _UxGT("Ε σε μμ3") #define MSG_VOLUMETRIC_ENABLED _UxGT("Ε σε μμ3")
#define MSG_FILAMENT_DIAM _UxGT("Διάμετρος νήματος") #define MSG_FILAMENT_DIAM _UxGT("Διάμετρος φιλαμεντ")
#define MSG_CONTRAST _UxGT("Κοντράστ LCD") #define MSG_CONTRAST _UxGT("Κοντράστ LCD")
#define MSG_STORE_EEPROM _UxGT("Αποθήκευση") #define MSG_STORE_EEPROM _UxGT("Αποθήκευση")
#define MSG_LOAD_EEPROM _UxGT("Φόρτωση") #define MSG_LOAD_EEPROM _UxGT("Φόρτωση")
@@ -142,15 +142,15 @@
#define MSG_REFRESH _UxGT("Ανανέωση") #define MSG_REFRESH _UxGT("Ανανέωση")
#define MSG_WATCH _UxGT("Οθόνη πληροφόρησης") #define MSG_WATCH _UxGT("Οθόνη πληροφόρησης")
#define MSG_PREPARE _UxGT("Προετοιμασία") #define MSG_PREPARE _UxGT("Προετοιμασία")
#define MSG_TUNE _UxGT("Συντονισμός") #define MSG_TUNE _UxGT("Ρύθμιση OTF")
#define MSG_PAUSE_PRINT _UxGT("Παύση εκτύπωσης") #define MSG_PAUSE_PRINT _UxGT("Διάλειμα")
#define MSG_RESUME_PRINT _UxGT("Συνέχιση εκτύπωσης") #define MSG_RESUME_PRINT _UxGT("Συνεχίζω")
#define MSG_STOP_PRINT _UxGT("Διακοπή εκτύπωσης") #define MSG_STOP_PRINT _UxGT("ΑΝΤΕ ΓΕΙΑ!!!")
#define MSG_CARD_MENU _UxGT("Εκτύπωση από SD") #define MSG_CARD_MENU _UxGT("φτιάχνω από κάρτα")
#define MSG_NO_CARD _UxGT("Δεν βρέθηκε SD") #define MSG_NO_CARD _UxGT("Αδερφέ, δεν έχω κάρτα")
#define MSG_DWELL _UxGT("Αναστολή λειτουργίας…") #define MSG_DWELL _UxGT("Αναστολή λειτουργίας…")
#define MSG_USERWAIT _UxGT("Αναμονή για χρήστη…") #define MSG_USERWAIT _UxGT("Αναμονή για χρήστη…")
#define MSG_PRINT_ABORTED _UxGT("Διακόπτεται η εκτύπωση") #define MSG_PRINT_ABORTED _UxGT("Ως εδώ με έχεις φέρει!!")
#define MSG_NO_MOVE _UxGT("Καμία κίνηση.") #define MSG_NO_MOVE _UxGT("Καμία κίνηση.")
#define MSG_KILLED _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. ") #define MSG_KILLED _UxGT("ΤΕΡΜΑΤΙΣΜΟΣ. ")
#define MSG_STOPPED _UxGT("ΔΙΑΚΟΠΗ. ") #define MSG_STOPPED _UxGT("ΔΙΑΚΟΠΗ. ")
@@ -174,14 +174,14 @@
#define MSG_BABYSTEP_Z _UxGT("Μικρό βήμα Ζ") #define MSG_BABYSTEP_Z _UxGT("Μικρό βήμα Ζ")
#define MSG_ENDSTOP_ABORT _UxGT("Ματαίωση endstop ") #define MSG_ENDSTOP_ABORT _UxGT("Ματαίωση endstop ")
#define MSG_HEATING_FAILED_LCD _UxGT("Ανεπιτυχής θέρμανση") #define MSG_HEATING_FAILED_LCD _UxGT("Ανεπιτυχής θέρμανση")
#define MSG_ERR_REDUNDANT_TEMP _UxGT("Λάθος: ΠΛΕΟΝΑΖΟΥΣΑ ΘΕΡΜΟΤΗΤΑ") #define MSG_ERR_REDUNDANT_TEMP _UxGT("Λάθος: ΘΑ ΜΕ ΚΑΨΕΙΣ ΗΛΗΘΙΕ")
#define MSG_THERMAL_RUNAWAY _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΤΗΤΑΣ") #define MSG_THERMAL_RUNAWAY _UxGT("ΔΙΑΦΥΓΗ ΘΕΡΜΟΤΗΤΑΣ")
#define MSG_ERR_MAXTEMP _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ") #define MSG_ERR_MAXTEMP _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ")
#define MSG_ERR_MINTEMP _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ") #define MSG_ERR_MINTEMP _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ")
#define MSG_ERR_MAXTEMP_BED _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΛΙΝΗΣ") #define MSG_ERR_MAXTEMP_BED _UxGT("Λάθος: ΜΕΓΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΡΕΒΑΤΙΟΥ")
#define MSG_ERR_MINTEMP_BED _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΛΙΝΗΣ") #define MSG_ERR_MINTEMP_BED _UxGT("Λάθος: ΕΛΑΧΙΣΤΗ ΘΕΡΜΟΤΗΤΑ ΚΡΕΒΑΤΙΟΥ")
#define MSG_HEATING _UxGT("Θερμαίνεται…") #define MSG_HEATING _UxGT("Ανάβω…")
#define MSG_BED_HEATING _UxGT("Θέρμανση κλίνης…") #define MSG_BED_HEATING _UxGT("Ανάβω το κρεβάτι…")
#define MSG_DELTA_CALIBRATE _UxGT("Βαθμονόμηση Delta") #define MSG_DELTA_CALIBRATE _UxGT("Βαθμονόμηση Delta")
#define MSG_DELTA_CALIBRATE_X _UxGT("Βαθμονόμηση X") #define MSG_DELTA_CALIBRATE_X _UxGT("Βαθμονόμηση X")
#define MSG_DELTA_CALIBRATE_Y _UxGT("Βαθμονόμηση Y") #define MSG_DELTA_CALIBRATE_Y _UxGT("Βαθμονόμηση Y")

View File

@@ -756,15 +756,6 @@
#ifndef MSG_BLTOUCH #ifndef MSG_BLTOUCH
#define MSG_BLTOUCH _UxGT("BLTouch") #define MSG_BLTOUCH _UxGT("BLTouch")
#endif #endif
#ifndef MSG_BLTOUCH_SW_MODE
#define MSG_BLTOUCH_SW_MODE _UxGT("SW Deploy BLTouch")
#endif
#ifndef MSG_BLTOUCH_5V_MODE
#define MSG_BLTOUCH_5V_MODE _UxGT("BLTouch 5V Mode")
#endif
#ifndef MSG_BLTOUCH_OD_MODE
#define MSG_BLTOUCH_OD_MODE _UxGT("BLTouch OD Mode")
#endif
#ifndef MSG_BLTOUCH_SELFTEST #ifndef MSG_BLTOUCH_SELFTEST
#define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test") #define MSG_BLTOUCH_SELFTEST _UxGT("BLTouch Self-Test")
#endif #endif

View File

@@ -251,25 +251,26 @@
#define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Boquilla: ") #define MSG_FILAMENT_CHANGE_NOZZLE _UxGT(" Boquilla: ")
#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando para") #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Esperando iniciar")
#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte el filamento") #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte filamento")
#define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("y presione el boton") #define MSG_FILAMENT_CHANGE_INSERT_2 _UxGT("y presione el boton")
#if LCD_HEIGHT >= 4 #if LCD_HEIGHT >= 4
// Up to 3 lines allowed // Up to 3 lines allowed
#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("iniciar cambio") #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("del filamento")
#define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("de filamento") #define MSG_FILAMENT_CHANGE_INIT_3 _UxGT("cambiar")
#define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("para continuar...") #define MSG_FILAMENT_CHANGE_INSERT_3 _UxGT("para continuar...")
#else // LCD_HEIGHT < 4 #else // LCD_HEIGHT < 4
// Up to 2 lines allowed // Up to 2 lines allowed
#define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("iniciar cambio fil.") #define MSG_FILAMENT_CHANGE_INIT_2 _UxGT("del fil. cambiar")
#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Inserte filamento")
#endif // LCD_HEIGHT < 4 #endif // LCD_HEIGHT < 4
#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperando para") #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Esperado por")
#define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("expulsar filamento") #define MSG_FILAMENT_CHANGE_UNLOAD_2 _UxGT("filamento expulsado")
#define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperado para") #define MSG_FILAMENT_CHANGE_LOAD_1 _UxGT("Esperado por")
#define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("cargar el filamento") #define MSG_FILAMENT_CHANGE_LOAD_2 _UxGT("Cargar filamento")
#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando imp.") #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando imp.")
#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("para resumir") #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("para resumir")
#define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Oprima boton para") #define MSG_FILAMENT_CHANGE_HEAT_1 _UxGT("Oprima boton para")

View File

@@ -369,7 +369,7 @@
#define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando impressao") #define MSG_FILAMENT_CHANGE_RESUME_1 _UxGT("Esperando impressao")
#define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("continuar") #define MSG_FILAMENT_CHANGE_RESUME_2 _UxGT("continuar")
#else // LCD_HEIGHT < 4 #else LCD_HEIGHT < 4
#define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Aguarde...") #define MSG_FILAMENT_CHANGE_INIT_1 _UxGT("Aguarde...")
#define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejetando...") #define MSG_FILAMENT_CHANGE_UNLOAD_1 _UxGT("Ejetando...")
#define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insira e Clique") #define MSG_FILAMENT_CHANGE_INSERT_1 _UxGT("Insira e Clique")

View File

@@ -157,17 +157,16 @@
#define LCD_SDSS 28 #define LCD_SDSS 28
#if ENABLED(ADC_KEYPAD) #if ENABLED(ADC_KEYPAD)
#define SERVO0_PIN 27 // free for BLTouch/3D-Touch #define SERVO0_PIN 27 // free for BLTouch/3D-Touch
#ifndef LCD_I2C_TYPE_PCF8575
#define LCD_PINS_RS 28 #define LCD_PINS_RS 28
#define LCD_PINS_ENABLE 29 #define LCD_PINS_ENABLE 29
#define LCD_PINS_D4 10 #define LCD_PINS_D4 10
#define LCD_PINS_D5 11 #define LCD_PINS_D5 11
#define LCD_PINS_D6 16 #define LCD_PINS_D6 16
#define LCD_PINS_D7 17 #define LCD_PINS_D7 17
#endif #define BTN_EN1 -1
#ifndef ADC_KEYPAD_PIN #define BTN_EN2 -1
#define ADC_KEYPAD_PIN 1 // Analog Input #define BTN_ENC -1
#endif #define ADC_KEYPAD_PIN 1
#elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) || ENABLED(ANET_FULL_GRAPHICS_LCD) #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) || ENABLED(ANET_FULL_GRAPHICS_LCD)
// Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics // Pin definitions for the Anet A6 Full Graphics display and the RepRapDiscount Full Graphics
// display using an adapter board // https://go.aisler.net/benlye/anet-lcd-adapter/pcb // display using an adapter board // https://go.aisler.net/benlye/anet-lcd-adapter/pcb

View File

@@ -509,7 +509,7 @@
#define BTN_ENC 35 #define BTN_ENC 35
#define SD_DETECT_PIN 49 #define SD_DETECT_PIN 49
#define KILL_PIN 41 #define KILL_PIN 64
#elif ENABLED(MINIPANEL) #elif ENABLED(MINIPANEL)

View File

@@ -95,7 +95,6 @@
#define TEMP_BED_PIN 14 #define TEMP_BED_PIN 14
// Servos // Servos
#if TRIGORILLA_VERSION == 0 // Default Trigorilla
#ifdef NUM_SERVOS #ifdef NUM_SERVOS
#define SERVO0_PIN 11 #define SERVO0_PIN 11
@@ -111,23 +110,6 @@
#define SERVO3_PIN 4 #define SERVO3_PIN 4
#endif #endif
#endif #endif
#else // Trigorilla 1.1
#ifdef NUM_SERVOS
#define SERVO0_PIN 5
#if NUM_SERVOS > 1
#define SERVO1_PIN 4
#endif
#if NUM_SERVOS > 2
#define SERVO2_PIN 11
#endif
#if NUM_SERVOS > 3
#define SERVO3_PIN 6
#endif
#endif
#endif // #if TRIGORILLA_VERSION
#if defined(ANYCUBIC_TFT_MODEL) || defined(REPRAP_DISCOUNT_SMART_CONTROLLER) #if defined(ANYCUBIC_TFT_MODEL) || defined(REPRAP_DISCOUNT_SMART_CONTROLLER)
#define BEEPER_PIN 31 #define BEEPER_PIN 31
@@ -155,8 +137,8 @@
#ifdef REPRAP_DISCOUNT_SMART_CONTROLLER #ifdef REPRAP_DISCOUNT_SMART_CONTROLLER
#define BTN_EN1 31 #define BTN_EN1 33
#define BTN_EN2 33 #define BTN_EN2 31
#define BTN_ENC 35 #define BTN_ENC 35
#elif defined(LCD_I2C_PANELOLU2) #elif defined(LCD_I2C_PANELOLU2)

View File

@@ -122,98 +122,156 @@
} }
#endif // TMC26X #endif // TMC26X
#if HAS_TRINAMIC
#define _TMC_INIT(ST, SPMM) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM)
#endif
// //
// TMC2130 Driver objects and inits // TMC2130 Driver objects and inits
// //
#if HAS_DRIVER(TMC2130) #if HAS_DRIVER(TMC2130)
#include <SPI.h> #include <SPI.h>
#include <TMC2130Stepper.h>
#include "planner.h" #include "planner.h"
#include "enum.h" #include "enum.h"
#if ENABLED(TMC_USE_SW_SPI) #if TMC2130STEPPER_VERSION < 0x020201
#define _TMC2130_DEFINE(ST, L) TMCMarlin<TMC2130Stepper, L> stepper##ST(ST##_CS_PIN, R_SENSE, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK) #error "Update TMC2130Stepper library to 2.2.1 or newer."
#define TMC2130_DEFINE(ST) _TMC2130_DEFINE(ST, TMC_##ST##_LABEL)
#else
#define _TMC2130_DEFINE(ST, L) TMCMarlin<TMC2130Stepper, L> stepper##ST(ST##_CS_PIN, R_SENSE)
#define TMC2130_DEFINE(ST) _TMC2130_DEFINE(ST, TMC_##ST##_LABEL)
#endif
// Stepper objects of TMC2130 steppers used
#if AXIS_DRIVER_TYPE(X, TMC2130)
TMC2130_DEFINE(X);
#endif
#if AXIS_DRIVER_TYPE(X2, TMC2130)
TMC2130_DEFINE(X2);
#endif
#if AXIS_DRIVER_TYPE(Y, TMC2130)
TMC2130_DEFINE(Y);
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC2130)
TMC2130_DEFINE(Y2);
#endif
#if AXIS_DRIVER_TYPE(Z, TMC2130)
TMC2130_DEFINE(Z);
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC2130)
TMC2130_DEFINE(Z2);
#endif
#if AXIS_DRIVER_TYPE(E0, TMC2130)
TMC2130_DEFINE(E0);
#endif
#if AXIS_DRIVER_TYPE(E1, TMC2130)
TMC2130_DEFINE(E1);
#endif
#if AXIS_DRIVER_TYPE(E2, TMC2130)
TMC2130_DEFINE(E2);
#endif
#if AXIS_DRIVER_TYPE(E3, TMC2130)
TMC2130_DEFINE(E3);
#endif
#if AXIS_DRIVER_TYPE(E4, TMC2130)
TMC2130_DEFINE(E4);
#endif #endif
template<char AXIS_LETTER, char DRIVER_ID> #if ENABLED(TMC_USE_SW_SPI)
void tmc_init(TMCMarlin<TMC2130Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) { #define _TMC2130_DEFINE(ST) TMC2130Stepper stepper##ST(ST##_ENABLE_PIN, ST##_DIR_PIN, ST##_STEP_PIN, ST##_CS_PIN, TMC_SW_MOSI, TMC_SW_MISO, TMC_SW_SCK)
#else
#define _TMC2130_DEFINE(ST) TMC2130Stepper stepper##ST(ST##_ENABLE_PIN, ST##_DIR_PIN, ST##_STEP_PIN, ST##_CS_PIN)
#endif
// Stepper objects of TMC2130 steppers used
#if AXIS_DRIVER_TYPE(X, TMC2130)
_TMC2130_DEFINE(X);
#endif
#if AXIS_DRIVER_TYPE(X2, TMC2130)
_TMC2130_DEFINE(X2);
#endif
#if AXIS_DRIVER_TYPE(Y, TMC2130)
_TMC2130_DEFINE(Y);
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC2130)
_TMC2130_DEFINE(Y2);
#endif
#if AXIS_DRIVER_TYPE(Z, TMC2130)
_TMC2130_DEFINE(Z);
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC2130)
_TMC2130_DEFINE(Z2);
#endif
#if AXIS_DRIVER_TYPE(E0, TMC2130)
_TMC2130_DEFINE(E0);
#endif
#if AXIS_DRIVER_TYPE(E1, TMC2130)
_TMC2130_DEFINE(E1);
#endif
#if AXIS_DRIVER_TYPE(E2, TMC2130)
_TMC2130_DEFINE(E2);
#endif
#if AXIS_DRIVER_TYPE(E3, TMC2130)
_TMC2130_DEFINE(E3);
#endif
#if AXIS_DRIVER_TYPE(E4, TMC2130)
_TMC2130_DEFINE(E4);
#endif
// Use internal reference voltage for current calculations. This is the default.
// Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609)
// https://www.trinamic.com/products/integrated-circuits/details/tmc2130/
void tmc2130_init(TMC2130Stepper &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
#if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD) #if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD)
UNUSED(thrs); UNUSED(thrs);
UNUSED(spmm); UNUSED(spmm);
#endif #endif
st.begin(); st.begin();
st.setCurrent(mA, R_SENSE, HOLD_MULTIPLIER);
CHOPCONF_t chopconf{0};
chopconf.tbl = 1;
chopconf.toff = 3;
chopconf.intpol = INTERPOLATE;
chopconf.hstrt = 2;
chopconf.hend = 5;
st.CHOPCONF(chopconf.sr);
st.rms_current(mA, HOLD_MULTIPLIER);
st.microsteps(microsteps); st.microsteps(microsteps);
st.iholddelay(10); st.blank_time(24);
st.TPOWERDOWN(128); // ~2s until driver lowers to hold current st.off_time(5); // Only enables the driver if used with stealthChop
st.interpolate(INTERPOLATE);
st.power_down_delay(128); // ~2s until driver lowers to hold current
st.hysteresis_start(3);
st.hysteresis_end(2);
#if ENABLED(STEALTHCHOP) #if ENABLED(STEALTHCHOP)
st.en_pwm_mode(true); st.stealth_freq(1); // f_pwm = 2/683 f_clk
st.stealth_autoscale(1);
PWMCONF_t pwmconf{0}; st.stealth_gradient(5);
pwmconf.pwm_freq = 0b01; // f_pwm = 2/683 f_clk st.stealth_amplitude(255);
pwmconf.pwm_autoscale = true; st.stealthChop(1);
pwmconf.pwm_grad = 5;
pwmconf.pwm_ampl = 180;
st.PWMCONF(pwmconf.sr);
#if ENABLED(HYBRID_THRESHOLD) #if ENABLED(HYBRID_THRESHOLD)
st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm)); st.stealth_max_speed(12650000UL*microsteps/(256*thrs*spmm));
#endif #endif
#endif #endif
st.GSTAT(); // Clear GSTAT st.GSTAT(); // Clear GSTAT
} }
#define _TMC2130_INIT(ST, SPMM) tmc2130_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM)
void tmc2130_init_to_defaults() {
#if AXIS_DRIVER_TYPE(X, TMC2130)
_TMC2130_INIT( X, planner.axis_steps_per_mm[X_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(X2, TMC2130)
_TMC2130_INIT(X2, planner.axis_steps_per_mm[X_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(Y, TMC2130)
_TMC2130_INIT( Y, planner.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC2130)
_TMC2130_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(Z, TMC2130)
_TMC2130_INIT( Z, planner.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC2130)
_TMC2130_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(E0, TMC2130)
_TMC2130_INIT(E0, planner.axis_steps_per_mm[E_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(E1, TMC2130)
{ constexpr int extruder = 1; _TMC2130_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); }
#endif
#if AXIS_DRIVER_TYPE(E2, TMC2130)
{ constexpr int extruder = 2; _TMC2130_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); }
#endif
#if AXIS_DRIVER_TYPE(E3, TMC2130)
{ constexpr int extruder = 3; _TMC2130_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); }
#endif
#if AXIS_DRIVER_TYPE(E4, TMC2130)
{ constexpr int extruder = 4; _TMC2130_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); }
#endif
#if ENABLED(SENSORLESS_HOMING)
#define TMC_INIT_SGT(P,Q) stepper##Q.sgt(P##_HOMING_SENSITIVITY);
#if X_SENSORLESS
#if AXIS_DRIVER_TYPE(X, TMC2130)
stepperX.sgt(X_HOMING_SENSITIVITY);
#endif
#if AXIS_DRIVER_TYPE(X2, TMC2130)
stepperX2.sgt(X_HOMING_SENSITIVITY);
#endif
#endif
#if Y_SENSORLESS
#if AXIS_DRIVER_TYPE(Y, TMC2130)
stepperY.sgt(Y_HOMING_SENSITIVITY);
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC2130)
stepperY2.sgt(Y_HOMING_SENSITIVITY);
#endif
#endif
#if Z_SENSORLESS
#if AXIS_DRIVER_TYPE(Z, TMC2130)
stepperZ.sgt(Z_HOMING_SENSITIVITY);
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC2130)
stepperZ2.sgt(Z_HOMING_SENSITIVITY);
#endif
#endif
#endif
}
#endif // TMC2130 #endif // TMC2130
// //
@@ -224,90 +282,92 @@
#undef HardwareSerial_h // undo Marlin trickery #undef HardwareSerial_h // undo Marlin trickery
#include <SoftwareSerial.h> #include <SoftwareSerial.h>
#include <HardwareSerial.h> #include <HardwareSerial.h>
#include <TMC2208Stepper.h>
#include "planner.h" #include "planner.h"
#define _TMC2208_DEFINE_HARDWARE(ST, L) TMCMarlin<TMC2208Stepper, L> stepper##ST(&ST##_HARDWARE_SERIAL, R_SENSE) #if TMC2208STEPPER_VERSION < 0x000101
#define TMC2208_DEFINE_HARDWARE(ST) _TMC2208_DEFINE_HARDWARE(ST, TMC_##ST##_LABEL) #error "Update TMC2208Stepper library to 0.1.1 or newer."
#endif
#define _TMC2208_DEFINE_SOFTWARE(ST, L) TMCMarlin<TMC2208Stepper, L> stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, R_SENSE, ST##_SERIAL_RX_PIN > -1) #define _TMC2208_DEFINE_HARDWARE(ST) TMC2208Stepper stepper##ST(&ST##_HARDWARE_SERIAL)
#define TMC2208_DEFINE_SOFTWARE(ST) _TMC2208_DEFINE_SOFTWARE(ST, TMC_##ST##_LABEL) #define _TMC2208_DEFINE_SOFTWARE(ST) TMC2208Stepper stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, ST##_SERIAL_RX_PIN > -1)
// Stepper objects of TMC2208 steppers used // Stepper objects of TMC2208 steppers used
#if AXIS_DRIVER_TYPE(X, TMC2208) #if AXIS_DRIVER_TYPE(X, TMC2208)
#ifdef X_HARDWARE_SERIAL #ifdef X_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(X); _TMC2208_DEFINE_HARDWARE(X);
#else #else
TMC2208_DEFINE_SOFTWARE(X); _TMC2208_DEFINE_SOFTWARE(X);
#endif #endif
#endif #endif
#if AXIS_DRIVER_TYPE(X2, TMC2208) #if AXIS_DRIVER_TYPE(X2, TMC2208)
#ifdef X2_HARDWARE_SERIAL #ifdef X2_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(X2); _TMC2208_DEFINE_HARDWARE(X2);
#else #else
TMC2208_DEFINE_SOFTWARE(X2); _TMC2208_DEFINE_SOFTWARE(X2);
#endif #endif
#endif #endif
#if AXIS_DRIVER_TYPE(Y, TMC2208) #if AXIS_DRIVER_TYPE(Y, TMC2208)
#ifdef Y_HARDWARE_SERIAL #ifdef Y_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(Y); _TMC2208_DEFINE_HARDWARE(Y);
#else #else
TMC2208_DEFINE_SOFTWARE(Y); _TMC2208_DEFINE_SOFTWARE(Y);
#endif #endif
#endif #endif
#if AXIS_DRIVER_TYPE(Y2, TMC2208) #if AXIS_DRIVER_TYPE(Y2, TMC2208)
#ifdef Y2_HARDWARE_SERIAL #ifdef Y2_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(Y2); _TMC2208_DEFINE_HARDWARE(Y2);
#else #else
TMC2208_DEFINE_SOFTWARE(Y2); _TMC2208_DEFINE_SOFTWARE(Y2);
#endif #endif
#endif #endif
#if AXIS_DRIVER_TYPE(Z, TMC2208) #if AXIS_DRIVER_TYPE(Z, TMC2208)
#ifdef Z_HARDWARE_SERIAL #ifdef Z_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(Z); _TMC2208_DEFINE_HARDWARE(Z);
#else #else
TMC2208_DEFINE_SOFTWARE(Z); _TMC2208_DEFINE_SOFTWARE(Z);
#endif #endif
#endif #endif
#if AXIS_DRIVER_TYPE(Z2, TMC2208) #if AXIS_DRIVER_TYPE(Z2, TMC2208)
#ifdef Z2_HARDWARE_SERIAL #ifdef Z2_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(Z2); _TMC2208_DEFINE_HARDWARE(Z2);
#else #else
TMC2208_DEFINE_SOFTWARE(Z2); _TMC2208_DEFINE_SOFTWARE(Z2);
#endif #endif
#endif #endif
#if AXIS_DRIVER_TYPE(E0, TMC2208) #if AXIS_DRIVER_TYPE(E0, TMC2208)
#ifdef E0_HARDWARE_SERIAL #ifdef E0_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(E0); _TMC2208_DEFINE_HARDWARE(E0);
#else #else
TMC2208_DEFINE_SOFTWARE(E0); _TMC2208_DEFINE_SOFTWARE(E0);
#endif #endif
#endif #endif
#if AXIS_DRIVER_TYPE(E1, TMC2208) #if AXIS_DRIVER_TYPE(E1, TMC2208)
#ifdef E1_HARDWARE_SERIAL #ifdef E1_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(E1); _TMC2208_DEFINE_HARDWARE(E1);
#else #else
TMC2208_DEFINE_SOFTWARE(E1); _TMC2208_DEFINE_SOFTWARE(E1);
#endif #endif
#endif #endif
#if AXIS_DRIVER_TYPE(E2, TMC2208) #if AXIS_DRIVER_TYPE(E2, TMC2208)
#ifdef E2_HARDWARE_SERIAL #ifdef E2_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(E2); _TMC2208_DEFINE_HARDWARE(E2);
#else #else
TMC2208_DEFINE_SOFTWARE(E2); _TMC2208_DEFINE_SOFTWARE(E2);
#endif #endif
#endif #endif
#if AXIS_DRIVER_TYPE(E3, TMC2208) #if AXIS_DRIVER_TYPE(E3, TMC2208)
#ifdef E3_HARDWARE_SERIAL #ifdef E3_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(E3); _TMC2208_DEFINE_HARDWARE(E3);
#else #else
TMC2208_DEFINE_SOFTWARE(E3); _TMC2208_DEFINE_SOFTWARE(E3);
#endif #endif
#endif #endif
#if AXIS_DRIVER_TYPE(E4, TMC2208) #if AXIS_DRIVER_TYPE(E4, TMC2208)
#ifdef E4_HARDWARE_SERIAL #ifdef E4_HARDWARE_SERIAL
TMC2208_DEFINE_HARDWARE(E4); _TMC2208_DEFINE_HARDWARE(E4);
#else #else
TMC2208_DEFINE_SOFTWARE(E4); _TMC2208_DEFINE_SOFTWARE(E4);
#endif #endif
#endif #endif
@@ -391,52 +451,79 @@
#endif #endif
} }
template<char AXIS_LETTER, char DRIVER_ID> // Use internal reference voltage for current calculations. This is the default.
void tmc_init(TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) { // Following values from Trinamic's spreadsheet with values for a NEMA17 (42BYGHW609)
#if DISABLED(STEALTHCHOP) || DISABLED(HYBRID_THRESHOLD) void tmc2208_init(TMC2208Stepper &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const float spmm) {
st.pdn_disable(true); // Use UART
st.mstep_reg_select(true); // Select microsteps with UART
st.I_scale_analog(false);
st.rms_current(mA, HOLD_MULTIPLIER, R_SENSE);
st.microsteps(microsteps);
st.blank_time(24);
st.toff(5);
st.intpol(INTERPOLATE);
st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
st.hysteresis_start(3);
st.hysteresis_end(2);
#if ENABLED(STEALTHCHOP)
st.pwm_lim(12);
st.pwm_reg(8);
st.pwm_autograd(1);
st.pwm_autoscale(1);
st.pwm_freq(1);
st.pwm_grad(14);
st.pwm_ofs(36);
st.en_spreadCycle(false);
#if ENABLED(HYBRID_THRESHOLD)
st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
#else
UNUSED(thrs); UNUSED(thrs);
UNUSED(spmm); UNUSED(spmm);
#endif #endif
TMC2208_n::GCONF_t gconf{0};
gconf.pdn_disable = true; // Use UART
gconf.mstep_reg_select = true; // Select microsteps with UART
gconf.i_scale_analog = false;
TMC2208_n::CHOPCONF_t chopconf{0};
chopconf.tbl = 0b01; // blank_time = 24
chopconf.toff = 5;
chopconf.intpol = INTERPOLATE;
chopconf.hstrt = 2;
chopconf.hend = 5;
st.CHOPCONF(chopconf.sr);
st.rms_current(mA, HOLD_MULTIPLIER);
st.microsteps(microsteps);
st.iholddelay(10);
st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
#if ENABLED(STEALTHCHOP)
gconf.en_spreadcycle = false;
TMC2208_n::PWMCONF_t pwmconf{0};
pwmconf.pwm_lim = 12;
pwmconf.pwm_reg = 8;
pwmconf.pwm_autograd = true;
pwmconf.pwm_autoscale = true;
pwmconf.pwm_freq = 0b01;
pwmconf.pwm_grad = 14;
pwmconf.pwm_ofs = 36;
st.PWMCONF(pwmconf.sr);
#if ENABLED(HYBRID_THRESHOLD)
st.TPWMTHRS(12650000UL*microsteps/(256*thrs*spmm));
#endif
#else #else
gconf.en_spreadcycle = true; st.en_spreadCycle(true);
#endif #endif
st.GCONF(gconf.sr);
st.GSTAT(0b111); // Clear st.GSTAT(0b111); // Clear
delay(200); delay(200);
} }
#define _TMC2208_INIT(ST, SPMM) tmc2208_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, SPMM)
void tmc2208_init_to_defaults() {
#if AXIS_DRIVER_TYPE(X, TMC2208)
_TMC2208_INIT(X, planner.axis_steps_per_mm[X_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(X2, TMC2208)
_TMC2208_INIT(X2, planner.axis_steps_per_mm[X_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(Y, TMC2208)
_TMC2208_INIT(Y, planner.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC2208)
_TMC2208_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(Z, TMC2208)
_TMC2208_INIT(Z, planner.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC2208)
_TMC2208_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(E0, TMC2208)
_TMC2208_INIT(E0, planner.axis_steps_per_mm[E_AXIS]);
#endif
#if AXIS_DRIVER_TYPE(E1, TMC2208)
{ constexpr int extruder = 1; _TMC2208_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); }
#endif
#if AXIS_DRIVER_TYPE(E2, TMC2208)
{ constexpr int extruder = 2; _TMC2208_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); }
#endif
#if AXIS_DRIVER_TYPE(E3, TMC2208)
{ constexpr int extruder = 3; _TMC2208_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); }
#endif
#if AXIS_DRIVER_TYPE(E4, TMC2208)
{ constexpr int extruder = 4; _TMC2208_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); }
#endif
}
#endif // TMC2208 #endif // TMC2208
void restore_stepper_drivers() { void restore_stepper_drivers() {
@@ -479,75 +566,20 @@ void reset_stepper_drivers() {
#if HAS_DRIVER(TMC26X) #if HAS_DRIVER(TMC26X)
tmc26x_init_to_defaults(); tmc26x_init_to_defaults();
#endif #endif
#if ENABLED(HAVE_L6470DRIVER) #if HAS_DRIVER(TMC2130)
L6470_init_to_defaults(); delay(100);
tmc2130_init_to_defaults();
#endif #endif
#if HAS_DRIVER(TMC2208)
#if AXIS_IS_TMC(X) delay(100);
_TMC_INIT(X, planner.axis_steps_per_mm[X_AXIS]); tmc2208_init_to_defaults();
#endif #endif
#if AXIS_IS_TMC(X2)
_TMC_INIT(X2, planner.axis_steps_per_mm[X_AXIS]);
#endif
#if AXIS_IS_TMC(Y)
_TMC_INIT(Y, planner.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_IS_TMC(Y2)
_TMC_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_IS_TMC(Z)
_TMC_INIT(Z, planner.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(Z2)
_TMC_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(E0)
_TMC_INIT(E0, planner.axis_steps_per_mm[E_AXIS]);
#endif
#if AXIS_IS_TMC(E1)
{ constexpr uint8_t extruder = 1; _TMC_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
#endif
#if AXIS_IS_TMC(E2)
{ constexpr uint8_t extruder = 2; _TMC_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
#endif
#if AXIS_IS_TMC(E3)
{ constexpr uint8_t extruder = 3; _TMC_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
#endif
#if AXIS_IS_TMC(E4)
{ constexpr uint8_t extruder = 4; _TMC_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N]); UNUSED(extruder); }
#endif
#if ENABLED(SENSORLESS_HOMING)
#if X_SENSORLESS
#if AXIS_HAS_STALLGUARD(X)
stepperX.sgt(X_STALL_SENSITIVITY);
#endif
#if AXIS_HAS_STALLGUARD(X2)
stepperX2.sgt(X_STALL_SENSITIVITY);
#endif
#endif
#if Y_SENSORLESS
#if AXIS_HAS_STALLGUARD(Y)
stepperY.sgt(Y_STALL_SENSITIVITY);
#endif
#if AXIS_HAS_STALLGUARD(Y2)
stepperY2.sgt(Y_STALL_SENSITIVITY);
#endif
#endif
#if Z_SENSORLESS
#if AXIS_HAS_STALLGUARD(Z)
stepperZ.sgt(Z_STALL_SENSITIVITY);
#endif
#if AXIS_HAS_STALLGUARD(Z2)
stepperZ2.sgt(Z_STALL_SENSITIVITY);
#endif
#endif
#endif
#ifdef TMC_ADV #ifdef TMC_ADV
TMC_ADV() TMC_ADV()
#endif #endif
#if HAS_DRIVER(L6470)
L6470_init_to_defaults();
#endif
stepper.set_directions(); stepper.set_directions();
} }

View File

@@ -53,20 +53,15 @@
void tmc26x_init_to_defaults(); void tmc26x_init_to_defaults();
#endif #endif
#if HAS_TRINAMIC #if HAS_DRIVER(TMC2130)
#include <TMCStepper.h> #include <TMC2130Stepper.h>
#include "tmc_util.h" void tmc2130_init_to_defaults();
#if TMCSTEPPER_VERSION < 0x000001
#error "Update TMCStepper library to 0.0.1 or newer."
#endif #endif
#define __TMC_CLASS(MODEL, A, I) TMCMarlin<TMC##MODEL##Stepper, A, I>
#define _TMC_CLASS(MODEL, L) __TMC_CLASS(MODEL, L)
#define TMC_CLASS(ST) _TMC_CLASS(ST##_DRIVER_TYPE, TMC_##ST##_LABEL)
#if HAS_DRIVER(TMC2208) #if HAS_DRIVER(TMC2208)
#include <TMC2208Stepper.h>
void tmc2208_serial_begin(); void tmc2208_serial_begin();
#endif void tmc2208_init_to_defaults();
#endif #endif
// L6470 has STEP on normal pins, but DIR/ENABLE via SPI // L6470 has STEP on normal pins, but DIR/ENABLE via SPI
@@ -89,15 +84,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define X_DIR_WRITE(STATE) stepperX.Step_Clock(STATE) #define X_DIR_WRITE(STATE) stepperX.Step_Clock(STATE)
#define X_DIR_READ (stepperX.getStatus() & STATUS_DIR) #define X_DIR_READ (stepperX.getStatus() & STATUS_DIR)
#else #else
#if AXIS_IS_TMC(X)
extern TMC_CLASS(X) stepperX;
#endif
#if AXIS_DRIVER_TYPE(X, TMC26X) #if AXIS_DRIVER_TYPE(X, TMC26X)
extern TMC26XStepper stepperX; extern TMC26XStepper stepperX;
#define X_ENABLE_INIT NOOP #define X_ENABLE_INIT NOOP
#define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE) #define X_ENABLE_WRITE(STATE) stepperX.setEnabled(STATE)
#define X_ENABLE_READ stepperX.isEnabled() #define X_ENABLE_READ stepperX.isEnabled()
#else #else
#if AXIS_DRIVER_TYPE(X, TMC2130)
extern TMC2130Stepper stepperX;
#elif AXIS_DRIVER_TYPE(X, TMC2208)
extern TMC2208Stepper stepperX;
#endif
#define X_ENABLE_INIT SET_OUTPUT(X_ENABLE_PIN) #define X_ENABLE_INIT SET_OUTPUT(X_ENABLE_PIN)
#define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE) #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE)
#define X_ENABLE_READ READ(X_ENABLE_PIN) #define X_ENABLE_READ READ(X_ENABLE_PIN)
@@ -120,15 +117,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define Y_DIR_WRITE(STATE) stepperY.Step_Clock(STATE) #define Y_DIR_WRITE(STATE) stepperY.Step_Clock(STATE)
#define Y_DIR_READ (stepperY.getStatus() & STATUS_DIR) #define Y_DIR_READ (stepperY.getStatus() & STATUS_DIR)
#else #else
#if AXIS_IS_TMC(Y)
extern TMC_CLASS(Y) stepperY;
#endif
#if AXIS_DRIVER_TYPE(Y, TMC26X) #if AXIS_DRIVER_TYPE(Y, TMC26X)
extern TMC26XStepper stepperY; extern TMC26XStepper stepperY;
#define Y_ENABLE_INIT NOOP #define Y_ENABLE_INIT NOOP
#define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE) #define Y_ENABLE_WRITE(STATE) stepperY.setEnabled(STATE)
#define Y_ENABLE_READ stepperY.isEnabled() #define Y_ENABLE_READ stepperY.isEnabled()
#else #else
#if AXIS_DRIVER_TYPE(Y, TMC2130)
extern TMC2130Stepper stepperY;
#elif AXIS_DRIVER_TYPE(Y, TMC2208)
extern TMC2208Stepper stepperY;
#endif
#define Y_ENABLE_INIT SET_OUTPUT(Y_ENABLE_PIN) #define Y_ENABLE_INIT SET_OUTPUT(Y_ENABLE_PIN)
#define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE) #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE)
#define Y_ENABLE_READ READ(Y_ENABLE_PIN) #define Y_ENABLE_READ READ(Y_ENABLE_PIN)
@@ -151,15 +150,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define Z_DIR_WRITE(STATE) stepperZ.Step_Clock(STATE) #define Z_DIR_WRITE(STATE) stepperZ.Step_Clock(STATE)
#define Z_DIR_READ (stepperZ.getStatus() & STATUS_DIR) #define Z_DIR_READ (stepperZ.getStatus() & STATUS_DIR)
#else #else
#if AXIS_IS_TMC(Z)
extern TMC_CLASS(Z) stepperZ;
#endif
#if AXIS_DRIVER_TYPE(Z, TMC26X) #if AXIS_DRIVER_TYPE(Z, TMC26X)
extern TMC26XStepper stepperZ; extern TMC26XStepper stepperZ;
#define Z_ENABLE_INIT NOOP #define Z_ENABLE_INIT NOOP
#define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE) #define Z_ENABLE_WRITE(STATE) stepperZ.setEnabled(STATE)
#define Z_ENABLE_READ stepperZ.isEnabled() #define Z_ENABLE_READ stepperZ.isEnabled()
#else #else
#if AXIS_DRIVER_TYPE(Z, TMC2130)
extern TMC2130Stepper stepperZ;
#elif AXIS_DRIVER_TYPE(Z, TMC2208)
extern TMC2208Stepper stepperZ;
#endif
#define Z_ENABLE_INIT SET_OUTPUT(Z_ENABLE_PIN) #define Z_ENABLE_INIT SET_OUTPUT(Z_ENABLE_PIN)
#define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE) #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE)
#define Z_ENABLE_READ READ(Z_ENABLE_PIN) #define Z_ENABLE_READ READ(Z_ENABLE_PIN)
@@ -183,15 +184,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define X2_DIR_WRITE(STATE) stepperX2.Step_Clock(STATE) #define X2_DIR_WRITE(STATE) stepperX2.Step_Clock(STATE)
#define X2_DIR_READ (stepperX2.getStatus() & STATUS_DIR) #define X2_DIR_READ (stepperX2.getStatus() & STATUS_DIR)
#else #else
#if AXIS_IS_TMC(X2)
extern TMC_CLASS(X2) stepperX2;
#endif
#if AXIS_DRIVER_TYPE(X2, TMC26X) #if AXIS_DRIVER_TYPE(X2, TMC26X)
extern TMC26XStepper stepperX2; extern TMC26XStepper stepperX2;
#define X2_ENABLE_INIT NOOP #define X2_ENABLE_INIT NOOP
#define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE) #define X2_ENABLE_WRITE(STATE) stepperX2.setEnabled(STATE)
#define X2_ENABLE_READ stepperX2.isEnabled() #define X2_ENABLE_READ stepperX2.isEnabled()
#else #else
#if AXIS_DRIVER_TYPE(X2, TMC2130)
extern TMC2130Stepper stepperX2;
#elif AXIS_DRIVER_TYPE(X2, TMC2208)
extern TMC2208Stepper stepperX2;
#endif
#define X2_ENABLE_INIT SET_OUTPUT(X2_ENABLE_PIN) #define X2_ENABLE_INIT SET_OUTPUT(X2_ENABLE_PIN)
#define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE) #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE)
#define X2_ENABLE_READ READ(X2_ENABLE_PIN) #define X2_ENABLE_READ READ(X2_ENABLE_PIN)
@@ -216,15 +219,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define Y2_DIR_WRITE(STATE) stepperY2.Step_Clock(STATE) #define Y2_DIR_WRITE(STATE) stepperY2.Step_Clock(STATE)
#define Y2_DIR_READ (stepperY2.getStatus() & STATUS_DIR) #define Y2_DIR_READ (stepperY2.getStatus() & STATUS_DIR)
#else #else
#if AXIS_IS_TMC(Y2)
extern TMC_CLASS(Y2) stepperY2;
#endif
#if AXIS_DRIVER_TYPE(Y2, TMC26X) #if AXIS_DRIVER_TYPE(Y2, TMC26X)
extern TMC26XStepper stepperY2; extern TMC26XStepper stepperY2;
#define Y2_ENABLE_INIT NOOP #define Y2_ENABLE_INIT NOOP
#define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE) #define Y2_ENABLE_WRITE(STATE) stepperY2.setEnabled(STATE)
#define Y2_ENABLE_READ stepperY2.isEnabled() #define Y2_ENABLE_READ stepperY2.isEnabled()
#else #else
#if AXIS_DRIVER_TYPE(Y2, TMC2130)
extern TMC2130Stepper stepperY2;
#elif AXIS_DRIVER_TYPE(Y2, TMC2208)
extern TMC2208Stepper stepperY2;
#endif
#define Y2_ENABLE_INIT SET_OUTPUT(Y2_ENABLE_PIN) #define Y2_ENABLE_INIT SET_OUTPUT(Y2_ENABLE_PIN)
#define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE) #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE)
#define Y2_ENABLE_READ READ(Y2_ENABLE_PIN) #define Y2_ENABLE_READ READ(Y2_ENABLE_PIN)
@@ -249,15 +254,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define Z2_DIR_WRITE(STATE) stepperZ2.Step_Clock(STATE) #define Z2_DIR_WRITE(STATE) stepperZ2.Step_Clock(STATE)
#define Z2_DIR_READ (stepperZ2.getStatus() & STATUS_DIR) #define Z2_DIR_READ (stepperZ2.getStatus() & STATUS_DIR)
#else #else
#if AXIS_IS_TMC(Z2)
extern TMC_CLASS(Z2) stepperZ2;
#endif
#if AXIS_DRIVER_TYPE(Z2, TMC26X) #if AXIS_DRIVER_TYPE(Z2, TMC26X)
extern TMC26XStepper stepperZ2; extern TMC26XStepper stepperZ2;
#define Z2_ENABLE_INIT NOOP #define Z2_ENABLE_INIT NOOP
#define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE) #define Z2_ENABLE_WRITE(STATE) stepperZ2.setEnabled(STATE)
#define Z2_ENABLE_READ stepperZ2.isEnabled() #define Z2_ENABLE_READ stepperZ2.isEnabled()
#else #else
#if AXIS_DRIVER_TYPE(Z2, TMC2130)
extern TMC2130Stepper stepperZ2;
#elif AXIS_DRIVER_TYPE(Z2, TMC2208)
extern TMC2208Stepper stepperZ2;
#endif
#define Z2_ENABLE_INIT SET_OUTPUT(Z2_ENABLE_PIN) #define Z2_ENABLE_INIT SET_OUTPUT(Z2_ENABLE_PIN)
#define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE) #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE)
#define Z2_ENABLE_READ READ(Z2_ENABLE_PIN) #define Z2_ENABLE_READ READ(Z2_ENABLE_PIN)
@@ -281,15 +288,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E0_DIR_WRITE(STATE) stepperE0.Step_Clock(STATE) #define E0_DIR_WRITE(STATE) stepperE0.Step_Clock(STATE)
#define E0_DIR_READ (stepperE0.getStatus() & STATUS_DIR) #define E0_DIR_READ (stepperE0.getStatus() & STATUS_DIR)
#else #else
#if AXIS_IS_TMC(E0)
extern TMC_CLASS(E0) stepperE0;
#endif
#if AXIS_DRIVER_TYPE(E0, TMC26X) #if AXIS_DRIVER_TYPE(E0, TMC26X)
extern TMC26XStepper stepperE0; extern TMC26XStepper stepperE0;
#define E0_ENABLE_INIT NOOP #define E0_ENABLE_INIT NOOP
#define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE) #define E0_ENABLE_WRITE(STATE) stepperE0.setEnabled(STATE)
#define E0_ENABLE_READ stepperE0.isEnabled() #define E0_ENABLE_READ stepperE0.isEnabled()
#else #else
#if AXIS_DRIVER_TYPE(E0, TMC2130)
extern TMC2130Stepper stepperE0;
#elif AXIS_DRIVER_TYPE(E0, TMC2208)
extern TMC2208Stepper stepperE0;
#endif
#define E0_ENABLE_INIT SET_OUTPUT(E0_ENABLE_PIN) #define E0_ENABLE_INIT SET_OUTPUT(E0_ENABLE_PIN)
#define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE)
#define E0_ENABLE_READ READ(E0_ENABLE_PIN) #define E0_ENABLE_READ READ(E0_ENABLE_PIN)
@@ -312,15 +321,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E1_DIR_WRITE(STATE) stepperE1.Step_Clock(STATE) #define E1_DIR_WRITE(STATE) stepperE1.Step_Clock(STATE)
#define E1_DIR_READ (stepperE1.getStatus() & STATUS_DIR) #define E1_DIR_READ (stepperE1.getStatus() & STATUS_DIR)
#else #else
#if AXIS_IS_TMC(E1)
extern TMC_CLASS(E1) stepperE1;
#endif
#if AXIS_DRIVER_TYPE(E1, TMC26X) #if AXIS_DRIVER_TYPE(E1, TMC26X)
extern TMC26XStepper stepperE1; extern TMC26XStepper stepperE1;
#define E1_ENABLE_INIT NOOP #define E1_ENABLE_INIT NOOP
#define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE) #define E1_ENABLE_WRITE(STATE) stepperE1.setEnabled(STATE)
#define E1_ENABLE_READ stepperE1.isEnabled() #define E1_ENABLE_READ stepperE1.isEnabled()
#else #else
#if AXIS_DRIVER_TYPE(E1, TMC2130)
extern TMC2130Stepper stepperE1;
#elif AXIS_DRIVER_TYPE(E1, TMC2208)
extern TMC2208Stepper stepperE1;
#endif
#define E1_ENABLE_INIT SET_OUTPUT(E1_ENABLE_PIN) #define E1_ENABLE_INIT SET_OUTPUT(E1_ENABLE_PIN)
#define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE)
#define E1_ENABLE_READ READ(E1_ENABLE_PIN) #define E1_ENABLE_READ READ(E1_ENABLE_PIN)
@@ -343,15 +354,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E2_DIR_WRITE(STATE) stepperE2.Step_Clock(STATE) #define E2_DIR_WRITE(STATE) stepperE2.Step_Clock(STATE)
#define E2_DIR_READ (stepperE2.getStatus() & STATUS_DIR) #define E2_DIR_READ (stepperE2.getStatus() & STATUS_DIR)
#else #else
#if AXIS_IS_TMC(E2)
extern TMC_CLASS(E2) stepperE2;
#endif
#if AXIS_DRIVER_TYPE(E2, TMC26X) #if AXIS_DRIVER_TYPE(E2, TMC26X)
extern TMC26XStepper stepperE2; extern TMC26XStepper stepperE2;
#define E2_ENABLE_INIT NOOP #define E2_ENABLE_INIT NOOP
#define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE) #define E2_ENABLE_WRITE(STATE) stepperE2.setEnabled(STATE)
#define E2_ENABLE_READ stepperE2.isEnabled() #define E2_ENABLE_READ stepperE2.isEnabled()
#else #else
#if AXIS_DRIVER_TYPE(E2, TMC2130)
extern TMC2130Stepper stepperE2;
#elif AXIS_DRIVER_TYPE(E2, TMC2208)
extern TMC2208Stepper stepperE2;
#endif
#define E2_ENABLE_INIT SET_OUTPUT(E2_ENABLE_PIN) #define E2_ENABLE_INIT SET_OUTPUT(E2_ENABLE_PIN)
#define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE)
#define E2_ENABLE_READ READ(E2_ENABLE_PIN) #define E2_ENABLE_READ READ(E2_ENABLE_PIN)
@@ -374,15 +387,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E3_DIR_WRITE(STATE) stepperE3.Step_Clock(STATE) #define E3_DIR_WRITE(STATE) stepperE3.Step_Clock(STATE)
#define E3_DIR_READ (stepperE3.getStatus() & STATUS_DIR) #define E3_DIR_READ (stepperE3.getStatus() & STATUS_DIR)
#else #else
#if AXIS_IS_TMC(E3)
extern TMC_CLASS(E3) stepperE3;
#endif
#if AXIS_DRIVER_TYPE(E3, TMC26X) #if AXIS_DRIVER_TYPE(E3, TMC26X)
extern TMC26XStepper stepperE3; extern TMC26XStepper stepperE3;
#define E3_ENABLE_INIT NOOP #define E3_ENABLE_INIT NOOP
#define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE) #define E3_ENABLE_WRITE(STATE) stepperE3.setEnabled(STATE)
#define E3_ENABLE_READ stepperE3.isEnabled() #define E3_ENABLE_READ stepperE3.isEnabled()
#else #else
#if AXIS_DRIVER_TYPE(E3, TMC2130)
extern TMC2130Stepper stepperE3;
#elif AXIS_DRIVER_TYPE(E3, TMC2208)
extern TMC2208Stepper stepperE3;
#endif
#define E3_ENABLE_INIT SET_OUTPUT(E3_ENABLE_PIN) #define E3_ENABLE_INIT SET_OUTPUT(E3_ENABLE_PIN)
#define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE)
#define E3_ENABLE_READ READ(E3_ENABLE_PIN) #define E3_ENABLE_READ READ(E3_ENABLE_PIN)
@@ -405,15 +420,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define E4_DIR_WRITE(STATE) stepperE4.Step_Clock(STATE) #define E4_DIR_WRITE(STATE) stepperE4.Step_Clock(STATE)
#define E4_DIR_READ (stepperE4.getStatus() & STATUS_DIR) #define E4_DIR_READ (stepperE4.getStatus() & STATUS_DIR)
#else #else
#if AXIS_IS_TMC(E4)
extern TMC_CLASS(E4) stepperE4;
#endif
#if AXIS_DRIVER_TYPE(E4, TMC26X) #if AXIS_DRIVER_TYPE(E4, TMC26X)
extern TMC26XStepper stepperE4; extern TMC26XStepper stepperE4;
#define E4_ENABLE_INIT NOOP #define E4_ENABLE_INIT NOOP
#define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE) #define E4_ENABLE_WRITE(STATE) stepperE4.setEnabled(STATE)
#define E4_ENABLE_READ stepperE4.isEnabled() #define E4_ENABLE_READ stepperE4.isEnabled()
#else #else
#if AXIS_DRIVER_TYPE(E4, TMC2130)
extern TMC2130Stepper stepperE4;
#elif AXIS_DRIVER_TYPE(E4, TMC2208)
extern TMC2208Stepper stepperE4;
#endif
#define E4_ENABLE_INIT SET_OUTPUT(E4_ENABLE_PIN) #define E4_ENABLE_INIT SET_OUTPUT(E4_ENABLE_PIN)
#define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE)
#define E4_ENABLE_READ READ(E4_ENABLE_PIN) #define E4_ENABLE_READ READ(E4_ENABLE_PIN)

View File

@@ -33,7 +33,6 @@
#include "printcounter.h" #include "printcounter.h"
#include "delay.h" #include "delay.h"
#include "endstops.h" #include "endstops.h"
#include "buzzer.h"
#if ENABLED(HEATER_0_USES_MAX6675) #if ENABLED(HEATER_0_USES_MAX6675)
#include "MarlinSPI.h" #include "MarlinSPI.h"
@@ -248,7 +247,7 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
* Alternately heat and cool the nozzle, observing its behavior to * Alternately heat and cool the nozzle, observing its behavior to
* determine the best PID values to achieve a stable temperature. * determine the best PID values to achieve a stable temperature.
*/ */
void Temperature::pid_autotune(const float &target, const int8_t hotend, const int8_t ncycles, const bool set_result/*=false*/) { void Temperature::PID_autotune(const float &target, const int8_t hotend, const int8_t ncycles, const bool set_result/*=false*/) {
float current = 0.0; float current = 0.0;
int cycles = 0; int cycles = 0;
bool heating = true; bool heating = true;
@@ -309,7 +308,7 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
return; return;
} }
if (target > GHV(BED_MAXTEMP, maxttemp[hotend]) - 15) { if (target > GHV(BED_MAXTEMP, maxttemp[hotend]) - 10) {
SERIAL_ECHOLNPGM(MSG_PID_TEMP_TOO_HIGH); SERIAL_ECHOLNPGM(MSG_PID_TEMP_TOO_HIGH);
return; return;
} }
@@ -328,7 +327,7 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
const millis_t ms = millis(); const millis_t ms = millis();
if (temp_meas_ready) { // temp sample ready if (temp_meas_ready) { // temp sample ready
calculate_celsius_temperatures(); updateTemperaturesFromRawValues();
// Get the current temperature and constrain it // Get the current temperature and constrain it
current = GHV(current_temperature_bed, current_temperature[hotend]); current = GHV(current_temperature_bed, current_temperature[hotend]);
@@ -337,7 +336,7 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
#if HAS_AUTO_FAN #if HAS_AUTO_FAN
if (ELAPSED(ms, next_auto_fan_check_ms)) { if (ELAPSED(ms, next_auto_fan_check_ms)) {
check_extruder_auto_fans(); checkExtruderAutoFans();
next_auto_fan_check_ms = ms + 2500UL; next_auto_fan_check_ms = ms + 2500UL;
} }
#endif #endif
@@ -457,8 +456,6 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
} }
if (cycles > ncycles) { if (cycles > ncycles) {
buzzer.tone(105, 1108);
buzzer.tone(210, 1661);
SERIAL_PROTOCOLLNPGM(MSG_PID_AUTOTUNE_FINISHED); SERIAL_PROTOCOLLNPGM(MSG_PID_AUTOTUNE_FINISHED);
#if HAS_PID_FOR_BOTH #if HAS_PID_FOR_BOTH
@@ -486,7 +483,7 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
PID_PARAM(Kp, hotend) = workKp; \ PID_PARAM(Kp, hotend) = workKp; \
PID_PARAM(Ki, hotend) = scalePID_i(workKi); \ PID_PARAM(Ki, hotend) = scalePID_i(workKi); \
PID_PARAM(Kd, hotend) = scalePID_d(workKd); \ PID_PARAM(Kd, hotend) = scalePID_d(workKd); \
update_pid(); }while(0) updatePID(); }while(0)
// Use the result? (As with "M303 U1") // Use the result? (As with "M303 U1")
if (set_result) { if (set_result) {
@@ -527,7 +524,7 @@ int Temperature::getHeaterPower(const int heater) {
#if HAS_AUTO_FAN #if HAS_AUTO_FAN
void Temperature::check_extruder_auto_fans() { void Temperature::checkExtruderAutoFans() {
static const pin_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN, CHAMBER_AUTO_FAN_PIN }; static const pin_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN, CHAMBER_AUTO_FAN_PIN };
static const uint8_t fanBit[] PROGMEM = { static const uint8_t fanBit[] PROGMEM = {
0, 0,
@@ -616,9 +613,18 @@ float Temperature::get_pid_output(const int8_t e) {
pid_error[HOTEND_INDEX] = target_temperature[HOTEND_INDEX] - current_temperature[HOTEND_INDEX]; pid_error[HOTEND_INDEX] = target_temperature[HOTEND_INDEX] - current_temperature[HOTEND_INDEX];
dTerm[HOTEND_INDEX] = PID_K2 * PID_PARAM(Kd, HOTEND_INDEX) * (current_temperature[HOTEND_INDEX] - temp_dState[HOTEND_INDEX]) + float(PID_K1) * dTerm[HOTEND_INDEX]; dTerm[HOTEND_INDEX] = PID_K2 * PID_PARAM(Kd, HOTEND_INDEX) * (current_temperature[HOTEND_INDEX] - temp_dState[HOTEND_INDEX]) + float(PID_K1) * dTerm[HOTEND_INDEX];
temp_dState[HOTEND_INDEX] = current_temperature[HOTEND_INDEX]; temp_dState[HOTEND_INDEX] = current_temperature[HOTEND_INDEX];
#if HEATER_IDLE_HANDLER
if (target_temperature[HOTEND_INDEX] == 0 if (heater_idle_timeout_exceeded[HOTEND_INDEX]) {
|| pid_error[HOTEND_INDEX] < -(PID_FUNCTIONAL_RANGE) pid_output = 0;
pid_reset[HOTEND_INDEX] = true;
}
else
#endif
if (pid_error[HOTEND_INDEX] > PID_FUNCTIONAL_RANGE) {
pid_output = BANG_MAX;
pid_reset[HOTEND_INDEX] = true;
}
else if (pid_error[HOTEND_INDEX] < -(PID_FUNCTIONAL_RANGE) || target_temperature[HOTEND_INDEX] == 0
#if HEATER_IDLE_HANDLER #if HEATER_IDLE_HANDLER
|| heater_idle_timeout_exceeded[HOTEND_INDEX] || heater_idle_timeout_exceeded[HOTEND_INDEX]
#endif #endif
@@ -626,10 +632,6 @@ float Temperature::get_pid_output(const int8_t e) {
pid_output = 0; pid_output = 0;
pid_reset[HOTEND_INDEX] = true; pid_reset[HOTEND_INDEX] = true;
} }
else if (pid_error[HOTEND_INDEX] > PID_FUNCTIONAL_RANGE) {
pid_output = BANG_MAX;
pid_reset[HOTEND_INDEX] = true;
}
else { else {
if (pid_reset[HOTEND_INDEX]) { if (pid_reset[HOTEND_INDEX]) {
temp_iState[HOTEND_INDEX] = 0.0; temp_iState[HOTEND_INDEX] = 0.0;
@@ -762,7 +764,7 @@ void Temperature::manage_heater() {
if (!temp_meas_ready) return; if (!temp_meas_ready) return;
calculate_celsius_temperatures(); // also resets the watchdog updateTemperaturesFromRawValues(); // also resets the watchdog
#if ENABLED(HEATER_0_USES_MAX6675) #if ENABLED(HEATER_0_USES_MAX6675)
if (current_temperature[0] > MIN(HEATER_0_MAXTEMP, MAX6675_TMAX - 1.0)) max_temp_error(0); if (current_temperature[0] > MIN(HEATER_0_MAXTEMP, MAX6675_TMAX - 1.0)) max_temp_error(0);
@@ -807,7 +809,7 @@ void Temperature::manage_heater() {
#if HAS_AUTO_FAN #if HAS_AUTO_FAN
if (ELAPSED(ms, next_auto_fan_check_ms)) { // only need to check fan state very infrequently if (ELAPSED(ms, next_auto_fan_check_ms)) { // only need to check fan state very infrequently
check_extruder_auto_fans(); checkExtruderAutoFans();
next_auto_fan_check_ms = ms + 2500UL; next_auto_fan_check_ms = ms + 2500UL;
} }
#endif #endif
@@ -917,7 +919,7 @@ void Temperature::manage_heater() {
// Derived from RepRap FiveD extruder::getTemperature() // Derived from RepRap FiveD extruder::getTemperature()
// For hot end temperature measurement. // For hot end temperature measurement.
float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { float Temperature::analog2temp(const int raw, const uint8_t e) {
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
if (e > HOTENDS) if (e > HOTENDS)
#else #else
@@ -989,7 +991,7 @@ float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) {
#if HAS_HEATED_BED #if HAS_HEATED_BED
// Derived from RepRap FiveD extruder::getTemperature() // Derived from RepRap FiveD extruder::getTemperature()
// For bed temperature measurement. // For bed temperature measurement.
float Temperature::analog_to_celsius_bed(const int raw) { float Temperature::analog2tempBed(const int raw) {
#if ENABLED(HEATER_BED_USES_THERMISTOR) #if ENABLED(HEATER_BED_USES_THERMISTOR)
SCAN_THERMISTOR_TABLE(BEDTEMPTABLE, BEDTEMPTABLE_LEN); SCAN_THERMISTOR_TABLE(BEDTEMPTABLE, BEDTEMPTABLE_LEN);
#elif ENABLED(HEATER_BED_USES_AD595) #elif ENABLED(HEATER_BED_USES_AD595)
@@ -1005,7 +1007,7 @@ float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) {
#if HAS_TEMP_CHAMBER #if HAS_TEMP_CHAMBER
// Derived from RepRap FiveD extruder::getTemperature() // Derived from RepRap FiveD extruder::getTemperature()
// For chamber temperature measurement. // For chamber temperature measurement.
float Temperature::analog_to_celsius_chamber(const int raw) { float Temperature::analog2tempChamber(const int raw) {
#if ENABLED(HEATER_CHAMBER_USES_THERMISTOR) #if ENABLED(HEATER_CHAMBER_USES_THERMISTOR)
SCAN_THERMISTOR_TABLE(CHAMBERTEMPTABLE, CHAMBERTEMPTABLE_LEN); SCAN_THERMISTOR_TABLE(CHAMBERTEMPTABLE, CHAMBERTEMPTABLE_LEN);
#elif ENABLED(HEATER_CHAMBER_USES_AD595) #elif ENABLED(HEATER_CHAMBER_USES_AD595)
@@ -1024,22 +1026,22 @@ float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) {
* and this function is called from normal context * and this function is called from normal context
* as it would block the stepper routine. * as it would block the stepper routine.
*/ */
void Temperature::calculate_celsius_temperatures() { void Temperature::updateTemperaturesFromRawValues() {
#if ENABLED(HEATER_0_USES_MAX6675) #if ENABLED(HEATER_0_USES_MAX6675)
current_temperature_raw[0] = read_max6675(); current_temperature_raw[0] = read_max6675();
#endif #endif
HOTEND_LOOP() current_temperature[e] = analog_to_celsius_hotend(current_temperature_raw[e], e); HOTEND_LOOP() current_temperature[e] = Temperature::analog2temp(current_temperature_raw[e], e);
#if HAS_HEATED_BED #if HAS_HEATED_BED
current_temperature_bed = analog_to_celsius_bed(current_temperature_bed_raw); current_temperature_bed = Temperature::analog2tempBed(current_temperature_bed_raw);
#endif #endif
#if HAS_TEMP_CHAMBER #if HAS_TEMP_CHAMBER
current_temperature_chamber = analog_to_celsius_chamber(current_temperature_chamber_raw); current_temperature_chamber = Temperature::analog2tempChamber(current_temperature_chamber_raw);
#endif #endif
#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
redundant_temperature = analog_to_celsius_hotend(redundant_temperature_raw, 1); redundant_temperature = Temperature::analog2temp(redundant_temperature_raw, 1);
#endif #endif
#if ENABLED(FILAMENT_WIDTH_SENSOR) #if ENABLED(FILAMENT_WIDTH_SENSOR)
filament_width_meas = analog_to_mm_fil_width(); filament_width_meas = analog2widthFil();
#endif #endif
#if ENABLED(USE_WATCHDOG) #if ENABLED(USE_WATCHDOG)
@@ -1054,7 +1056,7 @@ void Temperature::calculate_celsius_temperatures() {
#if ENABLED(FILAMENT_WIDTH_SENSOR) #if ENABLED(FILAMENT_WIDTH_SENSOR)
// Convert raw Filament Width to millimeters // Convert raw Filament Width to millimeters
float Temperature::analog_to_mm_fil_width() { float Temperature::analog2widthFil() {
return current_raw_filwidth * 5.0f * (1.0f / 16383.0); return current_raw_filwidth * 5.0f * (1.0f / 16383.0);
} }
@@ -1254,7 +1256,7 @@ void Temperature::init() {
#define TEMP_MIN_ROUTINE(NR) \ #define TEMP_MIN_ROUTINE(NR) \
minttemp[NR] = HEATER_ ##NR## _MINTEMP; \ minttemp[NR] = HEATER_ ##NR## _MINTEMP; \
while (analog_to_celsius_hotend(minttemp_raw[NR], NR) < HEATER_ ##NR## _MINTEMP) { \ while (analog2temp(minttemp_raw[NR], NR) < HEATER_ ##NR## _MINTEMP) { \
if (HEATER_ ##NR## _RAW_LO_TEMP < HEATER_ ##NR## _RAW_HI_TEMP) \ if (HEATER_ ##NR## _RAW_LO_TEMP < HEATER_ ##NR## _RAW_HI_TEMP) \
minttemp_raw[NR] += OVERSAMPLENR; \ minttemp_raw[NR] += OVERSAMPLENR; \
else \ else \
@@ -1262,7 +1264,7 @@ void Temperature::init() {
} }
#define TEMP_MAX_ROUTINE(NR) \ #define TEMP_MAX_ROUTINE(NR) \
maxttemp[NR] = HEATER_ ##NR## _MAXTEMP; \ maxttemp[NR] = HEATER_ ##NR## _MAXTEMP; \
while (analog_to_celsius_hotend(maxttemp_raw[NR], NR) > HEATER_ ##NR## _MAXTEMP) { \ while (analog2temp(maxttemp_raw[NR], NR) > HEATER_ ##NR## _MAXTEMP) { \
if (HEATER_ ##NR## _RAW_LO_TEMP < HEATER_ ##NR## _RAW_HI_TEMP) \ if (HEATER_ ##NR## _RAW_LO_TEMP < HEATER_ ##NR## _RAW_HI_TEMP) \
maxttemp_raw[NR] -= OVERSAMPLENR; \ maxttemp_raw[NR] -= OVERSAMPLENR; \
else \ else \
@@ -1310,7 +1312,7 @@ void Temperature::init() {
#if HAS_HEATED_BED #if HAS_HEATED_BED
#ifdef BED_MINTEMP #ifdef BED_MINTEMP
while (analog_to_celsius_bed(bed_minttemp_raw) < BED_MINTEMP) { while (analog2tempBed(bed_minttemp_raw) < BED_MINTEMP) {
#if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP #if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP
bed_minttemp_raw += OVERSAMPLENR; bed_minttemp_raw += OVERSAMPLENR;
#else #else
@@ -1319,7 +1321,7 @@ void Temperature::init() {
} }
#endif // BED_MINTEMP #endif // BED_MINTEMP
#ifdef BED_MAXTEMP #ifdef BED_MAXTEMP
while (analog_to_celsius_bed(bed_maxttemp_raw) > BED_MAXTEMP) { while (analog2tempBed(bed_maxttemp_raw) > BED_MAXTEMP) {
#if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP #if HEATER_BED_RAW_LO_TEMP < HEATER_BED_RAW_HI_TEMP
bed_maxttemp_raw -= OVERSAMPLENR; bed_maxttemp_raw -= OVERSAMPLENR;
#else #else

View File

@@ -318,13 +318,13 @@ class Temperature {
/** /**
* Static (class) methods * Static (class) methods
*/ */
static float analog_to_celsius_hotend(const int raw, const uint8_t e); static float analog2temp(const int raw, const uint8_t e);
#if HAS_HEATED_BED #if HAS_HEATED_BED
static float analog_to_celsius_bed(const int raw); static float analog2tempBed(const int raw);
#endif #endif
#if HAS_TEMP_CHAMBER #if HAS_TEMP_CHAMBER
static float analog_to_celsius_chamber(const int raw); static float analog2tempChamber(const int raw);
#endif #endif
/** /**
@@ -365,7 +365,7 @@ class Temperature {
#endif #endif
#if ENABLED(FILAMENT_WIDTH_SENSOR) #if ENABLED(FILAMENT_WIDTH_SENSOR)
static float analog_to_mm_fil_width(); // Convert raw Filament Width to millimeters static float analog2widthFil(); // Convert raw Filament Width to millimeters
static int8_t widthFil_to_size_ratio(); // Convert Filament Width (mm) to an extrusion ratio static int8_t widthFil_to_size_ratio(); // Convert Filament Width (mm) to an extrusion ratio
#endif #endif
@@ -414,7 +414,7 @@ class Temperature {
#if ENABLED(AUTO_POWER_CONTROL) #if ENABLED(AUTO_POWER_CONTROL)
powerManager.power_on(); powerManager.power_on();
#endif #endif
target_temperature[HOTEND_INDEX] = MIN(celsius, maxttemp[HOTEND_INDEX] - 15); target_temperature[HOTEND_INDEX] = MIN(celsius, maxttemp[HOTEND_INDEX] - 10);
#if WATCH_HOTENDS #if WATCH_HOTENDS
start_watching_heater(HOTEND_INDEX); start_watching_heater(HOTEND_INDEX);
#endif #endif
@@ -449,7 +449,7 @@ class Temperature {
#endif #endif
target_temperature_bed = target_temperature_bed =
#ifdef BED_MAXTEMP #ifdef BED_MAXTEMP
MIN(celsius, BED_MAXTEMP - 15) MIN(celsius, BED_MAXTEMP - 10)
#else #else
celsius celsius
#endif #endif
@@ -489,13 +489,13 @@ class Temperature {
* Perform auto-tuning for hotend or bed in response to M303 * Perform auto-tuning for hotend or bed in response to M303
*/ */
#if HAS_PID_HEATING #if HAS_PID_HEATING
static void pid_autotune(const float &target, const int8_t hotend, const int8_t ncycles, const bool set_result=false); static void PID_autotune(const float &target, const int8_t hotend, const int8_t ncycles, const bool set_result=false);
/** /**
* Update the temp manager when PID values change * Update the temp manager when PID values change
*/ */
#if ENABLED(PIDTEMP) #if ENABLED(PIDTEMP)
FORCE_INLINE static void update_pid() { FORCE_INLINE static void updatePID() {
#if ENABLED(PID_EXTRUSION_SCALING) #if ENABLED(PID_EXTRUSION_SCALING)
last_e_position = 0; last_e_position = 0;
#endif #endif
@@ -612,13 +612,13 @@ class Temperature {
static void set_current_temp_raw(); static void set_current_temp_raw();
static void calculate_celsius_temperatures(); static void updateTemperaturesFromRawValues();
#if ENABLED(HEATER_0_USES_MAX6675) #if ENABLED(HEATER_0_USES_MAX6675)
static int read_max6675(); static int read_max6675();
#endif #endif
static void check_extruder_auto_fans(); static void checkExtruderAutoFans();
static float get_pid_output(const int8_t e); static float get_pid_output(const int8_t e);

View File

@@ -34,6 +34,8 @@
#include "planner.h" #include "planner.h"
#endif #endif
bool report_tmc_status = false;
/** /**
* Check for over temperature or short to ground error flags. * Check for over temperature or short to ground error flags.
* Report and log warning of overtemperature condition. * Report and log warning of overtemperature condition.
@@ -42,8 +44,6 @@
* and so we don't repeatedly report warning before the condition is cleared. * and so we don't repeatedly report warning before the condition is cleared.
*/ */
#if ENABLED(MONITOR_DRIVER_STATUS) #if ENABLED(MONITOR_DRIVER_STATUS)
static bool report_tmc_status = false;
struct TMC_driver_data { struct TMC_driver_data {
uint32_t drv_status; uint32_t drv_status;
bool is_otpw; bool is_otpw;
@@ -93,13 +93,13 @@
#endif #endif
template<typename TMC> template<typename TMC>
void monitor_tmc_driver(TMC &st) { void monitor_tmc_driver(TMC &st, const TMC_AxisEnum axis, uint8_t &otpw_cnt) {
TMC_driver_data data = get_driver_data(st); TMC_driver_data data = get_driver_data(st);
#if ENABLED(STOP_ON_ERROR) #if ENABLED(STOP_ON_ERROR)
if (data.is_error) { if (data.is_error) {
SERIAL_EOL(); SERIAL_EOL();
st.printLabel(); _tmc_say_axis(axis);
SERIAL_ECHOLNPGM(" driver error detected:"); SERIAL_ECHOLNPGM(" driver error detected:");
if (data.is_ot) SERIAL_ECHOLNPGM("overtemperature"); if (data.is_ot) SERIAL_ECHOLNPGM("overtemperature");
if (st.s2ga()) SERIAL_ECHOLNPGM("short to ground (coil A)"); if (st.s2ga()) SERIAL_ECHOLNPGM("short to ground (coil A)");
@@ -112,7 +112,7 @@
#endif #endif
// Report if a warning was triggered // Report if a warning was triggered
if (data.is_otpw && st.otpw_count == 0) { if (data.is_otpw && otpw_cnt == 0) {
char timestamp[10]; char timestamp[10];
duration_t elapsed = print_job_timer.duration(); duration_t elapsed = print_job_timer.duration();
const bool has_days = (elapsed.value > 60*60*24L); const bool has_days = (elapsed.value > 60*60*24L);
@@ -120,38 +120,38 @@
SERIAL_EOL(); SERIAL_EOL();
SERIAL_ECHO(timestamp); SERIAL_ECHO(timestamp);
SERIAL_ECHOPGM(": "); SERIAL_ECHOPGM(": ");
st.printLabel(); _tmc_say_axis(axis);
SERIAL_ECHOPGM(" driver overtemperature warning! ("); SERIAL_ECHOPGM(" driver overtemperature warning! (");
SERIAL_ECHO(st.getMilliamps()); SERIAL_ECHO(st.getCurrent());
SERIAL_ECHOLNPGM("mA)"); SERIAL_ECHOLNPGM("mA)");
} }
#if CURRENT_STEP_DOWN > 0 #if CURRENT_STEP_DOWN > 0
// Decrease current if is_otpw is true and driver is enabled and there's been more than 4 warnings // Decrease current if is_otpw is true and driver is enabled and there's been more than 4 warnings
if (data.is_otpw && st.isEnabled() && st.otpw_cnt > 4) { if (data.is_otpw && st.isEnabled() && otpw_cnt > 4) {
st.rms_current(st.getMilliamps() - (CURRENT_STEP_DOWN)); st.setCurrent(st.getCurrent() - CURRENT_STEP_DOWN, R_SENSE, HOLD_MULTIPLIER);
#if ENABLED(REPORT_CURRENT_CHANGE) #if ENABLED(REPORT_CURRENT_CHANGE)
st.printLabel(); _tmc_say_axis(axis);
SERIAL_ECHOLNPAIR(" current decreased to ", st.getMilliamps()); SERIAL_ECHOLNPAIR(" current decreased to ", st.getCurrent());
#endif #endif
} }
#endif #endif
if (data.is_otpw) { if (data.is_otpw) {
st.otpw_count++; otpw_cnt++;
st.flag_otpw = true; st.flag_otpw = true;
} }
else if (st.otpw_count > 0) st.otpw_count = 0; else if (otpw_cnt > 0) otpw_cnt = 0;
if (report_tmc_status) { if (report_tmc_status) {
const uint32_t pwm_scale = get_pwm_scale(st); const uint32_t pwm_scale = get_pwm_scale(st);
st.printLabel(); _tmc_say_axis(axis);
SERIAL_ECHOPAIR(":", pwm_scale); SERIAL_ECHOPAIR(":", pwm_scale);
SERIAL_ECHOPGM(" |0b"); SERIAL_PRINT(get_status_response(st), BIN); SERIAL_ECHOPGM(" |0b"); SERIAL_PRINT(get_status_response(st), BIN);
SERIAL_ECHOPGM("| "); SERIAL_ECHOPGM("| ");
if (data.is_error) SERIAL_CHAR('E'); if (data.is_error) SERIAL_CHAR('E');
else if (data.is_ot) SERIAL_CHAR('O'); else if (data.is_ot) SERIAL_CHAR('O');
else if (data.is_otpw) SERIAL_CHAR('W'); else if (data.is_otpw) SERIAL_CHAR('W');
else if (st.otpw_count > 0) SERIAL_PRINT(st.otpw_count, DEC); else if (otpw_cnt > 0) SERIAL_PRINT(otpw_cnt, DEC);
else if (st.flag_otpw) SERIAL_CHAR('F'); else if (st.flag_otpw) SERIAL_CHAR('F');
SERIAL_CHAR('\t'); SERIAL_CHAR('\t');
} }
@@ -164,37 +164,48 @@
if (ELAPSED(millis(), next_cOT)) { if (ELAPSED(millis(), next_cOT)) {
next_cOT = millis() + 500; next_cOT = millis() + 500;
#if HAS_HW_COMMS(X) #if HAS_HW_COMMS(X)
monitor_tmc_driver(stepperX); static uint8_t x_otpw_cnt = 0;
monitor_tmc_driver(stepperX, TMC_X, x_otpw_cnt);
#endif #endif
#if HAS_HW_COMMS(Y) #if HAS_HW_COMMS(Y)
monitor_tmc_driver(stepperY); static uint8_t y_otpw_cnt = 0;
monitor_tmc_driver(stepperY, TMC_Y, y_otpw_cnt);
#endif #endif
#if HAS_HW_COMMS(Z) #if HAS_HW_COMMS(Z)
monitor_tmc_driver(stepperZ); static uint8_t z_otpw_cnt = 0;
monitor_tmc_driver(stepperZ, TMC_Z, z_otpw_cnt);
#endif #endif
#if HAS_HW_COMMS(X2) #if HAS_HW_COMMS(X2)
monitor_tmc_driver(stepperX2); static uint8_t x2_otpw_cnt = 0;
monitor_tmc_driver(stepperX2, TMC_X, x2_otpw_cnt);
#endif #endif
#if HAS_HW_COMMS(Y2) #if HAS_HW_COMMS(Y2)
monitor_tmc_driver(stepperY2); static uint8_t y2_otpw_cnt = 0;
monitor_tmc_driver(stepperY2, TMC_Y, y2_otpw_cnt);
#endif #endif
#if HAS_HW_COMMS(Z2) #if HAS_HW_COMMS(Z2)
monitor_tmc_driver(stepperZ2); static uint8_t z2_otpw_cnt = 0;
monitor_tmc_driver(stepperZ2, TMC_Z, z2_otpw_cnt);
#endif #endif
#if HAS_HW_COMMS(E0) #if HAS_HW_COMMS(E0)
monitor_tmc_driver(stepperE0); static uint8_t e0_otpw_cnt = 0;
monitor_tmc_driver(stepperE0, TMC_E0, e0_otpw_cnt);
#endif #endif
#if HAS_HW_COMMS(E1) #if HAS_HW_COMMS(E1)
monitor_tmc_driver(stepperE1); static uint8_t e1_otpw_cnt = 0;
monitor_tmc_driver(stepperE1, TMC_E1, e1_otpw_cnt);
#endif #endif
#if HAS_HW_COMMS(E2) #if HAS_HW_COMMS(E2)
monitor_tmc_driver(stepperE2); static uint8_t e2_otpw_cnt = 0;
monitor_tmc_driver(stepperE2, TMC_E2, e2_otpw_cnt);
#endif #endif
#if HAS_HW_COMMS(E3) #if HAS_HW_COMMS(E3)
monitor_tmc_driver(stepperE3); static uint8_t e3_otpw_cnt = 0;
monitor_tmc_driver(stepperE3, TMC_E3, e3_otpw_cnt);
#endif #endif
#if HAS_HW_COMMS(E4) #if HAS_HW_COMMS(E4)
monitor_tmc_driver(stepperE4); static uint8_t e4_otpw_cnt = 0;
monitor_tmc_driver(stepperE4, TMC_E4, e4_otpw_cnt);
#endif #endif
if (report_tmc_status) SERIAL_EOL(); if (report_tmc_status) SERIAL_EOL();
@@ -203,6 +214,40 @@
#endif // MONITOR_DRIVER_STATUS #endif // MONITOR_DRIVER_STATUS
void _tmc_say_axis(const TMC_AxisEnum axis) {
static const char ext_X[] PROGMEM = "X", ext_Y[] PROGMEM = "Y", ext_Z[] PROGMEM = "Z",
ext_X2[] PROGMEM = "X2", ext_Y2[] PROGMEM = "Y2", ext_Z2[] PROGMEM = "Z2",
ext_E0[] PROGMEM = "E0", ext_E1[] PROGMEM = "E1",
ext_E2[] PROGMEM = "E2", ext_E3[] PROGMEM = "E3",
ext_E4[] PROGMEM = "E4";
static const char* const tmc_axes[] PROGMEM = { ext_X, ext_Y, ext_Z, ext_X2, ext_Y2, ext_Z2, ext_E0, ext_E1, ext_E2, ext_E3, ext_E4 };
serialprintPGM((char*)pgm_read_ptr(&tmc_axes[axis]));
}
void _tmc_say_current(const TMC_AxisEnum axis, const uint16_t curr) {
_tmc_say_axis(axis);
SERIAL_ECHOLNPAIR(" driver current: ", curr);
}
void _tmc_say_otpw(const TMC_AxisEnum axis, const bool otpw) {
_tmc_say_axis(axis);
SERIAL_ECHOPGM(" temperature prewarn triggered: ");
serialprintPGM(otpw ? PSTR("true") : PSTR("false"));
SERIAL_EOL();
}
void _tmc_say_otpw_cleared(const TMC_AxisEnum axis) {
_tmc_say_axis(axis);
SERIAL_ECHOLNPGM(" prewarn flag cleared");
}
void _tmc_say_pwmthrs(const TMC_AxisEnum axis, const uint32_t thrs) {
_tmc_say_axis(axis);
SERIAL_ECHOLNPAIR(" stealthChop max speed: ", thrs);
}
void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt) {
_tmc_say_axis(axis);
SERIAL_ECHOPGM(" homing sensitivity: ");
SERIAL_PRINTLN(sgt, DEC);
}
#if ENABLED(TMC_DEBUG) #if ENABLED(TMC_DEBUG)
enum TMC_debug_enum : char { enum TMC_debug_enum : char {
@@ -251,7 +296,9 @@
TMC_S2VSB, TMC_S2VSB,
TMC_S2VSA TMC_S2VSA
}; };
static void drv_status_print_hex(const uint32_t drv_status) { static void drv_status_print_hex(const TMC_AxisEnum axis, const uint32_t drv_status) {
_tmc_say_axis(axis);
SERIAL_ECHOPGM(" = 0x");
for (int B = 24; B >= 8; B -= 8){ for (int B = 24; B >= 8; B -= 8){
SERIAL_PRINT((drv_status >> (B + 4)) & 0xF, HEX); SERIAL_PRINT((drv_status >> (B + 4)) & 0xF, HEX);
SERIAL_PRINT((drv_status >> B) & 0xF, HEX); SERIAL_PRINT((drv_status >> B) & 0xF, HEX);
@@ -262,19 +309,17 @@
SERIAL_EOL(); SERIAL_EOL();
} }
template<class TMC>
static void print_vsense(TMC &st) { serialprintPGM(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); }
#if HAS_DRIVER(TMC2130) #if HAS_DRIVER(TMC2130)
static void tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) { static void tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) {
switch (i) { switch (i) {
case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break; case TMC_PWM_SCALE: SERIAL_PRINT(st.PWM_SCALE(), DEC); break;
case TMC_TSTEP: SERIAL_ECHO(st.TSTEP()); break;
case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break; case TMC_SGT: SERIAL_PRINT(st.sgt(), DEC); break;
case TMC_STEALTHCHOP: serialprintPGM(st.en_pwm_mode() ? PSTR("true") : PSTR("false")); break; case TMC_STEALTHCHOP: serialprintPGM(st.stealthChop() ? PSTR("true") : PSTR("false")); break;
default: break; default: break;
} }
} }
static void _tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) { static void tmc_parse_drv_status(TMC2130Stepper &st, const TMC_drv_status_enum i) {
switch (i) { switch (i) {
case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('X'); break; case TMC_STALLGUARD: if (st.stallguard()) SERIAL_CHAR('X'); break;
case TMC_SG_RESULT: SERIAL_PRINT(st.sg_result(), DEC); break; case TMC_SG_RESULT: SERIAL_PRINT(st.sg_result(), DEC); break;
@@ -287,6 +332,7 @@
#if HAS_DRIVER(TMC2208) #if HAS_DRIVER(TMC2208)
static void tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) { static void tmc_status(TMC2208Stepper &st, const TMC_debug_enum i) {
switch (i) { switch (i) {
case TMC_TSTEP: { uint32_t data = 0; st.TSTEP(&data); SERIAL_PROTOCOL(data); break; }
case TMC_PWM_SCALE: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break; case TMC_PWM_SCALE: SERIAL_PRINT(st.pwm_scale_sum(), DEC); break;
case TMC_STEALTHCHOP: serialprintPGM(st.stealth() ? PSTR("true") : PSTR("false")); break; case TMC_STEALTHCHOP: serialprintPGM(st.stealth() ? PSTR("true") : PSTR("false")); break;
case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('X'); break; case TMC_S2VSA: if (st.s2vsa()) SERIAL_CHAR('X'); break;
@@ -294,7 +340,7 @@
default: break; default: break;
} }
} }
static void _tmc_parse_drv_status(TMC2208Stepper &st, const TMC_drv_status_enum i) { static void tmc_parse_drv_status(TMC2208Stepper &st, const TMC_drv_status_enum i) {
switch (i) { switch (i) {
case TMC_T157: if (st.t157()) SERIAL_CHAR('X'); break; case TMC_T157: if (st.t157()) SERIAL_CHAR('X'); break;
case TMC_T150: if (st.t150()) SERIAL_CHAR('X'); break; case TMC_T150: if (st.t150()) SERIAL_CHAR('X'); break;
@@ -306,12 +352,12 @@
#endif #endif
template <typename TMC> template <typename TMC>
static void tmc_status(TMC &st, const TMC_debug_enum i, const float spmm) { static void tmc_status(TMC &st, const TMC_AxisEnum axis, const TMC_debug_enum i, const float spmm) {
SERIAL_ECHO('\t'); SERIAL_ECHO('\t');
switch (i) { switch (i) {
case TMC_CODES: st.printLabel(); break; case TMC_CODES: _tmc_say_axis(axis); break;
case TMC_ENABLED: serialprintPGM(st.isEnabled() ? PSTR("true") : PSTR("false")); break; case TMC_ENABLED: serialprintPGM(st.isEnabled() ? PSTR("true") : PSTR("false")); break;
case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break; case TMC_CURRENT: SERIAL_ECHO(st.getCurrent()); break;
case TMC_RMS_CURRENT: SERIAL_PROTOCOL(st.rms_current()); break; case TMC_RMS_CURRENT: SERIAL_PROTOCOL(st.rms_current()); break;
case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break; case TMC_MAX_CURRENT: SERIAL_PRINT((float)st.rms_current() * 1.41, 0); break;
case TMC_IRUN: case TMC_IRUN:
@@ -326,9 +372,10 @@
SERIAL_PRINT(st.cs_actual(), DEC); SERIAL_PRINT(st.cs_actual(), DEC);
SERIAL_ECHOPGM("/31"); SERIAL_ECHOPGM("/31");
break; break;
case TMC_VSENSE: print_vsense(st); break;
case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); break;
case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
case TMC_TSTEP: SERIAL_ECHO(st.TSTEP()); break;
case TMC_TPWMTHRS: { case TMC_TPWMTHRS: {
uint32_t tpwmthrs_val = st.TPWMTHRS(); uint32_t tpwmthrs_val = st.TPWMTHRS();
SERIAL_ECHO(tpwmthrs_val); SERIAL_ECHO(tpwmthrs_val);
@@ -343,9 +390,7 @@
} }
break; break;
case TMC_OTPW: serialprintPGM(st.otpw() ? PSTR("true") : PSTR("false")); break; case TMC_OTPW: serialprintPGM(st.otpw() ? PSTR("true") : PSTR("false")); break;
#if ENABLED(MONITOR_DRIVER_STATUS)
case TMC_OTPW_TRIGGERED: serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false")); break; case TMC_OTPW_TRIGGERED: serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false")); break;
#endif
case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break; case TMC_TOFF: SERIAL_PRINT(st.toff(), DEC); break;
case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break; case TMC_TBL: SERIAL_PRINT(st.blank_time(), DEC); break;
case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break; case TMC_HEND: SERIAL_PRINT(st.hysteresis_end(), DEC); break;
@@ -355,10 +400,10 @@
} }
template <typename TMC> template <typename TMC>
static void tmc_parse_drv_status(TMC &st, const TMC_drv_status_enum i) { static void tmc_parse_drv_status(TMC &st, const TMC_AxisEnum axis, const TMC_drv_status_enum i) {
SERIAL_CHAR('\t'); SERIAL_CHAR('\t');
switch (i) { switch (i) {
case TMC_DRV_CODES: st.printLabel(); break; case TMC_DRV_CODES: _tmc_say_axis(axis); break;
case TMC_STST: if (st.stst()) SERIAL_CHAR('X'); break; case TMC_STST: if (st.stst()) SERIAL_CHAR('X'); break;
case TMC_OLB: if (st.olb()) SERIAL_CHAR('X'); break; case TMC_OLB: if (st.olb()) SERIAL_CHAR('X'); break;
case TMC_OLA: if (st.ola()) SERIAL_CHAR('X'); break; case TMC_OLA: if (st.ola()) SERIAL_CHAR('X'); break;
@@ -367,63 +412,59 @@
case TMC_DRV_OTPW: if (st.otpw()) 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_OT: if (st.ot()) SERIAL_CHAR('X'); break;
case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break; case TMC_DRV_CS_ACTUAL: SERIAL_PRINT(st.cs_actual(), DEC); break;
case TMC_DRV_STATUS_HEX: case TMC_DRV_STATUS_HEX:drv_status_print_hex(axis, st.DRV_STATUS()); break;
st.printLabel(); default: tmc_parse_drv_status(st, i); break;
SERIAL_ECHOPGM("\t0x");
drv_status_print_hex(st.DRV_STATUS());
break;
default: _tmc_parse_drv_status(st, i); break;
} }
} }
static void tmc_debug_loop(const TMC_debug_enum i) { static void tmc_debug_loop(const TMC_debug_enum i) {
#if AXIS_IS_TMC(X) #if AXIS_IS_TMC(X)
tmc_status(stepperX, i, planner.axis_steps_per_mm[X_AXIS]); tmc_status(stepperX, TMC_X, i, planner.axis_steps_per_mm[X_AXIS]);
#endif #endif
#if AXIS_IS_TMC(X2) #if AXIS_IS_TMC(X2)
tmc_status(stepperX2, i, planner.axis_steps_per_mm[X_AXIS]); tmc_status(stepperX2, TMC_X2, i, planner.axis_steps_per_mm[X_AXIS]);
#endif #endif
#if AXIS_IS_TMC(Y) #if AXIS_IS_TMC(Y)
tmc_status(stepperY, i, planner.axis_steps_per_mm[Y_AXIS]); tmc_status(stepperY, TMC_Y, i, planner.axis_steps_per_mm[Y_AXIS]);
#endif #endif
#if AXIS_IS_TMC(Y2) #if AXIS_IS_TMC(Y2)
tmc_status(stepperY2, i, planner.axis_steps_per_mm[Y_AXIS]); tmc_status(stepperY2, TMC_Y2, i, planner.axis_steps_per_mm[Y_AXIS]);
#endif #endif
#if AXIS_IS_TMC(Z) #if AXIS_IS_TMC(Z)
tmc_status(stepperZ, i, planner.axis_steps_per_mm[Z_AXIS]); tmc_status(stepperZ, TMC_Z, i, planner.axis_steps_per_mm[Z_AXIS]);
#endif #endif
#if AXIS_IS_TMC(Z2) #if AXIS_IS_TMC(Z2)
tmc_status(stepperZ2, i, planner.axis_steps_per_mm[Z_AXIS]); tmc_status(stepperZ2, TMC_Z2, i, planner.axis_steps_per_mm[Z_AXIS]);
#endif #endif
#if AXIS_IS_TMC(E0) #if AXIS_IS_TMC(E0)
tmc_status(stepperE0, i, planner.axis_steps_per_mm[E_AXIS]); tmc_status(stepperE0, TMC_E0, i, planner.axis_steps_per_mm[E_AXIS]);
#endif #endif
#if AXIS_IS_TMC(E1) #if AXIS_IS_TMC(E1)
tmc_status(stepperE1, i, planner.axis_steps_per_mm[E_AXIS tmc_status(stepperE1, TMC_E1, i, planner.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS) #if ENABLED(DISTINCT_E_FACTORS)
+ 1 + 1
#endif #endif
]); ]);
#endif #endif
#if AXIS_IS_TMC(E2) #if AXIS_IS_TMC(E2)
tmc_status(stepperE2, i, planner.axis_steps_per_mm[E_AXIS tmc_status(stepperE2, TMC_E2, i, planner.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS) #if ENABLED(DISTINCT_E_FACTORS)
+ 2 + 2
#endif #endif
]); ]);
#endif #endif
#if AXIS_IS_TMC(E3) #if AXIS_IS_TMC(E3)
tmc_status(stepperE3, i, planner.axis_steps_per_mm[E_AXIS tmc_status(stepperE3, TMC_E3, i, planner.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS) #if ENABLED(DISTINCT_E_FACTORS)
+ 3 + 3
#endif #endif
]); ]);
#endif #endif
#if AXIS_IS_TMC(E4) #if AXIS_IS_TMC(E4)
tmc_status(stepperE4, i, planner.axis_steps_per_mm[E_AXIS tmc_status(stepperE4, TMC_E4, i, planner.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS) #if ENABLED(DISTINCT_E_FACTORS)
+ 4 + 4
#endif #endif
@@ -435,40 +476,40 @@
static void drv_status_loop(const TMC_drv_status_enum i) { static void drv_status_loop(const TMC_drv_status_enum i) {
#if AXIS_IS_TMC(X) #if AXIS_IS_TMC(X)
tmc_parse_drv_status(stepperX, i); tmc_parse_drv_status(stepperX, TMC_X, i);
#endif #endif
#if AXIS_IS_TMC(X2) #if AXIS_IS_TMC(X2)
tmc_parse_drv_status(stepperX2, i); tmc_parse_drv_status(stepperX2, TMC_X2, i);
#endif #endif
#if AXIS_IS_TMC(Y) #if AXIS_IS_TMC(Y)
tmc_parse_drv_status(stepperY, i); tmc_parse_drv_status(stepperY, TMC_Y, i);
#endif #endif
#if AXIS_IS_TMC(Y2) #if AXIS_IS_TMC(Y2)
tmc_parse_drv_status(stepperY2, i); tmc_parse_drv_status(stepperY2, TMC_Y2, i);
#endif #endif
#if AXIS_IS_TMC(Z) #if AXIS_IS_TMC(Z)
tmc_parse_drv_status(stepperZ, i); tmc_parse_drv_status(stepperZ, TMC_Z, i);
#endif #endif
#if AXIS_IS_TMC(Z2) #if AXIS_IS_TMC(Z2)
tmc_parse_drv_status(stepperZ2, i); tmc_parse_drv_status(stepperZ2, TMC_Z2, i);
#endif #endif
#if AXIS_IS_TMC(E0) #if AXIS_IS_TMC(E0)
tmc_parse_drv_status(stepperE0, i); tmc_parse_drv_status(stepperE0, TMC_E0, i);
#endif #endif
#if AXIS_IS_TMC(E1) #if AXIS_IS_TMC(E1)
tmc_parse_drv_status(stepperE1, i); tmc_parse_drv_status(stepperE1, TMC_E1, i);
#endif #endif
#if AXIS_IS_TMC(E2) #if AXIS_IS_TMC(E2)
tmc_parse_drv_status(stepperE2, i); tmc_parse_drv_status(stepperE2, TMC_E2, i);
#endif #endif
#if AXIS_IS_TMC(E3) #if AXIS_IS_TMC(E3)
tmc_parse_drv_status(stepperE3, i); tmc_parse_drv_status(stepperE3, TMC_E3, i);
#endif #endif
#if AXIS_IS_TMC(E4) #if AXIS_IS_TMC(E4)
tmc_parse_drv_status(stepperE4, i); tmc_parse_drv_status(stepperE4, TMC_E4, i);
#endif #endif
SERIAL_EOL(); SERIAL_EOL();
@@ -477,12 +518,10 @@
/** /**
* M122 report functions * M122 report functions
*/ */
#if ENABLED(MONITOR_DRIVER_STATUS)
void tmc_set_report_status(const bool status) { void tmc_set_report_status(const bool status) {
if ((report_tmc_status = status)) if ((report_tmc_status = status))
SERIAL_ECHOLNPGM("axis:pwm_scale |status_response|"); SERIAL_ECHOLNPGM("axis:pwm_scale |status_response|");
} }
#endif
void tmc_report_all() { void tmc_report_all() {
#define TMC_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_debug_loop(ITEM); }while(0) #define TMC_REPORT(LABEL, ITEM) do{ SERIAL_ECHOPGM(LABEL); tmc_debug_loop(ITEM); }while(0)
@@ -495,7 +534,7 @@
TMC_REPORT("Run current", TMC_IRUN); TMC_REPORT("Run current", TMC_IRUN);
TMC_REPORT("Hold current", TMC_IHOLD); TMC_REPORT("Hold current", TMC_IHOLD);
TMC_REPORT("CS actual\t", TMC_CS_ACTUAL); TMC_REPORT("CS actual\t", TMC_CS_ACTUAL);
TMC_REPORT("PWM scale", TMC_PWM_SCALE); TMC_REPORT("PWM scale\t", TMC_PWM_SCALE);
TMC_REPORT("vsense\t", TMC_VSENSE); TMC_REPORT("vsense\t", TMC_VSENSE);
TMC_REPORT("stealthChop", TMC_STEALTHCHOP); TMC_REPORT("stealthChop", TMC_STEALTHCHOP);
TMC_REPORT("msteps\t", TMC_MICROSTEPS); TMC_REPORT("msteps\t", TMC_MICROSTEPS);
@@ -532,7 +571,7 @@
DRV_REPORT("s2vsa\t", TMC_S2VSA); DRV_REPORT("s2vsa\t", TMC_S2VSA);
DRV_REPORT("s2vsb\t", TMC_S2VSB); DRV_REPORT("s2vsb\t", TMC_S2VSB);
#endif #endif
DRV_REPORT("Driver registers:\n",TMC_DRV_STATUS_HEX); DRV_REPORT("Driver registers:", TMC_DRV_STATUS_HEX);
SERIAL_EOL(); SERIAL_EOL();
} }
@@ -541,9 +580,9 @@
#if ENABLED(SENSORLESS_HOMING) #if ENABLED(SENSORLESS_HOMING)
void tmc_sensorless_homing(TMC2130Stepper &st, const bool enable/*=true*/) { void tmc_sensorless_homing(TMC2130Stepper &st, const bool enable/*=true*/) {
st.TCOOLTHRS(enable ? 0xFFFFF : 0); st.coolstep_min_speed(enable ? 1024UL * 1024UL - 1UL : 0);
#if ENABLED(STEALTHCHOP) #if ENABLED(STEALTHCHOP)
st.en_pwm_mode(!enable); st.stealthChop(!enable);
#endif #endif
st.diag1_stall(enable ? 1 : 0); st.diag1_stall(enable ? 1 : 0);
} }
@@ -551,40 +590,39 @@
#endif // SENSORLESS_HOMING #endif // SENSORLESS_HOMING
#if HAS_DRIVER(TMC2130) #if HAS_DRIVER(TMC2130)
#define IS_TMC_SPI(ST) AXIS_DRIVER_TYPE(ST, TMC2130)
#define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH) #define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH)
void tmc_init_cs_pins() { void tmc_init_cs_pins() {
#if IS_TMC_SPI(X) #if AXIS_DRIVER_TYPE(X, TMC2130)
SET_CS_PIN(X); SET_CS_PIN(X);
#endif #endif
#if IS_TMC_SPI(Y) #if AXIS_DRIVER_TYPE(Y, TMC2130)
SET_CS_PIN(Y); SET_CS_PIN(Y);
#endif #endif
#if IS_TMC_SPI(Z) #if AXIS_DRIVER_TYPE(Z, TMC2130)
SET_CS_PIN(Z); SET_CS_PIN(Z);
#endif #endif
#if IS_TMC_SPI(X2) #if AXIS_DRIVER_TYPE(X2, TMC2130)
SET_CS_PIN(X2); SET_CS_PIN(X2);
#endif #endif
#if IS_TMC_SPI(Y2) #if AXIS_DRIVER_TYPE(Y2, TMC2130)
SET_CS_PIN(Y2); SET_CS_PIN(Y2);
#endif #endif
#if IS_TMC_SPI(Z2) #if AXIS_DRIVER_TYPE(Z2, TMC2130)
SET_CS_PIN(Z2); SET_CS_PIN(Z2);
#endif #endif
#if IS_TMC_SPI(E0) #if AXIS_DRIVER_TYPE(E0, TMC2130)
SET_CS_PIN(E0); SET_CS_PIN(E0);
#endif #endif
#if IS_TMC_SPI(E1) #if AXIS_DRIVER_TYPE(E1, TMC2130)
SET_CS_PIN(E1); SET_CS_PIN(E1);
#endif #endif
#if IS_TMC_SPI(E2) #if AXIS_DRIVER_TYPE(E2, TMC2130)
SET_CS_PIN(E2); SET_CS_PIN(E2);
#endif #endif
#if IS_TMC_SPI(E3) #if AXIS_DRIVER_TYPE(E3, TMC2130)
SET_CS_PIN(E3); SET_CS_PIN(E3);
#endif #endif
#if IS_TMC_SPI(E4) #if AXIS_DRIVER_TYPE(E4, TMC2130)
SET_CS_PIN(E4); SET_CS_PIN(E4);
#endif #endif
} }

View File

@@ -24,129 +24,58 @@
#define _TMC_UTIL_H_ #define _TMC_UTIL_H_
#include "MarlinConfig.h" #include "MarlinConfig.h"
#if HAS_TRINAMIC
#include <TMCStepper.h> #if HAS_DRIVER(TMC2130)
#include <TMC2130Stepper.h>
#endif #endif
#define TMC_X_LABEL 'X', '0' #if HAS_DRIVER(TMC2208)
#define TMC_Y_LABEL 'Y', '0' #include <TMC2208Stepper.h>
#define TMC_Z_LABEL 'Z', '0'
#define TMC_X2_LABEL 'X', '2'
#define TMC_Y2_LABEL 'Y', '2'
#define TMC_Z2_LABEL 'Z', '2'
#define TMC_E0_LABEL 'E', '0'
#define TMC_E1_LABEL 'E', '1'
#define TMC_E2_LABEL 'E', '2'
#define TMC_E3_LABEL 'E', '3'
#define TMC_E4_LABEL 'E', '4'
template<char AXIS_LETTER, char DRIVER_ID>
class TMCStorage {
protected:
// Only a child class has access to constructor => Don't create on its own! "Poor man's abstract class"
TMCStorage() {}
uint16_t val_mA = 0;
public:
#if ENABLED(MONITOR_DRIVER_STATUS)
uint8_t otpw_count = 0;
bool flag_otpw = false;
bool getOTPW() { return flag_otpw; }
void clear_otpw() { flag_otpw = 0; }
#endif #endif
uint16_t getMilliamps() { return val_mA; } extern bool report_tmc_status;
void printLabel() { enum TMC_AxisEnum : char { TMC_X, TMC_Y, TMC_Z, TMC_X2, TMC_Y2, TMC_Z2, TMC_E0, TMC_E1, TMC_E2, TMC_E3, TMC_E4 };
SERIAL_CHAR(AXIS_LETTER);
if (DRIVER_ID > '0') SERIAL_CHAR(DRIVER_ID);
}
};
template<class TMC, char AXIS_LETTER, char DRIVER_ID>
class TMCMarlin : public TMC, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
public:
TMCMarlin(uint16_t cs_pin, float RS) :
TMC(cs_pin, RS)
{}
TMCMarlin(uint16_t CS, float RS, uint16_t pinMOSI, uint16_t pinMISO, uint16_t pinSCK) :
TMC(CS, RS, pinMOSI, pinMISO, pinSCK)
{}
uint16_t rms_current() { return TMC::rms_current(); }
void rms_current(uint16_t mA) {
this->val_mA = mA;
TMC::rms_current(mA);
}
void rms_current(uint16_t mA, float mult) {
this->val_mA = mA;
TMC::rms_current(mA, mult);
}
};
template<char AXIS_LETTER, char DRIVER_ID>
class TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID> : public TMC2208Stepper, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
public:
TMCMarlin(Stream * SerialPort, float RS, bool has_rx=true) :
TMC2208Stepper(SerialPort, RS, has_rx=true)
{}
TMCMarlin(uint16_t RX, uint16_t TX, float RS, bool has_rx=true) :
TMC2208Stepper(RX, TX, RS, has_rx=true)
{}
uint16_t rms_current() { return TMC2208Stepper::rms_current(); }
void rms_current(uint16_t mA) {
this->val_mA = mA;
TMC2208Stepper::rms_current(mA);
}
void rms_current(uint16_t mA, float mult) {
this->val_mA = mA;
TMC2208Stepper::rms_current(mA, mult);
}
};
constexpr uint32_t _tmc_thrs(const uint16_t msteps, const int32_t thrs, const uint32_t spmm) { constexpr uint32_t _tmc_thrs(const uint16_t msteps, const int32_t thrs, const uint32_t spmm) {
return 12650000UL * msteps / (256 * thrs * spmm); return 12650000UL * msteps / (256 * thrs * spmm);
} }
void _tmc_say_axis(const TMC_AxisEnum axis);
void _tmc_say_current(const TMC_AxisEnum axis, const uint16_t curr);
void _tmc_say_otpw(const TMC_AxisEnum axis, const bool otpw);
void _tmc_say_otpw_cleared(const TMC_AxisEnum axis);
void _tmc_say_pwmthrs(const TMC_AxisEnum axis, const uint32_t thrs);
void _tmc_say_sgt(const TMC_AxisEnum axis, const int8_t sgt);
template<typename TMC> template<typename TMC>
void tmc_get_current(TMC &st) { void tmc_get_current(TMC &st, const TMC_AxisEnum axis) {
st.printLabel(); _tmc_say_current(axis, st.getCurrent());
SERIAL_ECHOLNPAIR(" driver current: ", st.getMilliamps());
} }
template<typename TMC> template<typename TMC>
void tmc_set_current(TMC &st, const int mA) { void tmc_set_current(TMC &st, const int mA) {
st.rms_current(mA); st.setCurrent(mA, R_SENSE, HOLD_MULTIPLIER);
}
#if ENABLED(MONITOR_DRIVER_STATUS)
template<typename TMC>
void tmc_report_otpw(TMC &st) {
st.printLabel();
SERIAL_ECHOPGM(" temperature prewarn triggered: ");
serialprintPGM(st.getOTPW() ? PSTR("true") : PSTR("false"));
SERIAL_EOL();
} }
template<typename TMC> template<typename TMC>
void tmc_clear_otpw(TMC &st) { void tmc_report_otpw(TMC &st, const TMC_AxisEnum axis) {
_tmc_say_otpw(axis, st.getOTPW());
}
template<typename TMC>
void tmc_clear_otpw(TMC &st, const TMC_AxisEnum axis) {
st.clear_otpw(); st.clear_otpw();
st.printLabel(); _tmc_say_otpw_cleared(axis);
SERIAL_ECHOLNPGM(" prewarn flag cleared");
} }
#endif
template<typename TMC> template<typename TMC>
void tmc_get_pwmthrs(TMC &st, const uint16_t spmm) { void tmc_get_pwmthrs(TMC &st, const TMC_AxisEnum axis, const uint16_t spmm) {
st.printLabel(); _tmc_say_pwmthrs(axis, _tmc_thrs(st.microsteps(), st.TPWMTHRS(), spmm));
SERIAL_ECHOLNPAIR(" stealthChop max speed: ", _tmc_thrs(st.microsteps(), st.TPWMTHRS(), spmm));
} }
template<typename TMC> template<typename TMC>
void tmc_set_pwmthrs(TMC &st, const int32_t thrs, const uint32_t spmm) { void tmc_set_pwmthrs(TMC &st, const int32_t thrs, const uint32_t spmm) {
st.TPWMTHRS(_tmc_thrs(st.microsteps(), thrs, spmm)); st.TPWMTHRS(_tmc_thrs(st.microsteps(), thrs, spmm));
} }
template<typename TMC> template<typename TMC>
void tmc_get_sgt(TMC &st) { void tmc_get_sgt(TMC &st, const TMC_AxisEnum axis) {
st.printLabel(); _tmc_say_sgt(axis, st.sgt());
SERIAL_ECHOPGM(" homing sensitivity: ");
SERIAL_PRINTLN(st.sgt(), DEC);
} }
template<typename TMC> template<typename TMC>
void tmc_set_sgt(TMC &st, const int8_t sgt_val) { void tmc_set_sgt(TMC &st, const int8_t sgt_val) {

View File

@@ -210,11 +210,8 @@
serialprintPGM(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); serialprintPGM(csv ? PSTR("CSV:\n") : PSTR("LCD:\n"));
} }
// Add XY_PROBE_OFFSET_FROM_EXTRUDER because probe_pt() subtracts these when const float current_xi = get_cell_index_x(current_position[X_AXIS] + (MESH_X_DIST) / 2.0),
// moving to the xy position to be measured. This ensures better agreement between current_yi = get_cell_index_y(current_position[Y_AXIS] + (MESH_Y_DIST) / 2.0);
// the current Z position after G28 and the mesh values.
const float current_xi = find_closest_x_index(current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER),
current_yi = find_closest_y_index(current_position[Y_AXIS] + Y_PROBE_OFFSET_FROM_EXTRUDER);
if (!lcd) SERIAL_EOL(); if (!lcd) SERIAL_EOL();
for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) { for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) {

View File

@@ -1287,8 +1287,8 @@
out_mesh.distance = -99999.9f; out_mesh.distance = -99999.9f;
// Get our reference position. Either the nozzle or probe location. // Get our reference position. Either the nozzle or probe location.
const float px = rx + (probe_as_reference == USE_PROBE_AS_REFERENCE ? X_PROBE_OFFSET_FROM_EXTRUDER : 0), const float px = rx - (probe_as_reference == USE_PROBE_AS_REFERENCE ? X_PROBE_OFFSET_FROM_EXTRUDER : 0),
py = ry + (probe_as_reference == USE_PROBE_AS_REFERENCE ? Y_PROBE_OFFSET_FROM_EXTRUDER : 0); py = ry - (probe_as_reference == USE_PROBE_AS_REFERENCE ? Y_PROBE_OFFSET_FROM_EXTRUDER : 0);
float best_so_far = 99999.99f; float best_so_far = 99999.99f;

View File

@@ -972,11 +972,6 @@ void lcd_quick_feedback(const bool clear_buttons) {
MENU_ITEM(gcode, MSG_BLTOUCH_SELFTEST, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_SELFTEST))); MENU_ITEM(gcode, MSG_BLTOUCH_SELFTEST, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_SELFTEST)));
MENU_ITEM(gcode, MSG_BLTOUCH_DEPLOY, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_DEPLOY))); MENU_ITEM(gcode, MSG_BLTOUCH_DEPLOY, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_DEPLOY)));
MENU_ITEM(gcode, MSG_BLTOUCH_STOW, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_STOW))); MENU_ITEM(gcode, MSG_BLTOUCH_STOW, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_STOW)));
#if ENABLED(BLTOUCH_V3)
MENU_ITEM(gcode, MSG_BLTOUCH_SW_MODE, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_SW_MODE)));
MENU_ITEM(gcode, MSG_BLTOUCH_5V_MODE, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_5V_MODE)));
MENU_ITEM(gcode, MSG_BLTOUCH_OD_MODE, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_OD_MODE)));
#endif
END_MENU(); END_MENU();
} }
@@ -3419,14 +3414,14 @@ void lcd_quick_feedback(const bool clear_buttons) {
UNUSED(e); UNUSED(e);
#endif #endif
PID_PARAM(Ki, e) = scalePID_i(raw_Ki); PID_PARAM(Ki, e) = scalePID_i(raw_Ki);
thermalManager.update_pid(); thermalManager.updatePID();
} }
void copy_and_scalePID_d(int16_t e) { void copy_and_scalePID_d(int16_t e) {
#if DISABLED(PID_PARAMS_PER_HOTEND) || HOTENDS == 1 #if DISABLED(PID_PARAMS_PER_HOTEND) || HOTENDS == 1
UNUSED(e); UNUSED(e);
#endif #endif
PID_PARAM(Kd, e) = scalePID_d(raw_Kd); PID_PARAM(Kd, e) = scalePID_d(raw_Kd);
thermalManager.update_pid(); thermalManager.updatePID();
} }
#define _DEFINE_PIDTEMP_BASE_FUNCS(N) \ #define _DEFINE_PIDTEMP_BASE_FUNCS(N) \
void copy_and_scalePID_i_E ## N() { copy_and_scalePID_i(N); } \ void copy_and_scalePID_i_E ## N() { copy_and_scalePID_i(N); } \
@@ -3529,7 +3524,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
MENU_ITEM_EDIT(bool, MSG_AUTOTEMP, &planner.autotemp_enabled); MENU_ITEM_EDIT(bool, MSG_AUTOTEMP, &planner.autotemp_enabled);
MENU_ITEM_EDIT(float3, MSG_MIN, &planner.autotemp_min, 0, float(HEATER_0_MAXTEMP) - 15); MENU_ITEM_EDIT(float3, MSG_MIN, &planner.autotemp_min, 0, float(HEATER_0_MAXTEMP) - 15);
MENU_ITEM_EDIT(float3, MSG_MAX, &planner.autotemp_max, 0, float(HEATER_0_MAXTEMP) - 15); MENU_ITEM_EDIT(float3, MSG_MAX, &planner.autotemp_max, 0, float(HEATER_0_MAXTEMP) - 15);
MENU_ITEM_EDIT(float52, MSG_FACTOR, &planner.autotemp_factor, 0, 10); MENU_ITEM_EDIT(float52, MSG_FACTOR, &planner.autotemp_factor, 0, 1);
#endif #endif
// //
@@ -5611,14 +5606,15 @@ void lcd_reset_alert_level() { lcd_status_message_level = 0; }
#endif // LCD_HAS_DIRECTIONAL_BUTTONS #endif // LCD_HAS_DIRECTIONAL_BUTTONS
#if ENABLED(LCD_HAS_SLOW_BUTTONS)
newbutton |= slow_buttons;
#endif
buttons = newbutton; buttons = newbutton;
#if ENABLED(LCD_HAS_SLOW_BUTTONS)
buttons |= slow_buttons;
#endif
#if ENABLED(ADC_KEYPAD) #if ENABLED(ADC_KEYPAD)
uint8_t newbutton_reprapworld_keypad = 0; uint8_t newbutton_reprapworld_keypad = 0;
buttons = 0;
if (buttons_reprapworld_keypad == 0) { if (buttons_reprapworld_keypad == 0) {
newbutton_reprapworld_keypad = get_ADC_keyValue(); newbutton_reprapworld_keypad = get_ADC_keyValue();
if (WITHIN(newbutton_reprapworld_keypad, 1, 8)) if (WITHIN(newbutton_reprapworld_keypad, 1, 8))

View File

@@ -1,9 +1,13 @@
# Anycubic i3 Mega / Mega-S Marlin 1.1.9 by davidramiro # Anycubic i3 Mega / Mega-S Marlin 1.1.9 by davidramiro
[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6B6SAL5XRH842&source=url) [![Downloads](https://img.shields.io/github/downloads/davidramiro/Marlin-AI3M/total.svg?style=flat)](https://github.com/davidramiro/Marlin-AI3M/releases) [![Open Issues](https://img.shields.io/github/issues-raw/davidramiro/Marlin-AI3M.svg?style=flat)](https://github.com/davidramiro/Marlin-AI3M/issues?q=is%3Aopen+is%3Aissue) [![License](https://img.shields.io/github/license/davidramiro/Marlin-AI3M.svg?style=flat)](https://github.com/davidramiro/Marlin-AI3M/blob/master/LICENSE) [![Latest Release](https://img.shields.io/github/release/davidramiro/Marlin-AI3m.svg?style=flat)](https://github.com/davidramiro/Marlin-AI3M/releases/latest/) [![Last commit](https://img.shields.io/github/last-commit/davidramiro/Marlin-AI3m.svg?style=flat)](https://github.com/davidramiro/Marlin-Ai3M/commits/) [![Travis CI](https://api.travis-ci.org/davidramiro/Marlin-Ai3M.svg?branch=master)](https://travis-ci.org/davidramiro/Marlin-Ai3M) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3MFT8QMP5ZRCE&source=url) [![Downloads](https://img.shields.io/github/downloads/davidramiro/Marlin-AI3M/total.svg?style=flat)](https://github.com/davidramiro/Marlin-AI3M/releases) [![Open Issues](https://img.shields.io/github/issues-raw/davidramiro/Marlin-AI3M.svg?style=flat)](https://github.com/davidramiro/Marlin-AI3M/issues?q=is%3Aopen+is%3Aissue) [![License](https://img.shields.io/github/license/davidramiro/Marlin-AI3M.svg?style=flat)](https://github.com/davidramiro/Marlin-AI3M/blob/master/LICENSE) [![Latest Release](https://img.shields.io/github/release/davidramiro/Marlin-AI3m.svg?style=flat)](https://github.com/davidramiro/Marlin-AI3M/releases/latest/) [![Last commit](https://img.shields.io/github/last-commit/davidramiro/Marlin-AI3m.svg?style=flat)](https://github.com/davidramiro/Marlin-Ai3M/commits/) [![Travis CI](https://api.travis-ci.org/davidramiro/Marlin-Ai3M.svg?branch=master)](https://travis-ci.org/davidramiro/Marlin-Ai3M)
This is a custom version of the [Marlin Firmware](https://github.com/MarlinFirmware/Marlin) for the i3 Mega/Mega-S, gratefully based on [derhopp's repo](https://github.com/derhopp/Marlin-with-Anycubic-i3-Mega-TFT) with his remarkable efforts to get the Anycubic TFT screen to work with the latest versions of Marlin. This is a custom version of the [Marlin Firmware](https://github.com/MarlinFirmware/Marlin) for the i3 Mega/Mega-S, gratefully based on [derhopp's repo](https://github.com/derhopp/Marlin-with-Anycubic-i3-Mega-TFT) with his remarkable efforts to get the Anycubic TFT screen to work with the latest versions of Marlin.
## RepRapDiscount Full Graphic Smart Controller branch
**This branch is prepared to be used with a 12864 display like the [RepRapDiscount Full Graphic Smart Controller](https://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller).**
Looking for a **BLtouch firmware**? Head [this way](https://github.com/MNieddu91/Marlin-AI3M-BLTouch)! Mounting and configuration instructions are included. Looking for a **BLtouch firmware**? Head [this way](https://github.com/MNieddu91/Marlin-AI3M-BLTouch)! Mounting and configuration instructions are included.
#### Make sure to take a look at the [Wiki](https://github.com/davidramiro/Marlin-AI3M/wiki/), especially the [FAQ](https://github.com/davidramiro/Marlin-AI3M/wiki/Frequently-Asked-Questions). #### Make sure to take a look at the [Wiki](https://github.com/davidramiro/Marlin-AI3M/wiki/), especially the [FAQ](https://github.com/davidramiro/Marlin-AI3M/wiki/Frequently-Asked-Questions).
@@ -70,11 +74,9 @@ I provided three different precompiled hex files: One for no modifications on th
- `M502` - load hard coded default values - `M502` - load hard coded default values
- `M500` - save them to EEPROM - `M500` - save them to EEPROM
**If you are using this on a Mega-S, those four additional commands are necessary:** **If you are using this on a Mega-S, those two additional commands are necessary:**
- `M92 E384` - set correct steps for the new extruder - `M92 E384` - set correct steps for the new extruder
- `M203 E30` - limit extruder feedrate - `M500` - save them
- `M204 R1500.00` - lower retract acceleration
- `M500` - save the values
- I highly recommend calibrating the extruder. - I highly recommend calibrating the extruder.
#### Calibration and other instructions have been moved to the [Wiki](https://github.com/davidramiro/Marlin-AI3M/wiki/Calibration). #### Calibration and other instructions have been moved to the [Wiki](https://github.com/davidramiro/Marlin-AI3M/wiki/Calibration).
@@ -340,7 +342,7 @@ Notable contributors include:
- [[@paulusjacobus](https://github.com/paulusjacobus)] - [[@paulusjacobus](https://github.com/paulusjacobus)]
- [[@psavva](https://github.com/psavva)] - [[@psavva](https://github.com/psavva)]
- [[@Tannoo](https://github.com/Tannoo)] - [[@Tannoo](https://github.com/Tannoo)]
- [[@teemuatlut](https://github.com/teemuatlut)] - [[@TheSFReader](https://github.com/TheSFReader)]
- ...and many others - ...and many others
## License ## License

View File

@@ -29,7 +29,8 @@ build_flags = -fmax-errors=5
lib_deps = lib_deps =
https://github.com/MarlinFirmware/U8glib-HAL/archive/dev.zip https://github.com/MarlinFirmware/U8glib-HAL/archive/dev.zip
LiquidCrystal_I2C@1.1.2 LiquidCrystal_I2C@1.1.2
https://github.com/teemuatlut/TMCStepper.git TMC2130Stepper
https://github.com/teemuatlut/TMC2208Stepper/archive/v0.1.1.zip
Adafruit NeoPixel@1.1.3 Adafruit NeoPixel@1.1.3
https://github.com/lincomatic/LiquidTWI2/archive/30aa480.zip https://github.com/lincomatic/LiquidTWI2/archive/30aa480.zip
https://github.com/ameyer/Arduino-L6470/archive/master.zip https://github.com/ameyer/Arduino-L6470/archive/master.zip