diff --git a/ArduinoAddons/Arduino_1.x.x/Sanguino/boards.txt b/ArduinoAddons/Arduino_1.x.x/Sanguino/boards.txt index ca2d74baf..c1a1f08ab 100644 --- a/ArduinoAddons/Arduino_1.x.x/Sanguino/boards.txt +++ b/ArduinoAddons/Arduino_1.x.x/Sanguino/boards.txt @@ -61,3 +61,25 @@ atmega1284.build.f_cpu=16000000L atmega1284.build.core=arduino atmega1284.build.variant=standard # + +############################################################## + +atmega1284.name=Sanguino W/ ATmega1284p 16mhz ceramic resonator + +atmega1284.upload.protocol=stk500 +atmega1284.upload.maximum_size=131072 +atmega1284.upload.speed=57600 + +atmega1284.bootloader.low_fuses=0xD6 +atmega1284.bootloader.high_fuses=0xDC +atmega1284.bootloader.extended_fuses=0xFD +atmega1284.bootloader.path=atmega +atmega1284.bootloader.file=ATmegaBOOT_168_atmega1284p.hex +atmega1284.bootloader.unlock_bits=0x3F +atmega1284.bootloader.lock_bits=0x0F + +atmega1284.build.mcu=atmega1284p +atmega1284.build.f_cpu=16000000L +atmega1284.build.core=arduino +atmega1284.build.variant=standard +# diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 8cb0a141c..33a1c3a16 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -8,9 +8,9 @@ //=========================================================================== //============================= DELTA Printer =============================== //=========================================================================== -// For a Delta printer rplace the configuration files wilth the files in the +// For a Delta printer rplace the configuration files wilth the files in the // example_configurations/delta directory. -// +// // User-specified version info of this build to display in [Pronterface, etc] terminal window during // startup. Implementation of an idea by Prof Braino to inform user that any changes made to this @@ -36,7 +36,8 @@ // 11 = Gen7 v1.1, v1.2 = 11 // 12 = Gen7 v1.3 // 13 = Gen7 v1.4 -// 20 = Sethi 3D_1 +// 2 = Cheaptronic v1.0 +// 20 = Sethi 3D_1 // 3 = MEGA/RAMPS up to 1.2 = 3 // 33 = RAMPS 1.3 / 1.4 (Power outputs: Extruder, Fan, Bed) // 34 = RAMPS 1.3 / 1.4 (Power outputs: Extruder0, Extruder1, Bed) @@ -335,9 +336,9 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z before homing (G28) for Probe Clearance. // Be sure you have this distance over your Z_MAX_POS in case - + #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min - + #define Z_RAISE_BEFORE_PROBING 15 //How much the extruder will be raised before traveling to the first probing point. #define Z_RAISE_BETWEEN_PROBINGS 5 //How much the extruder will be raised when traveling from between next probing points @@ -346,26 +347,26 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of //The value is the delay to turn the servo off after powered on - depends on the servo speed; 300ms is good value, but you can try lower it. // You MUST HAVE the SERVO_ENDSTOPS defined to use here a value higher than zero otherwise your code will not compile. -// #define PROBE_SERVO_DEACTIVATION_DELAY 300 +// #define PROBE_SERVO_DEACTIVATION_DELAY 300 -//If you have enabled the Bed Auto Levelling and are using the same Z Probe for Z Homing, +//If you have enabled the Bed Auto Levelling and are using the same Z Probe for Z Homing, //it is highly recommended you let this Z_SAFE_HOMING enabled!!! - #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with probe outside the bed area. + #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with probe outside the bed area. // When defined, it will: // - Allow Z homing only after X and Y homing AND stepper drivers still enabled // - If stepper drivers timeout, it will need X and Y homing again before Z homing // - Position the probe in a defined XY point before Z Homing when homing all axis (G28) // - Block Z homing only when the probe is outside bed area. - + #ifdef Z_SAFE_HOMING - + #define Z_SAFE_HOMING_X_POINT (X_MAX_LENGTH/2) // X point for Z homing when homing all axis (G28) #define Z_SAFE_HOMING_Y_POINT (Y_MAX_LENGTH/2) // Y point for Z homing when homing all axis (G28) - + #endif - + // with accurate bed leveling, the bed is sampled in a ACCURATE_BED_LEVELING_POINTSxACCURATE_BED_LEVELING_POINTS grid and least squares solution is calculated // Note: this feature occupies 10'206 byte #define ACCURATE_BED_LEVELING @@ -443,6 +444,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of //#define SDSUPPORT // Enable SD Card Support in Hardware Console //#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) //#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder +//#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking //#define ULTIMAKERCONTROLLER //as available from the ultimaker online store. //#define ULTIPANEL //the ultipanel as on thingiverse @@ -549,7 +551,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of // Shift register panels // --------------------- // 2 wire Non-latching LCD SR from: -// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection //#define SR_LCD #ifdef SR_LCD #define SR_LCD_2W_NL // Non latching 2 wire shiftregister diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7b3ef4aed..4e5d82911 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -161,7 +161,7 @@ #define EXTRUDERS 1 #endif -#ifdef Z_DUAL_STEPPER_DRIVERS && Y_DUAL_STEPPER_DRIVERS +#if defined (Z_DUAL_STEPPER_DRIVERS) && defined (Y_DUAL_STEPPER_DRIVERS) #error "You cannot have dual drivers for both Y and Z" #endif diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index e37c3e1de..8f006406a 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -50,7 +50,7 @@ #ifdef BLINKM #include "BlinkM.h" -#include "Wire.h" +#include "Wire.h" #endif #if NUM_SERVOS > 0 @@ -99,7 +99,7 @@ // M29 - Stop SD write // M30 - Delete file from SD (M30 filename.g) // M31 - Output time since last M109 or SD card start to serial -// M32 - Select file and start SD print (Can be used _while_ printing from SD card files): +// M32 - Select file and start SD print (Can be used _while_ printing from SD card files): // syntax "M32 /path/filename#", or "M32 S !filename#" // Call gcode file : "M32 P !filename#" and return to caller file after finishing (simiarl to #include). // The '#' is necessary when calling from within sd files, as it stops buffer prereading @@ -229,7 +229,11 @@ int EtoPPressure=0; #endif #ifdef ULTIPANEL - bool powersupply = true; + #ifdef PS_DEFAULT_OFF + bool powersupply = false; + #else + bool powersupply = true; + #endif #endif #ifdef DELTA @@ -418,7 +422,7 @@ void servo_init() #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0) delay(PROBE_SERVO_DEACTIVATION_DELAY); - servos[servo_endstops[Z_AXIS]].detach(); + servos[servo_endstops[Z_AXIS]].detach(); #endif } @@ -639,17 +643,17 @@ void get_command() if(!card.sdprinting || serial_count!=0){ return; } - + //'#' stops reading from sd to the buffer prematurely, so procedural macro calls are possible - // if it occures, stop_buffering is triggered and the buffer is ran dry. + // if it occures, stop_buffering is triggered and the buffer is ran dry. // this character _can_ occure in serial com, due to checksums. however, no checksums are used in sd printing - + static bool stop_buffering=false; if(buflen==0) stop_buffering=false; - - while( !card.eof() && buflen < BUFSIZE && !stop_buffering) { + + while( !card.eof() && buflen < BUFSIZE && !stop_buffering) { int16_t n=card.get(); - serial_char = (char)n; + serial_char = (char)n; if(serial_char == '\n' || serial_char == '\r' || (serial_char == '#' && comment_mode == false) || @@ -674,7 +678,7 @@ void get_command() } if(serial_char=='#') stop_buffering=true; - + if(!serial_count) { comment_mode = false; //for new command @@ -746,13 +750,13 @@ XYZ_CONSTS_FROM_CONFIG(signed char, home_dir, HOME_DIR); #endif #if X_HOME_DIR != -1 || X2_HOME_DIR != 1 #error "Please use canonical x-carriage assignment" // the x-carriages are defined by their homing directions - #endif + #endif #define DXC_FULL_CONTROL_MODE 0 #define DXC_AUTO_PARK_MODE 1 #define DXC_DUPLICATION_MODE 2 static int dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; - + static float x_home_pos(int extruder) { if (extruder == 0) return base_home_pos(X_AXIS) + add_homeing[X_AXIS]; @@ -770,12 +774,12 @@ static int x_home_dir(int extruder) { static float inactive_extruder_x_pos = X2_MAX_POS; // used in mode 0 & 1 static bool active_extruder_parked = false; // used in mode 1 & 2 -static float raised_parked_position[NUM_AXIS]; // used in mode 1 -static unsigned long delayed_move_time = 0; // used in mode 1 +static float raised_parked_position[NUM_AXIS]; // used in mode 1 +static unsigned long delayed_move_time = 0; // used in mode 1 static float duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // used in mode 2 static float duplicate_extruder_temp_offset = 0; // used in mode 2 bool extruder_duplication_enabled = false; // used in mode 2 -#endif //DUAL_X_CARRIAGE +#endif //DUAL_X_CARRIAGE static void axis_is_at_home(int axis) { #ifdef DUAL_X_CARRIAGE @@ -788,8 +792,8 @@ static void axis_is_at_home(int axis) { } else if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && active_extruder == 0) { current_position[X_AXIS] = base_home_pos(X_AXIS) + add_homeing[X_AXIS]; - min_pos[X_AXIS] = base_min_pos(X_AXIS) + add_homeing[X_AXIS]; - max_pos[X_AXIS] = min(base_max_pos(X_AXIS) + add_homeing[X_AXIS], + min_pos[X_AXIS] = base_min_pos(X_AXIS) + add_homeing[X_AXIS]; + max_pos[X_AXIS] = min(base_max_pos(X_AXIS) + add_homeing[X_AXIS], max(extruder_offset[X_AXIS][1], X2_MAX_POS) - duplicate_extruder_x_offset); return; } @@ -881,7 +885,7 @@ static void run_z_probe() { st_synchronize(); // move back down slowly to find bed - feedrate = homing_feedrate[Z_AXIS]/4; + feedrate = homing_feedrate[Z_AXIS]/4; zPosition -= home_retract_mm(Z_AXIS) * 2; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60, active_extruder); st_synchronize(); @@ -978,7 +982,7 @@ static void homeaxis(int axis) { current_position[axis] = 0; plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); - + // Engage Servo endstop if enabled #ifdef SERVO_ENDSTOPS @@ -1036,7 +1040,7 @@ static void homeaxis(int axis) { #if defined (ENABLE_AUTO_BED_LEVELING) && (PROBE_SERVO_DEACTIVATION_DELAY > 0) if (axis==Z_AXIS) retract_z_probe(); #endif - + } } #define HOMEAXIS(LETTER) homeaxis(LETTER##_AXIS) @@ -1110,7 +1114,7 @@ void process_commands() destination[Y_AXIS]=current_position[Y_AXIS]; destination[Z_AXIS]=current_position[Z_AXIS]; current_position[Z_AXIS]+=retract_zlift; - destination[E_AXIS]=current_position[E_AXIS]+retract_length+retract_recover_length; + destination[E_AXIS]=current_position[E_AXIS]+retract_length+retract_recover_length; feedrate=retract_recover_feedrate; retracted=false; prepare_move(); @@ -1224,10 +1228,10 @@ void process_commands() // reset state used by the different modes memcpy(raised_parked_position, current_position, sizeof(raised_parked_position)); delayed_move_time = 0; - active_extruder_parked = true; - #else + active_extruder_parked = true; + #else HOMEAXIS(X); - #endif + #endif } if((home_all_axis) || (code_seen(axis_codes[Y_AXIS]))) { @@ -1246,7 +1250,7 @@ void process_commands() current_position[Y_AXIS]=code_value()+add_homeing[1]; } } - + #if Z_HOME_DIR < 0 // If homing towards BED do Z last #ifndef Z_SAFE_HOMING if((home_all_axis) || (code_seen(axis_codes[Z_AXIS]))) { @@ -1258,14 +1262,14 @@ void process_commands() #endif HOMEAXIS(Z); } - #else // Z Safe mode activated. + #else // Z Safe mode activated. if(home_all_axis) { destination[X_AXIS] = round(Z_SAFE_HOMING_X_POINT - X_PROBE_OFFSET_FROM_EXTRUDER); destination[Y_AXIS] = round(Z_SAFE_HOMING_Y_POINT - Y_PROBE_OFFSET_FROM_EXTRUDER); destination[Z_AXIS] = Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS) * (-1); // Set destination away from bed feedrate = XY_TRAVEL_SPEED; current_position[Z_AXIS] = 0; - + plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate, active_extruder); st_synchronize(); @@ -1283,7 +1287,7 @@ void process_commands() && (current_position[Y_AXIS]+Y_PROBE_OFFSET_FROM_EXTRUDER <= Y_MAX_POS)) { current_position[Z_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[Z_AXIS] = Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS) * (-1); // Set destination away from bed feedrate = max_feedrate[Z_AXIS]; plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate, active_extruder); @@ -1303,8 +1307,8 @@ void process_commands() #endif #endif - - + + if(code_seen(axis_codes[Z_AXIS])) { if(code_value_long() != 0) { current_position[Z_AXIS]=code_value()+add_homeing[2]; @@ -1467,7 +1471,7 @@ void process_commands() run_z_probe(); float z_at_xLeft_yFront = current_position[Z_AXIS]; retract_z_probe(); - + SERIAL_PROTOCOLPGM("Bed x: "); SERIAL_PROTOCOL(LEFT_PROBE_BED_POSITION); SERIAL_PROTOCOLPGM(" y: "); @@ -1485,7 +1489,7 @@ void process_commands() run_z_probe(); float z_at_xRight_yFront = current_position[Z_AXIS]; retract_z_probe(); // Retract Z Servo endstop if available - + SERIAL_PROTOCOLPGM("Bed x: "); SERIAL_PROTOCOL(RIGHT_PROBE_BED_POSITION); SERIAL_PROTOCOLPGM(" y: "); @@ -1500,10 +1504,10 @@ void process_commands() #endif // ACCURATE_BED_LEVELING - st_synchronize(); + st_synchronize(); // The following code correct the Z height difference from z-probe position and hotend tip position. - // The Z height on homing is measured by Z-Probe, but the probe is quite far from the hotend. + // The Z height on homing is measured by Z-Probe, but the probe is quite far from the hotend. // When the bed is uneven, this height must be corrected. real_z = float(st_get_position(Z_AXIS))/axis_steps_per_unit[Z_AXIS]; //get the real Z (since the auto bed leveling is already correcting the plane) x_tmp = current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER; @@ -1515,11 +1519,11 @@ void process_commands() plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); } break; - + case 30: // G30 Single Z Probe { engage_z_probe(); // Engage Z Servo endstop if available - + st_synchronize(); // TODO: make sure the bed_level_rotation_matrix is identity or the planner will get set incorectly setup_for_endstop_move(); @@ -1670,14 +1674,14 @@ void process_commands() card.removeFile(strchr_pointer + 4); } break; - case 32: //M32 - Select file and start SD print + case 32: //M32 - Select file and start SD print { if(card.sdprinting) { st_synchronize(); } - starpos = (strchr(strchr_pointer + 4,'*')); - + starpos = (strchr(strchr_pointer + 4,'*')); + char* namestartpos = (strchr(strchr_pointer + 4,'!')); //find ! to indicate filename string start. if(namestartpos==NULL) { @@ -1685,16 +1689,16 @@ void process_commands() } else namestartpos++; //to skip the '!' - + if(starpos!=NULL) *(starpos-1)='\0'; - + bool call_procedure=(code_seen('P')); - - if(strchr_pointer>namestartpos) + + if(strchr_pointer>namestartpos) call_procedure=false; //false alert, 'P' found within filename - - if( card.cardOK ) + + if( card.cardOK ) { card.openFile(namestartpos,true,!call_procedure); if(code_seen('S')) @@ -1767,7 +1771,7 @@ void process_commands() #ifdef DUAL_X_CARRIAGE if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && tmp_extruder == 0) setTargetHotend1(code_value() == 0.0 ? 0.0 : code_value() + duplicate_extruder_temp_offset); -#endif +#endif setWatch(); break; case 140: // M140 set bed temp @@ -1823,7 +1827,7 @@ void process_commands() SERIAL_PROTOCOL_F(rawHotendTemp(cur_extruder)/OVERSAMPLENR,0); } #endif - + SERIAL_PROTOCOLLN(""); return; break; @@ -1841,14 +1845,14 @@ void process_commands() #ifdef DUAL_X_CARRIAGE if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && tmp_extruder == 0) setTargetHotend1(code_value() == 0.0 ? 0.0 : code_value() + duplicate_extruder_temp_offset); -#endif +#endif CooldownNoWait = true; } else if (code_seen('R')) { setTargetHotend(code_value(), tmp_extruder); #ifdef DUAL_X_CARRIAGE if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && tmp_extruder == 0) setTargetHotend1(code_value() == 0.0 ? 0.0 : code_value() + duplicate_extruder_temp_offset); -#endif +#endif CooldownNoWait = false; } #ifdef AUTOTEMP @@ -2012,7 +2016,7 @@ void process_commands() SET_OUTPUT(SUICIDE_PIN); WRITE(SUICIDE_PIN, HIGH); #endif - + #ifdef ULTIPANEL powersupply = true; LCD_MESSAGEPGM(WELCOME_MSG); @@ -2169,18 +2173,18 @@ void process_commands() #endif break; //TODO: update for all axis, use for loop - #ifdef BLINKM + #ifdef BLINKM case 150: // M150 { byte red; byte grn; byte blu; - + if(code_seen('R')) red = code_value(); if(code_seen('U')) grn = code_value(); if(code_seen('B')) blu = code_value(); - - SendColors(red,grn,blu); + + SendColors(red,grn,blu); } break; #endif //BLINKM @@ -2302,7 +2306,7 @@ void process_commands() { extruder_offset[Z_AXIS][tmp_extruder] = code_value(); } - #endif + #endif SERIAL_ECHO_START; SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); for(tmp_extruder = 0; tmp_extruder < EXTRUDERS; tmp_extruder++) @@ -2335,17 +2339,17 @@ void process_commands() } } break; - + case 226: // M226 P S- Wait until the specified pin reaches the state required { if(code_seen('P')){ int pin_number = code_value(); // pin number int pin_state = -1; // required pin state - default is inverted - + if(code_seen('S')) pin_state = code_value(); // required pin state - + if(pin_state >= -1 && pin_state <= 1){ - + for(int8_t i = 0; i < (int8_t)sizeof(sensitive_pins); i++) { if (sensitive_pins[i] == pin_number) @@ -2354,28 +2358,28 @@ void process_commands() break; } } - + if (pin_number > -1) { st_synchronize(); - + pinMode(pin_number, INPUT); - + int target; switch(pin_state){ case 1: target = HIGH; break; - + case 0: target = LOW; break; - + case -1: target = !digitalRead(pin_number); break; } - + while(digitalRead(pin_number) != target){ manage_heater(); manage_inactivity(); @@ -2385,7 +2389,7 @@ void process_commands() } } } - break; + break; #if NUM_SERVOS > 0 case 280: // M280 - set servo position absolute. P: servo index, S: angle or microseconds @@ -2561,13 +2565,13 @@ void process_commands() engage_z_probe(); // Engage Z Servo endstop if available } break; - + case 402: { retract_z_probe(); // Retract Z Servo endstop if enabled } break; -#endif +#endif case 500: // M500 Store settings in EEPROM { Config_StoreSettings(); @@ -2725,14 +2729,14 @@ void process_commands() // M605 S0: Full control mode. The slicer has full control over x-carriage movement // M605 S1: Auto-park mode. The inactive head will auto park/unpark without slicer involvement // M605 S2 [Xnnn] [Rmmm]: Duplication mode. The second extruder will duplicate the first with nnn - // millimeters x-offset and an optional differential hotend temperature of + // millimeters x-offset and an optional differential hotend temperature of // mmm degrees. E.g., with "M605 S2 X100 R2" the second extruder will duplicate // the first with a spacing of 100mm in the x direction and 2 degrees hotter. // // Note: the X axis should be homed after changing dual x-carriage mode. { st_synchronize(); - + if (code_seen('S')) dual_x_carriage_mode = code_value(); @@ -2743,7 +2747,7 @@ void process_commands() if (code_seen('R')) duplicate_extruder_temp_offset = code_value(); - + SERIAL_ECHO_START; SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); SERIAL_ECHO(" "); @@ -2759,13 +2763,13 @@ void process_commands() { dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; } - + active_extruder_parked = false; extruder_duplication_enabled = false; delayed_move_time = 0; } break; - #endif //DUAL_X_CARRIAGE + #endif //DUAL_X_CARRIAGE case 907: // M907 Set digital trimpot motor current using axis codes. { @@ -2846,19 +2850,19 @@ void process_commands() // Save current position to return to after applying extruder offset memcpy(destination, current_position, sizeof(destination)); #ifdef DUAL_X_CARRIAGE - if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE && Stopped == false && + if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE && Stopped == false && (delayed_move_time != 0 || current_position[X_AXIS] != x_home_pos(active_extruder))) { // Park old head: 1) raise 2) move to park position 3) lower - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + TOOLCHANGE_PARK_ZLIFT, + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + TOOLCHANGE_PARK_ZLIFT, current_position[E_AXIS], max_feedrate[Z_AXIS], active_extruder); - plan_buffer_line(x_home_pos(active_extruder), current_position[Y_AXIS], current_position[Z_AXIS] + TOOLCHANGE_PARK_ZLIFT, + plan_buffer_line(x_home_pos(active_extruder), current_position[Y_AXIS], current_position[Z_AXIS] + TOOLCHANGE_PARK_ZLIFT, current_position[E_AXIS], max_feedrate[X_AXIS], active_extruder); - plan_buffer_line(x_home_pos(active_extruder), current_position[Y_AXIS], current_position[Z_AXIS], + plan_buffer_line(x_home_pos(active_extruder), current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], max_feedrate[Z_AXIS], active_extruder); st_synchronize(); } - + // apply Y & Z extruder offset (x offset is already used in determining home pos) current_position[Y_AXIS] = current_position[Y_AXIS] - extruder_offset[Y_AXIS][active_extruder] + @@ -2866,7 +2870,7 @@ void process_commands() current_position[Z_AXIS] = current_position[Z_AXIS] - extruder_offset[Z_AXIS][active_extruder] + extruder_offset[Z_AXIS][tmp_extruder]; - + active_extruder = tmp_extruder; // This function resets the max/min values - the current position may be overwritten below. @@ -2874,18 +2878,18 @@ void process_commands() if (dual_x_carriage_mode == DXC_FULL_CONTROL_MODE) { - current_position[X_AXIS] = inactive_extruder_x_pos; + current_position[X_AXIS] = inactive_extruder_x_pos; inactive_extruder_x_pos = destination[X_AXIS]; } else if (dual_x_carriage_mode == DXC_DUPLICATION_MODE) { active_extruder_parked = (active_extruder == 0); // this triggers the second extruder to move into the duplication position if (active_extruder == 0 || active_extruder_parked) - current_position[X_AXIS] = inactive_extruder_x_pos; + current_position[X_AXIS] = inactive_extruder_x_pos; else - current_position[X_AXIS] = destination[X_AXIS] + duplicate_extruder_x_offset; + current_position[X_AXIS] = destination[X_AXIS] + duplicate_extruder_x_offset; inactive_extruder_x_pos = destination[X_AXIS]; - extruder_duplication_enabled = false; + extruder_duplication_enabled = false; } else { @@ -2895,7 +2899,7 @@ void process_commands() active_extruder_parked = true; delayed_move_time = 0; } - #else + #else // Offset extruder (only by XY) int i; for(i = 0; i < 2; i++) { @@ -3108,13 +3112,13 @@ void prepare_move() { // move duplicate extruder into correct duplication position. plan_set_position(inactive_extruder_x_pos, current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); - plan_buffer_line(current_position[X_AXIS] + duplicate_extruder_x_offset, current_position[Y_AXIS], current_position[Z_AXIS], + plan_buffer_line(current_position[X_AXIS] + duplicate_extruder_x_offset, current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], max_feedrate[X_AXIS], 1); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); st_synchronize(); extruder_duplication_enabled = true; active_extruder_parked = false; - } + } else if (dual_x_carriage_mode == DXC_AUTO_PARK_MODE) // handle unparking of head { if (current_position[E_AXIS] == destination[E_AXIS]) @@ -3123,7 +3127,7 @@ void prepare_move() // be used as start of first non-travel move) if (delayed_move_time != 0xFFFFFFFFUL) { - memcpy(current_position, destination, sizeof(current_position)); + memcpy(current_position, destination, sizeof(current_position)); if (destination[Z_AXIS] > raised_parked_position[Z_AXIS]) raised_parked_position[Z_AXIS] = destination[Z_AXIS]; delayed_move_time = millis(); @@ -3133,9 +3137,9 @@ void prepare_move() delayed_move_time = 0; // unpark extruder: 1) raise, 2) move into starting XY position, 3) lower plan_buffer_line(raised_parked_position[X_AXIS], raised_parked_position[Y_AXIS], raised_parked_position[Z_AXIS], current_position[E_AXIS], max_feedrate[Z_AXIS], active_extruder); - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], raised_parked_position[Z_AXIS], + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], raised_parked_position[Z_AXIS], current_position[E_AXIS], min(max_feedrate[X_AXIS],max_feedrate[Y_AXIS]), active_extruder); - 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], max_feedrate[Z_AXIS], active_extruder); active_extruder_parked = false; } @@ -3301,7 +3305,7 @@ void manage_inactivity() // travel moves have been received so enact them delayed_move_time = 0xFFFFFFFFUL; // force moves to be done memcpy(destination,current_position,sizeof(destination)); - prepare_move(); + prepare_move(); } #endif #ifdef TEMP_STAT_LEDS diff --git a/Marlin/example_configurations/delta/Configuration.h b/Marlin/example_configurations/delta/Configuration.h index dbd2892b4..0d232d372 100644 --- a/Marlin/example_configurations/delta/Configuration.h +++ b/Marlin/example_configurations/delta/Configuration.h @@ -5,6 +5,13 @@ // Advanced settings can be found in Configuration_adv.h // BASIC SETTINGS: select your board type, temperature sensor type, axis scaling, and endstop configuration +//=========================================================================== +//============================= DELTA Printer =============================== +//=========================================================================== +// For a Delta printer rplace the configuration files wilth the files in the +// example_configurations/delta directory. +// + // User-specified version info of this build to display in [Pronterface, etc] terminal window during // startup. Implementation of an idea by Prof Braino to inform user that any changes made to this // build by the user have been successfully uploaded into firmware. @@ -18,13 +25,18 @@ // This determines the communication speed of the printer #define BAUDRATE 250000 -//#define BAUDRATE 115200 + +// This enables the serial port associated to the Bluetooth interface +//#define BTENABLED // Enable BT interface on AT90USB devices + //// The following define selects which electronics board you have. Please choose the one that matches your setup // 10 = Gen7 custom (Alfons3 Version) "https://github.com/Alfons3/Generation_7_Electronics" // 11 = Gen7 v1.1, v1.2 = 11 // 12 = Gen7 v1.3 // 13 = Gen7 v1.4 +// 2 = Cheaptronic v1.0 +// 20 = Sethi 3D_1 // 3 = MEGA/RAMPS up to 1.2 = 3 // 33 = RAMPS 1.3 / 1.4 (Power outputs: Extruder, Fan, Bed) // 34 = RAMPS 1.3 / 1.4 (Power outputs: Extruder0, Extruder1, Bed) @@ -38,6 +50,7 @@ // 64 = STB V1.1 // 65 = Azteeg X1 // 66 = Melzi with ATmega1284 (MaKr3d version) +// 67 = Azteeg X3 // 7 = Ultimaker // 71 = Ultimaker (Older electronics. Pre 1.5.4. This is rare) // 77 = 3Drag Controller @@ -45,6 +58,7 @@ // 80 = Rumba // 81 = Printrboard (AT90USB1286) // 82 = Brainwave (AT90USB646) +// 83 = SAV Mk-I (AT90USB1286) // 9 = Gen3+ // 70 = Megatronics // 701= Megatronics v2.0 @@ -61,6 +75,10 @@ // Define this to set a custom name for your generic Mendel, // #define CUSTOM_MENDEL_NAME "This Mendel" +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +// #define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + // This defines the number of extruders #define EXTRUDERS 1 @@ -70,6 +88,8 @@ #define POWER_SUPPLY 1 +// Define this to have the electronics keep the powersupply off on startup. If you don't know what this is leave it. +// #define PS_DEFAULT_OFF //=========================================================================== //============================== Delta Settings ============================= @@ -125,9 +145,10 @@ // 2 is 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) // 3 is mendel-parts thermistor (4.7k pullup) // 4 is 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! -// 5 is 100K thermistor - ATC Semitec 104GT-2 (Used in ParCan) (4.7k pullup) +// 5 is 100K thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (4.7k pullup) // 6 is 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) // 7 is 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) +// 71 is 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) // 8 is 100k 0603 SMD Vishay NTCS0603E3104FXT (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) @@ -137,7 +158,7 @@ // (but gives greater accuracy and more stable PID) // 51 is 100k thermistor - EPCOS (1k pullup) // 52 is 200k thermistor - ATC Semitec 204GT-2 (1k pullup) -// 55 is 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan) (1k pullup) +// 55 is 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) #define TEMP_SENSOR_0 -1 #define TEMP_SENSOR_1 -1 @@ -282,16 +303,15 @@ #endif // The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins. -const bool X_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. -const bool Y_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. -const bool Z_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. -const bool X_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. -const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. -const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop. - -// deltas never have min endstops +const bool X_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +const bool Y_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +const bool Z_MIN_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +//#define DISABLE_MAX_ENDSTOPS +// Deltas never have min endstops #define DISABLE_MIN_ENDSTOPS - // Disable max endstops for compatibility with endstop checking routine #if defined(COREXY) && !defined(DISABLE_MAX_ENDSTOPS) #define DISABLE_MAX_ENDSTOPS @@ -338,6 +358,58 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o #define X_MAX_LENGTH (X_MAX_POS - X_MIN_POS) #define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS) #define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS) +//============================= Bed Auto Leveling =========================== + +//#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable (remove // at the start of the line) + +#ifdef ENABLE_AUTO_BED_LEVELING + + // these are the positions on the bed to do the probing + #define LEFT_PROBE_BED_POSITION 15 + #define RIGHT_PROBE_BED_POSITION 170 + #define BACK_PROBE_BED_POSITION 180 + #define FRONT_PROBE_BED_POSITION 20 + + // these are the offsets to the prob relative to the extruder tip (Hotend - Probe) + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 + + #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z before homing (G28) for Probe Clearance. + // Be sure you have this distance over your Z_MAX_POS in case + + #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min + + #define Z_RAISE_BEFORE_PROBING 15 //How much the extruder will be raised before traveling to the first probing point. + #define Z_RAISE_BETWEEN_PROBINGS 5 //How much the extruder will be raised when traveling from between next probing points + + + //If defined, the Probe servo will be turned on only during movement and then turned off to avoid jerk + //The value is the delay to turn the servo off after powered on - depends on the servo speed; 300ms is good value, but you can try lower it. + // You MUST HAVE the SERVO_ENDSTOPS defined to use here a value higher than zero otherwise your code will not compile. + +// #define PROBE_SERVO_DEACTIVATION_DELAY 300 + + +//If you have enabled the Bed Auto Levelling and are using the same Z Probe for Z Homing, +//it is highly recommended you let this Z_SAFE_HOMING enabled!!! + + #define Z_SAFE_HOMING // This feature is meant to avoid Z homing with probe outside the bed area. + // When defined, it will: + // - Allow Z homing only after X and Y homing AND stepper drivers still enabled + // - If stepper drivers timeout, it will need X and Y homing again before Z homing + // - Position the probe in a defined XY point before Z Homing when homing all axis (G28) + // - Block Z homing only when the probe is outside bed area. + + #ifdef Z_SAFE_HOMING + + #define Z_SAFE_HOMING_X_POINT (X_MAX_LENGTH/2) // X point for Z homing when homing all axis (G28) + #define Z_SAFE_HOMING_Y_POINT (Y_MAX_LENGTH/2) // Y point for Z homing when homing all axis (G28) + + #endif + +#endif + // The position of the homing switches //#define MANUAL_HOME_POSITIONS // If defined, MANUAL_*_HOME_POS below will be used @@ -406,7 +478,8 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define SDSUPPORT // Enable SD Card Support in Hardware Console //#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) - +//#define ENCODER_PULSES_PER_STEP 1 // Increase if you have a high resolution encoder +//#define ENCODER_STEPS_PER_MENU_ITEM 5 // Set according to ENCODER_PULSES_PER_STEP or your liking //#define ULTIMAKERCONTROLLER //as available from the ultimaker online store. //#define ULTIPANEL //the ultipanel as on thingiverse @@ -510,6 +583,17 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o #define ULTIPANEL #endif +// Shift register panels +// --------------------- +// 2 wire Non-latching LCD SR from: +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection +//#define SR_LCD +#ifdef SR_LCD + #define SR_LCD_2W_NL // Non latching 2 wire shiftregister + //#define NEWPANEL +#endif + + #ifdef ULTIPANEL // #define NEWPANEL //enable this if you have a click-encoder panel #define SDSUPPORT @@ -543,6 +627,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o // Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino //#define FAST_PWM_FAN +// Temperature status leds that display the hotend and bet temperature. +// If alle hotends and bed temperature and temperature setpoint are < 54C then the BLUE led is on. +// Otherwise the RED led is on. There is 1C hysteresis. +//#define TEMP_STAT_LEDS + // Use software PWM to drive the fan, as for the heaters. This uses a very low frequency // which is not ass annoying as with the hardware PWM. On the other hand, if this frequency // is too low, you should also increment SOFT_PWM_SCALE. @@ -564,6 +653,9 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o // Support for the BariCUDA Paste Extruder. //#define BARICUDA +//define BlinkM/CyzRgb Support +//#define BLINKM + /*********************************************************************\ * R/C SERVO support * Sponsored by TrinityLabs, Reworked by codexmas diff --git a/Marlin/example_configurations/delta/Configuration_adv.h b/Marlin/example_configurations/delta/Configuration_adv.h index d3c2d1939..fcf6ff570 100644 --- a/Marlin/example_configurations/delta/Configuration_adv.h +++ b/Marlin/example_configurations/delta/Configuration_adv.h @@ -40,6 +40,10 @@ #define AUTOTEMP_OLDWEIGHT 0.98 #endif +//Show Temperature ADC value +//The M105 command return, besides traditional information, the ADC value read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + // extruder run-out prevention. //if the machine is idle, and the temperature over MINTEMP, every couple of SECONDS some filament is extruded //#define EXTRUDER_RUNOUT_PREVENT @@ -146,6 +150,21 @@ #define EXTRUDERS 1 #endif +// Same again but for Y Axis. +//#define Y_DUAL_STEPPER_DRIVERS + +// Define if the two Y drives need to rotate in opposite directions +#define INVERT_Y2_VS_Y_DIR true + +#ifdef Y_DUAL_STEPPER_DRIVERS + #undef EXTRUDERS + #define EXTRUDERS 1 +#endif + +#if defined (Z_DUAL_STEPPER_DRIVERS) && defined (Y_DUAL_STEPPER_DRIVERS) + #error "You cannot have dual drivers for both Y and Z" +#endif + // Enable this for dual x-carriage printers. // A dual x-carriage design has the advantage that the inactive extruder can be parked which // prevents hot-end ooze contaminating the print. It also reduces the weight of each x-carriage @@ -155,8 +174,8 @@ // Configuration for second X-carriage // Note: the first x-carriage is defined as the x-carriage which homes to the minimum endstop; // the second x-carriage always homes to the maximum endstop. -#define X2_MIN_POS 88 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage -#define X2_MAX_POS 350.45 // set maximum to the distance between toolheads when both heads are homed +#define X2_MIN_POS 80 // set minimum to ensure second x-carriage doesn't hit the parked first X-carriage +#define X2_MAX_POS 353 // set maximum to the distance between toolheads when both heads are homed #define X2_HOME_DIR 1 // the second X-carriage always homes to the maximum endstop position #define X2_HOME_POS X2_MAX_POS // default home position is the maximum carriage position // However: In this mode the EXTRUDER_OFFSET_X value for the second extruder provides a software @@ -169,14 +188,35 @@ #define X2_STEP_PIN 25 #define X2_DIR_PIN 23 -#endif // DUAL_X_CARRIAGE +// There are a few selectable movement modes for dual x-carriages using M605 S +// Mode 0: Full control. The slicer has full control over both x-carriages and can achieve optimal travel results +// as long as it supports dual x-carriages. (M605 S0) +// Mode 1: Auto-park mode. The firmware will automatically park and unpark the x-carriages on tool changes so +// that additional slicer support is not required. (M605 S1) +// Mode 2: Duplication mode. The firmware will transparently make the second x-carriage and extruder copy all +// actions of the first x-carriage. This allows the printer to print 2 arbitrary items at +// once. (2nd extruder x offset and temp offset are set using: M605 S2 [Xnnn] [Rmmm]) + +// This is the default power-up mode which can be later using M605. +#define DEFAULT_DUAL_X_CARRIAGE_MODE 0 + +// As the x-carriages are independent we can now account for any relative Z offset +#define EXTRUDER1_Z_OFFSET 0.0 // z offset relative to extruder 0 + +// Default settings in "Auto-park Mode" +#define TOOLCHANGE_PARK_ZLIFT 0.2 // the distance to raise Z axis when parking an extruder +#define TOOLCHANGE_UNPARK_ZLIFT 1 // the distance to raise Z axis when unparking an extruder + +// Default x offset in duplication mode (typically set to half print bed width) +#define DEFAULT_DUPLICATION_X_OFFSET 100 + +#endif //DUAL_X_CARRIAGE //homing hits the endstop, then retracts by this distance, before it tries to slowly bump again: #define X_HOME_RETRACT_MM 5 -#define Y_HOME_RETRACT_MM 5 +#define Y_HOME_RETRACT_MM 5 #define Z_HOME_RETRACT_MM 5 // deltas need the same for all three axis - //#define QUICK_HOME //if this is defined, if both x and y are to be homed, a diagonal move will be performed initially. #define AXIS_RELATIVE_MODES {false, false, false, false} @@ -238,6 +278,11 @@ #define SD_FINISHED_STEPPERRELEASE true //if sd support and the file is finished: disable steppers? #define SD_FINISHED_RELEASECOMMAND "M84 X Y Z E" // You might want to keep the z enabled so your bed stays in place. +#define SDCARD_RATHERRECENTFIRST //reverse file order of sd card menu display. Its sorted practically after the filesystem block order. +// if a file is deleted, it frees a block. hence, the order is not purely cronological. To still have auto0.g accessible, there is again the option to do that. +// using: +//#define MENU_ADDAUTOSTART + // The hardware watchdog should reset the Microcontroller disabling all outputs, in case the firmware gets stuck and doesn't do temperature regulation. //#define USE_WATCHDOG @@ -251,6 +296,26 @@ // Enable the option to stop SD printing when hitting and endstops, needs to be enabled from the LCD menu when this option is enabled. //#define ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED +// Babystepping enables the user to control the axis in tiny amounts, independently from the normal printing process +// it can e.g. be used to change z-positions in the print startup phase in realtime +// does not respect endstops! +//#define BABYSTEPPING +#ifdef BABYSTEPPING + #define BABYSTEP_XY //not only z, but also XY in the menu. more clutter, more functions + #define BABYSTEP_INVERT_Z false //true for inverse movements in Z + #define BABYSTEP_Z_MULTIPLICATOR 2 //faster z movements + + #ifdef COREXY + #error BABYSTEPPING not implemented for COREXY yet. + #endif + + #ifdef DELTA + #ifdef BABYSTEP_XY + #error BABYSTEPPING only implemented for Z axis on deltabots. + #endif + #endif +#endif + // extruder advance constant (s2/mm3) // // advance (steps) = STEPS_PER_CUBIC_MM_E * EXTUDER_ADVANCE_K * cubic mm per second ^ 2 @@ -302,6 +367,9 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define PS_ON_ASLEEP LOW #endif +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + //=========================================================================== //=============================Buffers ============================ //=========================================================================== @@ -332,7 +400,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st //adds support for experimental filament exchange support M600; requires display #ifdef ULTIPANEL - //#define FILAMENTCHANGEENABLE + #define FILAMENTCHANGEENABLE #ifdef FILAMENTCHANGEENABLE #define FILAMENTCHANGE_XPOS 3 #define FILAMENTCHANGE_YPOS 3 @@ -341,6 +409,12 @@ const unsigned int dropsegments=5; //everything with less than this number of st #define FILAMENTCHANGE_FINALRETRACT -100 #endif #endif + +#ifdef FILAMENTCHANGEENABLE + #ifdef EXTRUDER_RUNOUT_PREVENT + #error EXTRUDER_RUNOUT_PREVENT currently incompatible with FILAMENTCHANGE + #endif +#endif //=========================================================================== //============================= Define Defines ============================ @@ -349,6 +423,10 @@ const unsigned int dropsegments=5; //everything with less than this number of st #error "You cannot use TEMP_SENSOR_1_AS_REDUNDANT if EXTRUDERS > 1" #endif +#if EXTRUDERS > 1 && defined HEATERS_PARALLEL + #error "You cannot use HEATERS_PARALLEL if EXTRUDERS > 1" +#endif + #if TEMP_SENSOR_0 > 0 #define THERMISTORHEATER_0 TEMP_SENSOR_0 #define HEATER_0_USES_THERMISTOR diff --git a/Marlin/pins.h b/Marlin/pins.h index ba73a3ccc..b7cbac4fd 100644 --- a/Marlin/pins.h +++ b/Marlin/pins.h @@ -2288,6 +2288,107 @@ #endif +/**************************************************************************************** +* Cheaptronic v1.0 +* +****************************************************************************************/ +#if MOTHERBOARD == 2 + #define KNOWN_BOARD 1 + + #ifndef __AVR_ATmega2560__ + #error Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu. + #endif + + #define LARGE_FLASH true + + //X motor stepper + #define X_STEP_PIN 14 + #define X_DIR_PIN 15 + #define X_ENABLE_PIN 24 + + //X endstop + #define X_MIN_PIN 3 + #define X_MAX_PIN -1 + + //Y motor stepper + #define Y_STEP_PIN 35 + #define Y_DIR_PIN 36 + #define Y_ENABLE_PIN 31 + + //Y endstop + #define Y_MIN_PIN 2 + #define Y_MAX_PIN -1 + + //Z motor stepper + #define Z_STEP_PIN 40 + #define Z_DIR_PIN 41 + #define Z_ENABLE_PIN 37 + + //Z endstop + #define Z_MIN_PIN 5 + #define Z_MAX_PIN -1 + + //Extruder 0 stepper + #define E0_STEP_PIN 26 + #define E0_DIR_PIN 28 + #define E0_ENABLE_PIN 25 + + //Extruder 1 stepper + #define E1_STEP_PIN 33 + #define E1_DIR_PIN 34 + #define E1_ENABLE_PIN 30 + + #define SDPOWER -1 + #define SDSS -1 + #define LED_PIN -1 + + //FAN + #define FAN_PIN -1 + + #define PS_ON_PIN -1 + #define KILL_PIN -1 + + #define HEATER_0_PIN 19 // EXTRUDER 1 + #define HEATER_1_PIN 23 // EXTRUDER 2 + //HeatedBad + #define HEATER_BED_PIN 22 + //Cheaptronic v1.0 hasent EXTRUDER 3 + #define HEATER_2_PIN -1 + + //Temperature sensors + #define TEMP_0_PIN 15 + #define TEMP_1_PIN 14 + #define TEMP_2_PIN -1 + #define TEMP_BED_PIN 13 + + //Cheaptronic v1.0 dont support LCD + #define LCD_PINS_RS -1 + #define LCD_PINS_ENABLE -1 + #define LCD_PINS_D4 -1 + #define LCD_PINS_D5 -1 + #define LCD_PINS_D6 -1 + #define LCD_PINS_D7 -1 + + //Cheaptronic v1.0 dont support keypad + #define BTN_EN1 -1 + #define BTN_EN2 -1 + #define BTN_ENC -1 + + #define BLEN_C 2 + #define BLEN_B 1 + #define BLEN_A 0 + + //Cheaptronic v1.0 does not use this port + #define SDCARDDETECT -1 + + //encoder rotation values + #define encrot0 0 + #define encrot1 2 + #define encrot2 3 + #define encrot3 1 + +#endif + #ifndef KNOWN_BOARD diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index d9299c4a7..a9da533c7 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -186,9 +186,9 @@ void calculate_trapezoid_for_block(block_t *block, float entry_factor, float exi long acceleration = block->acceleration_st; int32_t accelerate_steps = - ceil(estimate_acceleration_distance(block->initial_rate, block->nominal_rate, acceleration)); + ceil(estimate_acceleration_distance(initial_rate, block->nominal_rate, acceleration)); int32_t decelerate_steps = - floor(estimate_acceleration_distance(block->nominal_rate, block->final_rate, -acceleration)); + floor(estimate_acceleration_distance(block->nominal_rate, final_rate, -acceleration)); // Calculate the size of Plateau of Nominal Rate. int32_t plateau_steps = block->step_event_count-accelerate_steps-decelerate_steps; @@ -197,7 +197,7 @@ void calculate_trapezoid_for_block(block_t *block, float entry_factor, float exi // have to use intersection_distance() to calculate when to abort acceleration and start braking // in order to reach the final_rate exactly at the end of this block. if (plateau_steps < 0) { - accelerate_steps = ceil(intersection_distance(block->initial_rate, block->final_rate, acceleration, block->step_event_count)); + accelerate_steps = ceil(intersection_distance(initial_rate, final_rate, acceleration, block->step_event_count)); accelerate_steps = max(accelerate_steps,0); // Check limits due to numerical round-off accelerate_steps = min((uint32_t)accelerate_steps,block->step_event_count);//(We can cast here to unsigned, because the above line ensures that we are above zero) plateau_steps = 0; diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index 163c881e1..fe8cab086 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -90,12 +90,16 @@ static void menu_action_setting_edit_callback_long5(const char* pstr, unsigned l #define ENCODER_FEEDRATE_DEADZONE 10 #if !defined(LCD_I2C_VIKI) - #define ENCODER_STEPS_PER_MENU_ITEM 5 + #ifndef ENCODER_STEPS_PER_MENU_ITEM + #define ENCODER_STEPS_PER_MENU_ITEM 5 + #endif #ifndef ENCODER_PULSES_PER_STEP #define ENCODER_PULSES_PER_STEP 1 #endif #else - #define ENCODER_STEPS_PER_MENU_ITEM 2 // VIKI LCD rotary encoder uses a different number of steps per rotation + #ifndef ENCODER_STEPS_PER_MENU_ITEM + #define ENCODER_STEPS_PER_MENU_ITEM 2 // VIKI LCD rotary encoder uses a different number of steps per rotation + #endif #ifndef ENCODER_PULSES_PER_STEP #define ENCODER_PULSES_PER_STEP 1 #endif @@ -207,7 +211,7 @@ static void lcd_status_screen() else if (feedmultiply == 100 && int(encoderPosition) < -ENCODER_FEEDRATE_DEADZONE) { feedmultiply += int(encoderPosition) + ENCODER_FEEDRATE_DEADZONE; - encoderPosition = 0; + encoderPosition = 0; } else if (feedmultiply != 100) { @@ -407,7 +411,7 @@ static void lcd_tune_menu() #endif MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255); MENU_ITEM_EDIT(int3, MSG_FLOW, &extrudemultiply, 10, 999); - + #ifdef BABYSTEPPING #ifdef BABYSTEP_XY MENU_ITEM(submenu, "Babystep X", lcd_babystep_x); @@ -719,7 +723,7 @@ static void lcd_control_motion_menu() MENU_ITEM_EDIT(float52, MSG_XSTEPS, &axis_steps_per_unit[X_AXIS], 5, 9999); MENU_ITEM_EDIT(float52, MSG_YSTEPS, &axis_steps_per_unit[Y_AXIS], 5, 9999); MENU_ITEM_EDIT(float51, MSG_ZSTEPS, &axis_steps_per_unit[Z_AXIS], 5, 9999); - MENU_ITEM_EDIT(float51, MSG_ESTEPS, &axis_steps_per_unit[E_AXIS], 5, 9999); + MENU_ITEM_EDIT(float51, MSG_ESTEPS, &axis_steps_per_unit[E_AXIS], 5, 9999); #ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED MENU_ITEM_EDIT(bool, "Endstop abort", &abort_on_endstop_hit); #endif @@ -781,7 +785,7 @@ static void lcd_sd_updir() void lcd_sdcard_menu() { - if (lcdDrawUpdate == 0 && LCD_CLICKED == 0) + if (lcdDrawUpdate == 0 && LCD_CLICKED == 0) return; // nothing to do (so don't thrash the SD card) uint16_t fileCnt = card.getnrfilenames(); START_MENU(); @@ -795,7 +799,7 @@ void lcd_sdcard_menu() }else{ MENU_ITEM(function, LCD_STR_FOLDER "..", lcd_sd_updir); } - + for(uint16_t i=0;i 0 - pinMode(BTN_ENC,INPUT); + pinMode(BTN_ENC,INPUT); WRITE(BTN_ENC,HIGH); - #endif + #endif #ifdef REPRAPWORLD_KEYPAD pinMode(SHIFT_CLK,OUTPUT); pinMode(SHIFT_LD,OUTPUT); @@ -1007,9 +1011,9 @@ void lcd_init() pinMode(SHIFT_EN,OUTPUT); pinMode(SHIFT_OUT,INPUT); WRITE(SHIFT_OUT,HIGH); - WRITE(SHIFT_LD,HIGH); + WRITE(SHIFT_LD,HIGH); WRITE(SHIFT_EN,LOW); - #endif // SR_LCD_2W_NL + #endif // SR_LCD_2W_NL #endif//!NEWPANEL #if (SDCARDDETECT > 0) @@ -1020,28 +1024,28 @@ void lcd_init() slow_buttons = 0; #endif lcd_buttons_update(); -#ifdef ULTIPANEL +#ifdef ULTIPANEL encoderDiff = 0; -#endif +#endif } void lcd_update() { static unsigned long timeoutToStatus = 0; - + #ifdef LCD_HAS_SLOW_BUTTONS slow_buttons = lcd_implementation_read_slow_buttons(); // buttons which take too long to read in interrupt context #endif - + lcd_buttons_update(); - + #if (SDCARDDETECT > 0) if((IS_SD_INSERTED != lcd_oldcardstatus)) { lcdDrawUpdate = 2; lcd_oldcardstatus = IS_SD_INSERTED; lcd_implementation_init(); // to maybe revive the lcd if static electricty killed it. - + if(lcd_oldcardstatus) { card.initsd(); @@ -1054,7 +1058,7 @@ void lcd_update() } } #endif//CARDINSERTED - + if (lcd_next_update_millis < millis()) { #ifdef ULTIPANEL @@ -1095,7 +1099,7 @@ void lcd_update() #ifdef DOGLCD // Changes due to different driver architecture of the DOGM display blink++; // Variable for fan animation and alive dot u8g.firstPage(); - do + do { u8g.setFont(u8g_font_6x10_marlin); u8g.setPrintPos(125,0); @@ -1105,7 +1109,7 @@ void lcd_update() (*currentMenu)(); if (!lcdDrawUpdate) break; // Terminate display update, when nothing new to draw. This must be done before the last dogm.next() } while( u8g.nextPage() ); -#else +#else (*currentMenu)(); #endif @@ -1159,7 +1163,7 @@ void lcd_reset_alert_level() void lcd_setcontrast(uint8_t value) { lcd_contrast = value & 63; - u8g.setContrast(lcd_contrast); + u8g.setContrast(lcd_contrast); } #endif @@ -1199,7 +1203,7 @@ void lcd_buttons_update() WRITE(SHIFT_LD,HIGH); unsigned char tmp_buttons=0; for(int8_t i=0;i<8;i++) - { + { newbutton = newbutton>>1; if(READ(SHIFT_OUT)) newbutton|=(1<<7); @@ -1249,14 +1253,14 @@ void lcd_buttons_update() } void lcd_buzz(long duration, uint16_t freq) -{ +{ #ifdef LCD_USE_I2C_BUZZER lcd.buzz(duration,freq); -#endif +#endif } -bool lcd_clicked() -{ +bool lcd_clicked() +{ return LCD_CLICKED; } #endif//ULTIPANEL