From 4b1b0f1d96d2be2ed3941095f40a5c2d2bbb943d Mon Sep 17 00:00:00 2001 From: midopple Date: Fri, 17 Feb 2012 22:33:02 +0100 Subject: The microcontroller can store settings to EEPROM to use the fuction set in configuration.h #define USE_EEPROM_SETTINGS --> Save and recall Settings aktive #define PRINT_EEPROM_SETTING --> Print settings to UART Commands: M500 - stores paramters in EEPROM M501 - reads parameters from EEPROM M502 - reverts to the default M503 - Print Settings --- Sprinter/Configuration.h | 18 ++++ Sprinter/Sprinter.pde | 50 ++++++++++- Sprinter/store_eeprom.cpp | 213 ++++++++++++++++++++++++++++++++++++++++++++++ Sprinter/store_eeprom.h | 49 +++++++++++ 4 files changed, 327 insertions(+), 3 deletions(-) create mode 100644 Sprinter/store_eeprom.cpp create mode 100644 Sprinter/store_eeprom.h (limited to 'Sprinter') diff --git a/Sprinter/Configuration.h b/Sprinter/Configuration.h index 2ee4b39..e17f6f4 100644 --- a/Sprinter/Configuration.h +++ b/Sprinter/Configuration.h @@ -59,6 +59,24 @@ const bool Z_ENDSTOP_INVERT = false; //Only work with Atmega1284 you need +1 kb ram //#define SD_FAST_XFER_AKTIV +//----------------------------------------------------------------------- +//// STORE SETTINGS TO EEPROM +//----------------------------------------------------------------------- +// the microcontroller can store settings in the EEPROM +// M500 - stores paramters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// M503 - Print settings +// define this to enable eeprom support +//#define USE_EEPROM_SETTINGS + +// to disable EEPROM Serial responses and decrease program space by ~1000 byte: comment this out: +// please keep turned on if you can. +//#define PRINT_EEPROM_SETTING + +//----------------------------------------------------------------------- +//// ARC Function (G2/G3 Command) +//----------------------------------------------------------------------- //Uncomment to aktivate the arc (circle) function (G2/G3 Command) //Without SD function an ARC function the used Flash is smaller 31 kb #define USE_ARC_FUNCTION diff --git a/Sprinter/Sprinter.pde b/Sprinter/Sprinter.pde index 1dac69b..dfe12d1 100644 --- a/Sprinter/Sprinter.pde +++ b/Sprinter/Sprinter.pde @@ -59,6 +59,13 @@ - Corrected distance calculation. (thanks jv4779) - MAX Feed Rate for Z-Axis reduced to 2 mm/s some Printers had problems with 4 mm/s + Version 1.3.06T + - the microcontroller can store settings in the EEPROM + - M500 - stores paramters in EEPROM + - M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). + - M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. + - M503 - Print settings + */ @@ -70,15 +77,19 @@ #include "pins.h" #include "Sprinter.h" #include "speed_lookuptable.h" +#include "heater.h" + #ifdef USE_ARC_FUNCTION #include "arc_func.h" #endif -#include "heater.h" #ifdef SDSUPPORT -#include "SdFat.h" + #include "SdFat.h" #endif +#ifdef USE_EEPROM_SETTINGS + #include "store_eeprom.h" +#endif #ifndef CRITICAL_SECTION_START #define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli() @@ -143,13 +154,18 @@ void __cxa_pure_virtual(){}; // M220 - set speed factor override percentage S:factor in percent +// M500 - stores paramters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +// M503 - Print settings + // Debug feature / Testing the PID for Hotend // M601 - Show Temp jitter from Extruder (min / max value from Hotend Temperatur while printing) // M602 - Reset Temp jitter from Extruder (min / max val) --> Dont use it while Printing // M603 - Show Free Ram -#define _VERSION_TEXT "1.3.05T / 15.02.2012" +#define _VERSION_TEXT "1.3.06T / 17.02.2012" //Stepper Movement Variables char axis_codes[NUM_AXIS] = {'X', 'Y', 'Z', 'E'}; @@ -709,6 +725,12 @@ void setup() showString(PSTR("Stepper Timer init\r\n")); st_init(); // Initialize stepper + #ifdef USE_EEPROM_SETTINGS + //first Value --> Init with default + //second value --> Print settings to UART + EEPROM_RetrieveSettings(false,false); + #endif + //Free Ram showString(PSTR("Free Ram: ")); Serial.println(FreeRam1()); @@ -1579,6 +1601,28 @@ FORCE_INLINE void process_commands() } } break; +#ifdef USE_EEPROM_SETTINGS + case 500: // Store settings in EEPROM + { + EEPROM_StoreSettings(); + } + break; + case 501: // Read settings from EEPROM + { + EEPROM_RetrieveSettings(false,true); + } + break; + case 502: // Revert to default settings + { + EEPROM_RetrieveSettings(true,true); + } + break; + case 503: // print settings currently in memory + { + EEPROM_printSettings(); + } + break; +#endif #ifdef DEBUG_HEATER_TEMP case 601: // M601 show Extruder Temp jitter #if (TEMP_0_PIN > -1) || defined (HEATER_USES_MAX6675)|| defined HEATER_USES_AD595 diff --git a/Sprinter/store_eeprom.cpp b/Sprinter/store_eeprom.cpp new file mode 100644 index 0000000..9c5ae1f --- /dev/null +++ b/Sprinter/store_eeprom.cpp @@ -0,0 +1,213 @@ +/* + EEPROM routines to save Sprinter Settings + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include + +#include "sprinter.h" +#include "store_eeprom.h" +#include "Configuration.h" + + + +#ifdef USE_EEPROM_SETTINGS + +//====================================================================================== +//========================= Read / Write EEPROM ======================================= +template int EEPROM_writeAnything(int &ee, const T& value) +{ + const byte* p = (const byte*)(const void*)&value; + int i; + for (i = 0; i < (int)sizeof(value); i++) + eeprom_write_byte((unsigned char *)ee++, *p++); + return i; +} + +template int EEPROM_readAnything(int &ee, T& value) +{ + byte* p = (byte*)(void*)&value; + int i; + for (i = 0; i < (int)sizeof(value); i++) + *p++ = eeprom_read_byte((unsigned char *)ee++); + return i; +} +//====================================================================================== + + +void EEPROM_StoreSettings() +{ + + unsigned long ul_help = 20000; + unsigned int ui_help = 0; + char ver[4]= "000"; + int i=EEPROM_OFFSET; + EEPROM_writeAnything(i,ver); // invalidate data first + EEPROM_writeAnything(i,axis_steps_per_unit); + EEPROM_writeAnything(i,max_feedrate); + EEPROM_writeAnything(i,max_acceleration_units_per_sq_second); + EEPROM_writeAnything(i,move_acceleration); + EEPROM_writeAnything(i,retract_acceleration); + EEPROM_writeAnything(i,minimumfeedrate); + EEPROM_writeAnything(i,mintravelfeedrate); + EEPROM_writeAnything(i,ul_help); //Min Segment Time, not used yet + EEPROM_writeAnything(i,max_xy_jerk); + EEPROM_writeAnything(i,max_z_jerk); + + //PID Settings, not used yet --> placeholder + ui_help = 2560; + EEPROM_writeAnything(i,ui_help); //Kp + ui_help = 64; + EEPROM_writeAnything(i,ui_help); //Ki + ui_help = 4096; + EEPROM_writeAnything(i,ui_help); //Kd + + char ver2[4]=EEPROM_VERSION; + i=EEPROM_OFFSET; + EEPROM_writeAnything(i,ver2); // validate data + showString(PSTR("Settings Stored\r\n")); + +} + + +void EEPROM_printSettings() +{ + // if def=true, the default values will be used + #ifdef PRINT_EEPROM_SETTING + showString(PSTR("Steps per unit:\r\n")); + showString(PSTR(" M92 X")); + Serial.print(axis_steps_per_unit[0]); + showString(PSTR(" Y")); + Serial.print(axis_steps_per_unit[1]); + showString(PSTR(" Z")); + Serial.print(axis_steps_per_unit[2]); + showString(PSTR(" E")); + Serial.println(axis_steps_per_unit[3]); + + showString(PSTR("Maximum feedrates (mm/s):\r\n")); + showString(PSTR(" M203 X")); + Serial.print(max_feedrate[0]); + showString(PSTR(" Y")); + Serial.print(max_feedrate[1]); + showString(PSTR(" Z")); + Serial.print(max_feedrate[2]); + showString(PSTR(" E")); + Serial.println(max_feedrate[3]); + + showString(PSTR("Maximum Acceleration (mm/s2):\r\n")); + showString(PSTR(" M201 X")); + Serial.print(max_acceleration_units_per_sq_second[0] ); + showString(PSTR(" Y")); + Serial.print(max_acceleration_units_per_sq_second[1] ); + showString(PSTR(" Z")); + Serial.print(max_acceleration_units_per_sq_second[2] ); + showString(PSTR(" E")); + Serial.println(max_acceleration_units_per_sq_second[3]); + + showString(PSTR("Acceleration: S=acceleration, T=retract acceleration\r\n")); + showString(PSTR(" M204 S")); + Serial.print(move_acceleration ); + showString(PSTR(" T")); + Serial.println(retract_acceleration); + + showString(PSTR("Advanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), X=maximum xY jerk (mm/s), Z=maximum Z jerk (mm/s)\r\n")); + + showString(PSTR(" M205 S")); + Serial.print(minimumfeedrate ); + showString(PSTR(" T" )); + Serial.print(mintravelfeedrate ); +// showString(PSTR(" B")); +// Serial.print(minsegmenttime ); + showString(PSTR(" X")); + Serial.print(max_xy_jerk ); + showString(PSTR(" Z")); + Serial.println(max_z_jerk); + + #ifdef PIDTEMP + /* + showString(PSTR("PID settings:"); + showString(PSTR(" M301 P")); + Serial.print(Kp); + showString(PSTR(" I")); + Serial.print(Ki); + SshowString(PSTR(" D")); + Serial.print(Kd); + */ + #endif + #endif + +} + + +void EEPROM_RetrieveSettings(bool def, bool printout) +{ // if def=true, the default values will be used + + int i=EEPROM_OFFSET; + char stored_ver[4]; + char ver[4]=EEPROM_VERSION; + unsigned long ul_help = 0; + + EEPROM_readAnything(i,stored_ver); //read stored version + if ((!def)&&(strncmp(ver,stored_ver,3)==0)) + { // version number match + EEPROM_readAnything(i,axis_steps_per_unit); + EEPROM_readAnything(i,max_feedrate); + EEPROM_readAnything(i,max_acceleration_units_per_sq_second); + EEPROM_readAnything(i,move_acceleration); + EEPROM_readAnything(i,retract_acceleration); + EEPROM_readAnything(i,minimumfeedrate); + EEPROM_readAnything(i,mintravelfeedrate); + EEPROM_readAnything(i,ul_help); //min Segmenttime --> not used yet + EEPROM_readAnything(i,max_xy_jerk); + EEPROM_readAnything(i,max_z_jerk); + + unsigned int Kp,Ki,Kd; + EEPROM_readAnything(i,Kp); + EEPROM_readAnything(i,Ki); + EEPROM_readAnything(i,Kd); + + showString(PSTR("Stored settings retreived\r\n")); + } + else + { + + float tmp1[]=_AXIS_STEP_PER_UNIT; + float tmp2[]=_MAX_FEEDRATE; + long tmp3[]=_MAX_ACCELERATION_UNITS_PER_SQ_SECOND; + for (short i=0;i<4;i++) + { + axis_steps_per_unit[i]=tmp1[i]; + max_feedrate[i]=tmp2[i]; + max_acceleration_units_per_sq_second[i]=tmp3[i]; + } + move_acceleration=_ACCELERATION; + retract_acceleration=_RETRACT_ACCELERATION; + minimumfeedrate=DEFAULT_MINIMUMFEEDRATE; + mintravelfeedrate=DEFAULT_MINTRAVELFEEDRATE; + max_xy_jerk=_MAX_XY_JERK; + max_z_jerk=_MAX_Z_JERK; + + showString(PSTR("Using Default settings\r\n")); + } + + if(printout) + { + EEPROM_printSettings(); + } +} + +#endif diff --git a/Sprinter/store_eeprom.h b/Sprinter/store_eeprom.h new file mode 100644 index 0000000..cff25d3 --- /dev/null +++ b/Sprinter/store_eeprom.h @@ -0,0 +1,49 @@ +/* + EEPROM routines to save Sprinter Settings + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + + +#ifndef __EEPROMH +#define __EEPROMH + +#define EEPROM_OFFSET 100 + + +// 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 +// the default values are used whenever there is a change to the data, to prevent +// wrong data being written to the variables. +// ALSO: always make sure the variables in the Store and retrieve sections are in the same order. +#define EEPROM_VERSION "S01" + + +extern float axis_steps_per_unit[4]; +extern float max_feedrate[4]; +extern long max_acceleration_units_per_sq_second[4]; +extern float move_acceleration; +extern float retract_acceleration; +extern float mintravelfeedrate; +extern float minimumfeedrate; +extern float max_xy_jerk; +extern float max_z_jerk; + + +extern void EEPROM_RetrieveSettings(bool def, bool printout ); +extern void EEPROM_printSettings(); +extern void EEPROM_StoreSettings(); + + +#endif -- cgit v1.2.1