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
This commit is contained in:
midopple 2012-02-17 22:33:02 +01:00
parent ee764635a3
commit 4b1b0f1d96
4 changed files with 327 additions and 3 deletions

View file

@ -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

View file

@ -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

213
Sprinter/store_eeprom.cpp Normal file
View file

@ -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 <http://www.gnu.org/licenses/>.
*/
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
#include "sprinter.h"
#include "store_eeprom.h"
#include "Configuration.h"
#ifdef USE_EEPROM_SETTINGS
//======================================================================================
//========================= Read / Write EEPROM =======================================
template <class T> 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 <class T> 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

49
Sprinter/store_eeprom.h Normal file
View file

@ -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 <http://www.gnu.org/licenses/>.
*/
#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