This commit is contained in:
bubnikv 2017-09-22 15:43:56 +02:00
commit a8297369b2
13 changed files with 150 additions and 58 deletions

View file

@ -56,6 +56,7 @@
#define EEPROM_UVLO_TARGET_BED (EEPROM_UVLO_TARGET_HOTEND - 1) #define EEPROM_UVLO_TARGET_BED (EEPROM_UVLO_TARGET_HOTEND - 1)
#define EEPROM_UVLO_FEEDRATE (EEPROM_UVLO_TARGET_BED - 2) #define EEPROM_UVLO_FEEDRATE (EEPROM_UVLO_TARGET_BED - 2)
#define EEPROM_UVLO_FAN_SPEED (EEPROM_UVLO_FEEDRATE - 1) #define EEPROM_UVLO_FAN_SPEED (EEPROM_UVLO_FEEDRATE - 1)
#define EEPROM_FAN_CHECK_ENABLED (EEPROM_UVLO_FAN_SPEED - 1)
// Currently running firmware, each digit stored as uint16_t. // Currently running firmware, each digit stored as uint16_t.
@ -68,6 +69,8 @@
// Magic string, indicating that the current or the previous firmware running was the Prusa3D firmware. // Magic string, indicating that the current or the previous firmware running was the Prusa3D firmware.
#define EEPROM_FIRMWARE_PRUSA_MAGIC 0 #define EEPROM_FIRMWARE_PRUSA_MAGIC 0
#define EEPROM_OFFSET 20 //offset for storing settings using M500
//#define EEPROM_OFFSET
// This configuration file contains the basic settings. // This configuration file contains the basic settings.
// Advanced settings can be found in Configuration_adv.h // Advanced settings can be found in Configuration_adv.h

View file

@ -11,12 +11,22 @@
void _EEPROM_writeData(int &pos, uint8_t* value, uint8_t size) void _EEPROM_writeData(int &pos, uint8_t* value, uint8_t size)
{ {
do while (size--) {
{ uint8_t * const p = (uint8_t * const)pos;
eeprom_write_byte((unsigned char*)pos, *value); uint8_t v = *value;
// EEPROM has only ~100,000 write cycles,
// so only write bytes that have changed!
if (v != eeprom_read_byte(p)) {
eeprom_write_byte(p, v);
if (eeprom_read_byte(p) != v) {
SERIAL_ECHOLNPGM("EEPROM Error");
return;
}
}
pos++; pos++;
value++; value++;
}while(--size); };
} }
#define EEPROM_WRITE_VAR(pos, value) _EEPROM_writeData(pos, (uint8_t*)&value, sizeof(value)) #define EEPROM_WRITE_VAR(pos, value) _EEPROM_writeData(pos, (uint8_t*)&value, sizeof(value))
void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size)
@ -30,13 +40,7 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size)
} }
#define EEPROM_READ_VAR(pos, value) _EEPROM_readData(pos, (uint8_t*)&value, sizeof(value)) #define EEPROM_READ_VAR(pos, value) _EEPROM_readData(pos, (uint8_t*)&value, sizeof(value))
//====================================================================================== //======================================================================================
#define EEPROM_OFFSET 20 #define EEPROM_OFFSET 20
// IMPORTANT: Whenever there are changes made to the variables stored in EEPROM // IMPORTANT: Whenever there are changes made to the variables stored in EEPROM
// in the functions below, also increment the version number. This makes sure that // in the functions below, also increment the version number. This makes sure that
// the default values are used whenever there is a change to the data, to prevent // the default values are used whenever there is a change to the data, to prevent
@ -46,10 +50,10 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size)
#define EEPROM_VERSION "V1" #define EEPROM_VERSION "V1"
#ifdef EEPROM_SETTINGS #ifdef EEPROM_SETTINGS
void Config_StoreSettings() void Config_StoreSettings(uint16_t offset, uint8_t level)
{ {
char ver[4]= "000"; char ver[4]= "000";
int i=EEPROM_OFFSET; int i = offset;
EEPROM_WRITE_VAR(i,ver); // invalidate data first EEPROM_WRITE_VAR(i,ver); // invalidate data first
EEPROM_WRITE_VAR(i,axis_steps_per_unit); EEPROM_WRITE_VAR(i,axis_steps_per_unit);
EEPROM_WRITE_VAR(i,max_feedrate); EEPROM_WRITE_VAR(i,max_feedrate);
@ -124,12 +128,17 @@ void Config_StoreSettings()
EEPROM_WRITE_VAR(i, filament_size[2]); EEPROM_WRITE_VAR(i, filament_size[2]);
#endif #endif
#endif #endif
if (level >= 10) {
EEPROM_WRITE_VAR(i, extruder_advance_k);
EEPROM_WRITE_VAR(i, advance_ed_ratio);
}
/*MYSERIAL.print("Top address used:\n"); /*MYSERIAL.print("Top address used:\n");
MYSERIAL.print(i); MYSERIAL.print(i);
MYSERIAL.print("\n"); MYSERIAL.print("\n");
*/ */
char ver2[4]=EEPROM_VERSION; char ver2[4]=EEPROM_VERSION;
i=EEPROM_OFFSET; i=offset;
EEPROM_WRITE_VAR(i,ver2); // validate data EEPROM_WRITE_VAR(i,ver2); // validate data
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOLNPGM("Settings Stored"); SERIAL_ECHOLNPGM("Settings Stored");
@ -138,8 +147,9 @@ void Config_StoreSettings()
#ifndef DISABLE_M503 #ifndef DISABLE_M503
void Config_PrintSettings() void Config_PrintSettings(uint8_t level)
{ // Always have this function, even with EEPROM_SETTINGS disabled, the current values will be shown { // Always have this function, even with EEPROM_SETTINGS disabled, the current values will be shown
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOLNPGM("Steps per unit:"); SERIAL_ECHOLNPGM("Steps per unit:");
SERIAL_ECHO_START; SERIAL_ECHO_START;
@ -259,14 +269,22 @@ void Config_PrintSettings()
SERIAL_ECHOLNPGM("Filament settings: Disabled"); SERIAL_ECHOLNPGM("Filament settings: Disabled");
} }
#endif #endif
if (level >= 10) {
#ifdef LIN_ADVANCE
SERIAL_ECHO_START;
SERIAL_ECHOLNPGM("Linear advance settings:");
SERIAL_ECHOPAIR(" M900 K", extruder_advance_k);
SERIAL_ECHOPAIR(" E/D = ", advance_ed_ratio);
#endif //LIN_ADVANCE
}
} }
#endif #endif
#ifdef EEPROM_SETTINGS #ifdef EEPROM_SETTINGS
void Config_RetrieveSettings() void Config_RetrieveSettings(uint16_t offset, uint8_t level)
{ {
int i=EEPROM_OFFSET; int i=offset;
char stored_ver[4]; char stored_ver[4];
char ver[4]=EEPROM_VERSION; char ver[4]=EEPROM_VERSION;
EEPROM_READ_VAR(i,stored_ver); //read stored version EEPROM_READ_VAR(i,stored_ver); //read stored version
@ -347,6 +365,10 @@ void Config_RetrieveSettings()
EEPROM_READ_VAR(i, filament_size[2]); EEPROM_READ_VAR(i, filament_size[2]);
#endif #endif
#endif #endif
if (level >= 10) {
EEPROM_READ_VAR(i, extruder_advance_k);
EEPROM_READ_VAR(i, advance_ed_ratio);
}
calculate_volumetric_multipliers(); calculate_volumetric_multipliers();
// Call updatePID (similar to when we have processed M301) // Call updatePID (similar to when we have processed M301)
updatePID(); updatePID();

View file

@ -7,14 +7,14 @@
void Config_ResetDefault(); void Config_ResetDefault();
#ifndef DISABLE_M503 #ifndef DISABLE_M503
void Config_PrintSettings(); void Config_PrintSettings(uint8_t level = 0);
#else #else
FORCE_INLINE void Config_PrintSettings() {} FORCE_INLINE void Config_PrintSettings() {}
#endif #endif
#ifdef EEPROM_SETTINGS #ifdef EEPROM_SETTINGS
void Config_StoreSettings(); void Config_StoreSettings(uint16_t offset, uint8_t level = 0);
void Config_RetrieveSettings(); void Config_RetrieveSettings(uint16_t offset, uint8_t level = 0);
#else #else
FORCE_INLINE void Config_StoreSettings() {} FORCE_INLINE void Config_StoreSettings() {}
FORCE_INLINE void Config_RetrieveSettings() { Config_ResetDefault(); Config_PrintSettings(); } FORCE_INLINE void Config_RetrieveSettings() { Config_ResetDefault(); Config_PrintSettings(); }

View file

@ -68,7 +68,7 @@
// When first starting the main fan, run it at full speed for the // When first starting the main fan, run it at full speed for the
// given number of milliseconds. This gets the fan spinning reliably // given number of milliseconds. This gets the fan spinning reliably
// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu)
//#define FAN_KICKSTART_TIME 100 #define FAN_KICKSTART_TIME 800

View file

@ -472,7 +472,7 @@ const bool Z_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic o
#define DEFAULT_PID_TEMP 210 #define DEFAULT_PID_TEMP 210
#define MIN_PRINT_FAN_SPEED 50 #define MIN_PRINT_FAN_SPEED 75
#ifdef SNMM #ifdef SNMM
#define DEFAULT_RETRACTION 4 //used for PINDA temp calibration and pause print #define DEFAULT_RETRACTION 4 //used for PINDA temp calibration and pause print
@ -482,4 +482,6 @@ const bool Z_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic o
#define UVLO_Z_AXIS_SHIFT 2 #define UVLO_Z_AXIS_SHIFT 2
#define HEATBED_V2
#endif //__CONFIGURATION_PRUSA_H #endif //__CONFIGURATION_PRUSA_H

View file

@ -841,7 +841,7 @@ void setup()
SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE); SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE);
//lcd_update_enable(false); // why do we need this?? - andre //lcd_update_enable(false); // why do we need this?? - andre
// loads data from EEPROM if available else uses defaults (and resets step acceleration rate) // loads data from EEPROM if available else uses defaults (and resets step acceleration rate)
Config_RetrieveSettings(); Config_RetrieveSettings(EEPROM_OFFSET);
SdFatUtil::set_stack_guard(); //writes magic number at the end of static variables to protect against overwriting static memory by stack SdFatUtil::set_stack_guard(); //writes magic number at the end of static variables to protect against overwriting static memory by stack
tp_init(); // Initialize temperature loop tp_init(); // Initialize temperature loop
plan_init(); // Initialize planner; plan_init(); // Initialize planner;
@ -1030,7 +1030,8 @@ void setup()
#endif //DEBUG_DISABLE_STARTMSGS #endif //DEBUG_DISABLE_STARTMSGS
for (int i = 0; i<4; i++) EEPROM_read_B(EEPROM_BOWDEN_LENGTH + i * 2, &bowden_length[i]); for (int i = 0; i<4; i++) EEPROM_read_B(EEPROM_BOWDEN_LENGTH + i * 2, &bowden_length[i]);
lcd_update_enable(true); lcd_update_enable(true);
lcd_implementation_clear();
lcd_update(2);
// Store the currently running firmware into an eeprom, // Store the currently running firmware into an eeprom,
// so the next time the firmware gets updated, it will know from which version it has been updated. // so the next time the firmware gets updated, it will know from which version it has been updated.
update_current_firmware_version_to_eeprom(); update_current_firmware_version_to_eeprom();
@ -2798,6 +2799,19 @@ void process_commands()
#endif #endif
case 79: {
for (int i = 255; i > 0; i = i - 5) {
fanSpeed = i;
//delay_keep_alive(2000);
for (int j = 0; j < 100; j++) {
delay_keep_alive(100);
}
fan_speed[1];
MYSERIAL.print(i); SERIAL_ECHOPGM(": "); MYSERIAL.println(fan_speed[1]);
}
}break;
/** /**
* G80: Mesh-based Z probe, probes a grid and produces a * G80: Mesh-based Z probe, probes a grid and produces a
* mesh to compensate for variable bed height * mesh to compensate for variable bed height
@ -4886,12 +4900,12 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp
case 500: // M500 Store settings in EEPROM case 500: // M500 Store settings in EEPROM
{ {
Config_StoreSettings(); Config_StoreSettings(EEPROM_OFFSET);
} }
break; break;
case 501: // M501 Read settings from EEPROM case 501: // M501 Read settings from EEPROM
{ {
Config_RetrieveSettings(); Config_RetrieveSettings(EEPROM_OFFSET);
} }
break; break;
case 502: // M502 Revert to default settings case 502: // M502 Revert to default settings

View file

@ -50,6 +50,42 @@ const float bed_skew_angle_extreme = (0.25f * M_PI / 180.f);
// Positions of the bed reference points in the machine coordinates, referenced to the P.I.N.D.A sensor. // Positions of the bed reference points in the machine coordinates, referenced to the P.I.N.D.A sensor.
// The points are ordered in a zig-zag fashion to speed up the calibration. // The points are ordered in a zig-zag fashion to speed up the calibration.
#ifdef HEATBED_V2
// Positions of the bed reference points in the machine coordinates, referenced to the P.I.N.D.A sensor.
// The points are the following: center front, center right, center rear, center left.
const float bed_ref_points_4[] PROGMEM = {
115.f - BED_ZERO_REF_X, 8.4f - BED_ZERO_REF_Y,
216.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
115.f - BED_ZERO_REF_X, 200.4f - BED_ZERO_REF_Y,
13.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y
};
const float bed_ref_points[] PROGMEM = {
13.f - BED_ZERO_REF_X, 8.4f - BED_ZERO_REF_Y,
115.f - BED_ZERO_REF_X, 8.4f - BED_ZERO_REF_Y,
216.f - BED_ZERO_REF_X, 8.4f - BED_ZERO_REF_Y,
216.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
115.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
13.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
13.f - BED_ZERO_REF_X, 200.4f - BED_ZERO_REF_Y,
115.f - BED_ZERO_REF_X, 200.4f - BED_ZERO_REF_Y,
216.f - BED_ZERO_REF_X, 200.4f - BED_ZERO_REF_Y
};
#else
// Positions of the bed reference points in the machine coordinates, referenced to the P.I.N.D.A sensor.
// The points are the following: center front, center right, center rear, center left.
const float bed_ref_points_4[] PROGMEM = {
115.f - BED_ZERO_REF_X, 8.4f - BED_ZERO_REF_Y,
216.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
115.f - BED_ZERO_REF_X, 202.4f - BED_ZERO_REF_Y,
13.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y
};
const float bed_ref_points[] PROGMEM = { const float bed_ref_points[] PROGMEM = {
13.f - BED_ZERO_REF_X, 8.4f - BED_ZERO_REF_Y, 13.f - BED_ZERO_REF_X, 8.4f - BED_ZERO_REF_Y,
115.f - BED_ZERO_REF_X, 8.4f - BED_ZERO_REF_Y, 115.f - BED_ZERO_REF_X, 8.4f - BED_ZERO_REF_Y,
@ -64,14 +100,7 @@ const float bed_ref_points[] PROGMEM = {
216.f - BED_ZERO_REF_X, 202.4f - BED_ZERO_REF_Y 216.f - BED_ZERO_REF_X, 202.4f - BED_ZERO_REF_Y
}; };
// Positions of the bed reference points in the machine coordinates, referenced to the P.I.N.D.A sensor. #endif //not HEATBED_V2
// The points are the following: center front, center right, center rear, center left.
const float bed_ref_points_4[] PROGMEM = {
115.f - BED_ZERO_REF_X, 8.4f - BED_ZERO_REF_Y,
216.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y,
115.f - BED_ZERO_REF_X, 202.4f - BED_ZERO_REF_Y,
13.f - BED_ZERO_REF_X, 104.4f - BED_ZERO_REF_Y
};
static inline float sqr(float x) { return x * x; } static inline float sqr(float x) { return x * x; }

View file

@ -1388,15 +1388,6 @@ void microstep_readings()
#endif #endif
} }
static void check_fans() {
if (READ(TACH_0) != fan_state[0]) {
fan_edge_counter[0] ++;
fan_state[0] = READ(TACH_0);
}
if (READ(TACH_1) != fan_state[1]) {
fan_edge_counter[1] ++;
fan_state[1] = READ(TACH_1);
}
}

View file

@ -104,9 +104,6 @@ void digipot_current(uint8_t driver, int current);
void microstep_init(); void microstep_init();
void microstep_readings(); void microstep_readings();
static void check_fans();
#ifdef BABYSTEPPING #ifdef BABYSTEPPING
void babystep(const uint8_t axis,const bool direction); // perform a short step with a single stepper motor, outside of any convention void babystep(const uint8_t axis,const bool direction); // perform a short step with a single stepper motor, outside of any convention
#endif #endif

View file

@ -430,25 +430,30 @@ void setExtruderAutoFanState(int pin, bool state)
void countFanSpeed() void countFanSpeed()
{ {
//SERIAL_ECHOPGM("edge counter 1:"); MYSERIAL.println(fan_edge_counter[1]);
fan_speed[0] = (fan_edge_counter[0] * (float(250) / (millis() - extruder_autofan_last_check))); fan_speed[0] = (fan_edge_counter[0] * (float(250) / (millis() - extruder_autofan_last_check)));
fan_speed[1] = (fan_edge_counter[1] * (float(250) / (millis() - extruder_autofan_last_check))); fan_speed[1] = (fan_edge_counter[1] * (float(250) / (millis() - extruder_autofan_last_check)));
/*SERIAL_ECHOPGM("time interval: "); MYSERIAL.println(millis() - extruder_autofan_last_check);
SERIAL_ECHOPGM("extruder fan speed:"); MYSERIAL.print(fan_speed[0]); SERIAL_ECHOPGM("; edge counter:"); MYSERIAL.println(fan_edge_counter[0]);
SERIAL_ECHOPGM("print fan speed:"); MYSERIAL.print(fan_speed[1]); SERIAL_ECHOPGM("; edge counter:"); MYSERIAL.println(fan_edge_counter[1]);
SERIAL_ECHOLNPGM(" ");*/
fan_edge_counter[0] = 0; fan_edge_counter[0] = 0;
fan_edge_counter[1] = 0; fan_edge_counter[1] = 0;
} }
void checkFanSpeed() void checkFanSpeed()
{ {
bool fans_check_enabled = (eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED) > 0);
static unsigned char fan_speed_errors[2] = { 0,0 }; static unsigned char fan_speed_errors[2] = { 0,0 };
if (fan_speed[0] == 0 && current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE) fan_speed_errors[0]++; if (fan_speed[0] == 0 && (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE)) fan_speed_errors[0]++;
else fan_speed_errors[0] = 0; else fan_speed_errors[0] = 0;
if (fan_speed[1] == 0 && fanSpeed > MIN_PRINT_FAN_SPEED) fan_speed_errors[1]++; if ((fan_speed[1] == 0)&& (fanSpeed > MIN_PRINT_FAN_SPEED)) fan_speed_errors[1]++;
else fan_speed_errors[1] = 0; else fan_speed_errors[1] = 0;
if (fan_speed_errors[0] > 5) fanSpeedError(0); if ((fan_speed_errors[0] > 5) && fans_check_enabled) fanSpeedError(0); //extruder fan
if (fan_speed_errors[1] > 15) fanSpeedError(1); if ((fan_speed_errors[1] > 15) && fans_check_enabled) fanSpeedError(1); //print fan
} }
void fanSpeedError(unsigned char _fan) { void fanSpeedError(unsigned char _fan) {
@ -2148,6 +2153,19 @@ ISR(TIMER0_COMPB_vect)
} }
} }
#endif //BABYSTEPPING #endif //BABYSTEPPING
check_fans();
}
void check_fans() {
if (READ(TACH_0) != fan_state[0]) {
fan_edge_counter[0] ++;
fan_state[0] = !fan_state[0];
}
if (READ(TACH_1) != fan_state[1]) {
fan_edge_counter[1] ++;
fan_state[1] = !fan_state[1];
}
} }
#ifdef PIDTEMP #ifdef PIDTEMP

View file

@ -222,5 +222,7 @@ void countFanSpeed();
void checkFanSpeed(); void checkFanSpeed();
void fanSpeedError(unsigned char _fan); void fanSpeedError(unsigned char _fan);
void check_fans();
#endif #endif

View file

@ -29,6 +29,7 @@
int8_t encoderDiff; /* encoderDiff is updated from interrupt context and added to encoderPosition every LCD update */ int8_t encoderDiff; /* encoderDiff is updated from interrupt context and added to encoderPosition every LCD update */
extern int lcd_change_fil_state; extern int lcd_change_fil_state;
extern bool fans_check_enabled = true;
//Function pointer to menu functions. //Function pointer to menu functions.
typedef void (*menuFunc_t)(); typedef void (*menuFunc_t)();
@ -1058,10 +1059,22 @@ static void lcd_support_menu()
} }
MENU_ITEM(submenu, MSG_INFO_EXTRUDER, lcd_menu_extruder_info); MENU_ITEM(submenu, MSG_INFO_EXTRUDER, lcd_menu_extruder_info);
MENU_ITEM(submenu, PSTR("Temperatures"), lcd_menu_temperatures); MENU_ITEM(submenu, PSTR("Temperatures"), lcd_menu_temperatures);
if (fans_check_enabled == true) {
MENU_ITEM(function, PSTR("Check fans [EN]"), lcd_set_fan_check);
}
else {
MENU_ITEM(function, PSTR("Check fans [DIS]"), lcd_set_fan_check);
}
#endif //MK1BP #endif //MK1BP
END_MENU(); END_MENU();
} }
void lcd_set_fan_check() {
fans_check_enabled = !fans_check_enabled;
eeprom_update_byte((unsigned char *)EEPROM_FAN_CHECK_ENABLED, fans_check_enabled);
lcd_goto_menu(lcd_support_menu, 15);
}
void lcd_unLoadFilament() void lcd_unLoadFilament()
{ {

View file

@ -223,6 +223,7 @@ static void extr_unload_1();
static void extr_unload_2(); static void extr_unload_2();
static void extr_unload_3(); static void extr_unload_3();
static void lcd_disable_farm_mode(); static void lcd_disable_farm_mode();
static void lcd_set_fan_check();
void extr_unload_all(); void extr_unload_all();
void extr_unload_used(); void extr_unload_used();
void extr_unload(); void extr_unload();