Merge branch 'MK3' into thumbnails2
This commit is contained in:
commit
7aa4595211
49 changed files with 918 additions and 406 deletions
Firmware
ConfigurationStore.cppConfigurationStore.hMarlin.hMarlin_main.cppSd2PinMap.hcardreader.cppcardreader.hconfig.heeprom.hfastio.hfsensor.cppmessages.cmessages.hpat9125.cpat9125.hpins.hpins_Einsy_1_0.hpins_Rambo_1_3.hplanner.cppsm4.cstepper.cppswi2c.ctemperature.cpptimer02.ctimer02.htmc2130.cpptmc2130.htone04.ctwi.ctwi.hultralcd.cpputil.cpputil.h
PF-build.shvariants
lang
|
@ -96,7 +96,7 @@ void Config_PrintSettings(uint8_t level)
|
|||
"%SMaximum feedrates - stealth (mm/s):\n%S M203 X%.2f Y%.2f Z%.2f E%.2f\n"
|
||||
"%SMaximum acceleration - normal (mm/s2):\n%S M201 X%lu Y%lu Z%lu E%lu\n"
|
||||
"%SMaximum acceleration - stealth (mm/s2):\n%S M201 X%lu Y%lu Z%lu E%lu\n"
|
||||
"%SAcceleration: S=acceleration, T=retract acceleration\n%S M204 S%.2f T%.2f\n"
|
||||
"%SAcceleration: P=print, R=retract, T=travel\n%S M204 P%.2f R%.2f T%.2f\n"
|
||||
"%SAdvanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), B=minimum segment time (ms), X=maximum XY jerk (mm/s), Z=maximum Z jerk (mm/s), E=maximum E jerk (mm/s)\n%S M205 S%.2f T%.2f B%.2f X%.2f Y%.2f Z%.2f E%.2f\n"
|
||||
"%SHome offset (mm):\n%S M206 X%.2f Y%.2f Z%.2f\n"
|
||||
),
|
||||
|
@ -106,7 +106,7 @@ void Config_PrintSettings(uint8_t level)
|
|||
echomagic, echomagic, cs.max_feedrate_silent[X_AXIS], cs.max_feedrate_silent[Y_AXIS], cs.max_feedrate_silent[Z_AXIS], cs.max_feedrate_silent[E_AXIS],
|
||||
echomagic, echomagic, cs.max_acceleration_units_per_sq_second_normal[X_AXIS], cs.max_acceleration_units_per_sq_second_normal[Y_AXIS], cs.max_acceleration_units_per_sq_second_normal[Z_AXIS], cs.max_acceleration_units_per_sq_second_normal[E_AXIS],
|
||||
echomagic, echomagic, cs.max_acceleration_units_per_sq_second_silent[X_AXIS], cs.max_acceleration_units_per_sq_second_silent[Y_AXIS], cs.max_acceleration_units_per_sq_second_silent[Z_AXIS], cs.max_acceleration_units_per_sq_second_silent[E_AXIS],
|
||||
echomagic, echomagic, cs.acceleration, cs.retract_acceleration,
|
||||
echomagic, echomagic, cs.acceleration, cs.retract_acceleration, cs.travel_acceleration,
|
||||
echomagic, echomagic, cs.minimumfeedrate, cs.mintravelfeedrate, cs.minsegmenttime, cs.max_jerk[X_AXIS], cs.max_jerk[Y_AXIS], cs.max_jerk[Z_AXIS], cs.max_jerk[E_AXIS],
|
||||
echomagic, echomagic, cs.add_homing[X_AXIS], cs.add_homing[Y_AXIS], cs.add_homing[Z_AXIS]
|
||||
#else //TMC2130
|
||||
|
@ -114,14 +114,14 @@ void Config_PrintSettings(uint8_t level)
|
|||
"%SSteps per unit:\n%S M92 X%.2f Y%.2f Z%.2f E%.2f\n"
|
||||
"%SMaximum feedrates (mm/s):\n%S M203 X%.2f Y%.2f Z%.2f E%.2f\n"
|
||||
"%SMaximum acceleration (mm/s2):\n%S M201 X%lu Y%lu Z%lu E%lu\n"
|
||||
"%SAcceleration: S=acceleration, T=retract acceleration\n%S M204 S%.2f T%.2f\n"
|
||||
"%SAcceleration: P=print, R=retract, T=travel\n%S M204 P%.2f R%.2f T%.2f\n"
|
||||
"%SAdvanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), B=minimum segment time (ms), X=maximum XY jerk (mm/s), Z=maximum Z jerk (mm/s), E=maximum E jerk (mm/s)\n%S M205 S%.2f T%.2f B%.2f X%.2f Y%.2f Z%.2f E%.2f\n"
|
||||
"%SHome offset (mm):\n%S M206 X%.2f Y%.2f Z%.2f\n"
|
||||
),
|
||||
echomagic, echomagic, cs.axis_steps_per_unit[X_AXIS], cs.axis_steps_per_unit[Y_AXIS], cs.axis_steps_per_unit[Z_AXIS], cs.axis_steps_per_unit[E_AXIS],
|
||||
echomagic, echomagic, max_feedrate[X_AXIS], max_feedrate[Y_AXIS], max_feedrate[Z_AXIS], max_feedrate[E_AXIS],
|
||||
echomagic, echomagic, max_acceleration_units_per_sq_second[X_AXIS], max_acceleration_units_per_sq_second[Y_AXIS], max_acceleration_units_per_sq_second[Z_AXIS], max_acceleration_units_per_sq_second[E_AXIS],
|
||||
echomagic, echomagic, cs.acceleration, cs.retract_acceleration,
|
||||
echomagic, echomagic, cs.acceleration, cs.retract_acceleration, cs.travel_acceleration,
|
||||
echomagic, echomagic, cs.minimumfeedrate, cs.mintravelfeedrate, cs.minsegmenttime, cs.max_jerk[X_AXIS], cs.max_jerk[Y_AXIS], cs.max_jerk[Z_AXIS], cs.max_jerk[E_AXIS],
|
||||
echomagic, echomagic, cs.add_homing[X_AXIS], cs.add_homing[Y_AXIS], cs.add_homing[Z_AXIS]
|
||||
#endif //TMC2130
|
||||
|
@ -184,7 +184,7 @@ static_assert (false, "zprobe_zoffset was not initialized in printers in field t
|
|||
"0.0, if this is not acceptable, increment EEPROM_VERSION to force use default_conf");
|
||||
#endif
|
||||
|
||||
static_assert (sizeof(M500_conf) == 192, "sizeof(M500_conf) has changed, ensure that EEPROM_VERSION has been incremented, "
|
||||
static_assert (sizeof(M500_conf) == 196, "sizeof(M500_conf) has changed, ensure that EEPROM_VERSION has been incremented, "
|
||||
"or if you added members in the end of struct, ensure that historically uninitialized values will be initialized."
|
||||
"If this is caused by change to more then 8bit processor, decide whether make this struct packed to save EEPROM,"
|
||||
"leave as it is to keep fast code, or reorder struct members to pack more tightly.");
|
||||
|
@ -232,8 +232,21 @@ static const M500_conf default_conf PROGMEM =
|
|||
#else // TMC2130
|
||||
{16,16,16,16},
|
||||
#endif
|
||||
DEFAULT_TRAVEL_ACCELERATION,
|
||||
};
|
||||
|
||||
|
||||
static bool is_uninitialized(void* addr, uint8_t len)
|
||||
{
|
||||
while(len--)
|
||||
{
|
||||
if(reinterpret_cast<uint8_t*>(addr)[len] != 0xff)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//! @brief Read M500 configuration
|
||||
//! @retval true Succeeded. Stored settings retrieved or default settings retrieved in case EEPROM has been erased.
|
||||
//! @retval false Failed. Default settings has been retrieved, because of older version or corrupted data.
|
||||
|
@ -257,13 +270,9 @@ bool Config_RetrieveSettings()
|
|||
for (uint8_t i = 0; i < (sizeof(cs.max_feedrate_silent)/sizeof(cs.max_feedrate_silent[0])); ++i)
|
||||
{
|
||||
const uint32_t erased = 0xffffffff;
|
||||
bool initialized = false;
|
||||
|
||||
for(uint8_t j = 0; j < sizeof(float); ++j)
|
||||
{
|
||||
if(0xff != reinterpret_cast<uint8_t*>(&(cs.max_feedrate_silent[i]))[j]) initialized = true;
|
||||
if (is_uninitialized(&(cs.max_feedrate_silent[i]), sizeof(float))) {
|
||||
memcpy_P(&cs.max_feedrate_silent[i],&default_conf.max_feedrate_silent[i], sizeof(cs.max_feedrate_silent[i]));
|
||||
}
|
||||
if (!initialized) memcpy_P(&cs.max_feedrate_silent[i],&default_conf.max_feedrate_silent[i], sizeof(cs.max_feedrate_silent[i]));
|
||||
if (erased == cs.max_acceleration_units_per_sq_second_silent[i]) {
|
||||
memcpy_P(&cs.max_acceleration_units_per_sq_second_silent[i],&default_conf.max_acceleration_units_per_sq_second_silent[i],sizeof(cs.max_acceleration_units_per_sq_second_silent[i]));
|
||||
}
|
||||
|
@ -293,6 +302,9 @@ bool Config_RetrieveSettings()
|
|||
tmc2130_set_res(E_AXIS, cs.axis_ustep_resolution[E_AXIS]);
|
||||
#endif //TMC2130
|
||||
|
||||
if(is_uninitialized(&cs.travel_acceleration, sizeof(cs.travel_acceleration)))
|
||||
cs.travel_acceleration = cs.acceleration;
|
||||
|
||||
reset_acceleration_rates();
|
||||
|
||||
// Call updatePID (similar to when we have processed M301)
|
||||
|
|
|
@ -38,6 +38,7 @@ typedef struct
|
|||
float max_feedrate_silent[4]; //!< max speeds for silent mode
|
||||
unsigned long max_acceleration_units_per_sq_second_silent[4];
|
||||
unsigned char axis_ustep_resolution[4];
|
||||
float travel_acceleration; //!< travel acceleration mm/s^2
|
||||
} M500_conf;
|
||||
|
||||
extern M500_conf cs;
|
||||
|
|
|
@ -350,10 +350,6 @@ extern unsigned long t_fan_rising_edge;
|
|||
extern bool mesh_bed_leveling_flag;
|
||||
extern bool mesh_bed_run_from_menu;
|
||||
|
||||
extern bool sortAlpha;
|
||||
|
||||
extern char dir_names[3][9];
|
||||
|
||||
extern int8_t lcd_change_fil_state;
|
||||
// save/restore printing
|
||||
extern bool saved_printing;
|
||||
|
@ -501,4 +497,6 @@ void raise_z_above(float target, bool plan=true);
|
|||
|
||||
extern "C" void softReset();
|
||||
|
||||
extern uint32_t IP_address;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -90,18 +90,13 @@
|
|||
#include "la10compat.h"
|
||||
#endif
|
||||
|
||||
#ifdef SWSPI
|
||||
#include "swspi.h"
|
||||
#endif //SWSPI
|
||||
|
||||
#include "spi.h"
|
||||
|
||||
#ifdef SWI2C
|
||||
#include "swi2c.h"
|
||||
#endif //SWI2C
|
||||
|
||||
#ifdef FILAMENT_SENSOR
|
||||
#include "fsensor.h"
|
||||
#ifdef IR_SENSOR
|
||||
#include "pat9125.h" // for pat9125_probe
|
||||
#endif
|
||||
#endif //FILAMENT_SENSOR
|
||||
|
||||
#ifdef TMC2130
|
||||
|
@ -233,10 +228,6 @@ bool fan_state[2];
|
|||
int fan_edge_counter[2];
|
||||
int fan_speed[2];
|
||||
|
||||
char dir_names[3][9];
|
||||
|
||||
bool sortAlpha = false;
|
||||
|
||||
|
||||
float extruder_multiplier[EXTRUDERS] = {1.0
|
||||
#if EXTRUDERS > 1
|
||||
|
@ -326,6 +317,8 @@ uint16_t print_time_remaining_normal = PRINT_TIME_REMAINING_INIT; //estimated re
|
|||
uint8_t print_percent_done_silent = PRINT_PERCENT_DONE_INIT;
|
||||
uint16_t print_time_remaining_silent = PRINT_TIME_REMAINING_INIT; //estimated remaining print time in minutes
|
||||
|
||||
uint32_t IP_address = 0;
|
||||
|
||||
//===========================================================================
|
||||
//=============================Private Variables=============================
|
||||
//===========================================================================
|
||||
|
@ -457,6 +450,7 @@ static void gcode_M105(uint8_t extruder);
|
|||
static void temp_compensation_start();
|
||||
static void temp_compensation_apply();
|
||||
|
||||
static bool get_PRUSA_SN(char* SN);
|
||||
|
||||
uint16_t gcode_in_progress = 0;
|
||||
uint16_t mcode_in_progress = 0;
|
||||
|
@ -921,9 +915,7 @@ static void check_if_fw_is_on_right_printer(){
|
|||
#ifdef FILAMENT_SENSOR
|
||||
if((PRINTER_TYPE == PRINTER_MK3) || (PRINTER_TYPE == PRINTER_MK3S)){
|
||||
#ifdef IR_SENSOR
|
||||
swi2c_init();
|
||||
const uint8_t pat9125_detected = swi2c_readByte_A8(PAT9125_I2C_ADDR,0x00,NULL);
|
||||
if (pat9125_detected){
|
||||
if (pat9125_probe()){
|
||||
lcd_show_fullscreen_message_and_wait_P(_i("MK3S firmware detected on MK3 printer"));}////c=20 r=3
|
||||
#endif //IR_SENSOR
|
||||
|
||||
|
@ -1060,6 +1052,8 @@ static void w25x20cl_err_msg()
|
|||
// are initialized by the main() routine provided by the Arduino framework.
|
||||
void setup()
|
||||
{
|
||||
timer2_init(); // enables functional millis
|
||||
|
||||
mmu_init();
|
||||
|
||||
ultralcd_init();
|
||||
|
@ -1123,6 +1117,22 @@ void setup()
|
|||
if(!(eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED)))
|
||||
eeprom_update_byte((unsigned char *)EEPROM_FAN_CHECK_ENABLED,true);
|
||||
}
|
||||
|
||||
//saved EEPROM SN is not valid. Try to retrieve it.
|
||||
//SN is valid only if it is NULL terminated. Any other character means either uninitialized or corrupted
|
||||
if (eeprom_read_byte((uint8_t*)EEPROM_PRUSA_SN + 19))
|
||||
{
|
||||
char SN[20];
|
||||
if (get_PRUSA_SN(SN))
|
||||
{
|
||||
eeprom_update_block(SN, (uint8_t*)EEPROM_PRUSA_SN, 20);
|
||||
puts_P(PSTR("SN updated"));
|
||||
}
|
||||
else
|
||||
puts_P(PSTR("SN update failed"));
|
||||
}
|
||||
|
||||
|
||||
#ifndef W25X20CL
|
||||
SERIAL_PROTOCOLLNPGM("start");
|
||||
#else
|
||||
|
@ -3030,6 +3040,8 @@ bool gcode_M45(bool onlyZ, int8_t verbosity_level)
|
|||
//set_destination_to_current();
|
||||
int l_feedmultiply = setup_for_endstop_move();
|
||||
lcd_display_message_fullscreen_P(_T(MSG_AUTO_HOME));
|
||||
raise_z_above(MESH_HOME_Z_SEARCH);
|
||||
st_synchronize();
|
||||
home_xy();
|
||||
|
||||
enable_endstops(false);
|
||||
|
@ -3447,25 +3459,26 @@ void gcode_M701()
|
|||
*
|
||||
* Typical format of S/N is:CZPX0917X003XC13518
|
||||
*
|
||||
* Command operates only in farm mode, if not in farm mode, "Not in farm mode." is written to MYSERIAL.
|
||||
*
|
||||
* Send command ;S to serial port 0 to retrieve serial number stored in 32U2 processor,
|
||||
* reply is transmitted to serial port 1 character by character.
|
||||
* reply is stored in *SN.
|
||||
* Operation takes typically 23 ms. If the retransmit is not finished until 100 ms,
|
||||
* it is interrupted, so less, or no characters are retransmitted, only newline character is send
|
||||
* in any case.
|
||||
* it is interrupted, so less, or no characters are retransmitted, the function returns false
|
||||
* The command will fail if the 32U2 processor is unpowered via USB since it is isolated from the rest of the electronics.
|
||||
* In that case the value that is stored in the EEPROM should be used instead.
|
||||
*
|
||||
* @return 1 on success
|
||||
* @return 0 on general failure
|
||||
*/
|
||||
static void gcode_PRUSA_SN()
|
||||
static bool get_PRUSA_SN(char* SN)
|
||||
{
|
||||
uint8_t selectedSerialPort_bak = selectedSerialPort;
|
||||
char SN[20];
|
||||
selectedSerialPort = 0;
|
||||
SERIAL_ECHOLNRPGM(PSTR(";S"));
|
||||
uint8_t numbersRead = 0;
|
||||
ShortTimer timeout;
|
||||
timeout.start();
|
||||
|
||||
while (numbersRead < (sizeof(SN) - 1)) {
|
||||
while (numbersRead < 19) {
|
||||
if (MSerial.available() > 0) {
|
||||
SN[numbersRead] = MSerial.read();
|
||||
numbersRead++;
|
||||
|
@ -3474,7 +3487,7 @@ static void gcode_PRUSA_SN()
|
|||
}
|
||||
SN[numbersRead] = 0;
|
||||
selectedSerialPort = selectedSerialPort_bak;
|
||||
SERIAL_ECHOLN(SN);
|
||||
return (numbersRead == 19);
|
||||
}
|
||||
//! Detection of faulty RAMBo 1.1b boards equipped with bigger capacitors
|
||||
//! at the TACH_1 pin, which causes bad detection of print fan speed.
|
||||
|
@ -3719,6 +3732,7 @@ extern uint8_t st_backlash_y;
|
|||
//!@n M503 - print the current settings (from memory not from EEPROM)
|
||||
//!@n M509 - force language selection on next restart
|
||||
//!@n M540 - Use S[0|1] to enable or disable the stop SD card print on endstop hit (requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED)
|
||||
//!@n M552 - Set IP address
|
||||
//!@n M600 - Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal]
|
||||
//!@n M605 - Set dual x-carriage movement mode: S<mode> [ X<duplication x-offset> R<duplication temp offset> ]
|
||||
//!@n M860 - Wait for PINDA thermistor to reach target temperature.
|
||||
|
@ -4006,7 +4020,12 @@ void process_commands()
|
|||
card.openFileWrite(strchr_pointer+4);
|
||||
|
||||
} else if (code_seen_P(PSTR("SN"))) { // PRUSA SN
|
||||
gcode_PRUSA_SN();
|
||||
char SN[20];
|
||||
eeprom_read_block(SN, (uint8_t*)EEPROM_PRUSA_SN, 20);
|
||||
if (SN[19])
|
||||
puts_P(PSTR("SN invalid"));
|
||||
else
|
||||
puts(SN);
|
||||
|
||||
} else if(code_seen_P(PSTR("Fir"))){ // PRUSA Fir
|
||||
|
||||
|
@ -5816,9 +5835,15 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
|
|||
|
||||
/*!
|
||||
### M27 - Get SD status <a href="https://reprap.org/wiki/G-code#M27:_Report_SD_print_status">M27: Report SD print status</a>
|
||||
#### Usage
|
||||
|
||||
M27 [ P ]
|
||||
|
||||
#### Parameters
|
||||
- `P` - Show full SFN path instead of LFN only.
|
||||
*/
|
||||
case 27:
|
||||
card.getStatus();
|
||||
card.getStatus(code_seen('P'));
|
||||
break;
|
||||
|
||||
/*!
|
||||
|
@ -6963,14 +6988,14 @@ Sigma_Exit:
|
|||
### M120 - Enable endstops <a href="https://reprap.org/wiki/G-code#M120:_Enable_endstop_detection">M120: Enable endstop detection</a>
|
||||
*/
|
||||
case 120:
|
||||
enable_endstops(false) ;
|
||||
enable_endstops(true) ;
|
||||
break;
|
||||
|
||||
/*!
|
||||
### M121 - Disable endstops <a href="https://reprap.org/wiki/G-code#M121:_Disable_endstop_detection">M121: Disable endstop detection</a>
|
||||
*/
|
||||
case 121:
|
||||
enable_endstops(true) ;
|
||||
enable_endstops(false) ;
|
||||
break;
|
||||
|
||||
/*!
|
||||
|
@ -7231,7 +7256,7 @@ Sigma_Exit:
|
|||
// Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware,
|
||||
// and it is also generated by Slic3r to control acceleration per extrusion type
|
||||
// (there is a separate acceleration settings in Slicer for perimeter, first layer etc).
|
||||
cs.acceleration = code_value();
|
||||
cs.acceleration = cs.travel_acceleration = code_value();
|
||||
// Interpret the T value as retract acceleration in the old Marlin format.
|
||||
if(code_seen('T'))
|
||||
cs.retract_acceleration = code_value();
|
||||
|
@ -7241,13 +7266,8 @@ Sigma_Exit:
|
|||
cs.acceleration = code_value();
|
||||
if(code_seen('R'))
|
||||
cs.retract_acceleration = code_value();
|
||||
if(code_seen('T')) {
|
||||
// Interpret the T value as the travel acceleration in the new Marlin format.
|
||||
/*!
|
||||
@todo Prusa3D firmware currently does not support travel acceleration value independent from the extruding acceleration value.
|
||||
*/
|
||||
// travel_acceleration = code_value();
|
||||
}
|
||||
if(code_seen('T'))
|
||||
cs.travel_acceleration = code_value();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -7980,6 +8000,36 @@ Sigma_Exit:
|
|||
}
|
||||
#endif // CUSTOM_M_CODE_SET_Z_PROBE_OFFSET
|
||||
|
||||
/*!
|
||||
### M552 - Set IP address <a href="https://reprap.org/wiki/G-code#M552:_Set_IP_address.2C_enable.2Fdisable_network_interface">M552: Set IP address, enable/disable network interface"</a>
|
||||
Sets the printer IP address that is shown in the support menu. Designed to be used with the help of host software.
|
||||
If P is not specified nothing happens.
|
||||
If the structure of the IP address is invalid, 0.0.0.0 is assumed and nothing is shown on the screen in the Support menu.
|
||||
#### Usage
|
||||
|
||||
M552 [ P<IP_address> ]
|
||||
|
||||
#### Parameters
|
||||
- `P` - The IP address in xxx.xxx.xxx.xxx format. Eg: P192.168.1.14
|
||||
*/
|
||||
case 552:
|
||||
{
|
||||
if (code_seen('P'))
|
||||
{
|
||||
uint8_t valCnt = 0;
|
||||
IP_address = 0;
|
||||
do
|
||||
{
|
||||
*strchr_pointer = '*';
|
||||
((uint8_t*)&IP_address)[valCnt] = code_value_short();
|
||||
valCnt++;
|
||||
} while ((valCnt < 4) && code_seen('.'));
|
||||
|
||||
if (valCnt != 4)
|
||||
IP_address = 0;
|
||||
}
|
||||
} break;
|
||||
|
||||
#ifdef FILAMENTCHANGEENABLE
|
||||
|
||||
/*!
|
||||
|
@ -10026,16 +10076,16 @@ bool setTargetedHotend(int code, uint8_t &extruder)
|
|||
SERIAL_ECHORPGM(_n("M104 Invalid extruder "));////MSG_M104_INVALID_EXTRUDER
|
||||
break;
|
||||
case 105:
|
||||
SERIAL_ECHO(_n("M105 Invalid extruder "));////MSG_M105_INVALID_EXTRUDER
|
||||
SERIAL_ECHORPGM(_n("M105 Invalid extruder "));////MSG_M105_INVALID_EXTRUDER
|
||||
break;
|
||||
case 109:
|
||||
SERIAL_ECHO(_n("M109 Invalid extruder "));////MSG_M109_INVALID_EXTRUDER
|
||||
SERIAL_ECHORPGM(_n("M109 Invalid extruder "));////MSG_M109_INVALID_EXTRUDER
|
||||
break;
|
||||
case 218:
|
||||
SERIAL_ECHO(_n("M218 Invalid extruder "));////MSG_M218_INVALID_EXTRUDER
|
||||
SERIAL_ECHORPGM(_n("M218 Invalid extruder "));////MSG_M218_INVALID_EXTRUDER
|
||||
break;
|
||||
case 221:
|
||||
SERIAL_ECHO(_n("M221 Invalid extruder "));////MSG_M221_INVALID_EXTRUDER
|
||||
SERIAL_ECHORPGM(_n("M221 Invalid extruder "));////MSG_M221_INVALID_EXTRUDER
|
||||
break;
|
||||
}
|
||||
SERIAL_PROTOCOLLN((int)extruder);
|
||||
|
@ -10911,6 +10961,10 @@ void uvlo_()
|
|||
#endif
|
||||
eeprom_update_word((uint16_t*)(EEPROM_EXTRUDEMULTIPLY), (uint16_t)extrudemultiply);
|
||||
|
||||
eeprom_update_float((float*)(EEPROM_UVLO_ACCELL), cs.acceleration);
|
||||
eeprom_update_float((float*)(EEPROM_UVLO_RETRACT_ACCELL), cs.retract_acceleration);
|
||||
eeprom_update_float((float*)(EEPROM_UVLO_TRAVEL_ACCELL), cs.travel_acceleration);
|
||||
|
||||
// Store the saved target
|
||||
eeprom_update_float((float*)(EEPROM_UVLO_SAVED_TARGET+0*4), saved_target[X_AXIS]);
|
||||
eeprom_update_float((float*)(EEPROM_UVLO_SAVED_TARGET+1*4), saved_target[Y_AXIS]);
|
||||
|
@ -11223,8 +11277,8 @@ void restore_print_from_eeprom(bool mbl_was_active) {
|
|||
}
|
||||
dir_name[8] = '\0';
|
||||
MYSERIAL.println(dir_name);
|
||||
strcpy(dir_names[i], dir_name);
|
||||
card.chdir(dir_name);
|
||||
// strcpy(dir_names[i], dir_name);
|
||||
card.chdir(dir_name, false);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 8; i++) {
|
||||
|
@ -11255,6 +11309,13 @@ void restore_print_from_eeprom(bool mbl_was_active) {
|
|||
sprintf_P(cmd, PSTR("G1 Z%f"), eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_Z)));
|
||||
enquecommand(cmd);
|
||||
|
||||
// Restore acceleration settings
|
||||
float acceleration = eeprom_read_float((float*)(EEPROM_UVLO_ACCELL));
|
||||
float retract_acceleration = eeprom_read_float((float*)(EEPROM_UVLO_RETRACT_ACCELL));
|
||||
float travel_acceleration = eeprom_read_float((float*)(EEPROM_UVLO_TRAVEL_ACCELL));
|
||||
sprintf_P(cmd, PSTR("M204 P%f R%f T%f"), acceleration, retract_acceleration, travel_acceleration);
|
||||
enquecommand(cmd);
|
||||
|
||||
// Unretract.
|
||||
sprintf_P(cmd, PSTR("G1 E%0.3f F2700"), default_retraction);
|
||||
enquecommand(cmd);
|
||||
|
@ -11721,7 +11782,7 @@ void M600_wait_for_user(float HotendTempBckp) {
|
|||
delay_keep_alive(4);
|
||||
|
||||
if (_millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) {
|
||||
lcd_display_message_fullscreen_P(_i("Press knob to preheat nozzle and continue."));////MSG_PRESS_TO_PREHEAT c=20 r=4
|
||||
lcd_display_message_fullscreen_P(_i("Press the knob to preheat nozzle and continue."));////MSG_PRESS_TO_PREHEAT c=20 r=4
|
||||
wait_for_user_state = 1;
|
||||
setAllTargetHotends(0);
|
||||
st_synchronize();
|
||||
|
|
|
@ -37,10 +37,6 @@ struct pin_map_t {
|
|||
|| defined(__AVR_ATmega2560__)
|
||||
// Mega
|
||||
|
||||
// Two Wire (aka I2C) ports
|
||||
uint8_t const SDA_PIN = 20; // D1
|
||||
uint8_t const SCL_PIN = 21; // D0
|
||||
|
||||
#undef MOSI_PIN
|
||||
#undef MISO_PIN
|
||||
// SPI port
|
||||
|
@ -365,4 +361,4 @@ static inline __attribute__((always_inline))
|
|||
#endif // Sd2PinMap_h
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -32,6 +32,7 @@ CardReader::CardReader()
|
|||
workDirDepth = 0;
|
||||
file_subcall_ctr=0;
|
||||
memset(workDirParents, 0, sizeof(workDirParents));
|
||||
presort_flag = false;
|
||||
|
||||
autostart_stilltocheck=true; //the SD start is delayed, because otherwise the serial cannot answer fast enough to make contact with the host software.
|
||||
lastnr=0;
|
||||
|
@ -69,12 +70,23 @@ char *createFilename(char *buffer,const dir_t &p) //buffer>12characters
|
|||
+*/
|
||||
|
||||
void CardReader::lsDive(const char *prepend, SdFile parent, const char * const match/*=NULL*/) {
|
||||
static uint8_t recursionCnt = 0;
|
||||
// RAII incrementer for the recursionCnt
|
||||
class _incrementer
|
||||
{
|
||||
public:
|
||||
_incrementer() {recursionCnt++;}
|
||||
~_incrementer() {recursionCnt--;}
|
||||
} recursionCntIncrementer;
|
||||
|
||||
dir_t p;
|
||||
uint8_t cnt = 0;
|
||||
// Read the next entry from a directory
|
||||
while (parent.readDir(p, longFilename) > 0) {
|
||||
// If the entry is a directory and the action is LS_SerialPrint
|
||||
if (DIR_IS_SUBDIR(&p) && lsAction != LS_Count && lsAction != LS_GetFilename) {
|
||||
if (recursionCnt > MAX_DIR_DEPTH)
|
||||
return;
|
||||
else if (DIR_IS_SUBDIR(&p) && lsAction != LS_Count && lsAction != LS_GetFilename) { // If the entry is a directory and the action is LS_SerialPrint
|
||||
|
||||
// Get the short name for the item, which we know is a folder
|
||||
char lfilename[FILENAME_LENGTH];
|
||||
createFilename(lfilename, p);
|
||||
|
@ -241,18 +253,18 @@ void CardReader::initsd()
|
|||
|
||||
}
|
||||
|
||||
void CardReader::setroot()
|
||||
void CardReader::setroot(bool doPresort)
|
||||
{
|
||||
/*if(!workDir.openRoot(&volume))
|
||||
{
|
||||
SERIAL_ECHOLNPGM(MSG_SD_WORKDIR_FAIL);
|
||||
}*/
|
||||
workDir=root;
|
||||
workDirDepth = 0;
|
||||
|
||||
curDir=&workDir;
|
||||
#ifdef SDCARD_SORT_ALPHA
|
||||
presort();
|
||||
#endif
|
||||
#ifdef SDCARD_SORT_ALPHA
|
||||
if (doPresort)
|
||||
presort();
|
||||
else
|
||||
presort_flag = true;
|
||||
#endif
|
||||
}
|
||||
void CardReader::release()
|
||||
{
|
||||
|
@ -304,6 +316,18 @@ void CardReader::getAbsFilename(char *t)
|
|||
else
|
||||
t[0]=0;
|
||||
}
|
||||
|
||||
void CardReader::printAbsFilenameFast()
|
||||
{
|
||||
SERIAL_PROTOCOL('/');
|
||||
for (uint8_t i = 0; i < getWorkDirDepth(); i++)
|
||||
{
|
||||
SERIAL_PROTOCOL(dir_names[i]);
|
||||
SERIAL_PROTOCOL('/');
|
||||
}
|
||||
SERIAL_PROTOCOL(LONGEST_FILENAME);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Dive into subfolder
|
||||
*
|
||||
|
@ -317,19 +341,17 @@ void CardReader::getAbsFilename(char *t)
|
|||
* @param[in,out] fileName
|
||||
* expects file name including path
|
||||
* in case of absolute path, file name without path is returned
|
||||
* @param[in,out] dir SdFile object to operate with,
|
||||
* in case of absolute path, curDir is modified to point to dir,
|
||||
* so it is not possible to create on stack inside this function,
|
||||
* as curDir would point to destroyed object.
|
||||
*/
|
||||
void CardReader::diveSubfolder (const char *fileName, SdFile& dir)
|
||||
bool CardReader::diveSubfolder (const char *&fileName)
|
||||
{
|
||||
curDir=&root;
|
||||
if (!fileName) return;
|
||||
if (!fileName)
|
||||
return 1;
|
||||
|
||||
const char *dirname_start, *dirname_end;
|
||||
if (fileName[0] == '/') // absolute path
|
||||
{
|
||||
setroot(false);
|
||||
dirname_start = fileName + 1;
|
||||
while (*dirname_start)
|
||||
{
|
||||
|
@ -340,23 +362,13 @@ void CardReader::diveSubfolder (const char *fileName, SdFile& dir)
|
|||
{
|
||||
const size_t maxLen = 12;
|
||||
char subdirname[maxLen+1];
|
||||
subdirname[maxLen] = 0;
|
||||
const size_t len = ((static_cast<size_t>(dirname_end-dirname_start))>maxLen) ? maxLen : (dirname_end-dirname_start);
|
||||
strncpy(subdirname, dirname_start, len);
|
||||
SERIAL_ECHOLN(subdirname);
|
||||
if (!dir.open(curDir, subdirname, O_READ))
|
||||
{
|
||||
SERIAL_PROTOCOLRPGM(MSG_SD_OPEN_FILE_FAIL);
|
||||
SERIAL_PROTOCOL(subdirname);
|
||||
SERIAL_PROTOCOLLN('.');
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
//SERIAL_ECHOLN("dive ok");
|
||||
}
|
||||
subdirname[len] = 0;
|
||||
if (!chdir(subdirname, false))
|
||||
return 0;
|
||||
|
||||
curDir = &dir;
|
||||
curDir = &workDir;
|
||||
dirname_start = dirname_end + 1;
|
||||
}
|
||||
else // the reminder after all /fsa/fdsa/ is the filename
|
||||
|
@ -373,6 +385,7 @@ void CardReader::diveSubfolder (const char *fileName, SdFile& dir)
|
|||
{
|
||||
curDir = &workDir;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const char ofKill[] PROGMEM = "trying to call sub-gcode files with too many levels.";
|
||||
|
@ -428,9 +441,9 @@ void CardReader::openFileReadFilteredGcode(const char* name, bool replace_curren
|
|||
}
|
||||
sdprinting = false;
|
||||
|
||||
SdFile myDir;
|
||||
const char *fname=name;
|
||||
diveSubfolder(fname,myDir);
|
||||
if (!diveSubfolder(fname))
|
||||
return;
|
||||
|
||||
if (file.openFilteredGcode(curDir, fname)) {
|
||||
filesize = file.fileSize();
|
||||
|
@ -516,9 +529,9 @@ void CardReader::removeFile(const char* name)
|
|||
file.close();
|
||||
sdprinting = false;
|
||||
|
||||
SdFile myDir;
|
||||
const char *fname=name;
|
||||
diveSubfolder(fname,myDir);
|
||||
if (!diveSubfolder(fname))
|
||||
return;
|
||||
|
||||
if (file.remove(curDir, fname))
|
||||
{
|
||||
|
@ -543,31 +556,36 @@ uint32_t CardReader::getFileSize()
|
|||
return filesize;
|
||||
}
|
||||
|
||||
void CardReader::getStatus()
|
||||
void CardReader::getStatus(bool arg_P)
|
||||
{
|
||||
if(sdprinting)
|
||||
{
|
||||
if (isPrintPaused) {
|
||||
SERIAL_PROTOCOLLNPGM("SD print paused");
|
||||
}
|
||||
else if (saved_printing) {
|
||||
SERIAL_PROTOCOLLNPGM("Print saved");
|
||||
}
|
||||
else {
|
||||
SERIAL_PROTOCOLLN(LONGEST_FILENAME);
|
||||
SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE
|
||||
SERIAL_PROTOCOL(sdpos);
|
||||
SERIAL_PROTOCOL('/');
|
||||
SERIAL_PROTOCOLLN(filesize);
|
||||
uint16_t time = ( _millis() - starttime ) / 60000U;
|
||||
SERIAL_PROTOCOL(itostr2(time/60));
|
||||
SERIAL_PROTOCOL(':');
|
||||
SERIAL_PROTOCOLLN(itostr2(time%60));
|
||||
}
|
||||
}
|
||||
else {
|
||||
SERIAL_PROTOCOLLNPGM("Not SD printing");
|
||||
}
|
||||
if (isPrintPaused)
|
||||
{
|
||||
if (saved_printing && (saved_printing_type == PRINTING_TYPE_SD))
|
||||
SERIAL_PROTOCOLLNPGM("SD print paused");
|
||||
else
|
||||
SERIAL_PROTOCOLLNPGM("Print saved");
|
||||
}
|
||||
else if (sdprinting)
|
||||
{
|
||||
if (arg_P)
|
||||
{
|
||||
printAbsFilenameFast();
|
||||
SERIAL_PROTOCOLLN();
|
||||
}
|
||||
else
|
||||
SERIAL_PROTOCOLLN(LONGEST_FILENAME);
|
||||
|
||||
SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE
|
||||
SERIAL_PROTOCOL(sdpos);
|
||||
SERIAL_PROTOCOL('/');
|
||||
SERIAL_PROTOCOLLN(filesize);
|
||||
uint16_t time = ( _millis() - starttime ) / 60000U;
|
||||
SERIAL_PROTOCOL(itostr2(time/60));
|
||||
SERIAL_PROTOCOL(':');
|
||||
SERIAL_PROTOCOLLN(itostr2(time%60));
|
||||
}
|
||||
else
|
||||
SERIAL_PROTOCOLLNPGM("Not SD printing");
|
||||
}
|
||||
void CardReader::write_command(char *buf)
|
||||
{
|
||||
|
@ -704,7 +722,7 @@ uint16_t CardReader::getnrfilenames()
|
|||
return nrFiles;
|
||||
}
|
||||
|
||||
void CardReader::chdir(const char * relpath)
|
||||
bool CardReader::chdir(const char * relpath, bool doPresort)
|
||||
{
|
||||
SdFile newfile;
|
||||
SdFile *parent=&root;
|
||||
|
@ -712,23 +730,32 @@ void CardReader::chdir(const char * relpath)
|
|||
if(workDir.isOpen())
|
||||
parent=&workDir;
|
||||
|
||||
if(!newfile.open(*parent,relpath, O_READ))
|
||||
if(!newfile.open(*parent,relpath, O_READ) || ((workDirDepth + 1) >= MAX_DIR_DEPTH))
|
||||
{
|
||||
SERIAL_ECHO_START;
|
||||
SERIAL_ECHORPGM(_n("Cannot enter subdir: "));////MSG_SD_CANT_ENTER_SUBDIR
|
||||
SERIAL_ECHOLN(relpath);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(dir_names[workDirDepth], relpath);
|
||||
puts(relpath);
|
||||
|
||||
if (workDirDepth < MAX_DIR_DEPTH) {
|
||||
for (int d = ++workDirDepth; d--;)
|
||||
workDirParents[d+1] = workDirParents[d];
|
||||
workDirParents[0]=*parent;
|
||||
}
|
||||
workDir=newfile;
|
||||
#ifdef SDCARD_SORT_ALPHA
|
||||
|
||||
#ifdef SDCARD_SORT_ALPHA
|
||||
if (doPresort)
|
||||
presort();
|
||||
#endif
|
||||
else
|
||||
presort_flag = true;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
#ifdef SDSUPPORT
|
||||
|
||||
#define MAX_DIR_DEPTH 10
|
||||
#define MAX_DIR_DEPTH 6
|
||||
|
||||
#include "SdFile.h"
|
||||
enum LsAction {LS_SerialPrint,LS_SerialPrint_LFN,LS_Count,LS_GetFilename};
|
||||
|
@ -29,7 +29,7 @@ public:
|
|||
void release();
|
||||
void startFileprint();
|
||||
uint32_t getFileSize();
|
||||
void getStatus();
|
||||
void getStatus(bool arg_P);
|
||||
void printingHasFinished();
|
||||
|
||||
void getfilename(uint16_t nr, const char* const match=NULL);
|
||||
|
@ -37,14 +37,15 @@ public:
|
|||
uint16_t getnrfilenames();
|
||||
|
||||
void getAbsFilename(char *t);
|
||||
void printAbsFilenameFast();
|
||||
void getDirName(char* name, uint8_t level);
|
||||
uint16_t getWorkDirDepth();
|
||||
|
||||
|
||||
void ls(bool printLFN);
|
||||
void chdir(const char * relpath);
|
||||
bool chdir(const char * relpath, bool doPresort);
|
||||
void updir();
|
||||
void setroot();
|
||||
void setroot(bool doPresort);
|
||||
|
||||
#ifdef SDCARD_SORT_ALPHA
|
||||
void presort();
|
||||
|
@ -87,6 +88,10 @@ public:
|
|||
char longFilename[LONG_FILENAME_LENGTH];
|
||||
bool filenameIsDir;
|
||||
int lastnr; //last number of the autostart;
|
||||
#ifdef SDCARD_SORT_ALPHA
|
||||
bool presort_flag;
|
||||
char dir_names[MAX_DIR_DEPTH][9];
|
||||
#endif // SDCARD_SORT_ALPHA
|
||||
private:
|
||||
SdFile root,*curDir,workDir,workDirParents[MAX_DIR_DEPTH];
|
||||
uint16_t workDirDepth;
|
||||
|
@ -160,7 +165,7 @@ private:
|
|||
int16_t nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory.
|
||||
char* diveDirName;
|
||||
|
||||
void diveSubfolder (const char *fileName, SdFile& dir);
|
||||
bool diveSubfolder (const char *&fileName);
|
||||
void lsDive(const char *prepend, SdFile parent, const char * const match=NULL);
|
||||
#ifdef SDCARD_SORT_ALPHA
|
||||
void flush_presort();
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#define ADC_CALLBACK adc_ready //callback function ()
|
||||
|
||||
//SWI2C configuration
|
||||
#define SWI2C
|
||||
//#define SWI2C_SDA 20 //SDA on P3
|
||||
//#define SWI2C_SCL 21 //SCL on P3
|
||||
#define SWI2C_A8
|
||||
|
@ -31,7 +30,13 @@
|
|||
#define SWI2C_TMO 2048 //2048 cycles timeout
|
||||
|
||||
//PAT9125 configuration
|
||||
#define PAT9125_SWI2C
|
||||
//#define PAT9125_SWSPI // software SPI mode (incomplete)
|
||||
#ifdef SWI2C_SCL
|
||||
#define PAT9125_SWI2C // software I2C mode
|
||||
#else
|
||||
#define PAT9125_I2C // hardware I2C mode
|
||||
#endif
|
||||
|
||||
#define PAT9125_I2C_ADDR 0x75 //ID=LO
|
||||
//#define PAT9125_I2C_ADDR 0x79 //ID=HI
|
||||
//#define PAT9125_I2C_ADDR 0x73 //ID=NC
|
||||
|
|
|
@ -318,8 +318,11 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
|
|||
| 0x0D29 3369 | uint8 | EEPROM_PINDA_TEMP_COMPENSATION | ffh 255 | ffh 255 | PINDA temp compensation unknown state | LCD menu | D3 Ax0d29 C1
|
||||
| ^ | ^ | ^ | 00h 0 | ^ | PINDA has no temp compensation PINDA v1/2 | ^ | ^
|
||||
| ^ | ^ | ^ | 01h 1 | ^ | PINDA has temp compensation aka SuperPINDA | ^ | ^
|
||||
| 0x0D15 3349 | char[20] | EEPROM_PRUSA_SN | SN[19] == 0 | ffffffffffffffff... | PRUSA Serial number string | PRUSA SN | D3 Ax0d15 C20
|
||||
| 0x0D11 3345 | float | EEPROM_UVLO_ACCELL | ??? | ff ff ff ffh | Power panic saved normal acceleration | ??? | D3 Ax0d11 C4
|
||||
| 0x0D0D 3341 | float | EEPROM_UVLO_RETRACT_ACCELL | ??? | ff ff ff ffh | Power panic saved retract acceleration | ??? | D3 Ax0d0d C4
|
||||
| 0x0D09 3337 | float | EEPROM_UVLO_TRAVEL_ACCELL | ??? | ff ff ff ffh | Power panic saved travel acceleration | ??? | D3 Ax0d09 C4
|
||||
|
||||
|
||||
| Address begin | Bit/Type | Name | Valid values | Default/FactoryReset | Description | Gcode/Function| Debug code
|
||||
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--:
|
||||
| 0x0012 18 | uint16 | EEPROM_FIRMWARE_VERSION_END | ??? | ff ffh 65535 | ??? | ??? | D3 Ax0012 C2
|
||||
|
@ -523,8 +526,14 @@ static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE);
|
|||
#define EEPROM_ALTFAN_OVERRIDE (EEPROM_UVLO_LA_K-1) //uint8
|
||||
#define EEPROM_EXPERIMENTAL_VISIBILITY (EEPROM_ALTFAN_OVERRIDE-1) //uint8
|
||||
#define EEPROM_PINDA_TEMP_COMPENSATION (EEPROM_EXPERIMENTAL_VISIBILITY-1) //uint8
|
||||
#define EEPROM_PRUSA_SN (EEPROM_PINDA_TEMP_COMPENSATION-20) //char[20]
|
||||
|
||||
#define EEPROM_UVLO_ACCELL (EEPROM_PRUSA_SN-4) // float
|
||||
#define EEPROM_UVLO_RETRACT_ACCELL (EEPROM_UVLO_ACCELL-4) // float
|
||||
#define EEPROM_UVLO_TRAVEL_ACCELL (EEPROM_UVLO_RETRACT_ACCELL-4) // float
|
||||
|
||||
//This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items.
|
||||
#define EEPROM_LAST_ITEM EEPROM_PINDA_TEMP_COMPENSATION
|
||||
#define EEPROM_LAST_ITEM EEPROM_UVLO_TRAVEL_ACCELL
|
||||
// !!!!!
|
||||
// !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!!
|
||||
// !!!!!
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <avr/io.h>
|
||||
#include "macros.h"
|
||||
|
||||
|
||||
/*
|
||||
magic I/O routines
|
||||
now you can simply SET_OUTPUT(STEP); WRITE(STEP, 1); WRITE(STEP, 0);
|
||||
|
|
|
@ -233,6 +233,8 @@ void fsensor_init(void)
|
|||
bool fsensor_enable(bool bUpdateEEPROM)
|
||||
{
|
||||
#ifdef PAT9125
|
||||
(void)bUpdateEEPROM; // silence unused warning in this variant
|
||||
|
||||
if (mmu_enabled == false) { //filament sensor is pat9125, enable only if it is working
|
||||
uint8_t pat9125 = pat9125_init();
|
||||
printf_P(PSTR("PAT9125_init:%hhu\n"), pat9125);
|
||||
|
|
|
@ -197,3 +197,4 @@ const char MSG_M112_KILL[] PROGMEM_N1 = "M112 called. Emergency Stop."; ////c=20
|
|||
const char MSG_ADVANCE_K[] PROGMEM_N1 = "Advance K:"; ////c=13
|
||||
const char MSG_POWERPANIC_DETECTED[] PROGMEM_N1 = "POWER PANIC DETECTED"; ////c=20
|
||||
const char MSG_LCD_STATUS_CHANGED[] PROGMEM_N1 = "LCD status changed";
|
||||
const char MSG_FILE_SELECTED[] PROGMEM_N1 = "File selected"; ////c=20
|
||||
|
|
|
@ -197,6 +197,7 @@ extern const char MSG_M112_KILL[];
|
|||
extern const char MSG_ADVANCE_K[];
|
||||
extern const char MSG_POWERPANIC_DETECTED[];
|
||||
extern const char MSG_LCD_STATUS_CHANGED[];
|
||||
extern const char MSG_FILE_SELECTED[];
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
|
|
|
@ -26,12 +26,15 @@
|
|||
#define PAT9125_BANK_SELECTION 0x7f
|
||||
|
||||
|
||||
#ifdef PAT9125_SWSPI
|
||||
#if defined(PAT9125_SWSPI)
|
||||
#include "swspi.h"
|
||||
#endif //PAT9125_SWSPI
|
||||
#ifdef PAT9125_SWI2C
|
||||
#elif defined(PAT9125_SWI2C)
|
||||
#include "swi2c.h"
|
||||
#endif //PAT9125_SWI2C
|
||||
#elif defined(PAT9125_I2C)
|
||||
#include "twi.h"
|
||||
#else
|
||||
#error unknown PAT9125 communication method
|
||||
#endif
|
||||
|
||||
|
||||
uint8_t pat9125_PID1 = 0;
|
||||
|
@ -103,14 +106,31 @@ extern FILE _uartout;
|
|||
#define uartout (&_uartout)
|
||||
|
||||
|
||||
uint8_t pat9125_probe()
|
||||
{
|
||||
#if defined(PAT9125_SWSPI)
|
||||
swspi_init();
|
||||
#error not implemented
|
||||
#elif defined(PAT9125_SWI2C)
|
||||
swi2c_init();
|
||||
return swi2c_readByte_A8(PAT9125_I2C_ADDR,0x00,NULL);
|
||||
#elif defined(PAT9125_I2C)
|
||||
twi_init();
|
||||
#ifdef IR_SENSOR
|
||||
// NOTE: this is called from the MK3S variant, so it should be kept minimal
|
||||
uint8_t data;
|
||||
return (twi_r8(PAT9125_I2C_ADDR,PAT9125_PID1,&data) == 0);
|
||||
#else
|
||||
return (pat9125_rd_reg(PAT9125_PID1) != 0);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
uint8_t pat9125_init(void)
|
||||
{
|
||||
#ifdef PAT9125_SWSPI
|
||||
swspi_init();
|
||||
#endif //PAT9125_SWSPI
|
||||
#ifdef PAT9125_SWI2C
|
||||
swi2c_init();
|
||||
#endif //PAT9125_SWI2C
|
||||
if (!pat9125_probe())
|
||||
return 0;
|
||||
|
||||
// Verify that the sensor responds with its correct product ID.
|
||||
pat9125_PID1 = pat9125_rd_reg(PAT9125_PID1);
|
||||
pat9125_PID2 = pat9125_rd_reg(PAT9125_PID2);
|
||||
|
@ -234,39 +254,46 @@ uint8_t pat9125_update_bs(void)
|
|||
uint8_t pat9125_rd_reg(uint8_t addr)
|
||||
{
|
||||
uint8_t data = 0;
|
||||
#ifdef PAT9125_SWSPI
|
||||
#if defined(PAT9125_SWSPI)
|
||||
swspi_start();
|
||||
swspi_tx(addr & 0x7f);
|
||||
data = swspi_rx();
|
||||
swspi_stop();
|
||||
#endif //PAT9125_SWSPI
|
||||
#ifdef PAT9125_SWI2C
|
||||
#elif defined(PAT9125_SWI2C)
|
||||
if (!swi2c_readByte_A8(PAT9125_I2C_ADDR, addr, &data)) //NO ACK error
|
||||
{
|
||||
pat9125_PID1 = 0xff;
|
||||
pat9125_PID2 = 0xff;
|
||||
return 0;
|
||||
}
|
||||
#endif //PAT9125_SWI2C
|
||||
goto error;
|
||||
#elif defined(PAT9125_I2C)
|
||||
if (twi_r8(PAT9125_I2C_ADDR,addr,&data))
|
||||
goto error;
|
||||
#endif
|
||||
return data;
|
||||
|
||||
error:
|
||||
pat9125_PID1 = 0xff;
|
||||
pat9125_PID2 = 0xff;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pat9125_wr_reg(uint8_t addr, uint8_t data)
|
||||
{
|
||||
#ifdef PAT9125_SWSPI
|
||||
#if defined(PAT9125_SWSPI)
|
||||
swspi_start();
|
||||
swspi_tx(addr | 0x80);
|
||||
swspi_tx(data);
|
||||
swspi_stop();
|
||||
#endif //PAT9125_SWSPI
|
||||
#ifdef PAT9125_SWI2C
|
||||
#elif defined(PAT9125_SWI2C)
|
||||
if (!swi2c_writeByte_A8(PAT9125_I2C_ADDR, addr, &data)) //NO ACK error
|
||||
{
|
||||
pat9125_PID1 = 0xff;
|
||||
pat9125_PID2 = 0xff;
|
||||
return;
|
||||
}
|
||||
#endif //PAT9125_SWI2C
|
||||
goto error;
|
||||
#elif defined(PAT9125_I2C)
|
||||
if (twi_w8(PAT9125_I2C_ADDR,addr,data))
|
||||
goto error;
|
||||
#endif
|
||||
return;
|
||||
|
||||
error:
|
||||
pat9125_PID1 = 0xff;
|
||||
pat9125_PID2 = 0xff;
|
||||
return;
|
||||
}
|
||||
|
||||
uint8_t pat9125_wr_reg_verify(uint8_t addr, uint8_t data)
|
||||
|
|
|
@ -18,6 +18,7 @@ extern int16_t pat9125_y;
|
|||
extern uint8_t pat9125_b;
|
||||
extern uint8_t pat9125_s;
|
||||
|
||||
extern uint8_t pat9125_probe(void); // Return non-zero if PAT9125 can be trivially detected
|
||||
extern uint8_t pat9125_init(void);
|
||||
extern uint8_t pat9125_update(void); // update all sensor data
|
||||
extern uint8_t pat9125_update_y(void); // update _y only
|
||||
|
|
|
@ -25,6 +25,11 @@
|
|||
#error Unknown MOTHERBOARD value in configuration.h
|
||||
#endif
|
||||
|
||||
#if !defined(SDA_PIN) && (defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__))
|
||||
#define SDA_PIN 20
|
||||
#define SCL_PIN 21
|
||||
#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!
|
||||
#define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN, HEATER_0_PIN,
|
||||
#if EXTRUDERS > 1
|
||||
|
|
|
@ -18,12 +18,6 @@
|
|||
#define W25X20CL // external 256kB flash
|
||||
#define BOOTAPP // bootloader support
|
||||
|
||||
|
||||
#define SWI2C_SDA 20 //SDA on P3
|
||||
#define SWI2C_SCL 21 //SCL on P3
|
||||
|
||||
|
||||
|
||||
#define X_TMC2130_CS 41
|
||||
#define X_TMC2130_DIAG 64 // !!! changed from 40 (EINY03)
|
||||
#define X_STEP_PIN 37
|
||||
|
|
|
@ -11,9 +11,6 @@
|
|||
|
||||
#define PINDA_THERMISTOR
|
||||
|
||||
#define SWI2C_SDA 20 //SDA on P3
|
||||
#define SWI2C_SCL 21 //SCL on P3
|
||||
|
||||
#ifdef MICROMETER_LOGGING
|
||||
#define D_DATACLOCK 24 //Y_MAX (green)
|
||||
#define D_DATA 30 //X_MAX (blue)
|
||||
|
|
|
@ -1082,7 +1082,8 @@ Having the real displacement of the head, we can calculate the total movement le
|
|||
}
|
||||
else
|
||||
{
|
||||
block->acceleration_st = ceil(cs.acceleration * steps_per_mm); // convert to: acceleration steps/sec^2
|
||||
float acceleration = (block->steps_e.wide == 0? cs.travel_acceleration: cs.acceleration);
|
||||
block->acceleration_st = ceil(acceleration * steps_per_mm); // convert to: acceleration steps/sec^2
|
||||
|
||||
#ifdef LIN_ADVANCE
|
||||
/**
|
||||
|
|
|
@ -129,11 +129,15 @@ void sm4_set_dir_bits(uint8_t dir_bits)
|
|||
void sm4_do_step(uint8_t axes_mask)
|
||||
{
|
||||
#if ((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3) || (MOTHERBOARD == BOARD_EINSY_1_0a))
|
||||
#ifdef TMC2130_DEDGE_STEPPING
|
||||
PINC = (axes_mask & 0x0f); // toggle step signals by mask
|
||||
#else
|
||||
register uint8_t portC = PORTC & 0xf0;
|
||||
PORTC = portC | (axes_mask & 0x0f); //set step signals by mask
|
||||
asm("nop");
|
||||
PORTC = portC; //set step signals to zero
|
||||
asm("nop");
|
||||
#endif
|
||||
#endif //((MOTHERBOARD == BOARD_RAMBO_MINI_1_0) || (MOTHERBOARD == BOARD_RAMBO_MINI_1_3) || (MOTHERBOARD == BOARD_EINSY_1_0a))
|
||||
}
|
||||
|
||||
|
|
|
@ -48,6 +48,62 @@ int fsensor_counter; //counter for e-steps
|
|||
uint16_t SP_min = 0x21FF;
|
||||
#endif //DEBUG_STACK_MONITOR
|
||||
|
||||
|
||||
/*
|
||||
* Stepping macros
|
||||
*/
|
||||
#define _STEP_PIN_X_AXIS X_STEP_PIN
|
||||
#define _STEP_PIN_Y_AXIS Y_STEP_PIN
|
||||
#define _STEP_PIN_Z_AXIS Z_STEP_PIN
|
||||
#define _STEP_PIN_E_AXIS E0_STEP_PIN
|
||||
|
||||
#ifdef DEBUG_XSTEP_DUP_PIN
|
||||
#define _STEP_PIN_X_DUP_AXIS DEBUG_XSTEP_DUP_PIN
|
||||
#endif
|
||||
#ifdef DEBUG_YSTEP_DUP_PIN
|
||||
#define _STEP_PIN_Y_DUP_AXIS DEBUG_YSTEP_DUP_PIN
|
||||
#endif
|
||||
#ifdef Y_DUAL_STEPPER_DRIVERS
|
||||
#error Y_DUAL_STEPPER_DRIVERS not fully implemented
|
||||
#define _STEP_PIN_Y2_AXIS Y2_STEP_PIN
|
||||
#endif
|
||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
||||
#error Z_DUAL_STEPPER_DRIVERS not fully implemented
|
||||
#define _STEP_PIN_Z2_AXIS Z2_STEP_PIN
|
||||
#endif
|
||||
|
||||
#ifdef TMC2130
|
||||
#define STEPPER_MINIMUM_PULSE TMC2130_MINIMUM_PULSE
|
||||
#define STEPPER_SET_DIR_DELAY TMC2130_SET_DIR_DELAY
|
||||
#define STEPPER_MINIMUM_DELAY TMC2130_MINIMUM_DELAY
|
||||
#else
|
||||
#define STEPPER_MINIMUM_PULSE 2
|
||||
#define STEPPER_SET_DIR_DELAY 100
|
||||
#define STEPPER_MINIMUM_DELAY delayMicroseconds(STEPPER_MINIMUM_PULSE)
|
||||
#endif
|
||||
|
||||
#ifdef TMC2130_DEDGE_STEPPING
|
||||
static_assert(TMC2130_MINIMUM_DELAY 1, // this will fail to compile when non-empty
|
||||
"DEDGE implies/requires an empty TMC2130_MINIMUM_DELAY");
|
||||
#define STEP_NC_HI(axis) TOGGLE(_STEP_PIN_##axis)
|
||||
#define STEP_NC_LO(axis) //NOP
|
||||
#else
|
||||
|
||||
#define _STEP_HI_X_AXIS !INVERT_X_STEP_PIN
|
||||
#define _STEP_LO_X_AXIS INVERT_X_STEP_PIN
|
||||
#define _STEP_HI_Y_AXIS !INVERT_Y_STEP_PIN
|
||||
#define _STEP_LO_Y_AXIS INVERT_Y_STEP_PIN
|
||||
#define _STEP_HI_Z_AXIS !INVERT_Z_STEP_PIN
|
||||
#define _STEP_LO_Z_AXIS INVERT_Z_STEP_PIN
|
||||
#define _STEP_HI_E_AXIS !INVERT_E_STEP_PIN
|
||||
#define _STEP_LO_E_AXIS INVERT_E_STEP_PIN
|
||||
|
||||
#define STEP_NC_HI(axis) WRITE_NC(_STEP_PIN_##axis, _STEP_HI_##axis)
|
||||
#define STEP_NC_LO(axis) WRITE_NC(_STEP_PIN_##axis, _STEP_LO_##axis)
|
||||
|
||||
#endif //TMC2130_DEDGE_STEPPING
|
||||
|
||||
|
||||
//===========================================================================
|
||||
//=============================public variables ============================
|
||||
//===========================================================================
|
||||
|
@ -296,13 +352,13 @@ FORCE_INLINE void stepper_next_block()
|
|||
WRITE_NC(X_DIR_PIN, INVERT_X_DIR);
|
||||
else
|
||||
WRITE_NC(X_DIR_PIN, !INVERT_X_DIR);
|
||||
_delay_us(100);
|
||||
delayMicroseconds(STEPPER_SET_DIR_DELAY);
|
||||
for (uint8_t i = 0; i < st_backlash_x; i++)
|
||||
{
|
||||
WRITE_NC(X_STEP_PIN, !INVERT_X_STEP_PIN);
|
||||
_delay_us(100);
|
||||
WRITE_NC(X_STEP_PIN, INVERT_X_STEP_PIN);
|
||||
_delay_us(900);
|
||||
STEP_NC_HI(X_AXIS);
|
||||
STEPPER_MINIMUM_DELAY;
|
||||
STEP_NC_LO(X_AXIS);
|
||||
_delay_us(900); // hard-coded jerk! *bad*
|
||||
}
|
||||
}
|
||||
last_dir_bits &= ~1;
|
||||
|
@ -319,13 +375,13 @@ FORCE_INLINE void stepper_next_block()
|
|||
WRITE_NC(Y_DIR_PIN, INVERT_Y_DIR);
|
||||
else
|
||||
WRITE_NC(Y_DIR_PIN, !INVERT_Y_DIR);
|
||||
_delay_us(100);
|
||||
delayMicroseconds(STEPPER_SET_DIR_DELAY);
|
||||
for (uint8_t i = 0; i < st_backlash_y; i++)
|
||||
{
|
||||
WRITE_NC(Y_STEP_PIN, !INVERT_Y_STEP_PIN);
|
||||
_delay_us(100);
|
||||
WRITE_NC(Y_STEP_PIN, INVERT_Y_STEP_PIN);
|
||||
_delay_us(900);
|
||||
STEP_NC_HI(Y_AXIS);
|
||||
STEPPER_MINIMUM_DELAY;
|
||||
STEP_NC_LO(Y_AXIS);
|
||||
_delay_us(900); // hard-coded jerk! *bad*
|
||||
}
|
||||
}
|
||||
last_dir_bits &= ~2;
|
||||
|
@ -603,44 +659,44 @@ FORCE_INLINE void stepper_tick_lowres()
|
|||
// Step in X axis
|
||||
counter_x.lo += current_block->steps_x.lo;
|
||||
if (counter_x.lo > 0) {
|
||||
WRITE_NC(X_STEP_PIN, !INVERT_X_STEP_PIN);
|
||||
STEP_NC_HI(X_AXIS);
|
||||
#ifdef DEBUG_XSTEP_DUP_PIN
|
||||
WRITE_NC(DEBUG_XSTEP_DUP_PIN,!INVERT_X_STEP_PIN);
|
||||
STEP_NC_HI(X_DUP_AXIS);
|
||||
#endif //DEBUG_XSTEP_DUP_PIN
|
||||
counter_x.lo -= current_block->step_event_count.lo;
|
||||
count_position[X_AXIS]+=count_direction[X_AXIS];
|
||||
WRITE_NC(X_STEP_PIN, INVERT_X_STEP_PIN);
|
||||
STEP_NC_LO(X_AXIS);
|
||||
#ifdef DEBUG_XSTEP_DUP_PIN
|
||||
WRITE_NC(DEBUG_XSTEP_DUP_PIN,INVERT_X_STEP_PIN);
|
||||
STEP_NC_LO(X_DUP_AXIS);
|
||||
#endif //DEBUG_XSTEP_DUP_PIN
|
||||
}
|
||||
// Step in Y axis
|
||||
counter_y.lo += current_block->steps_y.lo;
|
||||
if (counter_y.lo > 0) {
|
||||
WRITE_NC(Y_STEP_PIN, !INVERT_Y_STEP_PIN);
|
||||
STEP_NC_HI(Y_AXIS);
|
||||
#ifdef DEBUG_YSTEP_DUP_PIN
|
||||
WRITE_NC(DEBUG_YSTEP_DUP_PIN,!INVERT_Y_STEP_PIN);
|
||||
STEP_NC_HI(Y_DUP_AXIS);
|
||||
#endif //DEBUG_YSTEP_DUP_PIN
|
||||
counter_y.lo -= current_block->step_event_count.lo;
|
||||
count_position[Y_AXIS]+=count_direction[Y_AXIS];
|
||||
WRITE_NC(Y_STEP_PIN, INVERT_Y_STEP_PIN);
|
||||
STEP_NC_LO(Y_AXIS);
|
||||
#ifdef DEBUG_YSTEP_DUP_PIN
|
||||
WRITE_NC(DEBUG_YSTEP_DUP_PIN,INVERT_Y_STEP_PIN);
|
||||
STEP_NC_LO(Y_DUP_AXIS);
|
||||
#endif //DEBUG_YSTEP_DUP_PIN
|
||||
}
|
||||
// Step in Z axis
|
||||
counter_z.lo += current_block->steps_z.lo;
|
||||
if (counter_z.lo > 0) {
|
||||
WRITE_NC(Z_STEP_PIN, !INVERT_Z_STEP_PIN);
|
||||
STEP_NC_HI(Z_AXIS);
|
||||
counter_z.lo -= current_block->step_event_count.lo;
|
||||
count_position[Z_AXIS]+=count_direction[Z_AXIS];
|
||||
WRITE_NC(Z_STEP_PIN, INVERT_Z_STEP_PIN);
|
||||
STEP_NC_LO(Z_AXIS);
|
||||
}
|
||||
// Step in E axis
|
||||
counter_e.lo += current_block->steps_e.lo;
|
||||
if (counter_e.lo > 0) {
|
||||
#ifndef LIN_ADVANCE
|
||||
WRITE(E0_STEP_PIN, !INVERT_E_STEP_PIN);
|
||||
STEP_NC_HI(E_AXIS);
|
||||
#endif /* LIN_ADVANCE */
|
||||
counter_e.lo -= current_block->step_event_count.lo;
|
||||
count_position[E_AXIS] += count_direction[E_AXIS];
|
||||
|
@ -650,7 +706,7 @@ FORCE_INLINE void stepper_tick_lowres()
|
|||
#ifdef FILAMENT_SENSOR
|
||||
fsensor_counter += count_direction[E_AXIS];
|
||||
#endif //FILAMENT_SENSOR
|
||||
WRITE(E0_STEP_PIN, INVERT_E_STEP_PIN);
|
||||
STEP_NC_LO(E_AXIS);
|
||||
#endif
|
||||
}
|
||||
if(++ step_events_completed.lo >= current_block->step_event_count.lo)
|
||||
|
@ -665,44 +721,44 @@ FORCE_INLINE void stepper_tick_highres()
|
|||
// Step in X axis
|
||||
counter_x.wide += current_block->steps_x.wide;
|
||||
if (counter_x.wide > 0) {
|
||||
WRITE_NC(X_STEP_PIN, !INVERT_X_STEP_PIN);
|
||||
STEP_NC_HI(X_AXIS);
|
||||
#ifdef DEBUG_XSTEP_DUP_PIN
|
||||
WRITE_NC(DEBUG_XSTEP_DUP_PIN,!INVERT_X_STEP_PIN);
|
||||
STEP_NC_HI(X_DUP_AXIS);
|
||||
#endif //DEBUG_XSTEP_DUP_PIN
|
||||
counter_x.wide -= current_block->step_event_count.wide;
|
||||
count_position[X_AXIS]+=count_direction[X_AXIS];
|
||||
WRITE_NC(X_STEP_PIN, INVERT_X_STEP_PIN);
|
||||
STEP_NC_LO(X_AXIS);
|
||||
#ifdef DEBUG_XSTEP_DUP_PIN
|
||||
WRITE_NC(DEBUG_XSTEP_DUP_PIN,INVERT_X_STEP_PIN);
|
||||
STEP_NC_LO(X_DUP_AXIS);
|
||||
#endif //DEBUG_XSTEP_DUP_PIN
|
||||
}
|
||||
// Step in Y axis
|
||||
counter_y.wide += current_block->steps_y.wide;
|
||||
if (counter_y.wide > 0) {
|
||||
WRITE_NC(Y_STEP_PIN, !INVERT_Y_STEP_PIN);
|
||||
STEP_NC_HI(Y_AXIS);
|
||||
#ifdef DEBUG_YSTEP_DUP_PIN
|
||||
WRITE_NC(DEBUG_YSTEP_DUP_PIN,!INVERT_Y_STEP_PIN);
|
||||
STEP_NC_HI(Y_DUP_AXIS);
|
||||
#endif //DEBUG_YSTEP_DUP_PIN
|
||||
counter_y.wide -= current_block->step_event_count.wide;
|
||||
count_position[Y_AXIS]+=count_direction[Y_AXIS];
|
||||
WRITE_NC(Y_STEP_PIN, INVERT_Y_STEP_PIN);
|
||||
STEP_NC_LO(Y_AXIS);
|
||||
#ifdef DEBUG_YSTEP_DUP_PIN
|
||||
WRITE_NC(DEBUG_YSTEP_DUP_PIN,INVERT_Y_STEP_PIN);
|
||||
STEP_NC_LO(Y_DUP_AXIS);
|
||||
#endif //DEBUG_YSTEP_DUP_PIN
|
||||
}
|
||||
// Step in Z axis
|
||||
counter_z.wide += current_block->steps_z.wide;
|
||||
if (counter_z.wide > 0) {
|
||||
WRITE_NC(Z_STEP_PIN, !INVERT_Z_STEP_PIN);
|
||||
STEP_NC_HI(Z_AXIS);
|
||||
counter_z.wide -= current_block->step_event_count.wide;
|
||||
count_position[Z_AXIS]+=count_direction[Z_AXIS];
|
||||
WRITE_NC(Z_STEP_PIN, INVERT_Z_STEP_PIN);
|
||||
STEP_NC_LO(Z_AXIS);
|
||||
}
|
||||
// Step in E axis
|
||||
counter_e.wide += current_block->steps_e.wide;
|
||||
if (counter_e.wide > 0) {
|
||||
#ifndef LIN_ADVANCE
|
||||
WRITE(E0_STEP_PIN, !INVERT_E_STEP_PIN);
|
||||
STEP_NC_HI(E_AXIS);
|
||||
#endif /* LIN_ADVANCE */
|
||||
counter_e.wide -= current_block->step_event_count.wide;
|
||||
count_position[E_AXIS]+=count_direction[E_AXIS];
|
||||
|
@ -712,7 +768,7 @@ FORCE_INLINE void stepper_tick_highres()
|
|||
#ifdef FILAMENT_SENSOR
|
||||
fsensor_counter += count_direction[E_AXIS];
|
||||
#endif //FILAMENT_SENSOR
|
||||
WRITE(E0_STEP_PIN, INVERT_E_STEP_PIN);
|
||||
STEP_NC_LO(E_AXIS);
|
||||
#endif
|
||||
}
|
||||
if(++ step_events_completed.wide >= current_block->step_event_count.wide)
|
||||
|
@ -1014,9 +1070,9 @@ FORCE_INLINE void advance_isr_scheduler() {
|
|||
bool rev = (e_steps < 0);
|
||||
do
|
||||
{
|
||||
WRITE_NC(E0_STEP_PIN, !INVERT_E_STEP_PIN);
|
||||
STEP_NC_HI(E_AXIS);
|
||||
e_steps += (rev? 1: -1);
|
||||
WRITE_NC(E0_STEP_PIN, INVERT_E_STEP_PIN);
|
||||
STEP_NC_LO(E_AXIS);
|
||||
#if defined(FILAMENT_SENSOR) && defined(PAT9125)
|
||||
fsensor_counter += (rev? -1: 1);
|
||||
#endif
|
||||
|
@ -1389,89 +1445,106 @@ void quickStop()
|
|||
#ifdef BABYSTEPPING
|
||||
void babystep(const uint8_t axis,const bool direction)
|
||||
{
|
||||
//MUST ONLY BE CALLED BY A ISR, it depends on that no other ISR interrupts this
|
||||
//store initial pin states
|
||||
switch(axis)
|
||||
{
|
||||
case X_AXIS:
|
||||
{
|
||||
enable_x();
|
||||
uint8_t old_x_dir_pin= READ(X_DIR_PIN); //if dualzstepper, both point to same direction.
|
||||
|
||||
//setup new step
|
||||
WRITE(X_DIR_PIN,(INVERT_X_DIR)^direction);
|
||||
|
||||
//perform step
|
||||
WRITE(X_STEP_PIN, !INVERT_X_STEP_PIN);
|
||||
// MUST ONLY BE CALLED BY A ISR as stepper pins are manipulated directly.
|
||||
// note: when switching direction no delay is inserted at the end when the
|
||||
// original is restored. We assume enough time passes as the function
|
||||
// returns and the stepper is manipulated again (to avoid dead times)
|
||||
switch(axis)
|
||||
{
|
||||
case X_AXIS:
|
||||
{
|
||||
enable_x();
|
||||
uint8_t old_x_dir_pin = READ(X_DIR_PIN); //if dualzstepper, both point to same direction.
|
||||
uint8_t new_x_dir_pin = (INVERT_X_DIR)^direction;
|
||||
|
||||
//setup new step
|
||||
if (new_x_dir_pin != old_x_dir_pin) {
|
||||
WRITE_NC(X_DIR_PIN, new_x_dir_pin);
|
||||
delayMicroseconds(STEPPER_SET_DIR_DELAY);
|
||||
}
|
||||
|
||||
//perform step
|
||||
STEP_NC_HI(X_AXIS);
|
||||
#ifdef DEBUG_XSTEP_DUP_PIN
|
||||
WRITE(DEBUG_XSTEP_DUP_PIN,!INVERT_X_STEP_PIN);
|
||||
#endif //DEBUG_XSTEP_DUP_PIN
|
||||
delayMicroseconds(1);
|
||||
WRITE(X_STEP_PIN, INVERT_X_STEP_PIN);
|
||||
STEP_NC_HI(X_DUP_AXIS);
|
||||
#endif
|
||||
STEPPER_MINIMUM_DELAY;
|
||||
STEP_NC_LO(X_AXIS);
|
||||
#ifdef DEBUG_XSTEP_DUP_PIN
|
||||
WRITE(DEBUG_XSTEP_DUP_PIN,INVERT_X_STEP_PIN);
|
||||
#endif //DEBUG_XSTEP_DUP_PIN
|
||||
STEP_NC_LO(X_DUP_AXIS);
|
||||
#endif
|
||||
|
||||
//get old pin state back.
|
||||
WRITE(X_DIR_PIN,old_x_dir_pin);
|
||||
}
|
||||
break;
|
||||
case Y_AXIS:
|
||||
{
|
||||
enable_y();
|
||||
uint8_t old_y_dir_pin= READ(Y_DIR_PIN); //if dualzstepper, both point to same direction.
|
||||
|
||||
//setup new step
|
||||
WRITE(Y_DIR_PIN,(INVERT_Y_DIR)^direction);
|
||||
|
||||
//perform step
|
||||
WRITE(Y_STEP_PIN, !INVERT_Y_STEP_PIN);
|
||||
//get old pin state back.
|
||||
WRITE_NC(X_DIR_PIN, old_x_dir_pin);
|
||||
}
|
||||
break;
|
||||
|
||||
case Y_AXIS:
|
||||
{
|
||||
enable_y();
|
||||
uint8_t old_y_dir_pin = READ(Y_DIR_PIN); //if dualzstepper, both point to same direction.
|
||||
uint8_t new_y_dir_pin = (INVERT_Y_DIR)^direction;
|
||||
|
||||
//setup new step
|
||||
if (new_y_dir_pin != old_y_dir_pin) {
|
||||
WRITE_NC(Y_DIR_PIN, new_y_dir_pin);
|
||||
delayMicroseconds(STEPPER_SET_DIR_DELAY);
|
||||
}
|
||||
|
||||
//perform step
|
||||
STEP_NC_HI(Y_AXIS);
|
||||
#ifdef DEBUG_YSTEP_DUP_PIN
|
||||
WRITE(DEBUG_YSTEP_DUP_PIN,!INVERT_Y_STEP_PIN);
|
||||
#endif //DEBUG_YSTEP_DUP_PIN
|
||||
delayMicroseconds(1);
|
||||
WRITE(Y_STEP_PIN, INVERT_Y_STEP_PIN);
|
||||
STEP_NC_HI(Y_DUP_AXIS);
|
||||
#endif
|
||||
STEPPER_MINIMUM_DELAY;
|
||||
STEP_NC_LO(Y_AXIS);
|
||||
#ifdef DEBUG_YSTEP_DUP_PIN
|
||||
WRITE(DEBUG_YSTEP_DUP_PIN,INVERT_Y_STEP_PIN);
|
||||
#endif //DEBUG_YSTEP_DUP_PIN
|
||||
STEP_NC_LO(Y_DUP_AXIS);
|
||||
#endif
|
||||
|
||||
//get old pin state back.
|
||||
WRITE(Y_DIR_PIN,old_y_dir_pin);
|
||||
//get old pin state back.
|
||||
WRITE_NC(Y_DIR_PIN, old_y_dir_pin);
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case Z_AXIS:
|
||||
{
|
||||
enable_z();
|
||||
uint8_t old_z_dir_pin= READ(Z_DIR_PIN); //if dualzstepper, both point to same direction.
|
||||
//setup new step
|
||||
WRITE(Z_DIR_PIN,(INVERT_Z_DIR)^direction^BABYSTEP_INVERT_Z);
|
||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
||||
WRITE(Z2_DIR_PIN,(INVERT_Z_DIR)^direction^BABYSTEP_INVERT_Z);
|
||||
#endif
|
||||
//perform step
|
||||
WRITE(Z_STEP_PIN, !INVERT_Z_STEP_PIN);
|
||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
||||
WRITE(Z2_STEP_PIN, !INVERT_Z_STEP_PIN);
|
||||
#endif
|
||||
delayMicroseconds(1);
|
||||
WRITE(Z_STEP_PIN, INVERT_Z_STEP_PIN);
|
||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
||||
WRITE(Z2_STEP_PIN, INVERT_Z_STEP_PIN);
|
||||
#endif
|
||||
case Z_AXIS:
|
||||
{
|
||||
enable_z();
|
||||
uint8_t old_z_dir_pin = READ(Z_DIR_PIN); //if dualzstepper, both point to same direction.
|
||||
uint8_t new_z_dir_pin = (INVERT_Z_DIR)^direction^BABYSTEP_INVERT_Z;
|
||||
|
||||
//get old pin state back.
|
||||
WRITE(Z_DIR_PIN,old_z_dir_pin);
|
||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
||||
WRITE(Z2_DIR_PIN,old_z_dir_pin);
|
||||
#endif
|
||||
//setup new step
|
||||
if (new_z_dir_pin != old_z_dir_pin) {
|
||||
WRITE_NC(Z_DIR_PIN, new_z_dir_pin);
|
||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
||||
WRITE_NC(Z2_DIR_PIN, new_z_dir_pin);
|
||||
#endif
|
||||
delayMicroseconds(STEPPER_SET_DIR_DELAY);
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
//perform step
|
||||
STEP_NC_HI(Z_AXIS);
|
||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
||||
STEP_NC_HI(Z2_AXIS);
|
||||
#endif
|
||||
STEPPER_MINIMUM_DELAY;
|
||||
STEP_NC_LO(Z_AXIS);
|
||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
||||
STEP_NC_LO(Z2_AXIS);
|
||||
#endif
|
||||
|
||||
//get old pin state back.
|
||||
if (new_z_dir_pin != old_z_dir_pin) {
|
||||
WRITE_NC(Z_DIR_PIN, old_z_dir_pin);
|
||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
||||
WRITE_NC(Z2_DIR_PIN, old_z_dir_pin);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
#endif //BABYSTEPPING
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include "pins.h"
|
||||
#include "fastio.h"
|
||||
|
||||
#ifdef SWI2C_SCL
|
||||
|
||||
#define SWI2C_RMSK 0x01 //read mask (bit0 = 1)
|
||||
#define SWI2C_WMSK 0x00 //write mask (bit0 = 0)
|
||||
|
@ -187,3 +188,5 @@ uint8_t swi2c_writeByte_A16(uint8_t dev_addr, unsigned short addr, uint8_t* pbyt
|
|||
}
|
||||
|
||||
#endif //SWI2C_A16
|
||||
|
||||
#endif //SWI2C_SCL
|
||||
|
|
|
@ -1124,7 +1124,10 @@ void tp_init()
|
|||
|
||||
adc_init();
|
||||
|
||||
timer0_init();
|
||||
timer0_init(); //enables the heatbed timer.
|
||||
|
||||
// timer2 already enabled earlier in the code
|
||||
// now enable the COMPB temperature interrupt
|
||||
OCR2B = 128;
|
||||
TIMSK2 |= (1<<OCIE2B);
|
||||
|
||||
|
|
|
@ -9,13 +9,11 @@
|
|||
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include "macros.h"
|
||||
|
||||
void timer0_init(void)
|
||||
{
|
||||
//save sreg
|
||||
uint8_t _sreg = SREG;
|
||||
//disable interrupts for sure
|
||||
cli();
|
||||
CRITICAL_SECTION_START;
|
||||
|
||||
TCNT0 = 0;
|
||||
// Fast PWM duty (0-255).
|
||||
|
@ -25,7 +23,14 @@ void timer0_init(void)
|
|||
TCCR0A = (1 << WGM01) | (1 << WGM00) | (1 << COM0B1) | (1 << COM0B0);
|
||||
TCCR0B = (1 << CS01); // CLK/8 prescaling
|
||||
TIMSK0 |= (1 << TOIE0); // enable timer overflow interrupt
|
||||
|
||||
|
||||
CRITICAL_SECTION_END;
|
||||
}
|
||||
|
||||
void timer2_init(void)
|
||||
{
|
||||
CRITICAL_SECTION_START;
|
||||
|
||||
// Everything, that used to be on timer0 was moved to timer2 (delay, beeping, millis etc.)
|
||||
//setup timer2
|
||||
TCCR2A = 0x00; //COM_A-B=00, WGM_0-1=00
|
||||
|
@ -36,9 +41,8 @@ void timer0_init(void)
|
|||
TIMSK2 &= ~(1<<OCIE2B);
|
||||
//set timer2 OCR registers (OCRB interrupt generated 0.5ms after OVF interrupt)
|
||||
OCR2A = 0;
|
||||
OCR2B = 128;
|
||||
//restore sreg (enable interrupts)
|
||||
SREG = _sreg;
|
||||
|
||||
CRITICAL_SECTION_END;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -14,6 +14,9 @@ extern "C" {
|
|||
///! Initializes TIMER0 for fast PWM mode-driven bed heating
|
||||
extern void timer0_init(void);
|
||||
|
||||
///! Initializes TIMER2 for time keeping and temperature interrupt
|
||||
extern void timer2_init(void);
|
||||
|
||||
///! Reimplemented original millis() using timer2
|
||||
extern unsigned long millis2(void);
|
||||
|
||||
|
|
|
@ -428,6 +428,11 @@ void tmc2130_check_overtemp()
|
|||
void tmc2130_setup_chopper(uint8_t axis, uint8_t mres, uint8_t current_h, uint8_t current_r)
|
||||
{
|
||||
uint8_t intpol = (mres != 0); // intpol to 256 only if microsteps aren't 256
|
||||
#ifdef TMC2130_DEDGE_STEPPING
|
||||
uint8_t dedge = 1;
|
||||
#else
|
||||
uint8_t dedge = 0;
|
||||
#endif
|
||||
uint8_t toff = tmc2130_chopper_config[axis].toff; // toff = 3 (fchop = 27.778kHz)
|
||||
uint8_t hstrt = tmc2130_chopper_config[axis].hstr; //initial 4, modified to 5
|
||||
uint8_t hend = tmc2130_chopper_config[axis].hend; //original value = 1
|
||||
|
@ -437,6 +442,9 @@ void tmc2130_setup_chopper(uint8_t axis, uint8_t mres, uint8_t current_h, uint8_
|
|||
uint8_t tbl = tmc2130_chopper_config[axis].tbl; //blanking time, original value = 2
|
||||
if (axis == E_AXIS)
|
||||
{
|
||||
#if defined(TMC2130_INTPOL_E) && (TMC2130_INTPOL_E == 0)
|
||||
intpol = 0;
|
||||
#endif
|
||||
#ifdef TMC2130_CNSTOFF_E
|
||||
// fd = 0 (slow decay only)
|
||||
hstrt = 0; //fd0..2
|
||||
|
@ -447,16 +455,26 @@ void tmc2130_setup_chopper(uint8_t axis, uint8_t mres, uint8_t current_h, uint8_
|
|||
// toff = TMC2130_TOFF_E; // toff = 3-5
|
||||
// rndtf = 1;
|
||||
}
|
||||
#if defined(TMC2130_INTPOL_XY) && (TMC2130_INTPOL_XY == 0)
|
||||
else if (axis == X_AXIS || axis == Y_AXIS) {
|
||||
intpol = 0;
|
||||
}
|
||||
#endif
|
||||
#if defined(TMC2130_INTPOL_Z) && (TMC2130_INTPOL_Z == 0)
|
||||
else if (axis == Z_AXIS) {
|
||||
intpol = 0;
|
||||
}
|
||||
#endif
|
||||
// DBG(_n("tmc2130_setup_chopper(axis=%hhd, mres=%hhd, curh=%hhd, curr=%hhd\n"), axis, mres, current_h, current_r);
|
||||
// DBG(_n(" toff=%hhd, hstr=%hhd, hend=%hhd, tbl=%hhd\n"), toff, hstrt, hend, tbl);
|
||||
if (current_r <= 31)
|
||||
{
|
||||
tmc2130_wr_CHOPCONF(axis, toff, hstrt, hend, fd3, 0, rndtf, chm, tbl, 1, 0, 0, 0, mres, intpol, 0, 0);
|
||||
tmc2130_wr_CHOPCONF(axis, toff, hstrt, hend, fd3, 0, rndtf, chm, tbl, 1, 0, 0, 0, mres, intpol, dedge, 0);
|
||||
tmc2130_wr(axis, TMC2130_REG_IHOLD_IRUN, 0x000f0000 | ((current_r & 0x1f) << 8) | (current_h & 0x1f));
|
||||
}
|
||||
else
|
||||
{
|
||||
tmc2130_wr_CHOPCONF(axis, toff, hstrt, hend, fd3, 0, rndtf, chm, tbl, 0, 0, 0, 0, mres, intpol, 0, 0);
|
||||
tmc2130_wr_CHOPCONF(axis, toff, hstrt, hend, fd3, 0, rndtf, chm, tbl, 0, 0, 0, 0, mres, intpol, dedge, 0);
|
||||
tmc2130_wr(axis, TMC2130_REG_IHOLD_IRUN, 0x000f0000 | (((current_r >> 1) & 0x1f) << 8) | ((current_h >> 1) & 0x1f));
|
||||
}
|
||||
}
|
||||
|
@ -678,25 +696,32 @@ static uint8_t tmc2130_rx(uint8_t axis, uint8_t addr, uint32_t* rval)
|
|||
#define _GET_PWR_Z (READ(Z_ENABLE_PIN) == Z_ENABLE_ON)
|
||||
#define _GET_PWR_E (READ(E0_ENABLE_PIN) == E_ENABLE_ON)
|
||||
|
||||
#define _SET_PWR_X(ena) { WRITE(X_ENABLE_PIN, ena?X_ENABLE_ON:!X_ENABLE_ON); asm("nop"); }
|
||||
#define _SET_PWR_Y(ena) { WRITE(Y_ENABLE_PIN, ena?Y_ENABLE_ON:!Y_ENABLE_ON); asm("nop"); }
|
||||
#define _SET_PWR_Z(ena) { WRITE(Z_ENABLE_PIN, ena?Z_ENABLE_ON:!Z_ENABLE_ON); asm("nop"); }
|
||||
#define _SET_PWR_E(ena) { WRITE(E0_ENABLE_PIN, ena?E_ENABLE_ON:!E_ENABLE_ON); asm("nop"); }
|
||||
#define _SET_PWR_X(ena) WRITE(X_ENABLE_PIN, ena?X_ENABLE_ON:!X_ENABLE_ON)
|
||||
#define _SET_PWR_Y(ena) WRITE(Y_ENABLE_PIN, ena?Y_ENABLE_ON:!Y_ENABLE_ON)
|
||||
#define _SET_PWR_Z(ena) WRITE(Z_ENABLE_PIN, ena?Z_ENABLE_ON:!Z_ENABLE_ON)
|
||||
#define _SET_PWR_E(ena) WRITE(E0_ENABLE_PIN, ena?E_ENABLE_ON:!E_ENABLE_ON)
|
||||
|
||||
#define _GET_DIR_X (READ(X_DIR_PIN) == INVERT_X_DIR)
|
||||
#define _GET_DIR_Y (READ(Y_DIR_PIN) == INVERT_Y_DIR)
|
||||
#define _GET_DIR_Z (READ(Z_DIR_PIN) == INVERT_Z_DIR)
|
||||
#define _GET_DIR_E (READ(E0_DIR_PIN) == INVERT_E0_DIR)
|
||||
|
||||
#define _SET_DIR_X(dir) { WRITE(X_DIR_PIN, dir?INVERT_X_DIR:!INVERT_X_DIR); asm("nop"); }
|
||||
#define _SET_DIR_Y(dir) { WRITE(Y_DIR_PIN, dir?INVERT_Y_DIR:!INVERT_Y_DIR); asm("nop"); }
|
||||
#define _SET_DIR_Z(dir) { WRITE(Z_DIR_PIN, dir?INVERT_Z_DIR:!INVERT_Z_DIR); asm("nop"); }
|
||||
#define _SET_DIR_E(dir) { WRITE(E0_DIR_PIN, dir?INVERT_E0_DIR:!INVERT_E0_DIR); asm("nop"); }
|
||||
#define _SET_DIR_X(dir) WRITE(X_DIR_PIN, dir?INVERT_X_DIR:!INVERT_X_DIR)
|
||||
#define _SET_DIR_Y(dir) WRITE(Y_DIR_PIN, dir?INVERT_Y_DIR:!INVERT_Y_DIR)
|
||||
#define _SET_DIR_Z(dir) WRITE(Z_DIR_PIN, dir?INVERT_Z_DIR:!INVERT_Z_DIR)
|
||||
#define _SET_DIR_E(dir) WRITE(E0_DIR_PIN, dir?INVERT_E0_DIR:!INVERT_E0_DIR)
|
||||
|
||||
#define _DO_STEP_X { WRITE(X_STEP_PIN, !INVERT_X_STEP_PIN); asm("nop"); WRITE(X_STEP_PIN, INVERT_X_STEP_PIN); asm("nop"); }
|
||||
#define _DO_STEP_Y { WRITE(Y_STEP_PIN, !INVERT_Y_STEP_PIN); asm("nop"); WRITE(Y_STEP_PIN, INVERT_Y_STEP_PIN); asm("nop"); }
|
||||
#define _DO_STEP_Z { WRITE(Z_STEP_PIN, !INVERT_Z_STEP_PIN); asm("nop"); WRITE(Z_STEP_PIN, INVERT_Z_STEP_PIN); asm("nop"); }
|
||||
#define _DO_STEP_E { WRITE(E0_STEP_PIN, !INVERT_E_STEP_PIN); asm("nop"); WRITE(E0_STEP_PIN, INVERT_E_STEP_PIN); asm("nop"); }
|
||||
#ifdef TMC2130_DEDGE_STEPPING
|
||||
#define _DO_STEP_X TOGGLE(X_STEP_PIN)
|
||||
#define _DO_STEP_Y TOGGLE(Y_STEP_PIN)
|
||||
#define _DO_STEP_Z TOGGLE(Z_STEP_PIN)
|
||||
#define _DO_STEP_E TOGGLE(E0_STEP_PIN)
|
||||
#else
|
||||
#define _DO_STEP_X { WRITE(X_STEP_PIN, !INVERT_X_STEP_PIN); TMC2130_MINIMUM_DELAY; WRITE(X_STEP_PIN, INVERT_X_STEP_PIN); }
|
||||
#define _DO_STEP_Y { WRITE(Y_STEP_PIN, !INVERT_Y_STEP_PIN); TMC2130_MINIMUM_DELAY; WRITE(Y_STEP_PIN, INVERT_Y_STEP_PIN); }
|
||||
#define _DO_STEP_Z { WRITE(Z_STEP_PIN, !INVERT_Z_STEP_PIN); TMC2130_MINIMUM_DELAY; WRITE(Z_STEP_PIN, INVERT_Z_STEP_PIN); }
|
||||
#define _DO_STEP_E { WRITE(E0_STEP_PIN, !INVERT_E_STEP_PIN); TMC2130_MINIMUM_DELAY; WRITE(E0_STEP_PIN, INVERT_E_STEP_PIN); }
|
||||
#endif
|
||||
|
||||
|
||||
uint16_t tmc2130_get_res(uint8_t axis)
|
||||
|
@ -737,6 +762,7 @@ void tmc2130_set_pwr(uint8_t axis, uint8_t pwr)
|
|||
case Z_AXIS: _SET_PWR_Z(pwr); break;
|
||||
case E_AXIS: _SET_PWR_E(pwr); break;
|
||||
}
|
||||
delayMicroseconds(TMC2130_SET_PWR_DELAY);
|
||||
}
|
||||
|
||||
uint8_t tmc2130_get_inv(uint8_t axis)
|
||||
|
@ -773,6 +799,7 @@ void tmc2130_set_dir(uint8_t axis, uint8_t dir)
|
|||
case Z_AXIS: _SET_DIR_Z(dir); break;
|
||||
case E_AXIS: _SET_DIR_E(dir); break;
|
||||
}
|
||||
delayMicroseconds(TMC2130_SET_DIR_DELAY);
|
||||
}
|
||||
|
||||
void tmc2130_do_step(uint8_t axis)
|
||||
|
@ -788,8 +815,8 @@ void tmc2130_do_step(uint8_t axis)
|
|||
|
||||
void tmc2130_do_steps(uint8_t axis, uint16_t steps, uint8_t dir, uint16_t delay_us)
|
||||
{
|
||||
tmc2130_set_dir(axis, dir);
|
||||
delayMicroseconds(100);
|
||||
if (tmc2130_get_dir(axis) != dir)
|
||||
tmc2130_set_dir(axis, dir);
|
||||
while (steps--)
|
||||
{
|
||||
tmc2130_do_step(axis);
|
||||
|
@ -820,7 +847,6 @@ void tmc2130_goto_step(uint8_t axis, uint8_t step, uint8_t dir, uint16_t delay_u
|
|||
cnt = steps;
|
||||
}
|
||||
tmc2130_set_dir(axis, dir);
|
||||
delayMicroseconds(100);
|
||||
mscnt = tmc2130_rd_MSCNT(axis);
|
||||
while ((cnt--) && ((mscnt >> shift) != step))
|
||||
{
|
||||
|
|
|
@ -29,6 +29,18 @@ extern uint8_t tmc2130_sg_homing_axes_mask;
|
|||
#define TMC2130_WAVE_FAC1000_MAX 200
|
||||
#define TMC2130_WAVE_FAC1000_STP 1
|
||||
|
||||
#define TMC2130_MINIMUM_PULSE 0 // minimum pulse width in uS
|
||||
#define TMC2130_SET_DIR_DELAY 20 // minimum delay after setting direction in uS
|
||||
#define TMC2130_SET_PWR_DELAY 0 // minimum delay after changing pwr mode in uS
|
||||
|
||||
#ifdef TMC2130_DEDGE_STEPPING
|
||||
#define TMC2130_MINIMUM_DELAY //NOP
|
||||
#elif TMC2130_MINIMUM_PULSE == 0
|
||||
#define TMC2130_MINIMUM_DELAY asm("nop")
|
||||
#else
|
||||
#define TMC2130_MINIMUM_DELAY delayMicroseconds(TMC2130_MINIMUM_PULSE)
|
||||
#endif
|
||||
|
||||
extern uint8_t tmc2130_home_enabled;
|
||||
extern uint8_t tmc2130_home_origin[2];
|
||||
extern uint8_t tmc2130_home_bsteps[2];
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
|
||||
#ifdef SYSTEM_TIMER_2
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include "pins.h"
|
||||
#include "fastio.h"
|
||||
#include "macros.h"
|
||||
|
|
137
Firmware/twi.c
Normal file
137
Firmware/twi.c
Normal file
|
@ -0,0 +1,137 @@
|
|||
/*
|
||||
twi.c - Stripped-down TWI/I2C library
|
||||
Copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts
|
||||
*/
|
||||
|
||||
|
||||
#include <math.h>
|
||||
#include "config.h"
|
||||
#include "fastio.h"
|
||||
#include "twi.h"
|
||||
|
||||
|
||||
void twi_init(void)
|
||||
{
|
||||
// activate internal pullups for twi.
|
||||
WRITE(SDA_PIN, 1);
|
||||
WRITE(SCL_PIN, 1);
|
||||
|
||||
// initialize twi prescaler and bit rate
|
||||
TWSR &= ~(_BV(TWPS0) | _BV(TWPS1));
|
||||
TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;
|
||||
|
||||
/* twi bit rate formula from atmega128 manual pg 204
|
||||
SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR))
|
||||
note: TWBR should be 10 or higher for master mode
|
||||
It is 72 for a 16mhz Wiring board with 100kHz TWI */
|
||||
}
|
||||
|
||||
void twi_disable(void)
|
||||
{
|
||||
// deactivate internal pullups for twi.
|
||||
WRITE(SDA_PIN, 0);
|
||||
WRITE(SCL_PIN, 0);
|
||||
}
|
||||
|
||||
|
||||
static void twi_stop()
|
||||
{
|
||||
TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTO);
|
||||
}
|
||||
|
||||
|
||||
static uint8_t twi_wait(uint8_t status)
|
||||
{
|
||||
while(!(TWCR & _BV(TWINT)));
|
||||
if(TW_STATUS != status)
|
||||
{
|
||||
twi_stop();
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static uint8_t twi_start(uint8_t address, uint8_t reg)
|
||||
{
|
||||
// send start condition
|
||||
TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
|
||||
if(twi_wait(TW_START))
|
||||
return 1;
|
||||
|
||||
// send address
|
||||
TWDR = TW_WRITE | (address << 1);
|
||||
TWCR = _BV(TWEN) | _BV(TWINT);
|
||||
if(twi_wait(TW_MT_SLA_ACK))
|
||||
return 2;
|
||||
|
||||
// send register
|
||||
TWDR = reg;
|
||||
TWCR = _BV(TWEN) | _BV(TWINT);
|
||||
if(twi_wait(TW_MT_DATA_ACK))
|
||||
return 3;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
uint8_t twi_r8(uint8_t address, uint8_t reg, uint8_t* data)
|
||||
{
|
||||
if(twi_start(address, reg))
|
||||
return 1;
|
||||
|
||||
// repeat start
|
||||
TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWSTA);
|
||||
if(twi_wait(TW_REP_START))
|
||||
return 2;
|
||||
|
||||
// start receiving
|
||||
TWDR = TW_READ | (address << 1);
|
||||
TWCR = _BV(TWEN) | _BV(TWINT);
|
||||
if(twi_wait(TW_MR_SLA_ACK))
|
||||
return 3;
|
||||
|
||||
// receive data
|
||||
TWCR = _BV(TWEN) | _BV(TWINT);
|
||||
if(twi_wait(TW_MR_DATA_NACK))
|
||||
return 4;
|
||||
|
||||
*data = TWDR;
|
||||
|
||||
// send stop
|
||||
twi_stop();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
uint8_t twi_w8(uint8_t address, uint8_t reg, uint8_t data)
|
||||
{
|
||||
if(twi_start(address, reg))
|
||||
return 1;
|
||||
|
||||
// send data
|
||||
TWDR = data;
|
||||
TWCR = _BV(TWEN) | _BV(TWINT);
|
||||
if(twi_wait(TW_MT_DATA_ACK))
|
||||
return 2;
|
||||
|
||||
// send stop
|
||||
twi_stop();
|
||||
return 0;
|
||||
}
|
63
Firmware/twi.h
Normal file
63
Firmware/twi.h
Normal file
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
twi.h - Stripped-down TWI/I2C library
|
||||
Copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <compat/twi.h>
|
||||
|
||||
#ifndef TWI_FREQ
|
||||
#define TWI_FREQ 400000L
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Function twi_init
|
||||
* Desc readys twi pins and sets twi bitrate
|
||||
* Input none
|
||||
* Output none
|
||||
*/
|
||||
void twi_init(void);
|
||||
|
||||
/*
|
||||
* Function twi_disable
|
||||
* Desc disables twi pins
|
||||
* Input none
|
||||
* Output none
|
||||
*/
|
||||
void twi_disable(void);
|
||||
|
||||
/*
|
||||
* Function twi_r8
|
||||
* Desc read a single byte from a device
|
||||
* Input address: 7bit i2c device address
|
||||
* reg: register address
|
||||
* data: pointer to byte for result
|
||||
* Output 0 on success
|
||||
*/
|
||||
uint8_t twi_r8(uint8_t address, uint8_t reg, uint8_t* data);
|
||||
|
||||
/*
|
||||
* Function twi_w8
|
||||
* Desc write a single byte from a device
|
||||
* Input address: 7bit i2c device address
|
||||
* reg: register address
|
||||
* data: byte to write
|
||||
* Output 0 on success
|
||||
*/
|
||||
uint8_t twi_w8(uint8_t address, uint8_t reg, uint8_t data);
|
|
@ -75,11 +75,6 @@ int8_t FSensorStateMenu = 1;
|
|||
bool bMenuFSDetect=false;
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
|
||||
|
||||
#ifdef SDCARD_SORT_ALPHA
|
||||
bool presort_flag = false;
|
||||
#endif
|
||||
|
||||
LcdCommands lcd_commands_type = LcdCommands::Idle;
|
||||
static uint8_t lcd_commands_step = 0;
|
||||
|
||||
|
@ -2057,8 +2052,8 @@ static void lcd_support_menu()
|
|||
{ // 22bytes total
|
||||
int8_t status; // 1byte
|
||||
bool is_flash_air; // 1byte
|
||||
uint8_t ip[4]; // 4bytes
|
||||
char ip_str[3*4+3+1]; // 16bytes
|
||||
uint32_t ip; // 4bytes
|
||||
char ip_str[IP4_STR_SIZE]; // 16bytes
|
||||
} _menu_data_t;
|
||||
static_assert(sizeof(menu_data)>= sizeof(_menu_data_t),"_menu_data_t doesn't fit into menu_data");
|
||||
_menu_data_t* _md = (_menu_data_t*)&(menu_data[0]);
|
||||
|
@ -2069,17 +2064,10 @@ static void lcd_support_menu()
|
|||
_md->status = 1;
|
||||
_md->is_flash_air = card.ToshibaFlashAir_isEnabled();
|
||||
if (_md->is_flash_air) {
|
||||
card.ToshibaFlashAir_GetIP(_md->ip); // ip[4] filled with 0 if it failed
|
||||
// Prepare IP string from ip[4]
|
||||
sprintf_P(_md->ip_str, PSTR("%d.%d.%d.%d"),
|
||||
_md->ip[0], _md->ip[1],
|
||||
_md->ip[2], _md->ip[3]);
|
||||
card.ToshibaFlashAir_GetIP((uint8_t*)(&_md->ip)); // ip == 0 if it failed
|
||||
}
|
||||
} else if (_md->is_flash_air &&
|
||||
_md->ip[0] == 0 && _md->ip[1] == 0 &&
|
||||
_md->ip[2] == 0 && _md->ip[3] == 0 &&
|
||||
++ _md->status == 16)
|
||||
{
|
||||
} else if (_md->is_flash_air && _md->ip == 0 && ++ _md->status == 16)
|
||||
{
|
||||
// Waiting for the FlashAir card to get an IP address from a router. Force an update.
|
||||
_md->status = 0;
|
||||
}
|
||||
|
@ -2143,6 +2131,20 @@ static void lcd_support_menu()
|
|||
MENU_ITEM_BACK_P(PSTR(" "));
|
||||
if (((menu_item - 1) == menu_line) && lcd_draw_update) {
|
||||
lcd_set_cursor(2, menu_row);
|
||||
ip4_to_str(_md->ip_str, (uint8_t*)(&_md->ip));
|
||||
lcd_printf_P(PSTR("%s"), _md->ip_str);
|
||||
}
|
||||
}
|
||||
|
||||
// Show the printer IP address, if it is available.
|
||||
if (IP_address) {
|
||||
|
||||
MENU_ITEM_BACK_P(STR_SEPARATOR);
|
||||
MENU_ITEM_BACK_P(PSTR("Printer IP Addr:")); //c=18 r=1
|
||||
MENU_ITEM_BACK_P(PSTR(" "));
|
||||
if (((menu_item - 1) == menu_line) && lcd_draw_update) {
|
||||
lcd_set_cursor(2, menu_row);
|
||||
ip4_to_str(_md->ip_str, (uint8_t*)(&IP_address));
|
||||
lcd_printf_P(PSTR("%s"), _md->ip_str);
|
||||
}
|
||||
}
|
||||
|
@ -2228,18 +2230,18 @@ uint8_t nLevel;
|
|||
|
||||
lcd_set_cursor(0,0);
|
||||
lcdui_print_temp(LCD_STR_THERMOMETER[0],(int)degHotend(0),(int)degTargetHotend(0));
|
||||
lcd_puts_at_P(0,2, _i("Press the knob")); ////MSG_ c=20 r=1
|
||||
lcd_set_cursor(0,3);
|
||||
lcd_puts_at_P(0,1, _i("Press the knob")); ////MSG_ c=20
|
||||
lcd_set_cursor(0,2);
|
||||
switch(eFilamentAction)
|
||||
{
|
||||
case FilamentAction::Load:
|
||||
case FilamentAction::AutoLoad:
|
||||
case FilamentAction::MmuLoad:
|
||||
lcd_puts_P(_i("to load filament")); ////MSG_ c=20 r=1
|
||||
lcd_puts_P(_i("to load filament")); ////MSG_ c=20
|
||||
break;
|
||||
case FilamentAction::UnLoad:
|
||||
case FilamentAction::MmuUnLoad:
|
||||
lcd_puts_P(_i("to unload filament")); ////MSG_ c=20 r=1
|
||||
lcd_puts_P(_i("to unload filament")); ////MSG_ c=20
|
||||
break;
|
||||
case FilamentAction::MmuEject:
|
||||
case FilamentAction::MmuCut:
|
||||
|
@ -4310,7 +4312,7 @@ static void lcd_sort_type_set() {
|
|||
default: sdSort = SD_SORT_TIME;
|
||||
}
|
||||
eeprom_update_byte((unsigned char *)EEPROM_SD_SORT, sdSort);
|
||||
presort_flag = true;
|
||||
card.presort_flag = true;
|
||||
}
|
||||
#endif //SDCARD_SORT_ALPHA
|
||||
|
||||
|
@ -5284,16 +5286,13 @@ do\
|
|||
else\
|
||||
MENU_ITEM_TOGGLE_P(_T(MSG_SD_CARD), _T(MSG_NORMAL), lcd_toshiba_flash_air_compatibility_toggle);\
|
||||
\
|
||||
if (!farm_mode)\
|
||||
uint8_t sdSort;\
|
||||
EEPROM_read(EEPROM_SD_SORT, (uint8_t*)&sdSort, sizeof(sdSort));\
|
||||
switch (sdSort)\
|
||||
{\
|
||||
uint8_t sdSort;\
|
||||
EEPROM_read(EEPROM_SD_SORT, (uint8_t*)&sdSort, sizeof(sdSort));\
|
||||
switch (sdSort)\
|
||||
{\
|
||||
case SD_SORT_TIME: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_TIME), lcd_sort_type_set); break;\
|
||||
case SD_SORT_ALPHA: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_ALPHA), lcd_sort_type_set); break;\
|
||||
default: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_NONE), lcd_sort_type_set);\
|
||||
}\
|
||||
case SD_SORT_TIME: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_TIME), lcd_sort_type_set); break;\
|
||||
case SD_SORT_ALPHA: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_SORT_ALPHA), lcd_sort_type_set); break;\
|
||||
default: MENU_ITEM_TOGGLE_P(_T(MSG_SORT), _T(MSG_NONE), lcd_sort_type_set);\
|
||||
}\
|
||||
}\
|
||||
while (0)
|
||||
|
@ -7176,8 +7175,8 @@ void lcd_sdcard_menu()
|
|||
{
|
||||
uint8_t sdSort = eeprom_read_byte((uint8_t*)EEPROM_SD_SORT);
|
||||
|
||||
if (presort_flag == true) {
|
||||
presort_flag = false;
|
||||
if (card.presort_flag == true) {
|
||||
card.presort_flag = false;
|
||||
card.presort();
|
||||
}
|
||||
if (lcd_draw_update == 0 && LCD_CLICKED == 0)
|
||||
|
@ -8541,7 +8540,7 @@ static void menu_action_sdfile(const char* filename)
|
|||
|
||||
for (uint_least8_t i = 0; i < depth; i++) {
|
||||
for (uint_least8_t j = 0; j < 8; j++) {
|
||||
eeprom_write_byte((uint8_t*)EEPROM_DIRS + j + 8 * i, dir_names[i][j]);
|
||||
eeprom_write_byte((uint8_t*)EEPROM_DIRS + j + 8 * i, card.dir_names[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8559,12 +8558,8 @@ static void menu_action_sdfile(const char* filename)
|
|||
|
||||
void menu_action_sddirectory(const char* filename)
|
||||
{
|
||||
uint8_t depth = (uint8_t)card.getWorkDirDepth();
|
||||
|
||||
strcpy(dir_names[depth], filename);
|
||||
MYSERIAL.println(dir_names[depth]);
|
||||
card.chdir(filename);
|
||||
lcd_encoder = 0;
|
||||
card.chdir(filename, true);
|
||||
lcd_encoder = 0;
|
||||
}
|
||||
|
||||
/** LCD API **/
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include "sound.h"
|
||||
#include "language.h"
|
||||
#include "util.h"
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
// Allocate the version string in the program memory. Otherwise the string lands either on the stack or in the global RAM.
|
||||
const char FW_VERSION_STR[] PROGMEM = FW_VERSION;
|
||||
|
@ -604,3 +605,9 @@ else {
|
|||
sPrinterName=_sPrinterName;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ip4_to_str(char* dest, uint8_t* IP)
|
||||
{
|
||||
sprintf_P(dest, PSTR("%u.%u.%u.%u"), IP[0], IP[1], IP[2], IP[3]);
|
||||
}
|
||||
|
|
|
@ -110,4 +110,7 @@ void gcode_level_check(uint16_t nGcodeLevel);
|
|||
|
||||
void fSetMmuMode(bool bMMu);
|
||||
|
||||
#define IP4_STR_SIZE 16
|
||||
extern void ip4_to_str(char* dest, uint8_t* IP);
|
||||
|
||||
#endif /* UTIL_H */
|
||||
|
|
|
@ -90,8 +90,9 @@ AXIS SETTINGS
|
|||
#define DEFAULT_MAX_ACCELERATION {9000,9000,500,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_SILENT {960, 960, 200, 5000} // (mm/sec^2) max acceleration (M201), silent mode
|
||||
|
||||
#define DEFAULT_ACCELERATION 1500 // X, Y, Z and E max acceleration in mm/s^2 for printing moves
|
||||
#define DEFAULT_ACCELERATION 1500 // X, Y, Z and E max acceleration in mm/s^2 for printing moves
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1500 // X, Y, Z and E max acceleration in mm/s^2 for retracts
|
||||
#define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z and E max acceleration in mm/s^2 for travels
|
||||
|
||||
|
||||
#define MANUAL_FEEDRATE {3000, 3000, 1000, 100} // set the speeds for manual moves (mm/min)
|
||||
|
|
|
@ -90,8 +90,9 @@ AXIS SETTINGS
|
|||
#define DEFAULT_MAX_ACCELERATION {9000,9000,500,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_SILENT {960, 960, 200, 5000} // (mm/sec^2) max acceleration (M201), silent mode
|
||||
|
||||
#define DEFAULT_ACCELERATION 1500 // X, Y, Z and E max acceleration in mm/s^2 for printing moves
|
||||
#define DEFAULT_ACCELERATION 1500 // X, Y, Z and E max acceleration in mm/s^2 for printing moves
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1500 // X, Y, Z and E max acceleration in mm/s^2 for retracts
|
||||
#define DEFAULT_TRAVEL_ACCELERATION 1500 // X, Y, Z and E max acceleration in mm/s^2 for travels
|
||||
|
||||
|
||||
#define MANUAL_FEEDRATE {3000, 3000, 1000, 100} // set the speeds for manual moves (mm/min)
|
||||
|
|
|
@ -94,8 +94,9 @@
|
|||
#define DEFAULT_MAX_ACCELERATION {1000, 1000, 200, 5000} // (mm/sec^2) max acceleration (M201)
|
||||
#define DEFAULT_MAX_ACCELERATION_SILENT {960, 960, 200, 5000} // (mm/sec^2) max acceleration (M201), silent mode
|
||||
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204S)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204T)
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204P)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204R)
|
||||
#define DEFAULT_TRAVEL_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for travels (M204T)
|
||||
|
||||
#define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min)
|
||||
|
||||
|
|
|
@ -95,8 +95,9 @@
|
|||
#define DEFAULT_MAX_ACCELERATION_SILENT {960, 960, 200, 5000} // (mm/sec^2) max acceleration (M201), silent mode
|
||||
|
||||
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204S)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204T)
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204P)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204R)
|
||||
#define DEFAULT_TRAVEL_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for travels (M204T)
|
||||
|
||||
#define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min)
|
||||
|
||||
|
|
|
@ -94,8 +94,9 @@
|
|||
#define DEFAULT_MAX_ACCELERATION {1000, 1000, 200, 5000} // (mm/sec^2) max acceleration (M201)
|
||||
#define DEFAULT_MAX_ACCELERATION_SILENT {960, 960, 200, 5000} // (mm/sec^2) max acceleration (M201), silent mode
|
||||
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204S)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204T)
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204P)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204R)
|
||||
#define DEFAULT_TRAVEL_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for travels (M204T)
|
||||
|
||||
#define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min)
|
||||
|
||||
|
|
|
@ -95,8 +95,9 @@
|
|||
#define DEFAULT_MAX_ACCELERATION_SILENT {960, 960, 200, 5000} // (mm/sec^2) max acceleration (M201), silent mode
|
||||
|
||||
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204S)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204T)
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204P)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204R)
|
||||
#define DEFAULT_TRAVEL_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for travels (M204T)
|
||||
|
||||
#define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min)
|
||||
|
||||
|
|
|
@ -99,8 +99,9 @@
|
|||
#define DEFAULT_MAX_ACCELERATION_SILENT {960, 960, 200, 5000} // (mm/sec^2) max acceleration (M201), silent mode
|
||||
|
||||
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204S)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204T)
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204P)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204R)
|
||||
#define DEFAULT_TRAVEL_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for travels (M204T)
|
||||
|
||||
#define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min)
|
||||
|
||||
|
@ -268,6 +269,7 @@
|
|||
#define TMC2130_CURRENTS_R_HOME {8, 10, 20, 18} // homing running currents for all axes
|
||||
|
||||
#define TMC2130_STEALTH_Z
|
||||
#define TMC2130_DEDGE_STEPPING
|
||||
|
||||
//#define TMC2130_SERVICE_CODES_M910_M918
|
||||
|
||||
|
|
|
@ -101,8 +101,9 @@
|
|||
#define DEFAULT_MAX_ACCELERATION_SILENT {960, 960, 200, 5000} // (mm/sec^2) max acceleration (M201), silent mode
|
||||
|
||||
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204S)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204T)
|
||||
#define DEFAULT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for printing moves (M204P)
|
||||
#define DEFAULT_RETRACT_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for retracts (M204R)
|
||||
#define DEFAULT_TRAVEL_ACCELERATION 1250 // X, Y, Z and E max acceleration in mm/s^2 for travels (M204T)
|
||||
|
||||
#define MANUAL_FEEDRATE {2700, 2700, 1000, 100} // set the speeds for manual moves (mm/min)
|
||||
|
||||
|
@ -270,6 +271,7 @@
|
|||
#define TMC2130_CURRENTS_R_HOME {8, 10, 20, 18} // homing running currents for all axes
|
||||
|
||||
#define TMC2130_STEALTH_Z
|
||||
#define TMC2130_DEDGE_STEPPING
|
||||
|
||||
//#define TMC2130_SERVICE_CODES_M910_M918
|
||||
|
||||
|
|
47
PF-build.sh
47
PF-build.sh
|
@ -56,7 +56,7 @@
|
|||
# Some may argue that this is only used by a script, BUT as soon someone accidentally or on purpose starts Arduino IDE
|
||||
# it will use the default Arduino IDE folders and so can corrupt the build environment.
|
||||
#
|
||||
# Version: 1.0.6-Build_33
|
||||
# Version: 1.0.6-Build_36
|
||||
# Change log:
|
||||
# 12 Jan 2019, 3d-gussner, Fixed "compiler.c.elf.flags=-w -Os -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections" in 'platform.txt'
|
||||
# 16 Jan 2019, 3d-gussner, Build_2, Added development check to modify 'Configuration.h' to prevent unwanted LCD messages that Firmware is unknown
|
||||
|
@ -135,6 +135,7 @@
|
|||
# Update exit numbers 1-13 for prepare build env 21-29 for prepare compiling 30-36 compiling
|
||||
# 08 Jan 2021, 3d-gussner, Comment out 'sudo' auto installation
|
||||
# Add '-?' '-h' help option
|
||||
# 27 Jan 2021, 3d-gussner, Add `-c`, `-p` and `-n` options
|
||||
|
||||
#### Start check if OSTYPE is supported
|
||||
OS_FOUND=$( command -v uname)
|
||||
|
@ -451,7 +452,7 @@ if type git > /dev/null; then
|
|||
git_available="1"
|
||||
fi
|
||||
|
||||
while getopts v:l:d:b:o:?h flag
|
||||
while getopts v:l:d:b:o:c:p:n:?h flag
|
||||
do
|
||||
case "${flag}" in
|
||||
v) variant_flag=${OPTARG};;
|
||||
|
@ -459,6 +460,9 @@ while getopts v:l:d:b:o:?h flag
|
|||
d) devel_flag=${OPTARG};;
|
||||
b) build_flag=${OPTARG};;
|
||||
o) output_flag=${OPTARG};;
|
||||
c) clean_flag=${OPTARG};;
|
||||
p) prusa_flag=${OPTARG};;
|
||||
n) new_build_flag=${OPTARG};;
|
||||
?) help_flag=1;;
|
||||
h) help_flag=1;;
|
||||
esac
|
||||
|
@ -469,6 +473,9 @@ while getopts v:l:d:b:o:?h flag
|
|||
#echo "build_flag: $build_flag";
|
||||
#echo "output_flag: $output_flag";
|
||||
#echo "help_flag: $help_flag"
|
||||
#echo "clean_flag: $clean_flag"
|
||||
#echo "prusa_flag: $prusa_flag"
|
||||
#echo "new_build_flag: $new_build_flag"
|
||||
|
||||
#
|
||||
# '?' 'h' argument usage and help
|
||||
|
@ -482,19 +489,23 @@ echo "$(tput setaf 2)-l$(tput sgr0) Languages '$(tput setaf 2)ALL$(tput sgr0)' f
|
|||
echo "$(tput setaf 2)-d$(tput sgr0) Devel build '$(tput setaf 2)GOLD$(tput sgr0)', '$(tput setaf 2)RC$(tput sgr0)', '$(tput setaf 2)BETA$(tput sgr0)', '$(tput setaf 2)ALPHA$(tput sgr0)', '$(tput setaf 2)DEBUG$(tput sgr0)', '$(tput setaf 2)DEVEL$(tput sgr0)' and '$(tput setaf 2)UNKNOWN$(tput sgr0)'"
|
||||
echo "$(tput setaf 2)-b$(tput sgr0) Build/commit number '$(tput setaf 2)Auto$(tput sgr0)' needs git or a number"
|
||||
echo "$(tput setaf 2)-o$(tput sgr0) Output '$(tput setaf 2)1$(tput sgr0)' force or '$(tput setaf 2)0$(tput sgr0)' block output and delays"
|
||||
echo "$(tput setaf 2)-c$(tput sgr0) Do not clean up lang build'$(tput setaf 2)0$(tput sgr0)' no '$(tput setaf 2)1$(tput sgr0)' yes"
|
||||
echo "$(tput setaf 2)-p$(tput sgr0) Keep Configuration_prusa.h '$(tput setaf 2)0$(tput sgr0)' no '$(tput setaf 2)1$(tput sgr0)' yes"
|
||||
echo "$(tput setaf 2)-n$(tput sgr0) New fresh build '$(tput setaf 2)0$(tput sgr0)' no '$(tput setaf 2)1$(tput sgr0)' yes"
|
||||
echo "$(tput setaf 2)-?$(tput sgr0) Help"
|
||||
echo "$(tput setaf 2)-h$(tput sgr0) Help"
|
||||
echo
|
||||
echo "Brief USAGE:"
|
||||
echo " $(tput setaf 2)./PF-build.sh$(tput sgr0) [-v] [-l] [-d] [-b] [-o]"
|
||||
echo " $(tput setaf 2)./PF-build.sh$(tput sgr0) [-v] [-l] [-d] [-b] [-o] [-c] [-p] [-n]"
|
||||
echo
|
||||
echo "Example:"
|
||||
echo " $(tput setaf 2)./PF-build.sh -v All -l ALL -d GOLD$(tput sgr0)"
|
||||
echo " Will build all variants as multi language and final GOLD version"
|
||||
echo
|
||||
echo " $(tput setaf 2) ./PF-build.sh -v 1_75mm_MK3S-EINSy10a-E3Dv6full.h -b Auto -l ALL -d GOLD -o 1$(tput sgr0)"
|
||||
echo " $(tput setaf 2) ./PF-build.sh -v 1_75mm_MK3S-EINSy10a-E3Dv6full.h -b Auto -l ALL -d GOLD -o 1 -c 1 -p 1 -n 1$(tput sgr0)"
|
||||
echo " Will build MK3S multi language final GOLD firmware "
|
||||
echo " with current commit count number and output extra information"
|
||||
echo " with current commit count number and output extra information,"
|
||||
echo " not delete lang build temporary files, keep Configuration_prusa.h and build with new fresh build folder."
|
||||
echo
|
||||
exit
|
||||
|
||||
|
@ -807,6 +818,12 @@ do
|
|||
if [ $OUTPUT == "1" ] ; then
|
||||
sleep 2
|
||||
fi
|
||||
|
||||
#New fresh PF-Firmware-build
|
||||
if [ "$new_build_flag" == "1" ]; then
|
||||
rm -r -f $BUILD_PATH/* || exit 36
|
||||
fi
|
||||
|
||||
#$BUILD_ENV_PATH/arduino-builder -dump-prefs -debug-level 10 -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD_PACKAGE_NAME:avr:$BOARD -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14
|
||||
$BUILD_ENV_PATH/arduino-builder -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD_PACKAGE_NAME:avr:$BOARD -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 30
|
||||
echo "$(tput sgr 0)"
|
||||
|
@ -874,17 +891,21 @@ do
|
|||
fi
|
||||
fi
|
||||
# Cleanup after build
|
||||
echo "$(tput setaf 3)"
|
||||
./fw-clean.sh || exit 34
|
||||
./lang-clean.sh || exit 35
|
||||
echo "$(tput sgr 0)"
|
||||
if [[ -z "$clean_flag" || "$clean_flag" == "0" ]]; then
|
||||
echo "$(tput setaf 3)"
|
||||
./fw-clean.sh || exit 34
|
||||
./lang-clean.sh || exit 35
|
||||
echo "$(tput sgr 0)"
|
||||
fi
|
||||
else
|
||||
echo "$(tput setaf 2)Copying English only firmware to PF-build-hex folder$(tput sgr 0)"
|
||||
cp -f $BUILD_PATH/Firmware.ino.hex $SCRIPT_PATH/../$OUTPUT_FOLDER/FW$FW-Build$BUILD-$VARIANT-EN_ONLY.hex || exit 34
|
||||
fi
|
||||
|
||||
# Cleanup Firmware
|
||||
rm $SCRIPT_PATH/Firmware/Configuration_prusa.h || exit 36
|
||||
if [[ -z "$prusa_flag" || "$prusa_flag" == "0" ]]; then
|
||||
rm $SCRIPT_PATH/Firmware/Configuration_prusa.h || exit 36
|
||||
fi
|
||||
if find $SCRIPT_PATH/lang/ -name '*RAMBo10a*.txt' -printf 1 -quit | grep -q 1
|
||||
then
|
||||
rm $SCRIPT_PATH/lang/*RAMBo10a*.txt
|
||||
|
@ -901,6 +922,12 @@ do
|
|||
then
|
||||
rm $SCRIPT_PATH/lang/not_used.txt
|
||||
fi
|
||||
|
||||
#New fresh PF-Firmware-build
|
||||
if [ "$new_build_flag" == "1" ]; then
|
||||
rm -r -f $BUILD_PATH/* || exit 36
|
||||
fi
|
||||
|
||||
# Restore files to previous state
|
||||
sed -i -- "s/^#define FW_DEV_VERSION FW_VERSION_$DEV_STATUS/#define FW_DEV_VERSION FW_VERSION_UNKNOWN/g" $SCRIPT_PATH/Firmware/Configuration.h
|
||||
sed -i -- 's/^#define FW_REPOSITORY "Prusa3d"/#define FW_REPOSITORY "Unknown"/g' $SCRIPT_PATH/Firmware/Configuration.h
|
||||
|
|
|
@ -620,7 +620,7 @@
|
|||
"Please upgrade."
|
||||
|
||||
#MSG_PRESS_TO_PREHEAT c=20 r=4
|
||||
"Press knob to preheat nozzle and continue."
|
||||
"Press the knob to preheat nozzle and continue."
|
||||
|
||||
#MSG_FS_PAUSE c=5
|
||||
"Pause"
|
||||
|
@ -643,7 +643,7 @@
|
|||
#MSG_CARD_MENU
|
||||
"Print from SD"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"Press the knob"
|
||||
|
||||
#MSG_PRINT_PAUSED c=20 r=1
|
||||
|
@ -874,10 +874,10 @@
|
|||
#MSG_TOTAL_FAILURES c=20
|
||||
"Total failures"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to load filament"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to unload filament"
|
||||
|
||||
#MSG_UNLOAD_FILAMENT c=17
|
||||
|
|
|
@ -827,7 +827,7 @@
|
|||
"Prosim aktualizujte."
|
||||
|
||||
#MSG_PRESS_TO_PREHEAT c=20 r=4
|
||||
"Press knob to preheat nozzle and continue."
|
||||
"Press the knob to preheat nozzle and continue."
|
||||
"Pro nahrati trysky a pokracovani stisknete tlacitko."
|
||||
|
||||
#MSG_FS_PAUSE c=5
|
||||
|
@ -858,7 +858,7 @@
|
|||
"Print from SD"
|
||||
"Tisk z SD"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"Press the knob"
|
||||
"Stisknete hl. tlacitko"
|
||||
|
||||
|
@ -1166,11 +1166,11 @@
|
|||
"Total failures"
|
||||
"Celkem selhani"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to load filament"
|
||||
"k zavedeni filamentu"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to unload filament"
|
||||
"k vyjmuti filamentu"
|
||||
|
||||
|
|
|
@ -827,7 +827,7 @@
|
|||
"Bitte aktualisieren."
|
||||
|
||||
#MSG_PRESS_TO_PREHEAT c=20 r=4
|
||||
"Press knob to preheat nozzle and continue."
|
||||
"Press the knob to preheat nozzle and continue."
|
||||
"Bitte druecken Sie den Knopf um die Duese vorzuheizen und fortzufahren."
|
||||
|
||||
#MSG_FS_PAUSE c=5
|
||||
|
@ -858,7 +858,7 @@
|
|||
"Print from SD"
|
||||
"Drucken von SD"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"Press the knob"
|
||||
"Knopf druecken zum"
|
||||
|
||||
|
@ -1166,11 +1166,11 @@
|
|||
"Total failures"
|
||||
"Gesamte Fehler"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to load filament"
|
||||
"Filament laden"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to unload filament"
|
||||
"Filament entladen"
|
||||
|
||||
|
|
|
@ -827,7 +827,7 @@
|
|||
"Actualize por favor"
|
||||
|
||||
#MSG_PRESS_TO_PREHEAT c=20 r=4
|
||||
"Press knob to preheat nozzle and continue."
|
||||
"Press the knob to preheat nozzle and continue."
|
||||
"Pulsa el dial para precalentar la boquilla y continue."
|
||||
|
||||
#MSG_FS_PAUSE c=5
|
||||
|
@ -858,7 +858,7 @@
|
|||
"Print from SD"
|
||||
"Menu tarjeta SD"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"Press the knob"
|
||||
"Pulsa el dial"
|
||||
|
||||
|
@ -1166,13 +1166,13 @@
|
|||
"Total failures"
|
||||
"Fallos totales"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to load filament"
|
||||
"para cargar el filamento"
|
||||
"para cargar el fil."
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to unload filament"
|
||||
"para descargar el filamento"
|
||||
"para descargar fil."
|
||||
|
||||
#MSG_UNLOAD_FILAMENT c=17
|
||||
"Unload filament"
|
||||
|
|
|
@ -827,7 +827,7 @@
|
|||
"Mettez a jour le FW."
|
||||
|
||||
#MSG_PRESS_TO_PREHEAT c=20 r=4
|
||||
"Press knob to preheat nozzle and continue."
|
||||
"Press the knob to preheat nozzle and continue."
|
||||
"Appuyez sur le bouton pour prechauffer la buse et continuer."
|
||||
|
||||
#MSG_FS_PAUSE c=5
|
||||
|
@ -858,7 +858,7 @@
|
|||
"Print from SD"
|
||||
"Impr. depuis la SD"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"Press the knob"
|
||||
"App. sur sur bouton"
|
||||
|
||||
|
@ -1166,11 +1166,11 @@
|
|||
"Total failures"
|
||||
"Total des echecs"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to load filament"
|
||||
"pour charger le fil."
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to unload filament"
|
||||
"pour decharger fil."
|
||||
|
||||
|
|
|
@ -827,7 +827,7 @@
|
|||
"Prego aggiornare."
|
||||
|
||||
#MSG_PRESS_TO_PREHEAT c=20 r=4
|
||||
"Press knob to preheat nozzle and continue."
|
||||
"Press the knob to preheat nozzle and continue."
|
||||
"Premete la manopola per preriscaldare l'ugello e continuare."
|
||||
|
||||
#MSG_FS_PAUSE c=5
|
||||
|
@ -858,7 +858,7 @@
|
|||
"Print from SD"
|
||||
"Stampa da SD"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"Press the knob"
|
||||
"Premere la manopola"
|
||||
|
||||
|
@ -1166,13 +1166,13 @@
|
|||
"Total failures"
|
||||
"Totale fallimenti"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to load filament"
|
||||
"per caricare il filamento"
|
||||
"per caricare il fil."
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to unload filament"
|
||||
"per scaricare il filamento"
|
||||
"per scaricare fil."
|
||||
|
||||
#MSG_UNLOAD_FILAMENT c=17
|
||||
"Unload filament"
|
||||
|
|
|
@ -827,7 +827,7 @@
|
|||
"Prosze zaktualizowac."
|
||||
|
||||
#MSG_PRESS_TO_PREHEAT c=20 r=4
|
||||
"Press knob to preheat nozzle and continue."
|
||||
"Press the knob to preheat nozzle and continue."
|
||||
"Wcisnij pokretlo aby rozgrzac dysze i kontynuowac."
|
||||
|
||||
#MSG_FS_PAUSE c=5
|
||||
|
@ -858,7 +858,7 @@
|
|||
"Print from SD"
|
||||
"Druk z karty SD"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"Press the knob"
|
||||
"Wcisnij pokretlo"
|
||||
|
||||
|
@ -1166,11 +1166,11 @@
|
|||
"Total failures"
|
||||
"Suma bledow"
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to load filament"
|
||||
"aby zaladow. fil."
|
||||
|
||||
#
|
||||
# c=20
|
||||
"to unload filament"
|
||||
"aby rozlad. filament"
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue