First attempt at refactoring of original servo code. Only adding servo support as a start to keep things simple.

This commit is contained in:
Gord Christmas 2013-05-16 07:03:01 -07:00
parent b668cb0516
commit dc59f07d24
4 changed files with 396 additions and 308 deletions

View file

@ -2,7 +2,7 @@
#define CONFIGURATION_H #define CONFIGURATION_H
// This configurtion file contains the basic settings. // This configurtion file contains the basic settings.
// Advanced settings can be found in Configuration_adv.h // Advanced settings can be found in Configuration_adv.h
// BASIC SETTINGS: select your board type, temperature sensor type, axis scaling, and endstop configuration // BASIC SETTINGS: select your board type, temperature sensor type, axis scaling, and endstop configuration
//User specified version info of this build to display in [Pronterface, etc] terminal window during startup. //User specified version info of this build to display in [Pronterface, etc] terminal window during startup.
@ -78,7 +78,7 @@
// 9 is 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) // 9 is 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup)
// 10 is 100k RS thermistor 198-961 (4.7k pullup) // 10 is 100k RS thermistor 198-961 (4.7k pullup)
// //
// 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k // 1k ohm pullup tables - This is not normal, you would have to have changed out your 4.7k for 1k
// (but gives greater accuracy and more stable PID) // (but gives greater accuracy and more stable PID)
// 51 is 100k thermistor - EPCOS (1k pullup) // 51 is 100k thermistor - EPCOS (1k pullup)
// 52 is 200k thermistor - ATC Semitec 204GT-2 (1k pullup) // 52 is 200k thermistor - ATC Semitec 204GT-2 (1k pullup)
@ -95,7 +95,7 @@
#define TEMP_WINDOW 1 // (degC) Window around target to start the recidency timer x degC early. #define TEMP_WINDOW 1 // (degC) Window around target to start the recidency timer x degC early.
// The minimal temperature defines the temperature below which the heater will not be enabled It is used // The minimal temperature defines the temperature below which the heater will not be enabled It is used
// to check that the wiring to the thermistor is not broken. // to check that the wiring to the thermistor is not broken.
// Otherwise this would lead to the heater being powered on all the time. // Otherwise this would lead to the heater being powered on all the time.
#define HEATER_0_MINTEMP 5 #define HEATER_0_MINTEMP 5
#define HEATER_1_MINTEMP 5 #define HEATER_1_MINTEMP 5
@ -121,7 +121,7 @@
#define BANG_MAX 256 // limits current to nozzle while in bang-bang mode; 256=full current #define BANG_MAX 256 // limits current to nozzle while in bang-bang mode; 256=full current
#define PID_MAX 256 // limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 256=full current #define PID_MAX 256 // limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 256=full current
#ifdef PIDTEMP #ifdef PIDTEMP
//#define PID_DEBUG // Sends debug data to the serial port. //#define PID_DEBUG // Sends debug data to the serial port.
//#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX
#define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature
// is more then PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. // is more then PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max.
@ -132,15 +132,15 @@
// If you are using a preconfigured hotend then you can use one of the value sets by uncommenting it // If you are using a preconfigured hotend then you can use one of the value sets by uncommenting it
// Ultimaker // Ultimaker
#define DEFAULT_Kp 22.2 #define DEFAULT_Kp 22.2
#define DEFAULT_Ki 1.08 #define DEFAULT_Ki 1.08
#define DEFAULT_Kd 114 #define DEFAULT_Kd 114
// Makergear // Makergear
// #define DEFAULT_Kp 7.0 // #define DEFAULT_Kp 7.0
// #define DEFAULT_Ki 0.1 // #define DEFAULT_Ki 0.1
// #define DEFAULT_Kd 12 // #define DEFAULT_Kd 12
// Mendel Parts V9 on 12V // Mendel Parts V9 on 12V
// #define DEFAULT_Kp 63.0 // #define DEFAULT_Kp 63.0
// #define DEFAULT_Ki 2.25 // #define DEFAULT_Ki 2.25
// #define DEFAULT_Kd 440 // #define DEFAULT_Kd 440
@ -149,11 +149,11 @@
// Bed Temperature Control // Bed Temperature Control
// Select PID or bang-bang with PIDTEMPBED. If bang-bang, BED_LIMIT_SWITCHING will enable hysteresis // Select PID or bang-bang with PIDTEMPBED. If bang-bang, BED_LIMIT_SWITCHING will enable hysteresis
// //
// uncomment this to enable PID on the bed. It uses the same ferquency PWM as the extruder. // uncomment this to enable PID on the bed. It uses the same ferquency PWM as the extruder.
// If your PID_dT above is the default, and correct for your hardware/configuration, that means 7.689Hz, // If your PID_dT above is the default, and correct for your hardware/configuration, that means 7.689Hz,
// which is fine for driving a square wave into a resistive load and does not significantly impact you FET heating. // which is fine for driving a square wave into a resistive load and does not significantly impact you FET heating.
// This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W heater. // This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W heater.
// If your configuration is significantly different than this and you don't understand the issues involved, you proabaly // If your configuration is significantly different than this and you don't understand the issues involved, you proabaly
// shouldn't use bed PID until someone else verifies your hardware works. // shouldn't use bed PID until someone else verifies your hardware works.
// If this is enabled, find your own PID constants below. // If this is enabled, find your own PID constants below.
//#define PIDTEMPBED //#define PIDTEMPBED
@ -223,9 +223,9 @@
#endif #endif
// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins. // The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
const bool X_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops. const bool X_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
const bool Y_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops. const bool Y_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops. const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
//#define DISABLE_MAX_ENDSTOPS //#define DISABLE_MAX_ENDSTOPS
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 // For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
@ -280,13 +280,13 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E #define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0} // set the homing speeds (mm/min) #define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0} // set the homing speeds (mm/min)
// default settings // default settings
#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200.0*8/3,760*1.1} // default steps per unit for ultimaker #define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200.0*8/3,760*1.1} // default steps per unit for ultimaker
#define DEFAULT_MAX_FEEDRATE {500, 500, 5, 25} // (mm/sec) #define DEFAULT_MAX_FEEDRATE {500, 500, 5, 25} // (mm/sec)
#define DEFAULT_MAX_ACCELERATION {9000,9000,100,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot. #define DEFAULT_MAX_ACCELERATION {9000,9000,100,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot.
#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E max acceleration in mm/s^2 for printing moves #define DEFAULT_ACCELERATION 3000 // X, Y, Z and E max acceleration in mm/s^2 for printing moves
#define DEFAULT_RETRACT_ACCELERATION 3000 // X, Y, Z and E max acceleration in mm/s^2 for r retracts #define DEFAULT_RETRACT_ACCELERATION 3000 // X, Y, Z and E max acceleration in mm/s^2 for r retracts
// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). // Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing).
@ -307,7 +307,7 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
// EEPROM // EEPROM
// the microcontroller can store settings in the EEPROM, e.g. max velocity... // the microcontroller can store settings in the EEPROM, e.g. max velocity...
// M500 - stores paramters in EEPROM // M500 - stores paramters in EEPROM
// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). // M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily).
// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. // M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to.
//define this to enable eeprom support //define this to enable eeprom support
//#define EEPROM_SETTINGS //#define EEPROM_SETTINGS
@ -353,7 +353,7 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
#if defined(ULTIMAKERCONTROLLER) || defined(REPRAP_DISCOUNT_SMART_CONTROLLER) || defined(G3D_PANEL) #if defined(ULTIMAKERCONTROLLER) || defined(REPRAP_DISCOUNT_SMART_CONTROLLER) || defined(G3D_PANEL)
#define ULTIPANEL #define ULTIPANEL
#define NEWPANEL #define NEWPANEL
#endif #endif
#if defined(REPRAPWORLD_KEYPAD) #if defined(REPRAPWORLD_KEYPAD)
#define NEWPANEL #define NEWPANEL
@ -361,7 +361,7 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
#endif #endif
// Preheat Constants // Preheat Constants
#define PLA_PREHEAT_HOTEND_TEMP 180 #define PLA_PREHEAT_HOTEND_TEMP 180
#define PLA_PREHEAT_HPB_TEMP 70 #define PLA_PREHEAT_HPB_TEMP 70
#define PLA_PREHEAT_FAN_SPEED 255 // Insert Value between 0 and 255 #define PLA_PREHEAT_FAN_SPEED 255 // Insert Value between 0 and 255
@ -381,7 +381,7 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
#define LCD_WIDTH 20 #define LCD_WIDTH 20
#define LCD_HEIGHT 4 #define LCD_HEIGHT 4
#endif #endif
#else //no panel but just lcd #else //no panel but just lcd
#ifdef ULTRA_LCD #ifdef ULTRA_LCD
#ifdef DOGLCD // Change number of lines to match the 128x64 graphics display #ifdef DOGLCD // Change number of lines to match the 128x64 graphics display
#define LCD_WIDTH 20 #define LCD_WIDTH 20
@ -389,7 +389,7 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
#else #else
#define LCD_WIDTH 16 #define LCD_WIDTH 16
#define LCD_HEIGHT 2 #define LCD_HEIGHT 2
#endif #endif
#endif #endif
#endif #endif
@ -406,6 +406,23 @@ const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of th
// Support for the BariCUDA Paste Extruder. // Support for the BariCUDA Paste Extruder.
//#define BARICUDA //#define BARICUDA
/*********************************************************************\
*
* R/C SERVO support
*
* Sponsored by TrinityLabs, Reworked by codexmas
*
**********************************************************************/
// Number of servos
//
// If you select a configuration below, this will receive a default value and does not need to be set manually
// set it manually if you have more servos than extruders and wish to manually control some
// leaving it undefined or defining as 0 will disable the servo subsystem
// If unsure, leave commented / disabled
//
// #define NUM_SERVOS 3
#include "Configuration_adv.h" #include "Configuration_adv.h"
#include "thermistortables.h" #include "thermistortables.h"

View file

@ -3,17 +3,17 @@
/* /*
Reprap firmware based on Sprinter and grbl. Reprap firmware based on Sprinter and grbl.
Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -22,8 +22,8 @@
This firmware is a mashup between Sprinter and grbl. This firmware is a mashup between Sprinter and grbl.
(https://github.com/kliment/Sprinter) (https://github.com/kliment/Sprinter)
(https://github.com/simen/grbl/tree) (https://github.com/simen/grbl/tree)
It has preliminary support for Matthew Roberts advance algorithm It has preliminary support for Matthew Roberts advance algorithm
http://reprap.org/pipermail/reprap-dev/2011-May/003323.html http://reprap.org/pipermail/reprap-dev/2011-May/003323.html
*/ */
@ -40,6 +40,10 @@
#include "language.h" #include "language.h"
#include "pins_arduino.h" #include "pins_arduino.h"
#if (defined NUM_SERVOS) && (NUM_SERVOS > 0)
#include "Servo.h"
#endif
#if DIGIPOTSS_PIN > -1 #if DIGIPOTSS_PIN > -1
#include <SPI.h> #include <SPI.h>
#endif #endif
@ -93,11 +97,11 @@
// M81 - Turn off Power Supply // M81 - Turn off Power Supply
// M82 - Set E codes absolute (default) // M82 - Set E codes absolute (default)
// M83 - Set E codes relative while in Absolute Coordinates (G90) mode // M83 - Set E codes relative while in Absolute Coordinates (G90) mode
// M84 - Disable steppers until next move, // M84 - Disable steppers until next move,
// or use S<seconds> to specify an inactivity timeout, after which the steppers will be disabled. S0 to disable the timeout. // or use S<seconds> to specify an inactivity timeout, after which the steppers will be disabled. S0 to disable the timeout.
// M85 - Set inactivity shutdown timer with parameter S<seconds>. To disable set zero (default) // M85 - Set inactivity shutdown timer with parameter S<seconds>. To disable set zero (default)
// M92 - Set axis_steps_per_unit - same syntax as G92 // M92 - Set axis_steps_per_unit - same syntax as G92
// M114 - Output current position to serial port // M114 - Output current position to serial port
// M115 - Capabilities string // M115 - Capabilities string
// M117 - display message // M117 - display message
// M119 - Output Endstop status to serial port // M119 - Output Endstop status to serial port
@ -121,6 +125,7 @@
// M220 S<factor in percent>- set speed factor override percentage // M220 S<factor in percent>- set speed factor override percentage
// M221 S<factor in percent>- set extrude factor override percentage // M221 S<factor in percent>- set extrude factor override percentage
// M240 - Trigger a camera to take a photograph // M240 - Trigger a camera to take a photograph
// M280 - set servo position absolute. P: servo index, S: angle or microseconds
// M300 - Play beepsound S<frequency Hz> P<duration ms> // M300 - Play beepsound S<frequency Hz> P<duration ms>
// M301 - Set PID parameters P I and D // M301 - Set PID parameters P I and D
// M302 - Allow cold extrudes // M302 - Allow cold extrudes
@ -128,7 +133,7 @@
// M304 - Set bed PID parameters P I and D // M304 - Set bed PID parameters P I and D
// M400 - Finish all moves // M400 - Finish all moves
// M500 - stores paramters in EEPROM // M500 - stores paramters in EEPROM
// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). // M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily).
// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. // M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to.
// M503 - print the current settings (from memory not from eeprom) // M503 - print the current settings (from memory not from eeprom)
// M540 - Use S[0|1] to enable or disable the stop SD card print on endstop hit (requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) // M540 - Use S[0|1] to enable or disable the stop SD card print on endstop hit (requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED)
@ -164,11 +169,11 @@ float min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS };
float max_pos[3] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS }; float max_pos[3] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS };
// Extruder offset, only in XY plane // Extruder offset, only in XY plane
#if EXTRUDERS > 1 #if EXTRUDERS > 1
float extruder_offset[2][EXTRUDERS] = { float extruder_offset[2][EXTRUDERS] = {
#if defined(EXTRUDER_OFFSET_X) && defined(EXTRUDER_OFFSET_Y) #if defined(EXTRUDER_OFFSET_X) && defined(EXTRUDER_OFFSET_Y)
EXTRUDER_OFFSET_X, EXTRUDER_OFFSET_Y EXTRUDER_OFFSET_X, EXTRUDER_OFFSET_Y
#endif #endif
}; };
#endif #endif
uint8_t active_extruder = 0; uint8_t active_extruder = 0;
int fanSpeed=0; int fanSpeed=0;
@ -225,6 +230,10 @@ static uint8_t tmp_extruder;
bool Stopped=false; bool Stopped=false;
#if (defined NUM_SERVOS) && (NUM_SERVOS > 0)
Servo servos[NUM_SERVOS];
#endif
//=========================================================================== //===========================================================================
//=============================ROUTINES============================= //=============================ROUTINES=============================
//=========================================================================== //===========================================================================
@ -296,7 +305,7 @@ void setup_killpin()
WRITE(KILL_PIN,HIGH); WRITE(KILL_PIN,HIGH);
#endif #endif
} }
void setup_photpin() void setup_photpin()
{ {
#ifdef PHOTOGRAPH_PIN #ifdef PHOTOGRAPH_PIN
@ -304,7 +313,7 @@ void setup_photpin()
SET_OUTPUT(PHOTOGRAPH_PIN); SET_OUTPUT(PHOTOGRAPH_PIN);
WRITE(PHOTOGRAPH_PIN, LOW); WRITE(PHOTOGRAPH_PIN, LOW);
#endif #endif
#endif #endif
} }
void setup_powerhold() void setup_powerhold()
@ -324,16 +333,35 @@ void setup_powerhold()
void suicide() void suicide()
{ {
#ifdef SUICIDE_PIN #ifdef SUICIDE_PIN
#if (SUICIDE_PIN> -1) #if (SUICIDE_PIN> -1)
SET_OUTPUT(SUICIDE_PIN); SET_OUTPUT(SUICIDE_PIN);
WRITE(SUICIDE_PIN, LOW); WRITE(SUICIDE_PIN, LOW);
#endif #endif
#endif #endif
} }
void servo_init()
{
#if (NUM_SERVOS >= 1) && defined (SERVO0_PIN) && (SERVO0_PIN > -1)
servos[0].attach(SERVO0_PIN);
#endif
#if (NUM_SERVOS >= 2) && defined (SERVO1_PIN) && (SERVO1_PIN > -1)
servos[1].attach(SERVO1_PIN);
#endif
#if (NUM_SERVOS >= 3) && defined (SERVO2_PIN) && (SERVO2_PIN > -1)
servos[2].attach(SERVO2_PIN);
#endif
#if (NUM_SERVOS >= 4) && defined (SERVO3_PIN) && (SERVO3_PIN > -1)
servos[3].attach(SERVO3_PIN);
#endif
#if (NUM_SERVOS >= 5)
#error "TODO: enter initalisation code for more servos"
#endif
}
void setup() void setup()
{ {
setup_killpin(); setup_killpin();
setup_powerhold(); setup_powerhold();
MYSERIAL.begin(BAUDRATE); MYSERIAL.begin(BAUDRATE);
SERIAL_PROTOCOLLNPGM("start"); SERIAL_PROTOCOLLNPGM("start");
@ -370,22 +398,23 @@ void setup()
{ {
fromsd[i] = false; fromsd[i] = false;
} }
// loads data from EEPROM if available else uses defaults (and resets step acceleration rate)
Config_RetrieveSettings();
tp_init(); // Initialize temperature loop // loads data from EEPROM if available else uses defaults (and resets step acceleration rate)
Config_RetrieveSettings();
tp_init(); // Initialize temperature loop
plan_init(); // Initialize planner; plan_init(); // Initialize planner;
watchdog_init(); watchdog_init();
st_init(); // Initialize stepper, this enables interrupts! st_init(); // Initialize stepper, this enables interrupts!
setup_photpin(); setup_photpin();
servo_init();
lcd_init(); lcd_init();
#ifdef CONTROLLERFAN_PIN #ifdef CONTROLLERFAN_PIN
SET_OUTPUT(CONTROLLERFAN_PIN); //Set pin used for driver cooling fan SET_OUTPUT(CONTROLLERFAN_PIN); //Set pin used for driver cooling fan
#endif #endif
#ifdef EXTRUDERFAN_PIN #ifdef EXTRUDERFAN_PIN
SET_OUTPUT(EXTRUDERFAN_PIN); //Set pin used for extruder cooling fan SET_OUTPUT(EXTRUDERFAN_PIN); //Set pin used for extruder cooling fan
#endif #endif
@ -439,14 +468,14 @@ void loop()
lcd_update(); lcd_update();
} }
void get_command() void get_command()
{ {
while( MYSERIAL.available() > 0 && buflen < BUFSIZE) { while( MYSERIAL.available() > 0 && buflen < BUFSIZE) {
serial_char = MYSERIAL.read(); serial_char = MYSERIAL.read();
if(serial_char == '\n' || if(serial_char == '\n' ||
serial_char == '\r' || serial_char == '\r' ||
(serial_char == ':' && comment_mode == false) || (serial_char == ':' && comment_mode == false) ||
serial_count >= (MAX_CMD_SIZE - 1) ) serial_count >= (MAX_CMD_SIZE - 1) )
{ {
if(!serial_count) { //if empty line if(!serial_count) { //if empty line
comment_mode = false; //for new command comment_mode = false; //for new command
@ -487,7 +516,7 @@ void get_command()
} }
//if no errors, continue parsing //if no errors, continue parsing
} }
else else
{ {
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORPGM(MSG_ERR_NO_CHECKSUM); SERIAL_ERRORPGM(MSG_ERR_NO_CHECKSUM);
@ -523,7 +552,7 @@ void get_command()
if(card.saving) if(card.saving)
break; break;
#endif //SDSUPPORT #endif //SDSUPPORT
SERIAL_PROTOCOLLNPGM(MSG_OK); SERIAL_PROTOCOLLNPGM(MSG_OK);
} }
else { else {
SERIAL_ERRORLNPGM(MSG_ERR_STOPPED); SERIAL_ERRORLNPGM(MSG_ERR_STOPPED);
@ -553,10 +582,10 @@ void get_command()
while( !card.eof() && buflen < BUFSIZE) { while( !card.eof() && buflen < BUFSIZE) {
int16_t n=card.get(); int16_t n=card.get();
serial_char = (char)n; serial_char = (char)n;
if(serial_char == '\n' || if(serial_char == '\n' ||
serial_char == '\r' || serial_char == '\r' ||
(serial_char == ':' && comment_mode == false) || (serial_char == ':' && comment_mode == false) ||
serial_count >= (MAX_CMD_SIZE - 1)||n==-1) serial_count >= (MAX_CMD_SIZE - 1)||n==-1)
{ {
if(card.eof()){ if(card.eof()){
SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED); SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED);
@ -572,7 +601,7 @@ void get_command()
lcd_setstatus(time); lcd_setstatus(time);
card.printingHasFinished(); card.printingHasFinished();
card.checkautostart(true); card.checkautostart(true);
} }
if(!serial_count) if(!serial_count)
{ {
@ -584,7 +613,7 @@ void get_command()
fromsd[bufindw] = true; fromsd[bufindw] = true;
buflen += 1; buflen += 1;
bufindw = (bufindw + 1)%BUFSIZE; bufindw = (bufindw + 1)%BUFSIZE;
// } // }
comment_mode = false; //for new command comment_mode = false; //for new command
serial_count = 0; //clear buffer serial_count = 0; //clear buffer
} }
@ -594,20 +623,20 @@ void get_command()
if(!comment_mode) cmdbuffer[bufindw][serial_count++] = serial_char; if(!comment_mode) cmdbuffer[bufindw][serial_count++] = serial_char;
} }
} }
#endif //SDSUPPORT #endif //SDSUPPORT
} }
float code_value() float code_value()
{ {
return (strtod(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL)); return (strtod(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL));
} }
long code_value_long() long code_value_long()
{ {
return (strtol(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL, 10)); return (strtol(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL, 10));
} }
bool code_seen(char code) bool code_seen(char code)
@ -656,19 +685,19 @@ static void homeaxis(int axis) {
feedrate = homing_feedrate[axis]; feedrate = homing_feedrate[axis];
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
st_synchronize(); st_synchronize();
current_position[axis] = 0; current_position[axis] = 0;
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
destination[axis] = -home_retract_mm(axis) * home_dir(axis); destination[axis] = -home_retract_mm(axis) * home_dir(axis);
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
st_synchronize(); st_synchronize();
destination[axis] = 2*home_retract_mm(axis) * home_dir(axis); destination[axis] = 2*home_retract_mm(axis) * home_dir(axis);
feedrate = homing_feedrate[axis]/2 ; feedrate = homing_feedrate[axis]/2 ;
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
st_synchronize(); st_synchronize();
axis_is_at_home(axis); axis_is_at_home(axis);
destination[axis] = current_position[axis]; destination[axis] = current_position[axis];
feedrate = 0.0; feedrate = 0.0;
endstops_hit_on_purpose(); endstops_hit_on_purpose();
@ -711,7 +740,7 @@ void process_commands()
codenum = 0; codenum = 0;
if(code_seen('P')) codenum = code_value(); // milliseconds to wait if(code_seen('P')) codenum = code_value(); // milliseconds to wait
if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait
st_synchronize(); st_synchronize();
codenum += millis(); // keep track of when we started waiting codenum += millis(); // keep track of when we started waiting
previous_millis_cmd = millis(); previous_millis_cmd = millis();
@ -721,30 +750,30 @@ void process_commands()
lcd_update(); lcd_update();
} }
break; break;
#ifdef FWRETRACT #ifdef FWRETRACT
case 10: // G10 retract case 10: // G10 retract
if(!retracted) if(!retracted)
{ {
destination[X_AXIS]=current_position[X_AXIS]; destination[X_AXIS]=current_position[X_AXIS];
destination[Y_AXIS]=current_position[Y_AXIS]; destination[Y_AXIS]=current_position[Y_AXIS];
destination[Z_AXIS]=current_position[Z_AXIS]; destination[Z_AXIS]=current_position[Z_AXIS];
current_position[Z_AXIS]+=-retract_zlift; current_position[Z_AXIS]+=-retract_zlift;
destination[E_AXIS]=current_position[E_AXIS]-retract_length; destination[E_AXIS]=current_position[E_AXIS]-retract_length;
feedrate=retract_feedrate; feedrate=retract_feedrate;
retracted=true; retracted=true;
prepare_move(); prepare_move();
} }
break; break;
case 11: // G10 retract_recover case 11: // G10 retract_recover
if(!retracted) if(!retracted)
{ {
destination[X_AXIS]=current_position[X_AXIS]; destination[X_AXIS]=current_position[X_AXIS];
destination[Y_AXIS]=current_position[Y_AXIS]; destination[Y_AXIS]=current_position[Y_AXIS];
destination[Z_AXIS]=current_position[Z_AXIS]; destination[Z_AXIS]=current_position[Z_AXIS];
current_position[Z_AXIS]+=retract_zlift; current_position[Z_AXIS]+=retract_zlift;
current_position[E_AXIS]+=-retract_recover_length; current_position[E_AXIS]+=-retract_recover_length;
feedrate=retract_recover_feedrate; feedrate=retract_recover_feedrate;
retracted=false; retracted=false;
prepare_move(); prepare_move();
@ -756,34 +785,34 @@ void process_commands()
saved_feedmultiply = feedmultiply; saved_feedmultiply = feedmultiply;
feedmultiply = 100; feedmultiply = 100;
previous_millis_cmd = millis(); previous_millis_cmd = millis();
enable_endstops(true); enable_endstops(true);
for(int8_t i=0; i < NUM_AXIS; i++) { for(int8_t i=0; i < NUM_AXIS; i++) {
destination[i] = current_position[i]; destination[i] = current_position[i];
} }
feedrate = 0.0; feedrate = 0.0;
home_all_axis = !((code_seen(axis_codes[0])) || (code_seen(axis_codes[1])) || (code_seen(axis_codes[2]))); home_all_axis = !((code_seen(axis_codes[0])) || (code_seen(axis_codes[1])) || (code_seen(axis_codes[2])));
#if Z_HOME_DIR > 0 // If homing away from BED do Z first #if Z_HOME_DIR > 0 // If homing away from BED do Z first
if((home_all_axis) || (code_seen(axis_codes[Z_AXIS]))) { if((home_all_axis) || (code_seen(axis_codes[Z_AXIS]))) {
HOMEAXIS(Z); HOMEAXIS(Z);
} }
#endif #endif
#ifdef QUICK_HOME #ifdef QUICK_HOME
if((home_all_axis)||( code_seen(axis_codes[X_AXIS]) && code_seen(axis_codes[Y_AXIS])) ) //first diagonal move if((home_all_axis)||( code_seen(axis_codes[X_AXIS]) && code_seen(axis_codes[Y_AXIS])) ) //first diagonal move
{ {
current_position[X_AXIS] = 0;current_position[Y_AXIS] = 0; current_position[X_AXIS] = 0;current_position[Y_AXIS] = 0;
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
destination[X_AXIS] = 1.5 * X_MAX_LENGTH * X_HOME_DIR;destination[Y_AXIS] = 1.5 * Y_MAX_LENGTH * Y_HOME_DIR; destination[X_AXIS] = 1.5 * X_MAX_LENGTH * X_HOME_DIR;destination[Y_AXIS] = 1.5 * Y_MAX_LENGTH * Y_HOME_DIR;
feedrate = homing_feedrate[X_AXIS]; feedrate = homing_feedrate[X_AXIS];
if(homing_feedrate[Y_AXIS]<feedrate) if(homing_feedrate[Y_AXIS]<feedrate)
feedrate =homing_feedrate[Y_AXIS]; feedrate =homing_feedrate[Y_AXIS];
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
st_synchronize(); st_synchronize();
axis_is_at_home(X_AXIS); axis_is_at_home(X_AXIS);
axis_is_at_home(Y_AXIS); axis_is_at_home(Y_AXIS);
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
@ -795,8 +824,8 @@ void process_commands()
endstops_hit_on_purpose(); endstops_hit_on_purpose();
} }
#endif #endif
if((home_all_axis) || (code_seen(axis_codes[X_AXIS]))) if((home_all_axis) || (code_seen(axis_codes[X_AXIS])))
{ {
HOMEAXIS(X); HOMEAXIS(X);
} }
@ -804,14 +833,14 @@ void process_commands()
if((home_all_axis) || (code_seen(axis_codes[Y_AXIS]))) { if((home_all_axis) || (code_seen(axis_codes[Y_AXIS]))) {
HOMEAXIS(Y); HOMEAXIS(Y);
} }
#if Z_HOME_DIR < 0 // If homing towards BED do Z last #if Z_HOME_DIR < 0 // If homing towards BED do Z last
if((home_all_axis) || (code_seen(axis_codes[Z_AXIS]))) { if((home_all_axis) || (code_seen(axis_codes[Z_AXIS]))) {
HOMEAXIS(Z); HOMEAXIS(Z);
} }
#endif #endif
if(code_seen(axis_codes[X_AXIS])) if(code_seen(axis_codes[X_AXIS]))
{ {
if(code_value_long() != 0) { if(code_value_long() != 0) {
current_position[X_AXIS]=code_value()+add_homeing[0]; current_position[X_AXIS]=code_value()+add_homeing[0];
@ -830,11 +859,11 @@ void process_commands()
} }
} }
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
#ifdef ENDSTOPS_ONLY_FOR_HOMING #ifdef ENDSTOPS_ONLY_FOR_HOMING
enable_endstops(false); enable_endstops(false);
#endif #endif
feedrate = saved_feedrate; feedrate = saved_feedrate;
feedmultiply = saved_feedmultiply; feedmultiply = saved_feedmultiply;
previous_millis_cmd = millis(); previous_millis_cmd = millis();
@ -850,13 +879,13 @@ void process_commands()
if(!code_seen(axis_codes[E_AXIS])) if(!code_seen(axis_codes[E_AXIS]))
st_synchronize(); st_synchronize();
for(int8_t i=0; i < NUM_AXIS; i++) { for(int8_t i=0; i < NUM_AXIS; i++) {
if(code_seen(axis_codes[i])) { if(code_seen(axis_codes[i])) {
if(i == E_AXIS) { if(i == E_AXIS) {
current_position[i] = code_value(); current_position[i] = code_value();
plan_set_e_position(current_position[E_AXIS]); plan_set_e_position(current_position[E_AXIS]);
} }
else { else {
current_position[i] = code_value()+add_homeing[i]; current_position[i] = code_value()+add_homeing[i];
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
} }
} }
@ -867,7 +896,7 @@ void process_commands()
else if(code_seen('M')) else if(code_seen('M'))
{ {
switch( (int)code_value() ) switch( (int)code_value() )
{ {
#ifdef ULTIPANEL #ifdef ULTIPANEL
case 0: // M0 - Unconditional stop - Wait for user button press on LCD case 0: // M0 - Unconditional stop - Wait for user button press on LCD
@ -877,7 +906,7 @@ void process_commands()
codenum = 0; codenum = 0;
if(code_seen('P')) codenum = code_value(); // milliseconds to wait if(code_seen('P')) codenum = code_value(); // milliseconds to wait
if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait
st_synchronize(); st_synchronize();
previous_millis_cmd = millis(); previous_millis_cmd = millis();
if (codenum > 0){ if (codenum > 0){
@ -900,12 +929,12 @@ void process_commands()
#endif #endif
case 17: case 17:
LCD_MESSAGEPGM(MSG_NO_MOVE); LCD_MESSAGEPGM(MSG_NO_MOVE);
enable_x(); enable_x();
enable_y(); enable_y();
enable_z(); enable_z();
enable_e0(); enable_e0();
enable_e1(); enable_e1();
enable_e2(); enable_e2();
break; break;
#ifdef SDSUPPORT #ifdef SDSUPPORT
@ -915,9 +944,9 @@ void process_commands()
SERIAL_PROTOCOLLNPGM(MSG_END_FILE_LIST); SERIAL_PROTOCOLLNPGM(MSG_END_FILE_LIST);
break; break;
case 21: // M21 - init SD card case 21: // M21 - init SD card
card.initsd(); card.initsd();
break; break;
case 22: //M22 - release SD card case 22: //M22 - release SD card
card.release(); card.release();
@ -957,7 +986,7 @@ void process_commands()
//processed in write to file routine above //processed in write to file routine above
//card,saving = false; //card,saving = false;
break; break;
case 30: //M30 <filename> Delete File case 30: //M30 <filename> Delete File
if (card.cardOK){ if (card.cardOK){
card.closefile(); card.closefile();
starpos = (strchr(strchr_pointer + 4,'*')); starpos = (strchr(strchr_pointer + 4,'*'));
@ -978,7 +1007,7 @@ void process_commands()
} }
card.openLogFile(strchr_pointer+5); card.openLogFile(strchr_pointer+5);
break; break;
#endif //SDSUPPORT #endif //SDSUPPORT
case 31: //M31 take time since the start of the SD print or an M109 command case 31: //M31 take time since the start of the SD print or an M109 command
@ -1035,11 +1064,11 @@ void process_commands()
} }
#if (TEMP_0_PIN > -1) #if (TEMP_0_PIN > -1)
SERIAL_PROTOCOLPGM("ok T:"); SERIAL_PROTOCOLPGM("ok T:");
SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1); SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1);
SERIAL_PROTOCOLPGM(" /"); SERIAL_PROTOCOLPGM(" /");
SERIAL_PROTOCOL_F(degTargetHotend(tmp_extruder),1); SERIAL_PROTOCOL_F(degTargetHotend(tmp_extruder),1);
#if TEMP_BED_PIN > -1 #if TEMP_BED_PIN > -1
SERIAL_PROTOCOLPGM(" B:"); SERIAL_PROTOCOLPGM(" B:");
SERIAL_PROTOCOL_F(degBed(),1); SERIAL_PROTOCOL_F(degBed(),1);
SERIAL_PROTOCOLPGM(" /"); SERIAL_PROTOCOLPGM(" /");
SERIAL_PROTOCOL_F(degTargetBed(),1); SERIAL_PROTOCOL_F(degTargetBed(),1);
@ -1050,20 +1079,20 @@ void process_commands()
#endif #endif
SERIAL_PROTOCOLPGM(" @:"); SERIAL_PROTOCOLPGM(" @:");
SERIAL_PROTOCOL(getHeaterPower(tmp_extruder)); SERIAL_PROTOCOL(getHeaterPower(tmp_extruder));
SERIAL_PROTOCOLPGM(" B@:"); SERIAL_PROTOCOLPGM(" B@:");
SERIAL_PROTOCOL(getHeaterPower(-1)); SERIAL_PROTOCOL(getHeaterPower(-1));
SERIAL_PROTOCOLLN(""); SERIAL_PROTOCOLLN("");
return; return;
break; break;
case 109: case 109:
{// M109 - Wait for extruder heater to reach target. {// M109 - Wait for extruder heater to reach target.
if(setTargetedHotend(109)){ if(setTargetedHotend(109)){
break; break;
} }
LCD_MESSAGEPGM(MSG_HEATING); LCD_MESSAGEPGM(MSG_HEATING);
#ifdef AUTOTEMP #ifdef AUTOTEMP
autotemp_enabled=false; autotemp_enabled=false;
#endif #endif
@ -1071,15 +1100,15 @@ void process_commands()
#ifdef AUTOTEMP #ifdef AUTOTEMP
if (code_seen('S')) autotemp_min=code_value(); if (code_seen('S')) autotemp_min=code_value();
if (code_seen('B')) autotemp_max=code_value(); if (code_seen('B')) autotemp_max=code_value();
if (code_seen('F')) if (code_seen('F'))
{ {
autotemp_factor=code_value(); autotemp_factor=code_value();
autotemp_enabled=true; autotemp_enabled=true;
} }
#endif #endif
setWatch(); setWatch();
codenum = millis(); codenum = millis();
/* See if we are heating up or cooling down */ /* See if we are heating up or cooling down */
bool target_direction = isHeatingHotend(tmp_extruder); // true if heating, false if cooling bool target_direction = isHeatingHotend(tmp_extruder); // true if heating, false if cooling
@ -1087,7 +1116,7 @@ void process_commands()
#ifdef TEMP_RESIDENCY_TIME #ifdef TEMP_RESIDENCY_TIME
long residencyStart; long residencyStart;
residencyStart = -1; residencyStart = -1;
/* continue to loop until we have reached the target temp /* continue to loop until we have reached the target temp
_and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */ _and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
while((residencyStart == -1) || while((residencyStart == -1) ||
(residencyStart >= 0 && (((unsigned int) (millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))) ) { (residencyStart >= 0 && (((unsigned int) (millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL))) ) {
@ -1097,9 +1126,9 @@ void process_commands()
if( (millis() - codenum) > 1000UL ) if( (millis() - codenum) > 1000UL )
{ //Print Temp Reading and remaining time every 1 second while heating up/cooling down { //Print Temp Reading and remaining time every 1 second while heating up/cooling down
SERIAL_PROTOCOLPGM("T:"); SERIAL_PROTOCOLPGM("T:");
SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1); SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1);
SERIAL_PROTOCOLPGM(" E:"); SERIAL_PROTOCOLPGM(" E:");
SERIAL_PROTOCOL((int)tmp_extruder); SERIAL_PROTOCOL((int)tmp_extruder);
#ifdef TEMP_RESIDENCY_TIME #ifdef TEMP_RESIDENCY_TIME
SERIAL_PROTOCOLPGM(" W:"); SERIAL_PROTOCOLPGM(" W:");
if(residencyStart > -1) if(residencyStart > -1)
@ -1107,7 +1136,7 @@ void process_commands()
codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (millis() - residencyStart)) / 1000UL; codenum = ((TEMP_RESIDENCY_TIME * 1000UL) - (millis() - residencyStart)) / 1000UL;
SERIAL_PROTOCOLLN( codenum ); SERIAL_PROTOCOLLN( codenum );
} }
else else
{ {
SERIAL_PROTOCOLLN( "?" ); SERIAL_PROTOCOLLN( "?" );
} }
@ -1124,7 +1153,7 @@ void process_commands()
or when current temp falls outside the hysteresis after target temp was reached */ or when current temp falls outside the hysteresis after target temp was reached */
if ((residencyStart == -1 && target_direction && (degHotend(tmp_extruder) >= (degTargetHotend(tmp_extruder)-TEMP_WINDOW))) || if ((residencyStart == -1 && target_direction && (degHotend(tmp_extruder) >= (degTargetHotend(tmp_extruder)-TEMP_WINDOW))) ||
(residencyStart == -1 && !target_direction && (degHotend(tmp_extruder) <= (degTargetHotend(tmp_extruder)+TEMP_WINDOW))) || (residencyStart == -1 && !target_direction && (degHotend(tmp_extruder) <= (degTargetHotend(tmp_extruder)+TEMP_WINDOW))) ||
(residencyStart > -1 && labs(degHotend(tmp_extruder) - degTargetHotend(tmp_extruder)) > TEMP_HYSTERESIS) ) (residencyStart > -1 && labs(degHotend(tmp_extruder) - degTargetHotend(tmp_extruder)) > TEMP_HYSTERESIS) )
{ {
residencyStart = millis(); residencyStart = millis();
} }
@ -1139,8 +1168,8 @@ void process_commands()
#if TEMP_BED_PIN > -1 #if TEMP_BED_PIN > -1
LCD_MESSAGEPGM(MSG_BED_HEATING); LCD_MESSAGEPGM(MSG_BED_HEATING);
if (code_seen('S')) setTargetBed(code_value()); if (code_seen('S')) setTargetBed(code_value());
codenum = millis(); codenum = millis();
while(isHeatingBed()) while(isHeatingBed())
{ {
if(( millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up. if(( millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
{ {
@ -1148,11 +1177,11 @@ void process_commands()
SERIAL_PROTOCOLPGM("T:"); SERIAL_PROTOCOLPGM("T:");
SERIAL_PROTOCOL(tt); SERIAL_PROTOCOL(tt);
SERIAL_PROTOCOLPGM(" E:"); SERIAL_PROTOCOLPGM(" E:");
SERIAL_PROTOCOL((int)active_extruder); SERIAL_PROTOCOL((int)active_extruder);
SERIAL_PROTOCOLPGM(" B:"); SERIAL_PROTOCOLPGM(" B:");
SERIAL_PROTOCOL_F(degBed(),1); SERIAL_PROTOCOL_F(degBed(),1);
SERIAL_PROTOCOLLN(""); SERIAL_PROTOCOLLN("");
codenum = millis(); codenum = millis();
} }
manage_heater(); manage_heater();
manage_inactivity(); manage_inactivity();
@ -1169,7 +1198,7 @@ void process_commands()
fanSpeed=constrain(code_value(),0,255); fanSpeed=constrain(code_value(),0,255);
} }
else { else {
fanSpeed=255; fanSpeed=255;
} }
break; break;
case 107: //M107 Fan Off case 107: //M107 Fan Off
@ -1184,7 +1213,7 @@ void process_commands()
ValvePressure=constrain(code_value(),0,255); ValvePressure=constrain(code_value(),0,255);
} }
else { else {
ValvePressure=255; ValvePressure=255;
} }
break; break;
case 127: //M127 valve closed case 127: //M127 valve closed
@ -1199,7 +1228,7 @@ void process_commands()
EtoPPressure=constrain(code_value(),0,255); EtoPPressure=constrain(code_value(),0,255);
} }
else { else {
EtoPPressure=255; EtoPPressure=255;
} }
break; break;
case 129: //M129 valve closed case 129: //M129 valve closed
@ -1214,18 +1243,18 @@ void process_commands()
WRITE(PS_ON_PIN, PS_ON_AWAKE); WRITE(PS_ON_PIN, PS_ON_AWAKE);
break; break;
#endif #endif
case 81: // M81 - ATX Power Off case 81: // M81 - ATX Power Off
#if defined SUICIDE_PIN && SUICIDE_PIN > -1 #if defined SUICIDE_PIN && SUICIDE_PIN > -1
st_synchronize(); st_synchronize();
suicide(); suicide();
#elif (PS_ON_PIN > -1) #elif (PS_ON_PIN > -1)
SET_OUTPUT(PS_ON_PIN); SET_OUTPUT(PS_ON_PIN);
WRITE(PS_ON_PIN, PS_ON_ASLEEP); WRITE(PS_ON_PIN, PS_ON_ASLEEP);
#endif #endif
break; break;
case 82: case 82:
axis_relative_modes[3] = false; axis_relative_modes[3] = false;
break; break;
@ -1234,11 +1263,11 @@ void process_commands()
break; break;
case 18: //compatibility case 18: //compatibility
case 84: // M84 case 84: // M84
if(code_seen('S')){ if(code_seen('S')){
stepper_inactive_time = code_value() * 1000; stepper_inactive_time = code_value() * 1000;
} }
else else
{ {
bool all_axis = !((code_seen(axis_codes[0])) || (code_seen(axis_codes[1])) || (code_seen(axis_codes[2]))|| (code_seen(axis_codes[3]))); bool all_axis = !((code_seen(axis_codes[0])) || (code_seen(axis_codes[1])) || (code_seen(axis_codes[2]))|| (code_seen(axis_codes[3])));
if(all_axis) if(all_axis)
{ {
@ -1260,18 +1289,18 @@ void process_commands()
disable_e1(); disable_e1();
disable_e2(); disable_e2();
} }
#endif #endif
} }
} }
break; break;
case 85: // M85 case 85: // M85
code_seen('S'); code_seen('S');
max_inactive_time = code_value() * 1000; max_inactive_time = code_value() * 1000;
break; break;
case 92: // M92 case 92: // M92
for(int8_t i=0; i < NUM_AXIS; i++) for(int8_t i=0; i < NUM_AXIS; i++)
{ {
if(code_seen(axis_codes[i])) if(code_seen(axis_codes[i]))
{ {
if(i == 3) { // E if(i == 3) { // E
float value = code_value(); float value = code_value();
@ -1305,16 +1334,16 @@ void process_commands()
SERIAL_PROTOCOL(current_position[Y_AXIS]); SERIAL_PROTOCOL(current_position[Y_AXIS]);
SERIAL_PROTOCOLPGM("Z:"); SERIAL_PROTOCOLPGM("Z:");
SERIAL_PROTOCOL(current_position[Z_AXIS]); SERIAL_PROTOCOL(current_position[Z_AXIS]);
SERIAL_PROTOCOLPGM("E:"); SERIAL_PROTOCOLPGM("E:");
SERIAL_PROTOCOL(current_position[E_AXIS]); SERIAL_PROTOCOL(current_position[E_AXIS]);
SERIAL_PROTOCOLPGM(MSG_COUNT_X); SERIAL_PROTOCOLPGM(MSG_COUNT_X);
SERIAL_PROTOCOL(float(st_get_position(X_AXIS))/axis_steps_per_unit[X_AXIS]); SERIAL_PROTOCOL(float(st_get_position(X_AXIS))/axis_steps_per_unit[X_AXIS]);
SERIAL_PROTOCOLPGM("Y:"); SERIAL_PROTOCOLPGM("Y:");
SERIAL_PROTOCOL(float(st_get_position(Y_AXIS))/axis_steps_per_unit[Y_AXIS]); SERIAL_PROTOCOL(float(st_get_position(Y_AXIS))/axis_steps_per_unit[Y_AXIS]);
SERIAL_PROTOCOLPGM("Z:"); SERIAL_PROTOCOLPGM("Z:");
SERIAL_PROTOCOL(float(st_get_position(Z_AXIS))/axis_steps_per_unit[Z_AXIS]); SERIAL_PROTOCOL(float(st_get_position(Z_AXIS))/axis_steps_per_unit[Z_AXIS]);
SERIAL_PROTOCOLLN(""); SERIAL_PROTOCOLLN("");
break; break;
case 120: // M120 case 120: // M120
@ -1352,7 +1381,7 @@ void process_commands()
break; break;
//TODO: update for all axis, use for loop //TODO: update for all axis, use for loop
case 201: // M201 case 201: // M201
for(int8_t i=0; i < NUM_AXIS; i++) for(int8_t i=0; i < NUM_AXIS; i++)
{ {
if(code_seen(axis_codes[i])) if(code_seen(axis_codes[i]))
{ {
@ -1391,7 +1420,7 @@ void process_commands()
} }
break; break;
case 206: // M206 additional homeing offset case 206: // M206 additional homeing offset
for(int8_t i=0; i < 3; i++) for(int8_t i=0; i < 3; i++)
{ {
if(code_seen(axis_codes[i])) add_homeing[i] = code_value(); if(code_seen(axis_codes[i])) add_homeing[i] = code_value();
} }
@ -1399,47 +1428,47 @@ void process_commands()
#ifdef FWRETRACT #ifdef FWRETRACT
case 207: //M207 - set retract length S[positive mm] F[feedrate mm/sec] Z[additional zlift/hop] case 207: //M207 - set retract length S[positive mm] F[feedrate mm/sec] Z[additional zlift/hop]
{ {
if(code_seen('S')) if(code_seen('S'))
{ {
retract_length = code_value() ; retract_length = code_value() ;
} }
if(code_seen('F')) if(code_seen('F'))
{ {
retract_feedrate = code_value() ; retract_feedrate = code_value() ;
} }
if(code_seen('Z')) if(code_seen('Z'))
{ {
retract_zlift = code_value() ; retract_zlift = code_value() ;
} }
}break; }break;
case 208: // M208 - set retract recover length S[positive mm surplus to the M207 S*] F[feedrate mm/sec] case 208: // M208 - set retract recover length S[positive mm surplus to the M207 S*] F[feedrate mm/sec]
{ {
if(code_seen('S')) if(code_seen('S'))
{ {
retract_recover_length = code_value() ; retract_recover_length = code_value() ;
} }
if(code_seen('F')) if(code_seen('F'))
{ {
retract_recover_feedrate = code_value() ; retract_recover_feedrate = code_value() ;
} }
}break; }break;
case 209: // M209 - S<1=true/0=false> enable automatic retract detect if the slicer did not support G10/11: every normal extrude-only move will be classified as retract depending on the direction. case 209: // M209 - S<1=true/0=false> enable automatic retract detect if the slicer did not support G10/11: every normal extrude-only move will be classified as retract depending on the direction.
{ {
if(code_seen('S')) if(code_seen('S'))
{ {
int t= code_value() ; int t= code_value() ;
switch(t) switch(t)
{ {
case 0: autoretract_enabled=false;retracted=false;break; case 0: autoretract_enabled=false;retracted=false;break;
case 1: autoretract_enabled=true;retracted=false;break; case 1: autoretract_enabled=true;retracted=false;break;
default: default:
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOPGM(MSG_UNKNOWN_COMMAND); SERIAL_ECHOPGM(MSG_UNKNOWN_COMMAND);
SERIAL_ECHO(cmdbuffer[bufindr]); SERIAL_ECHO(cmdbuffer[bufindr]);
SERIAL_ECHOLNPGM("\""); SERIAL_ECHOLNPGM("\"");
} }
} }
}break; }break;
#endif // FWRETRACT #endif // FWRETRACT
#if EXTRUDERS > 1 #if EXTRUDERS > 1
@ -1448,7 +1477,7 @@ void process_commands()
if(setTargetedHotend(218)){ if(setTargetedHotend(218)){
break; break;
} }
if(code_seen('X')) if(code_seen('X'))
{ {
extruder_offset[X_AXIS][tmp_extruder] = code_value(); extruder_offset[X_AXIS][tmp_extruder] = code_value();
} }
@ -1458,7 +1487,7 @@ void process_commands()
} }
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); SERIAL_ECHOPGM(MSG_HOTEND_OFFSET);
for(tmp_extruder = 0; tmp_extruder < EXTRUDERS; tmp_extruder++) for(tmp_extruder = 0; tmp_extruder < EXTRUDERS; tmp_extruder++)
{ {
SERIAL_ECHO(" "); SERIAL_ECHO(" ");
SERIAL_ECHO(extruder_offset[X_AXIS][tmp_extruder]); SERIAL_ECHO(extruder_offset[X_AXIS][tmp_extruder]);
@ -1470,7 +1499,7 @@ void process_commands()
#endif #endif
case 220: // M220 S<factor in percent>- set speed factor override percentage case 220: // M220 S<factor in percent>- set speed factor override percentage
{ {
if(code_seen('S')) if(code_seen('S'))
{ {
feedmultiply = code_value() ; feedmultiply = code_value() ;
} }
@ -1478,13 +1507,44 @@ void process_commands()
break; break;
case 221: // M221 S<factor in percent>- set extrude factor override percentage case 221: // M221 S<factor in percent>- set extrude factor override percentage
{ {
if(code_seen('S')) if(code_seen('S'))
{ {
extrudemultiply = code_value() ; extrudemultiply = code_value() ;
} }
} }
break; break;
#if (defined NUM_SERVOS) && (NUM_SERVOS > 0)
case 280: // M280 - set servo position absolute. P: servo index, S: angle or microseconds
{
int servo_index = -1;
int servo_position = 0;
if (code_seen('P'))
servo_index = code_value();
if (code_seen('S')) {
servo_position = code_value();
if ((servo_index >= 0) && (servo_index < NUM_SERVOS)) {
servos[servo_index].write(servo_position);
}
else {
SERIAL_ECHO_START;
SERIAL_ECHO("Servo ");
SERIAL_ECHO(servo_index);
SERIAL_ECHOLN(" out of range");
}
}
else if (servo_index >= 0) {
SERIAL_PROTOCOL(MSG_OK);
SERIAL_PROTOCOL(" Servo ");
SERIAL_PROTOCOL(servo_index);
SERIAL_PROTOCOL(": ");
SERIAL_PROTOCOL(servos[servo_index].read());
SERIAL_PROTOCOLLN("");
}
}
break;
#endif // NUM_SERVOS > 0
#if defined(LARGE_FLASH) && LARGE_FLASH == true && defined(BEEPER) && BEEPER > -1 #if defined(LARGE_FLASH) && LARGE_FLASH == true && defined(BEEPER) && BEEPER > -1
case 300: // M300 case 300: // M300
{ {
@ -1509,7 +1569,7 @@ void process_commands()
#ifdef PID_ADD_EXTRUSION_RATE #ifdef PID_ADD_EXTRUSION_RATE
if(code_seen('C')) Kc = code_value(); if(code_seen('C')) Kc = code_value();
#endif #endif
updatePID(); updatePID();
SERIAL_PROTOCOL(MSG_OK); SERIAL_PROTOCOL(MSG_OK);
SERIAL_PROTOCOL(" p:"); SERIAL_PROTOCOL(" p:");
@ -1569,7 +1629,7 @@ void process_commands()
#endif #endif
} }
break; break;
case 302: // allow cold extrudes case 302: // allow cold extrudes
{ {
allow_cold_extrudes(true); allow_cold_extrudes(true);
@ -1634,7 +1694,7 @@ void process_commands()
lastpos[Z_AXIS]=current_position[Z_AXIS]; lastpos[Z_AXIS]=current_position[Z_AXIS];
lastpos[E_AXIS]=current_position[E_AXIS]; lastpos[E_AXIS]=current_position[E_AXIS];
//retract by E //retract by E
if(code_seen('E')) if(code_seen('E'))
{ {
target[E_AXIS]+= code_value(); target[E_AXIS]+= code_value();
} }
@ -1645,9 +1705,9 @@ void process_commands()
#endif #endif
} }
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder);
//lift Z //lift Z
if(code_seen('Z')) if(code_seen('Z'))
{ {
target[Z_AXIS]+= code_value(); target[Z_AXIS]+= code_value();
} }
@ -1658,9 +1718,9 @@ void process_commands()
#endif #endif
} }
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder);
//move xy //move xy
if(code_seen('X')) if(code_seen('X'))
{ {
target[X_AXIS]+= code_value(); target[X_AXIS]+= code_value();
} }
@ -1670,7 +1730,7 @@ void process_commands()
target[X_AXIS]= FILAMENTCHANGE_XPOS ; target[X_AXIS]= FILAMENTCHANGE_XPOS ;
#endif #endif
} }
if(code_seen('Y')) if(code_seen('Y'))
{ {
target[Y_AXIS]= code_value(); target[Y_AXIS]= code_value();
} }
@ -1680,9 +1740,9 @@ void process_commands()
target[Y_AXIS]= FILAMENTCHANGE_YPOS ; target[Y_AXIS]= FILAMENTCHANGE_YPOS ;
#endif #endif
} }
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder);
if(code_seen('L')) if(code_seen('L'))
{ {
target[E_AXIS]+= code_value(); target[E_AXIS]+= code_value();
@ -1693,9 +1753,9 @@ void process_commands()
target[E_AXIS]+= FILAMENTCHANGE_FINALRETRACT ; target[E_AXIS]+= FILAMENTCHANGE_FINALRETRACT ;
#endif #endif
} }
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder);
//finish moves //finish moves
st_synchronize(); st_synchronize();
//disable extruder steppers so filament can be removed //disable extruder steppers so filament can be removed
@ -1710,12 +1770,12 @@ void process_commands()
manage_heater(); manage_heater();
manage_inactivity(); manage_inactivity();
lcd_update(); lcd_update();
#if BEEPER > -1 #if BEEPER > -1
if(cnt==0) if(cnt==0)
{ {
SET_OUTPUT(BEEPER); SET_OUTPUT(BEEPER);
WRITE(BEEPER,HIGH); WRITE(BEEPER,HIGH);
delay(3); delay(3);
WRITE(BEEPER,LOW); WRITE(BEEPER,LOW);
@ -1723,9 +1783,9 @@ void process_commands()
} }
#endif #endif
} }
//return to normal //return to normal
if(code_seen('L')) if(code_seen('L'))
{ {
target[E_AXIS]+= -code_value(); target[E_AXIS]+= -code_value();
} }
@ -1743,7 +1803,7 @@ void process_commands()
plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], lastpos[E_AXIS], feedrate/60, active_extruder); //final untretract plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], lastpos[E_AXIS], feedrate/60, active_extruder); //final untretract
} }
break; break;
#endif //FILAMENTCHANGEENABLE #endif //FILAMENTCHANGEENABLE
case 907: // M907 Set digital trimpot motor current using axis codes. case 907: // M907 Set digital trimpot motor current using axis codes.
{ {
#if DIGIPOTSS_PIN > -1 #if DIGIPOTSS_PIN > -1
@ -1766,7 +1826,7 @@ void process_commands()
case 350: // M350 Set microstepping mode. Warning: Steps per unit remains unchanged. S code sets stepping mode for all drivers. case 350: // M350 Set microstepping mode. Warning: Steps per unit remains unchanged. S code sets stepping mode for all drivers.
{ {
#if X_MS1_PIN > -1 #if X_MS1_PIN > -1
if(code_seen('S')) for(int i=0;i<=4;i++) microstep_mode(i,code_value()); if(code_seen('S')) for(int i=0;i<=4;i++) microstep_mode(i,code_value());
for(int i=0;i<NUM_AXIS;i++) if(code_seen(axis_codes[i])) microstep_mode(i,(uint8_t)code_value()); for(int i=0;i<NUM_AXIS;i++) if(code_seen(axis_codes[i])) microstep_mode(i,(uint8_t)code_value());
if(code_seen('B')) microstep_mode(4,code_value()); if(code_seen('B')) microstep_mode(4,code_value());
microstep_readings(); microstep_readings();
@ -1800,7 +1860,7 @@ void process_commands()
} }
} }
else if(code_seen('T')) else if(code_seen('T'))
{ {
tmp_extruder = code_value(); tmp_extruder = code_value();
if(tmp_extruder >= EXTRUDERS) { if(tmp_extruder >= EXTRUDERS) {
@ -1825,7 +1885,7 @@ void process_commands()
// Offset extruder (only by XY) // Offset extruder (only by XY)
int i; int i;
for(i = 0; i < 2; i++) { for(i = 0; i < 2; i++) {
current_position[i] = current_position[i] - current_position[i] = current_position[i] -
extruder_offset[i][active_extruder] + extruder_offset[i][active_extruder] +
extruder_offset[i][tmp_extruder]; extruder_offset[i][tmp_extruder];
} }
@ -1871,14 +1931,14 @@ void ClearToSend()
if(fromsd[bufindr]) if(fromsd[bufindr])
return; return;
#endif //SDSUPPORT #endif //SDSUPPORT
SERIAL_PROTOCOLLNPGM(MSG_OK); SERIAL_PROTOCOLLNPGM(MSG_OK);
} }
void get_coordinates() void get_coordinates()
{ {
bool seen[4]={false,false,false,false}; bool seen[4]={false,false,false,false};
for(int8_t i=0; i < NUM_AXIS; i++) { for(int8_t i=0; i < NUM_AXIS; i++) {
if(code_seen(axis_codes[i])) if(code_seen(axis_codes[i]))
{ {
destination[i] = (float)code_value() + (axis_relative_modes[i] || relative_mode)*current_position[i]; destination[i] = (float)code_value() + (axis_relative_modes[i] || relative_mode)*current_position[i];
seen[i]=true; seen[i]=true;
@ -1896,23 +1956,23 @@ void get_coordinates()
float echange=destination[E_AXIS]-current_position[E_AXIS]; float echange=destination[E_AXIS]-current_position[E_AXIS];
if(echange<-MIN_RETRACT) //retract if(echange<-MIN_RETRACT) //retract
{ {
if(!retracted) if(!retracted)
{ {
destination[Z_AXIS]+=retract_zlift; //not sure why chaninging current_position negatively does not work. destination[Z_AXIS]+=retract_zlift; //not sure why chaninging current_position negatively does not work.
//if slicer retracted by echange=-1mm and you want to retract 3mm, corrrectede=-2mm additionally //if slicer retracted by echange=-1mm and you want to retract 3mm, corrrectede=-2mm additionally
float correctede=-echange-retract_length; float correctede=-echange-retract_length;
//to generate the additional steps, not the destination is changed, but inversely the current position //to generate the additional steps, not the destination is changed, but inversely the current position
current_position[E_AXIS]+=-correctede; current_position[E_AXIS]+=-correctede;
feedrate=retract_feedrate; feedrate=retract_feedrate;
retracted=true; retracted=true;
} }
} }
else else
if(echange>MIN_RETRACT) //retract_recover if(echange>MIN_RETRACT) //retract_recover
{ {
if(retracted) if(retracted)
{ {
//current_position[Z_AXIS]+=-retract_zlift; //current_position[Z_AXIS]+=-retract_zlift;
//if slicer retracted_recovered by echange=+1mm and you want to retract_recover 3mm, corrrectede=2mm additionally //if slicer retracted_recovered by echange=+1mm and you want to retract_recover 3mm, corrrectede=2mm additionally
@ -1922,7 +1982,7 @@ void get_coordinates()
retracted=false; retracted=false;
} }
} }
} }
#endif //FWRETRACT #endif //FWRETRACT
} }
@ -1940,7 +2000,7 @@ void get_arc_coordinates()
if(code_seen('I')) { if(code_seen('I')) {
offset[0] = code_value(); offset[0] = code_value();
} }
else { else {
offset[0] = 0.0; offset[0] = 0.0;
} }
@ -1971,7 +2031,7 @@ void prepare_move()
{ {
clamp_to_software_endstops(destination); clamp_to_software_endstops(destination);
previous_millis_cmd = millis(); previous_millis_cmd = millis();
// Do not use feedmultiply for E or Z only moves // Do not use feedmultiply for E or Z only moves
if( (current_position[X_AXIS] == destination [X_AXIS]) && (current_position[Y_AXIS] == destination [Y_AXIS])) { if( (current_position[X_AXIS] == destination [X_AXIS]) && (current_position[Y_AXIS] == destination [Y_AXIS])) {
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
@ -1989,7 +2049,7 @@ void prepare_arc_move(char isclockwise) {
// Trace the arc // Trace the arc
mc_arc(current_position, destination, offset, X_AXIS, Y_AXIS, Z_AXIS, feedrate*feedmultiply/60/100.0, r, isclockwise, active_extruder); mc_arc(current_position, destination, offset, X_AXIS, Y_AXIS, Z_AXIS, feedrate*feedmultiply/60/100.0, r, isclockwise, active_extruder);
// As far as the parser is concerned, the position is now == target. In reality the // As far as the parser is concerned, the position is now == target. In reality the
// motion control system might still be processing the action and the real tool position // motion control system might still be processing the action and the real tool position
// in any intermediate location. // in any intermediate location.
@ -2008,7 +2068,7 @@ void controllerFan()
if ((millis() - lastMotorCheck) >= 2500) //Not a time critical function, so we only check every 2500ms if ((millis() - lastMotorCheck) >= 2500) //Not a time critical function, so we only check every 2500ms
{ {
lastMotorCheck = millis(); lastMotorCheck = millis();
if(!READ(X_ENABLE_PIN) || !READ(Y_ENABLE_PIN) || !READ(Z_ENABLE_PIN) if(!READ(X_ENABLE_PIN) || !READ(Y_ENABLE_PIN) || !READ(Z_ENABLE_PIN)
#if EXTRUDERS > 2 #if EXTRUDERS > 2
|| !READ(E2_ENABLE_PIN) || !READ(E2_ENABLE_PIN)
@ -2016,12 +2076,12 @@ void controllerFan()
#if EXTRUDER > 1 #if EXTRUDER > 1
|| !READ(E1_ENABLE_PIN) || !READ(E1_ENABLE_PIN)
#endif #endif
|| !READ(E0_ENABLE_PIN)) //If any of the drivers are enabled... || !READ(E0_ENABLE_PIN)) //If any of the drivers are enabled...
{ {
lastMotor = millis(); //... set time to NOW so the fan will turn on lastMotor = millis(); //... set time to NOW so the fan will turn on
} }
if ((millis() - lastMotor) >= (CONTROLLERFAN_SEC*1000UL) || lastMotor == 0) //If the last time any driver was enabled, is longer since than CONTROLLERSEC... if ((millis() - lastMotor) >= (CONTROLLERFAN_SEC*1000UL) || lastMotor == 0) //If the last time any driver was enabled, is longer since than CONTROLLERSEC...
{ {
WRITE(CONTROLLERFAN_PIN, LOW); //... turn the fan off WRITE(CONTROLLERFAN_PIN, LOW); //... turn the fan off
} }
@ -2041,7 +2101,7 @@ void extruderFan()
if ((millis() - lastExtruderCheck) >= 2500) //Not a time critical function, so we only check every 2500ms if ((millis() - lastExtruderCheck) >= 2500) //Not a time critical function, so we only check every 2500ms
{ {
lastExtruderCheck = millis(); lastExtruderCheck = millis();
if (degHotend(active_extruder) < EXTRUDERFAN_DEC) if (degHotend(active_extruder) < EXTRUDERFAN_DEC)
{ {
WRITE(EXTRUDERFAN_PIN, LOW); //... turn the fan off WRITE(EXTRUDERFAN_PIN, LOW); //... turn the fan off
@ -2054,13 +2114,13 @@ void extruderFan()
} }
#endif #endif
void manage_inactivity() void manage_inactivity()
{ {
if( (millis() - previous_millis_cmd) > max_inactive_time ) if( (millis() - previous_millis_cmd) > max_inactive_time )
if(max_inactive_time) if(max_inactive_time)
kill(); kill();
if(stepper_inactive_time) { if(stepper_inactive_time) {
if( (millis() - previous_millis_cmd) > stepper_inactive_time ) if( (millis() - previous_millis_cmd) > stepper_inactive_time )
{ {
if(blocks_queued() == false) { if(blocks_queued() == false) {
disable_x(); disable_x();
@ -2080,15 +2140,15 @@ void manage_inactivity()
controllerFan(); //Check if fan should be turned on to cool stepper drivers down controllerFan(); //Check if fan should be turned on to cool stepper drivers down
#endif #endif
#ifdef EXTRUDER_RUNOUT_PREVENT #ifdef EXTRUDER_RUNOUT_PREVENT
if( (millis() - previous_millis_cmd) > EXTRUDER_RUNOUT_SECONDS*1000 ) if( (millis() - previous_millis_cmd) > EXTRUDER_RUNOUT_SECONDS*1000 )
if(degHotend(active_extruder)>EXTRUDER_RUNOUT_MINTEMP) if(degHotend(active_extruder)>EXTRUDER_RUNOUT_MINTEMP)
{ {
bool oldstatus=READ(E0_ENABLE_PIN); bool oldstatus=READ(E0_ENABLE_PIN);
enable_e0(); enable_e0();
float oldepos=current_position[E_AXIS]; float oldepos=current_position[E_AXIS];
float oldedes=destination[E_AXIS]; float oldedes=destination[E_AXIS];
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS],
current_position[E_AXIS]+EXTRUDER_RUNOUT_EXTRUDE*EXTRUDER_RUNOUT_ESTEPS/axis_steps_per_unit[E_AXIS], current_position[E_AXIS]+EXTRUDER_RUNOUT_EXTRUDE*EXTRUDER_RUNOUT_ESTEPS/axis_steps_per_unit[E_AXIS],
EXTRUDER_RUNOUT_SPEED/60.*EXTRUDER_RUNOUT_ESTEPS/axis_steps_per_unit[E_AXIS], active_extruder); EXTRUDER_RUNOUT_SPEED/60.*EXTRUDER_RUNOUT_ESTEPS/axis_steps_per_unit[E_AXIS], active_extruder);
current_position[E_AXIS]=oldepos; current_position[E_AXIS]=oldepos;
destination[E_AXIS]=oldedes; destination[E_AXIS]=oldedes;
@ -2112,7 +2172,7 @@ void kill()
disable_e0(); disable_e0();
disable_e1(); disable_e1();
disable_e2(); disable_e2();
if(PS_ON_PIN > -1) pinMode(PS_ON_PIN,INPUT); if(PS_ON_PIN > -1) pinMode(PS_ON_PIN,INPUT);
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORLNPGM(MSG_ERR_KILLED); SERIAL_ERRORLNPGM(MSG_ERR_KILLED);
@ -2141,7 +2201,7 @@ void setPwmFrequency(uint8_t pin, int val)
val &= 0x07; val &= 0x07;
switch(digitalPinToTimer(pin)) switch(digitalPinToTimer(pin))
{ {
#if defined(TCCR0A) #if defined(TCCR0A)
case TIMER0A: case TIMER0A:
case TIMER0B: case TIMER0B:
@ -2183,7 +2243,7 @@ void setPwmFrequency(uint8_t pin, int val)
break; break;
#endif #endif
#if defined(TCCR4A) #if defined(TCCR4A)
case TIMER4A: case TIMER4A:
case TIMER4B: case TIMER4B:
case TIMER4C: case TIMER4C:
@ -2192,7 +2252,7 @@ void setPwmFrequency(uint8_t pin, int val)
break; break;
#endif #endif
#if defined(TCCR5A) #if defined(TCCR5A)
case TIMER5A: case TIMER5A:
case TIMER5B: case TIMER5B:
case TIMER5C: case TIMER5C:

View file

@ -59,28 +59,34 @@
// Say which 16 bit timers can be used and in what order // Say which 16 bit timers can be used and in what order
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define _useTimer5 #define _useTimer5
#define _useTimer1 //#define _useTimer1
#define _useTimer3 #define _useTimer3
#define _useTimer4 #define _useTimer4
typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ; //typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ;
typedef enum { _timer5, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ;
#elif defined(__AVR_ATmega32U4__) #elif defined(__AVR_ATmega32U4__)
#define _useTimer1 //#define _useTimer1
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ; #define _useTimer3
//typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ;
typedef enum { _timer3, _Nbr_16timers } timer16_Sequence_t ;
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
#define _useTimer3 #define _useTimer3
#define _useTimer1 //#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ; //typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ;
typedef enum { _timer3, _Nbr_16timers } timer16_Sequence_t ;
#elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__) #elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__)
#define _useTimer3 #define _useTimer3
#define _useTimer1 //#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ; //typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ;
typedef enum { _timer3, _Nbr_16timers } timer16_Sequence_t ;
#else // everything else #else // everything else
#define _useTimer1 //#define _useTimer1
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ; //typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ;
typedef enum { _Nbr_16timers } timer16_Sequence_t ;
#endif #endif
#define Servo_VERSION 2 // software version of this library #define Servo_VERSION 2 // software version of this library

View file

@ -248,14 +248,14 @@
#define E0_STEP_PIN 28 #define E0_STEP_PIN 28
#define E0_DIR_PIN 27 #define E0_DIR_PIN 27
#define E0_ENABLE_PIN 24 #define E0_ENABLE_PIN 24
#define TEMP_0_PIN 2 #define TEMP_0_PIN 2
#define TEMP_1_PIN -1 #define TEMP_1_PIN -1
#define TEMP_2_PIN -1 #define TEMP_2_PIN -1
#define TEMP_BED_PIN 1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 34 bed) #define TEMP_BED_PIN 1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 34 bed)
#define HEATER_0_PIN 4 #define HEATER_0_PIN 4
#define HEATER_1_PIN -1 #define HEATER_1_PIN -1
#define HEATER_2_PIN -1 #define HEATER_2_PIN -1
#define HEATER_BED_PIN 3 // (bed) #define HEATER_BED_PIN 3 // (bed)
@ -272,25 +272,25 @@
//our RS485 pins //our RS485 pins
//#define TX_ENABLE_PIN 12 //#define TX_ENABLE_PIN 12
//#define RX_ENABLE_PIN 13 //#define RX_ENABLE_PIN 13
#define BEEPER -1 #define BEEPER -1
#define SDCARDDETECT -1 #define SDCARDDETECT -1
#define SUICIDE_PIN -1 //has to be defined; otherwise Power_off doesn't work #define SUICIDE_PIN -1 //has to be defined; otherwise Power_off doesn't work
#define KILL_PIN -1 #define KILL_PIN -1
//Pins for 4bit LCD Support //Pins for 4bit LCD Support
#define LCD_PINS_RS 18 #define LCD_PINS_RS 18
#define LCD_PINS_ENABLE 17 #define LCD_PINS_ENABLE 17
#define LCD_PINS_D4 16 #define LCD_PINS_D4 16
#define LCD_PINS_D5 15 #define LCD_PINS_D5 15
#define LCD_PINS_D6 13 #define LCD_PINS_D6 13
#define LCD_PINS_D7 14 #define LCD_PINS_D7 14
//buttons are directly attached //buttons are directly attached
#define BTN_EN1 11 #define BTN_EN1 11
#define BTN_EN2 10 #define BTN_EN2 10
#define BTN_ENC 12 //the click #define BTN_ENC 12 //the click
#define BLEN_C 2 #define BLEN_C 2
#define BLEN_B 1 #define BLEN_B 1
#define BLEN_A 0 #define BLEN_A 0
@ -376,13 +376,18 @@
#else #else
#define HEATER_1_PIN 9 // EXTRUDER 2 (FAN On Sprinter) #define HEATER_1_PIN 9 // EXTRUDER 2 (FAN On Sprinter)
#endif #endif
#define HEATER_2_PIN -1 #define HEATER_2_PIN -1
#define TEMP_0_PIN 13 // ANALOG NUMBERING #define TEMP_0_PIN 13 // ANALOG NUMBERING
#define TEMP_1_PIN 15 // ANALOG NUMBERING #define TEMP_1_PIN 15 // ANALOG NUMBERING
#define TEMP_2_PIN -1 // ANALOG NUMBERING #define TEMP_2_PIN -1 // ANALOG NUMBERING
#define HEATER_BED_PIN 8 // BED #define HEATER_BED_PIN 8 // BED
#define TEMP_BED_PIN 14 // ANALOG NUMBERING #define TEMP_BED_PIN 14 // ANALOG NUMBERING
#define SERVO0_PIN 11
#define SERVO1_PIN 6
#define SERVO2_PIN 5
#define SERVO3_PIN 4
#ifdef ULTRA_LCD #ifdef ULTRA_LCD
#ifdef NEWPANEL #ifdef NEWPANEL
@ -396,13 +401,13 @@
#define BLEN_B 1 #define BLEN_B 1
#define BLEN_C 2 #define BLEN_C 2
#define LCD_PINS_RS 16 #define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 17 #define LCD_PINS_ENABLE 17
#define LCD_PINS_D4 23 #define LCD_PINS_D4 23
#define LCD_PINS_D5 25 #define LCD_PINS_D5 25
#define LCD_PINS_D6 27 #define LCD_PINS_D6 27
#define LCD_PINS_D7 29 #define LCD_PINS_D7 29
#ifdef REPRAP_DISCOUNT_SMART_CONTROLLER #ifdef REPRAP_DISCOUNT_SMART_CONTROLLER
#define BEEPER 37 #define BEEPER 37
@ -455,21 +460,21 @@
//#define SHIFT_LD 42 //#define SHIFT_LD 42
//#define SHIFT_OUT 40 //#define SHIFT_OUT 40
//#define SHIFT_EN 17 //#define SHIFT_EN 17
#define LCD_PINS_RS 16 #define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 17 #define LCD_PINS_ENABLE 17
#define LCD_PINS_D4 23 #define LCD_PINS_D4 23
#define LCD_PINS_D5 25 #define LCD_PINS_D5 25
#define LCD_PINS_D6 27 #define LCD_PINS_D6 27
#define LCD_PINS_D7 29 #define LCD_PINS_D7 29
//encoder rotation values //encoder rotation values
#define encrot0 0 #define encrot0 0
#define encrot1 2 #define encrot1 2
#define encrot2 3 #define encrot2 3
#define encrot3 1 #define encrot3 1
//bits in the shift register that carry the buttons for: //bits in the shift register that carry the buttons for:
// left up center down right red // left up center down right red
#define BL_LE 7 #define BL_LE 7
@ -481,7 +486,7 @@
#define BLEN_B 1 #define BLEN_B 1
#define BLEN_A 0 #define BLEN_A 0
#endif #endif
#endif //ULTRA_LCD #endif //ULTRA_LCD
#else // RAMPS_V_1_1 or RAMPS_V_1_2 as default (MOTHERBOARD == 3) #else // RAMPS_V_1_1 or RAMPS_V_1_2 as default (MOTHERBOARD == 3)
@ -526,15 +531,15 @@
#define HEATER_1_PIN -1 #define HEATER_1_PIN -1
#define HEATER_2_PIN -1 #define HEATER_2_PIN -1
#define TEMP_0_PIN 2 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! #define TEMP_0_PIN 2 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
#define TEMP_1_PIN -1 #define TEMP_1_PIN -1
#define TEMP_2_PIN -1 #define TEMP_2_PIN -1
#define TEMP_BED_PIN 1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! #define TEMP_BED_PIN 1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
#endif// MOTHERBOARD == 33 || MOTHERBOARD == 34 #endif// MOTHERBOARD == 33 || MOTHERBOARD == 34
// SPI for Max6675 Thermocouple // SPI for Max6675 Thermocouple
#ifndef SDSUPPORT #ifndef SDSUPPORT
// these pins are defined in the SD library if building with SD support // these pins are defined in the SD library if building with SD support
#define MAX_SCK_PIN 52 #define MAX_SCK_PIN 52
#define MAX_MISO_PIN 50 #define MAX_MISO_PIN 50
#define MAX_MOSI_PIN 51 #define MAX_MOSI_PIN 51
@ -586,8 +591,8 @@
#define HEATER_1_PIN -1 #define HEATER_1_PIN -1
#define HEATER_2_PIN -1 #define HEATER_2_PIN -1
#define TEMP_0_PIN 0 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! #define TEMP_0_PIN 0 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
#define TEMP_1_PIN -1 #define TEMP_1_PIN -1
#define TEMP_2_PIN -1 #define TEMP_2_PIN -1
#define HEATER_BED_PIN -1 #define HEATER_BED_PIN -1
#define TEMP_BED_PIN -1 #define TEMP_BED_PIN -1
@ -650,14 +655,14 @@
#define PS_ON_PIN -1 //changed @ rkoeppl 20110410 #define PS_ON_PIN -1 //changed @ rkoeppl 20110410
#define KILL_PIN -1 //changed @ drakelive 20120830 #define KILL_PIN -1 //changed @ drakelive 20120830
//our pin for debugging. //our pin for debugging.
#define DEBUG_PIN 0 #define DEBUG_PIN 0
//our RS485 pins //our RS485 pins
#define TX_ENABLE_PIN 12 #define TX_ENABLE_PIN 12
#define RX_ENABLE_PIN 13 #define RX_ENABLE_PIN 13
#endif #endif
/**************************************************************************************** /****************************************************************************************
@ -673,7 +678,7 @@
#if MOTHERBOARD == 62 || MOTHERBOARD == 63 || MOTHERBOARD == 64 #if MOTHERBOARD == 62 || MOTHERBOARD == 63 || MOTHERBOARD == 64
#undef MOTHERBOARD #undef MOTHERBOARD
#define MOTHERBOARD 6 #define MOTHERBOARD 6
#define SANGUINOLOLU_V_1_2 #define SANGUINOLOLU_V_1_2
#endif #endif
#if MOTHERBOARD == 6 #if MOTHERBOARD == 6
#define KNOWN_BOARD 1 #define KNOWN_BOARD 1
@ -700,7 +705,7 @@
#define LED_PIN -1 #define LED_PIN -1
#define FAN_PIN -1 #define FAN_PIN -1
#if FAN_PIN == 12 || FAN_PIN ==13 #if FAN_PIN == 12 || FAN_PIN ==13
#define FAN_SOFT_PWM #define FAN_SOFT_PWM
#endif #endif
@ -779,21 +784,21 @@
#define BTN_ENC 16 //the switch #define BTN_ENC 16 //the switch
//not connected to a pin //not connected to a pin
#define SDCARDDETECT -1 #define SDCARDDETECT -1
//from the same bit in the RAMPS Newpanel define //from the same bit in the RAMPS Newpanel define
//encoder rotation values //encoder rotation values
#define encrot0 0 #define encrot0 0
#define encrot1 2 #define encrot1 2
#define encrot2 3 #define encrot2 3
#define encrot3 1 #define encrot3 1
#define BLEN_C 2 #define BLEN_C 2
#define BLEN_B 1 #define BLEN_B 1
#define BLEN_A 0 #define BLEN_A 0
#endif //Newpanel #endif //Newpanel
#endif //Ultipanel #endif //Ultipanel
#endif #endif
@ -823,17 +828,17 @@
#define Y_MAX_PIN 28 #define Y_MAX_PIN 28
#define Y_ENABLE_PIN 29 #define Y_ENABLE_PIN 29
#define Z_STEP_PIN 37 #define Z_STEP_PIN 37
#define Z_DIR_PIN 39 #define Z_DIR_PIN 39
#define Z_MIN_PIN 30 #define Z_MIN_PIN 30
#define Z_MAX_PIN 32 #define Z_MAX_PIN 32
#define Z_ENABLE_PIN 35 #define Z_ENABLE_PIN 35
#define HEATER_BED_PIN 4 #define HEATER_BED_PIN 4
#define TEMP_BED_PIN 10 #define TEMP_BED_PIN 10
#define HEATER_0_PIN 2 #define HEATER_0_PIN 2
#define TEMP_0_PIN 8 #define TEMP_0_PIN 8
#define HEATER_1_PIN 3 #define HEATER_1_PIN 3
#define TEMP_1_PIN 9 #define TEMP_1_PIN 9
@ -863,24 +868,24 @@
//arduino pin witch triggers an piezzo beeper //arduino pin witch triggers an piezzo beeper
#define BEEPER 18 #define BEEPER 18
#define LCD_PINS_RS 20 #define LCD_PINS_RS 20
#define LCD_PINS_ENABLE 17 #define LCD_PINS_ENABLE 17
#define LCD_PINS_D4 16 #define LCD_PINS_D4 16
#define LCD_PINS_D5 21 #define LCD_PINS_D5 21
#define LCD_PINS_D6 5 #define LCD_PINS_D6 5
#define LCD_PINS_D7 6 #define LCD_PINS_D7 6
//buttons are directly attached //buttons are directly attached
#define BTN_EN1 40 #define BTN_EN1 40
#define BTN_EN2 42 #define BTN_EN2 42
#define BTN_ENC 19 //the click #define BTN_ENC 19 //the click
#define BLEN_C 2 #define BLEN_C 2
#define BLEN_B 1 #define BLEN_B 1
#define BLEN_A 0 #define BLEN_A 0
#define SDCARDDETECT 38 #define SDCARDDETECT 38
//encoder rotation values //encoder rotation values
#define encrot0 0 #define encrot0 0
#define encrot1 2 #define encrot1 2
@ -895,14 +900,14 @@
#define SHIFT_LD 42 #define SHIFT_LD 42
#define SHIFT_OUT 40 #define SHIFT_OUT 40
#define SHIFT_EN 17 #define SHIFT_EN 17
#define LCD_PINS_RS 16 #define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 5 #define LCD_PINS_ENABLE 5
#define LCD_PINS_D4 6 #define LCD_PINS_D4 6
#define LCD_PINS_D5 21 #define LCD_PINS_D5 21
#define LCD_PINS_D6 20 #define LCD_PINS_D6 20
#define LCD_PINS_D7 19 #define LCD_PINS_D7 19
//encoder rotation values //encoder rotation values
#ifndef ULTIMAKERCONTROLLER #ifndef ULTIMAKERCONTROLLER
#define encrot0 0 #define encrot0 0
@ -929,7 +934,7 @@
#define BLEN_B 1 #define BLEN_B 1
#define BLEN_A 0 #define BLEN_A 0
#endif #endif
#endif //ULTRA_LCD #endif //ULTRA_LCD
#endif #endif
@ -960,17 +965,17 @@
#define Y_MAX_PIN 16 #define Y_MAX_PIN 16
#define Y_ENABLE_PIN 29 #define Y_ENABLE_PIN 29
#define Z_STEP_PIN 37 #define Z_STEP_PIN 37
#define Z_DIR_PIN 39 #define Z_DIR_PIN 39
#define Z_MIN_PIN 19 #define Z_MIN_PIN 19
#define Z_MAX_PIN 18 #define Z_MAX_PIN 18
#define Z_ENABLE_PIN 35 #define Z_ENABLE_PIN 35
#define HEATER_BED_PIN -1 #define HEATER_BED_PIN -1
#define TEMP_BED_PIN -1 #define TEMP_BED_PIN -1
#define HEATER_0_PIN 2 #define HEATER_0_PIN 2
#define TEMP_0_PIN 8 #define TEMP_0_PIN 8
#define HEATER_1_PIN 1 #define HEATER_1_PIN 1
#define TEMP_1_PIN 1 #define TEMP_1_PIN 1
@ -994,10 +999,10 @@
#define KILL_PIN -1 #define KILL_PIN -1
#define SUICIDE_PIN -1 //PIN that has to be turned on right after start, to keep power flowing. #define SUICIDE_PIN -1 //PIN that has to be turned on right after start, to keep power flowing.
#define LCD_PINS_RS 24 #define LCD_PINS_RS 24
#define LCD_PINS_ENABLE 22 #define LCD_PINS_ENABLE 22
#define LCD_PINS_D4 36 #define LCD_PINS_D4 36
#define LCD_PINS_D5 34 #define LCD_PINS_D5 34
#define LCD_PINS_D6 32 #define LCD_PINS_D6 32
#define LCD_PINS_D7 30 #define LCD_PINS_D7 30
@ -1019,17 +1024,17 @@
#define X_DIR_PIN 16 #define X_DIR_PIN 16
#define X_ENABLE_PIN 48 #define X_ENABLE_PIN 48
#define X_MIN_PIN 37 #define X_MIN_PIN 37
#define X_MAX_PIN 36 #define X_MAX_PIN 36
#define Y_STEP_PIN 54 #define Y_STEP_PIN 54
#define Y_DIR_PIN 47 #define Y_DIR_PIN 47
#define Y_ENABLE_PIN 55 #define Y_ENABLE_PIN 55
#define Y_MIN_PIN 35 #define Y_MIN_PIN 35
#define Y_MAX_PIN 34 #define Y_MAX_PIN 34
#define Z_STEP_PIN 57 #define Z_STEP_PIN 57
#define Z_DIR_PIN 56 #define Z_DIR_PIN 56
#define Z_ENABLE_PIN 62 #define Z_ENABLE_PIN 62
#define Z_MIN_PIN 33 #define Z_MIN_PIN 33
#define Z_MAX_PIN 32 #define Z_MAX_PIN 32
@ -1047,7 +1052,7 @@
#define LED_PIN 13 #define LED_PIN 13
#define FAN_PIN 7 #define FAN_PIN 7
//additional FAN1 PIN (e.g. useful for electronics fan or light on/off) on PIN 8 //additional FAN1 PIN (e.g. useful for electronics fan or light on/off) on PIN 8
#define PS_ON_PIN 45 #define PS_ON_PIN 45
@ -1069,10 +1074,10 @@
#define SDSS 53 #define SDSS 53
#define SDCARDDETECT 49 #define SDCARDDETECT 49
#define BEEPER 44 #define BEEPER 44
#define LCD_PINS_RS 19 #define LCD_PINS_RS 19
#define LCD_PINS_ENABLE 42 #define LCD_PINS_ENABLE 42
#define LCD_PINS_D4 18 #define LCD_PINS_D4 18
#define LCD_PINS_D5 38 #define LCD_PINS_D5 38
#define LCD_PINS_D6 41 #define LCD_PINS_D6 41
#define LCD_PINS_D7 40 #define LCD_PINS_D7 40
#define BTN_EN1 11 #define BTN_EN1 11
@ -1256,7 +1261,7 @@
#define LED_PIN -1 #define LED_PIN -1
#define FAN_PIN -1 #define FAN_PIN -1
#define PS_ON_PIN 14 #define PS_ON_PIN 14
#define KILL_PIN -1 #define KILL_PIN -1
@ -1295,7 +1300,7 @@
* MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25) * MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25)
* SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24) * SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24)
* RST 9| |32 AREF * RST 9| |32 AREF
* VCC 10| |31 GND * VCC 10| |31 GND
* GND 11| |30 AVCC * GND 11| |30 AVCC
* XTAL2 12| |29 PC7 (D 23) * XTAL2 12| |29 PC7 (D 23)
* XTAL1 13| |28 PC6 (D 22) * XTAL1 13| |28 PC6 (D 22)
@ -1352,7 +1357,7 @@
#define KILL_PIN -1 #define KILL_PIN -1
#define HEATER_0_PIN 4 #define HEATER_0_PIN 4
#define HEATER_1_PIN -1 // 12 #define HEATER_1_PIN -1 // 12
#define HEATER_2_PIN -1 // 13 #define HEATER_2_PIN -1 // 13
#define TEMP_0_PIN 0 //D27 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! #define TEMP_0_PIN 0 //D27 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
#define TEMP_1_PIN -1 // 1 #define TEMP_1_PIN -1 // 1
@ -1414,11 +1419,11 @@
#define KILL_PIN -1 #define KILL_PIN -1
#define HEATER_0_PIN 3 /*DONE PWM on RIGHT connector */ #define HEATER_0_PIN 3 /*DONE PWM on RIGHT connector */
#define HEATER_1_PIN -1 #define HEATER_1_PIN -1
#define HEATER_2_PIN -1 #define HEATER_2_PIN -1
#define HEATER_1_PIN -1 #define HEATER_1_PIN -1
#define HEATER_2_PIN -1 #define HEATER_2_PIN -1
#define TEMP_0_PIN 0 // ANALOG INPUT NUMBERING #define TEMP_0_PIN 0 // ANALOG INPUT NUMBERING
#define TEMP_1_PIN 1 // ANALOG #define TEMP_1_PIN 1 // ANALOG
#define TEMP_2_PIN -1 // 2 #define TEMP_2_PIN -1 // 2
#define HEATER_BED_PIN 4 #define HEATER_BED_PIN 4
@ -1466,7 +1471,7 @@
#define Z_MS2_PIN 67 #define Z_MS2_PIN 67
#define HEATER_BED_PIN 3 #define HEATER_BED_PIN 3
#define TEMP_BED_PIN 2 #define TEMP_BED_PIN 2
#define HEATER_0_PIN 9 #define HEATER_0_PIN 9
#define TEMP_0_PIN 0 #define TEMP_0_PIN 0
@ -1559,9 +1564,9 @@
#define HEATER_0_PIN 9 // EXTRUDER 1 #define HEATER_0_PIN 9 // EXTRUDER 1
#define HEATER_1_PIN 8 // EXTRUDER 2 (FAN On Sprinter) #define HEATER_1_PIN 8 // EXTRUDER 2 (FAN On Sprinter)
#define HEATER_2_PIN -1 #define HEATER_2_PIN -1
#if TEMP_SENSOR_0 == -1 #if TEMP_SENSOR_0 == -1
#define TEMP_0_PIN 8 // ANALOG NUMBERING #define TEMP_0_PIN 8 // ANALOG NUMBERING
#else #else
#define TEMP_0_PIN 13 // ANALOG NUMBERING #define TEMP_0_PIN 13 // ANALOG NUMBERING
@ -1580,25 +1585,25 @@
#ifdef NEWPANEL #ifdef NEWPANEL
//arduino pin which triggers an piezzo beeper //arduino pin which triggers an piezzo beeper
#define LCD_PINS_RS 16 #define LCD_PINS_RS 16
#define LCD_PINS_ENABLE 17 #define LCD_PINS_ENABLE 17
#define LCD_PINS_D4 23 #define LCD_PINS_D4 23
#define LCD_PINS_D5 25 #define LCD_PINS_D5 25
#define LCD_PINS_D6 27 #define LCD_PINS_D6 27
#define LCD_PINS_D7 29 #define LCD_PINS_D7 29
//buttons are directly attached using AUX-2 //buttons are directly attached using AUX-2
#define BTN_EN1 59 #define BTN_EN1 59
#define BTN_EN2 64 #define BTN_EN2 64
#define BTN_ENC 43 //the click #define BTN_ENC 43 //the click
#define BLEN_C 2 #define BLEN_C 2
#define BLEN_B 1 #define BLEN_B 1
#define BLEN_A 0 #define BLEN_A 0
#define SDCARDDETECT -1 // Ramps does not use this port #define SDCARDDETECT -1 // Ramps does not use this port
//encoder rotation values //encoder rotation values
#define encrot0 0 #define encrot0 0
#define encrot1 2 #define encrot1 2
@ -1614,7 +1619,7 @@
#endif #endif
//List of pins which to ignore when asked to change by gcode, 0 and 1 are RX and TX, do not mess with those! //List of pins which to ignore when asked to change by gcode, 0 and 1 are RX and TX, do not mess with those!
#define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN, HEATER_0_PIN, #define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN, HEATER_0_PIN,
#if EXTRUDERS > 1 #if EXTRUDERS > 1
#define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, HEATER_1_PIN, #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, HEATER_1_PIN,
#else #else