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/store_eeprom.cpp | 213 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 Sprinter/store_eeprom.cpp (limited to 'Sprinter/store_eeprom.cpp') 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 -- cgit v1.2.1