diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index 75b57d0b9..b465d8535 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -184,6 +184,8 @@ extern float homing_feedrate[]; extern bool axis_relative_modes[]; extern float current_position[NUM_AXIS] ; extern float add_homeing[3]; +extern float min_pos[3]; +extern float max_pos[3]; extern unsigned char FanSpeed; // Handling multiple extruders pins diff --git a/Marlin/Marlin.pde b/Marlin/Marlin.pde index 5268a3de3..d11b51c7c 100644 --- a/Marlin/Marlin.pde +++ b/Marlin/Marlin.pde @@ -143,6 +143,8 @@ volatile bool feedmultiplychanged=false; volatile int extrudemultiply=100; //100->1 200->2 float current_position[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0 }; float add_homeing[3]={0,0,0}; +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 }; uint8_t active_extruder = 0; unsigned char FanSpeed=0; @@ -543,6 +545,28 @@ bool code_seen(char code) return (strchr_pointer != NULL); //Return True if a character was found } +#define DEFINE_PGM_READ_ANY(type, reader) \ + static inline type pgm_read_any(const type *p) \ + { return pgm_read_##reader##_near(p); } + +DEFINE_PGM_READ_ANY(float, float); + +#define XYZ_CONSTS_FROM_CONFIG(type, array, CONFIG) \ +static const PROGMEM type array##_P[3] = \ + { X_##CONFIG, Y_##CONFIG, Z_##CONFIG }; \ +static inline type array(int axis) \ + { return pgm_read_any(&array##_P[axis]); } + +XYZ_CONSTS_FROM_CONFIG(float, base_min_pos, MIN_POS); +XYZ_CONSTS_FROM_CONFIG(float, base_max_pos, MAX_POS); +XYZ_CONSTS_FROM_CONFIG(float, base_home_pos, HOME_POS); + +static void axis_is_at_home(int axis) { + current_position[axis] = base_home_pos(axis) + add_homeing[axis]; + min_pos[axis] = base_min_pos(axis) + add_homeing[axis]; + max_pos[axis] = base_max_pos(axis) + add_homeing[axis]; +} + #define HOMEAXIS(LETTER) \ if ((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1))\ { \ @@ -564,8 +588,8 @@ bool code_seen(char code) plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); \ st_synchronize();\ \ - current_position[LETTER##_AXIS] = LETTER##_HOME_POS;\ - destination[LETTER##_AXIS] = current_position[LETTER##_AXIS];\ + axis_is_at_home(LETTER##_AXIS); \ + destination[LETTER##_AXIS] = current_position[LETTER##_AXIS]; \ feedrate = 0.0;\ endstops_hit_on_purpose();\ } @@ -678,8 +702,8 @@ void process_commands() plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); st_synchronize(); - current_position[X_AXIS] = X_HOME_POS; - current_position[Y_AXIS] = Y_HOME_POS; + axis_is_at_home(X_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]); destination[X_AXIS] = current_position[X_AXIS]; destination[Y_AXIS] = current_position[Y_AXIS]; @@ -1544,15 +1568,15 @@ void get_arc_coordinates() void clamp_to_software_endstops(float target[3]) { if (min_software_endstops) { - if (target[X_AXIS] < X_MIN_POS) target[X_AXIS] = X_MIN_POS; - if (target[Y_AXIS] < Y_MIN_POS) target[Y_AXIS] = Y_MIN_POS; - if (target[Z_AXIS] < Z_MIN_POS) target[Z_AXIS] = Z_MIN_POS; + if (target[X_AXIS] < min_pos[X_AXIS]) target[X_AXIS] = min_pos[X_AXIS]; + if (target[Y_AXIS] < min_pos[Y_AXIS]) target[Y_AXIS] = min_pos[Y_AXIS]; + if (target[Z_AXIS] < min_pos[Z_AXIS]) target[Z_AXIS] = min_pos[Z_AXIS]; } if (max_software_endstops) { - if (target[X_AXIS] > X_MAX_POS) target[X_AXIS] = X_MAX_POS; - if (target[Y_AXIS] > Y_MAX_POS) target[Y_AXIS] = Y_MAX_POS; - if (target[Z_AXIS] > Z_MAX_POS) target[Z_AXIS] = Z_MAX_POS; + if (target[X_AXIS] > max_pos[X_AXIS]) target[X_AXIS] = max_pos[X_AXIS]; + if (target[Y_AXIS] > max_pos[Y_AXIS]) target[Y_AXIS] = max_pos[Y_AXIS]; + if (target[Z_AXIS] > max_pos[Z_AXIS]) target[Z_AXIS] = max_pos[Z_AXIS]; } } diff --git a/README.md b/README.md index 86dd93de9..fb2c18968 100644 --- a/README.md +++ b/README.md @@ -152,6 +152,7 @@ Movement variables: * M202 - Set max acceleration in units/s^2 for travel moves (M202 X1000 Y1000) Unused in Marlin!! * M203 - Set maximum feedrate that your machine can sustain (M203 X200 Y200 Z300 E10000) in mm/sec * M204 - Set default acceleration: S normal moves T filament only moves (M204 S3000 T7000) im mm/sec^2 also sets minimum segment time in ms (B20000) to prevent buffer underruns and M20 minimum feedrate +* M206 - set home offsets. This sets the X,Y,Z coordinates of the endstops (and is added to the {X,Y,Z}_HOME_POS configuration options (and is also added to the coordinates, if any, provided to G82, as with earlier firmware) * M220 - set build speed mulitplying S:factor in percent ; aka "realtime tuneing in the gcode". So you can slow down if you have islands in one height-range, and speed up otherwise. * M221 - set the extrude multiplying S:factor in percent * M400 - Finish all buffered moves.