From: Ian Jackson Date: Wed, 1 Aug 2012 20:12:14 +0000 (+0100) Subject: M206: always use homing ("homeing") offsets X-Git-Tag: firmware-tested-2012-08-10^2~2^2~3 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=71f5d005126298c899d87701cbdd432c76dd4480;p=marlin.git M206: always use homing ("homeing") offsets Previously the parameters set in M206 would only be used if a G82 command was sent with specific axis home values. This limits its usefulness. Really, we should have a way to adjust the XYZ homing of a machine in the eeprom. So as the first stage of this, make M206 affect every home command. The values set using M206 are now added to the configuration variables [XYZ]_HOME_POS. This is achieved by replacing all uses of [XYZ]_HOME_POS in the code by [XYZ]_HOME_POS_A which is a macro which includes the adjustment. A question arises: if the M206 offset is set, should this adjustment to the home position shift or change the possible range of movement permitted by the software endstops ? The documentation in Configuration.h describes these limits as: // Travel limits after homing Since this is a file containing physical limits, and actual suggested values for these configuration parameters appear to include a certain amount of slop, I've taken the view that these should be regarded as nominal physical distances from the limit switches, and that the permissible travel should be unaffected by M206. So for example with the (rather unrealistic) #define X_HOME_DIR -1 #define X_MIN_POS -20 #define X_HOME_POS 0 #define X_MAX_POS 100 no matter the setting of M206 X, the machine would be permitted to move from 20mm "beyond" the limit switch trigger point in the negative X direction and 100mm away from the limit switch in the positive X direction, for a total travel of 120mm. With M206 X-10 that would be considered to correspond to X coordinates -30 to +90. With M206 X+10 that would be considered to correspond to X coordinates -10 to +110. fixes #200 (in ErikZalm/Marlin). Signed-off-by: Ian Jackson --- diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index 75b57d0..b465d85 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 d471d49..05e7d5a 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,16 @@ bool code_seen(char code) return (strchr_pointer != NULL); //Return True if a character was found } +static const PROGMEM float base_min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }; +static const PROGMEM float base_max_pos[3] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS }; +static const PROGMEM float base_home_pos[3] = { X_HOME_POS, Y_HOME_POS, Z_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 +576,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 +690,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 +1556,15 @@ void get_arc_coordinates() void clamp_to_software_endstops(float target[3]) { if (min_software_endstops) { - if (destination[X_AXIS] < X_MIN_POS) destination[X_AXIS] = X_MIN_POS; - if (destination[Y_AXIS] < Y_MIN_POS) destination[Y_AXIS] = Y_MIN_POS; - if (destination[Z_AXIS] < Z_MIN_POS) destination[Z_AXIS] = Z_MIN_POS; + if (destination[X_AXIS] < min_pos[X_AXIS]) destination[X_AXIS] = min_pos[X_AXIS]; + if (destination[Y_AXIS] < min_pos[Y_AXIS]) destination[Y_AXIS] = min_pos[Y_AXIS]; + if (destination[Z_AXIS] < min_pos[Z_AXIS]) destination[Z_AXIS] = min_pos[Z_AXIS]; } if (max_software_endstops) { - if (destination[X_AXIS] > X_MAX_POS) destination[X_AXIS] = X_MAX_POS; - if (destination[Y_AXIS] > Y_MAX_POS) destination[Y_AXIS] = Y_MAX_POS; - if (destination[Z_AXIS] > Z_MAX_POS) destination[Z_AXIS] = Z_MAX_POS; + if (destination[X_AXIS] > max_pos[X_AXIS]) destination[X_AXIS] = max_pos[X_AXIS]; + if (destination[Y_AXIS] > max_pos[Y_AXIS]) destination[Y_AXIS] = max_pos[Y_AXIS]; + if (destination[Z_AXIS] > max_pos[Z_AXIS]) destination[Z_AXIS] = max_pos[Z_AXIS]; } } diff --git a/README.md b/README.md index 86dd93d..fb2c189 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.