merge from the branch bkubicek/Marlin/zalmmerge
This commit is contained in:
@ -1,220 +1,243 @@
|
||||
#ifndef CONFIGURATION_H
|
||||
#define CONFIGURATION_H
|
||||
|
||||
//#define DEBUG_STEPS
|
||||
|
||||
// BASIC SETTINGS: select your board type, thermistor type, axis scaling, and endstop configuration
|
||||
|
||||
//// The following define selects which electronics board you have. Please choose the one that matches your setup
|
||||
// MEGA/RAMPS up to 1.2 = 3,
|
||||
// RAMPS 1.3 = 33
|
||||
// Gen6 = 5,
|
||||
// Sanguinololu 1.2 and above = 62
|
||||
// Ultimaker = 7,
|
||||
#define MOTHERBOARD 7
|
||||
//#define MOTHERBOARD 5
|
||||
|
||||
|
||||
//// Thermistor settings:
|
||||
// 1 is 100k thermistor
|
||||
// 2 is 200k thermistor
|
||||
// 3 is mendel-parts thermistor
|
||||
// 4 is 10k thermistor
|
||||
// 5 is ParCan supplied 104GT-2 100K
|
||||
// 6 is EPCOS 100k
|
||||
// 7 is 100k Honeywell thermistor 135-104LAG-J01
|
||||
#define THERMISTORHEATER_1 3
|
||||
#define THERMISTORHEATER_2 3
|
||||
#define THERMISTORBED 3
|
||||
|
||||
//#define HEATER_1_USES_THERMISTOR
|
||||
//#define HEATER_2_USES_THERMISTOR
|
||||
#define HEATER_1_USES_AD595
|
||||
//#define HEATER_2_USES_AD595
|
||||
|
||||
// Select one of these only to define how the bed temp is read.
|
||||
//#define BED_USES_THERMISTOR
|
||||
//#define BED_USES_AD595
|
||||
|
||||
#define HEATER_CHECK_INTERVAL 50
|
||||
#define BED_CHECK_INTERVAL 5000
|
||||
|
||||
|
||||
//// Endstop Settings
|
||||
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
|
||||
// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
|
||||
const bool ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
|
||||
// For optos H21LOB set to true, for Mendel-Parts newer optos TCST2103 set to false
|
||||
|
||||
// This determines the communication speed of the printer
|
||||
//#define BAUDRATE 250000
|
||||
#define BAUDRATE 115200
|
||||
//#define BAUDRATE 230400
|
||||
|
||||
// Comment out (using // at the start of the line) to disable SD support:
|
||||
|
||||
// #define ULTRA_LCD //any lcd
|
||||
#define LCD_WIDTH 16
|
||||
#define LCD_HEIGHT 2
|
||||
|
||||
//#define ULTIPANEL
|
||||
#ifdef ULTIPANEL
|
||||
//#define NEWPANEL //enable this if you have a click-encoder panel
|
||||
#define SDSUPPORT
|
||||
#define ULTRA_LCD
|
||||
#define LCD_WIDTH 20
|
||||
#define LCD_HEIGHT 4
|
||||
#endif
|
||||
|
||||
|
||||
//#define SDSUPPORT // Enable SD Card Support in Hardware Console
|
||||
|
||||
|
||||
|
||||
const int dropsegments=5; //everything with this number of steps will be ignored as move
|
||||
|
||||
//// ADVANCED SETTINGS - to tweak parameters
|
||||
|
||||
#include "thermistortables.h"
|
||||
|
||||
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
|
||||
#define X_ENABLE_ON 0
|
||||
#define Y_ENABLE_ON 0
|
||||
#define Z_ENABLE_ON 0
|
||||
#define E_ENABLE_ON 0
|
||||
|
||||
// Disables axis when it's not being used.
|
||||
#define DISABLE_X false
|
||||
#define DISABLE_Y false
|
||||
#define DISABLE_Z false
|
||||
#define DISABLE_E false
|
||||
|
||||
// Inverting axis direction
|
||||
#define INVERT_X_DIR true // for Mendel set to false, for Orca set to true
|
||||
#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false
|
||||
#define INVERT_Z_DIR true // for Mendel set to false, for Orca set to true
|
||||
#define INVERT_E_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
|
||||
|
||||
//// ENDSTOP SETTINGS:
|
||||
// Sets direction of endstops when homing; 1=MAX, -1=MIN
|
||||
#define X_HOME_DIR -1
|
||||
#define Y_HOME_DIR -1
|
||||
#define Z_HOME_DIR -1
|
||||
|
||||
#define min_software_endstops false //If true, axis won't move to coordinates less than zero.
|
||||
#define max_software_endstops false //If true, axis won't move to coordinates greater than the defined lengths below.
|
||||
#define X_MAX_LENGTH 210
|
||||
#define Y_MAX_LENGTH 210
|
||||
#define Z_MAX_LENGTH 210
|
||||
|
||||
//// MOVEMENT SETTINGS
|
||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
|
||||
//note: on bernhards ultimaker 200 200 12 are working well.
|
||||
#define HOMING_FEEDRATE {50*60, 50*60, 12*60, 0} // set the homing speeds
|
||||
//the followint checks if an extrusion is existent in the move. if _not_, the speed of the move is set to the maximum speed.
|
||||
//!!!!!!Use only if you know that your printer works at the maximum declared speeds.
|
||||
// works around the skeinforge cool-bug. There all moves are slowed to have a minimum layer time. However slow travel moves= ooze
|
||||
#define TRAVELING_AT_MAXSPEED
|
||||
#define AXIS_RELATIVE_MODES {false, false, false, false}
|
||||
|
||||
#define MAX_STEP_FREQUENCY 40000 // Max step frequency for Ultimaker (5000 pps / half step)
|
||||
|
||||
// default settings
|
||||
|
||||
#define DEFAULT_AXIS_STEPS_PER_UNIT {79.87220447,79.87220447,200*8/3,14} // default steps per unit for ultimaker
|
||||
#define DEFAULT_MAX_FEEDRATE {160*60, 160*60, 10*60, 500000}
|
||||
#define DEFAULT_MAX_ACCELERATION {9000,9000,150,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_ACCELERATION 3000 // X, Y, Z and E max acceleration in mm/s^2 for printing moves
|
||||
#define DEFAULT_RETRACT_ACCELERATION 7000 // X, Y, Z and E max acceleration in mm/s^2 for r retracts
|
||||
|
||||
#define DEFAULT_MINIMUMFEEDRATE 10 // minimum feedrate
|
||||
#define DEFAULT_MINTRAVELFEEDRATE 10
|
||||
|
||||
// minimum time in microseconds that a movement needs to take if the buffer is emptied. Increase this number if you see blobs while printing high speed & high detail. It will slowdown on the detailed stuff.
|
||||
#define DEFAULT_MINSEGMENTTIME 20000
|
||||
#define DEFAULT_XYJERK 30.0*60
|
||||
#define DEFAULT_ZJERK 10.0*60
|
||||
|
||||
|
||||
// The watchdog waits for the watchperiod in milliseconds whenever an M104 or M109 increases the target temperature
|
||||
//this enables the watchdog interrupt.
|
||||
#define USE_WATCHDOG
|
||||
//you cannot reboot on a mega2560 due to a bug in he bootloader. Hence, you have to reset manually, and this is done hereby:
|
||||
#define RESET_MANUAL
|
||||
|
||||
#define WATCHDOG_TIMEOUT 4
|
||||
|
||||
|
||||
|
||||
//// Experimental watchdog and minimal temp
|
||||
// The watchdog waits for the watchperiod in milliseconds whenever an M104 or M109 increases the target temperature
|
||||
// If the temperature has not increased at the end of that period, the target temperature is set to zero. It can be reset with another M104/M109
|
||||
//#define WATCHPERIOD 5000 //5 seconds
|
||||
|
||||
// Actual temperature must be close to target for this long before M109 returns success
|
||||
//#define TEMP_RESIDENCY_TIME 20 // (seconds)
|
||||
//#define TEMP_HYSTERESIS 5 // (C°) range of +/- temperatures considered "close" to the target one
|
||||
|
||||
//// The minimal temperature defines the temperature below which the heater will not be enabled
|
||||
#define MINTEMP 5
|
||||
#define BED_MINTEMP 5
|
||||
|
||||
|
||||
// When temperature exceeds max temp, your heater will be switched off.
|
||||
// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure!
|
||||
// You should use MINTEMP for thermistor short/failure protection.
|
||||
#define MAXTEMP 275
|
||||
#define BED_MAXTEMP 150
|
||||
|
||||
/// PID settings:
|
||||
// Uncomment the following line to enable PID support.
|
||||
//#define SMOOTHING
|
||||
//#define SMOOTHFACTOR 5.0
|
||||
//float current_raw_average=0;
|
||||
|
||||
#define PIDTEMP
|
||||
#ifdef PIDTEMP
|
||||
//#define PID_DEBUG // Sends debug data to the serial port.
|
||||
//#define PID_OPENLOOP 1 // Puts PID in open loop. M104 sets the output power in %
|
||||
#define PID_MAX 255 // limits current to nozzle
|
||||
#define PID_INTEGRAL_DRIVE_MAX 255
|
||||
#define PID_dT 0.10 // 100ms sample time
|
||||
#define DEFAULT_Kp 20.0
|
||||
#define DEFAULT_Ki 1.5*PID_dT
|
||||
#define DEFAULT_Kd 80/PID_dT
|
||||
#define DEFAULT_Kc 0
|
||||
#endif // PIDTEMP
|
||||
|
||||
|
||||
// extruder advance constant (s2/mm3)
|
||||
//
|
||||
// advance (steps) = STEPS_PER_CUBIC_MM_E * EXTUDER_ADVANCE_K * cubic mm per second ^ 2
|
||||
//
|
||||
// hooke's law says: force = k * distance
|
||||
// bernoulli's priniciple says: v ^ 2 / 2 + g . h + pressure / density = constant
|
||||
// so: v ^ 2 is proportional to number of steps we advance the extruder
|
||||
//#define ADVANCE
|
||||
|
||||
#ifdef ADVANCE
|
||||
#define EXTRUDER_ADVANCE_K .3
|
||||
|
||||
#define D_FILAMENT 1.7
|
||||
#define STEPS_MM_E 65
|
||||
#define EXTRUTION_AREA (0.25 * D_FILAMENT * D_FILAMENT * 3.14159)
|
||||
#define STEPS_PER_CUBIC_MM_E (axis_steps_per_unit[E_AXIS]/ EXTRUTION_AREA)
|
||||
|
||||
#endif // ADVANCE
|
||||
|
||||
#if defined SDSUPPORT
|
||||
// The number of linear motions that can be in the plan at any give time.
|
||||
#define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller
|
||||
#else
|
||||
#define BLOCK_BUFFER_SIZE 16 // maximize block buffer
|
||||
#endif
|
||||
|
||||
#ifdef SIMPLE_LCD
|
||||
#define BLOCK_BUFFER_SIZE 16 // A little less buffer for just a simple LCD
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#ifndef CONFIGURATION_H
|
||||
#define CONFIGURATION_H
|
||||
|
||||
//#define DEBUG_STEPS
|
||||
|
||||
// BASIC SETTINGS: select your board type, thermistor type, axis scaling, and endstop configuration
|
||||
|
||||
//// The following define selects which electronics board you have. Please choose the one that matches your setup
|
||||
// MEGA/RAMPS up to 1.2 = 3,
|
||||
// RAMPS 1.3 = 33
|
||||
// Gen6 = 5,
|
||||
// Sanguinololu 1.2 and above = 62
|
||||
// Ultimaker = 7,
|
||||
#define MOTHERBOARD 7
|
||||
//#define MOTHERBOARD 5
|
||||
|
||||
|
||||
//// Thermistor settings:
|
||||
// 1 is 100k thermistor
|
||||
// 2 is 200k thermistor
|
||||
// 3 is mendel-parts thermistor
|
||||
// 4 is 10k thermistor
|
||||
// 5 is ParCan supplied 104GT-2 100K
|
||||
// 6 is EPCOS 100k
|
||||
// 7 is 100k Honeywell thermistor 135-104LAG-J01
|
||||
#define THERMISTORHEATER_1 3
|
||||
#define THERMISTORHEATER_2 3
|
||||
#define THERMISTORBED 3
|
||||
|
||||
//#define HEATER_1_USES_THERMISTOR
|
||||
//#define HEATER_2_USES_THERMISTOR
|
||||
#define HEATER_1_USES_AD595
|
||||
//#define HEATER_2_USES_AD595
|
||||
|
||||
// Select one of these only to define how the bed temp is read.
|
||||
//#define BED_USES_THERMISTOR
|
||||
//#define BED_USES_AD595
|
||||
|
||||
#define HEATER_CHECK_INTERVAL 50
|
||||
#define BED_CHECK_INTERVAL 5000
|
||||
|
||||
|
||||
//// Endstop Settings
|
||||
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
|
||||
// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
|
||||
const bool ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
|
||||
// For optos H21LOB set to true, for Mendel-Parts newer optos TCST2103 set to false
|
||||
|
||||
// This determines the communication speed of the printer
|
||||
//#define BAUDRATE 250000
|
||||
#define BAUDRATE 115200
|
||||
//#define BAUDRATE 230400
|
||||
|
||||
// Comment out (using // at the start of the line) to disable SD support:
|
||||
|
||||
// #define ULTRA_LCD //any lcd
|
||||
|
||||
|
||||
#define ULTIPANEL
|
||||
#ifdef ULTIPANEL
|
||||
//#define NEWPANEL //enable this if you have a click-encoder panel
|
||||
#define SDSUPPORT
|
||||
#define ULTRA_LCD
|
||||
#define LCD_WIDTH 20
|
||||
#define LCD_HEIGHT 4
|
||||
#else //no panel but just lcd
|
||||
#ifdef ULTRA_LCD
|
||||
#define LCD_WIDTH 16
|
||||
#define LCD_HEIGHT 2
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
//#define SDSUPPORT // Enable SD Card Support in Hardware Console
|
||||
|
||||
|
||||
|
||||
const int dropsegments=5; //everything with this number of steps will be ignored as move
|
||||
|
||||
//// ADVANCED SETTINGS - to tweak parameters
|
||||
|
||||
#include "thermistortables.h"
|
||||
|
||||
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
|
||||
#define X_ENABLE_ON 0
|
||||
#define Y_ENABLE_ON 0
|
||||
#define Z_ENABLE_ON 0
|
||||
#define E_ENABLE_ON 0
|
||||
|
||||
// Disables axis when it's not being used.
|
||||
#define DISABLE_X false
|
||||
#define DISABLE_Y false
|
||||
#define DISABLE_Z false
|
||||
#define DISABLE_E false
|
||||
|
||||
// Inverting axis direction
|
||||
#define INVERT_X_DIR true // for Mendel set to false, for Orca set to true
|
||||
#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false
|
||||
#define INVERT_Z_DIR true // for Mendel set to false, for Orca set to true
|
||||
#define INVERT_E_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
|
||||
|
||||
//// ENDSTOP SETTINGS:
|
||||
// Sets direction of endstops when homing; 1=MAX, -1=MIN
|
||||
#define X_HOME_DIR -1
|
||||
#define Y_HOME_DIR -1
|
||||
#define Z_HOME_DIR -1
|
||||
|
||||
#define min_software_endstops false //If true, axis won't move to coordinates less than zero.
|
||||
#define max_software_endstops false //If true, axis won't move to coordinates greater than the defined lengths below.
|
||||
#define X_MAX_LENGTH 210
|
||||
#define Y_MAX_LENGTH 210
|
||||
#define Z_MAX_LENGTH 210
|
||||
|
||||
//// MOVEMENT SETTINGS
|
||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
|
||||
//note: on bernhards ultimaker 200 200 12 are working well.
|
||||
#define HOMING_FEEDRATE {50*60, 50*60, 12*60, 0} // set the homing speeds
|
||||
//the followint checks if an extrusion is existent in the move. if _not_, the speed of the move is set to the maximum speed.
|
||||
//!!!!!!Use only if you know that your printer works at the maximum declared speeds.
|
||||
// works around the skeinforge cool-bug. There all moves are slowed to have a minimum layer time. However slow travel moves= ooze
|
||||
#define TRAVELING_AT_MAXSPEED
|
||||
#define AXIS_RELATIVE_MODES {false, false, false, false}
|
||||
|
||||
#define MAX_STEP_FREQUENCY 40000 // Max step frequency for Ultimaker (5000 pps / half step)
|
||||
|
||||
// default settings
|
||||
|
||||
#define DEFAULT_AXIS_STEPS_PER_UNIT {79.87220447,79.87220447,200*8/3,14} // default steps per unit for ultimaker
|
||||
#define DEFAULT_MAX_FEEDRATE {160*60, 160*60, 10*60, 500000}
|
||||
#define DEFAULT_MAX_ACCELERATION {9000,9000,150,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_ACCELERATION 3000 // X, Y, Z and E max acceleration in mm/s^2 for printing moves
|
||||
#define DEFAULT_RETRACT_ACCELERATION 7000 // X, Y, Z and E max acceleration in mm/s^2 for r retracts
|
||||
|
||||
#define DEFAULT_MINIMUMFEEDRATE 10 // minimum feedrate
|
||||
#define DEFAULT_MINTRAVELFEEDRATE 10
|
||||
|
||||
// minimum time in microseconds that a movement needs to take if the buffer is emptied. Increase this number if you see blobs while printing high speed & high detail. It will slowdown on the detailed stuff.
|
||||
#define DEFAULT_MINSEGMENTTIME 20000
|
||||
#define DEFAULT_XYJERK 30.0*60
|
||||
#define DEFAULT_ZJERK 10.0*60
|
||||
|
||||
|
||||
// The watchdog waits for the watchperiod in milliseconds whenever an M104 or M109 increases the target temperature
|
||||
//this enables the watchdog interrupt.
|
||||
#define USE_WATCHDOG
|
||||
//you cannot reboot on a mega2560 due to a bug in he bootloader. Hence, you have to reset manually, and this is done hereby:
|
||||
#define RESET_MANUAL
|
||||
|
||||
#define WATCHDOG_TIMEOUT 4
|
||||
|
||||
|
||||
|
||||
//// Experimental watchdog and minimal temp
|
||||
// The watchdog waits for the watchperiod in milliseconds whenever an M104 or M109 increases the target temperature
|
||||
// If the temperature has not increased at the end of that period, the target temperature is set to zero. It can be reset with another M104/M109
|
||||
//#define WATCHPERIOD 5000 //5 seconds
|
||||
|
||||
// Actual temperature must be close to target for this long before M109 returns success
|
||||
//#define TEMP_RESIDENCY_TIME 20 // (seconds)
|
||||
//#define TEMP_HYSTERESIS 5 // (C°) range of +/- temperatures considered "close" to the target one
|
||||
|
||||
//// The minimal temperature defines the temperature below which the heater will not be enabled
|
||||
#define MINTEMP 5
|
||||
#define BED_MINTEMP 5
|
||||
|
||||
|
||||
// When temperature exceeds max temp, your heater will be switched off.
|
||||
// This feature exists to protect your hotend from overheating accidentally, but *NOT* from thermistor short/failure!
|
||||
// You should use MINTEMP for thermistor short/failure protection.
|
||||
#define MAXTEMP 275
|
||||
#define BED_MAXTEMP 150
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define PIDTEMP
|
||||
#ifdef PIDTEMP
|
||||
/// PID settings:
|
||||
// Uncomment the following line to enable PID support.
|
||||
//#define SMOOTHING
|
||||
//#define SMOOTHFACTOR 5.0
|
||||
//float current_raw_average=0;
|
||||
#define K1 0.95 //smoothing of the PID
|
||||
//#define PID_DEBUG // Sends debug data to the serial port.
|
||||
//#define PID_OPENLOOP 1 // Puts PID in open loop. M104 sets the output power in %
|
||||
#define PID_MAX 255 // limits current to nozzle
|
||||
#define PID_INTEGRAL_DRIVE_MAX 255
|
||||
#define PID_dT 0.1
|
||||
//machine with red silicon: 1950:45 second ; with fan fully blowin 3000:47
|
||||
|
||||
#define PID_CRITIAL_GAIN 3000
|
||||
#define PID_SWING_AT_CRITIAL 45 //seconds
|
||||
#define PIDIADD 5
|
||||
/*
|
||||
//PID according to Ziegler-Nichols method
|
||||
float Kp = 0.6*PID_CRITIAL_GAIN;
|
||||
float Ki =PIDIADD+2*Kp/PID_SWING_AT_CRITIAL*PID_dT;
|
||||
float Kd = Kp*PID_SWING_AT_CRITIAL/8./PID_dT;
|
||||
*/
|
||||
//PI according to Ziegler-Nichols method
|
||||
#define DEFAULT_Kp (PID_CRITIAL_GAIN/2.2)
|
||||
#define DEFAULT_Ki (1.2*Kp/PID_SWING_AT_CRITIAL*PID_dT)
|
||||
#define DEFAULT_Kd (0)
|
||||
|
||||
#define PID_ADD_EXTRUSION_RATE
|
||||
#ifdef PID_ADD_EXTRUSION_RATE
|
||||
#define DEFAULT_Kc (5) //heatingpower=Kc*(e_speed)
|
||||
#endif
|
||||
#endif // PIDTEMP
|
||||
|
||||
// extruder advance constant (s2/mm3)
|
||||
//
|
||||
// advance (steps) = STEPS_PER_CUBIC_MM_E * EXTUDER_ADVANCE_K * cubic mm per second ^ 2
|
||||
//
|
||||
// hooke's law says: force = k * distance
|
||||
// bernoulli's priniciple says: v ^ 2 / 2 + g . h + pressure / density = constant
|
||||
// so: v ^ 2 is proportional to number of steps we advance the extruder
|
||||
//#define ADVANCE
|
||||
|
||||
#ifdef ADVANCE
|
||||
#define EXTRUDER_ADVANCE_K .3
|
||||
|
||||
#define D_FILAMENT 1.7
|
||||
#define STEPS_MM_E 65
|
||||
#define EXTRUTION_AREA (0.25 * D_FILAMENT * D_FILAMENT * 3.14159)
|
||||
#define STEPS_PER_CUBIC_MM_E (axis_steps_per_unit[E_AXIS]/ EXTRUTION_AREA)
|
||||
|
||||
#endif // ADVANCE
|
||||
|
||||
// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2, e.g. 8,16,32
|
||||
#if defined SDSUPPORT
|
||||
// The number of linear motions that can be in the plan at any give time.
|
||||
#define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller
|
||||
#else
|
||||
#define BLOCK_BUFFER_SIZE 16 // maximize block buffer
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -1,123 +1,129 @@
|
||||
|
||||
#include "planner.h"
|
||||
#include "temperature.h"
|
||||
|
||||
//======================================================================================
|
||||
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 < sizeof(value); i++)
|
||||
EEPROM.write(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 < sizeof(value); i++)
|
||||
*p++ = EEPROM.read(ee++);
|
||||
return i;
|
||||
}
|
||||
//======================================================================================
|
||||
|
||||
#define EEPROM_OFFSET 100
|
||||
|
||||
#define EEPROM_VERSION "V04" // 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.
|
||||
void StoreSettings() {
|
||||
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,acceleration);
|
||||
EEPROM_writeAnything(i,retract_acceleration);
|
||||
EEPROM_writeAnything(i,minimumfeedrate);
|
||||
EEPROM_writeAnything(i,mintravelfeedrate);
|
||||
EEPROM_writeAnything(i,minsegmenttime);
|
||||
EEPROM_writeAnything(i,max_xy_jerk);
|
||||
EEPROM_writeAnything(i,max_z_jerk);
|
||||
#ifdef PIDTEMP
|
||||
EEPROM_writeAnything(i,Kp);
|
||||
EEPROM_writeAnything(i,Ki);
|
||||
EEPROM_writeAnything(i,Kd);
|
||||
#else
|
||||
EEPROM_writeAnything(i,3000);
|
||||
EEPROM_writeAnything(i,0);
|
||||
EEPROM_writeAnything(i,0);
|
||||
#endif
|
||||
char ver2[4]=EEPROM_VERSION;
|
||||
i=EEPROM_OFFSET;
|
||||
EEPROM_writeAnything(i,ver2); // validate data
|
||||
ECHOLN("Settings Stored");
|
||||
|
||||
}
|
||||
|
||||
void RetrieveSettings(bool def=false){ // if def=true, the default values will be used
|
||||
int i=EEPROM_OFFSET;
|
||||
char stored_ver[4];
|
||||
char ver[4]=EEPROM_VERSION;
|
||||
EEPROM_readAnything(i,stored_ver); //read stored version
|
||||
// ECHOLN("Version: [" << ver << "] Stored version: [" << stored_ver << "]");
|
||||
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,acceleration);
|
||||
EEPROM_readAnything(i,retract_acceleration);
|
||||
EEPROM_readAnything(i,minimumfeedrate);
|
||||
EEPROM_readAnything(i,mintravelfeedrate);
|
||||
EEPROM_readAnything(i,minsegmenttime);
|
||||
EEPROM_readAnything(i,max_xy_jerk);
|
||||
EEPROM_readAnything(i,max_z_jerk);
|
||||
#ifndef PIDTEMP
|
||||
float Kp,Ki,Kd;
|
||||
#endif
|
||||
EEPROM_readAnything(i,Kp);
|
||||
EEPROM_readAnything(i,Ki);
|
||||
EEPROM_readAnything(i,Kd);
|
||||
|
||||
ECHOLN("Stored settings retreived:");
|
||||
}
|
||||
else {
|
||||
float tmp1[]=DEFAULT_AXIS_STEPS_PER_UNIT;
|
||||
float tmp2[]=DEFAULT_MAX_FEEDRATE;
|
||||
long tmp3[]=DEFAULT_MAX_ACCELERATION;
|
||||
for (int 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];
|
||||
}
|
||||
acceleration=DEFAULT_ACCELERATION;
|
||||
retract_acceleration=DEFAULT_RETRACT_ACCELERATION;
|
||||
minimumfeedrate=DEFAULT_MINIMUMFEEDRATE;
|
||||
minsegmenttime=DEFAULT_MINSEGMENTTIME;
|
||||
mintravelfeedrate=DEFAULT_MINTRAVELFEEDRATE;
|
||||
max_xy_jerk=DEFAULT_XYJERK;
|
||||
max_z_jerk=DEFAULT_ZJERK;
|
||||
ECHOLN("Using Default settings:");
|
||||
}
|
||||
ECHOLN("Steps per unit:");
|
||||
ECHOLN(" M92 X" <<_FLOAT(axis_steps_per_unit[0],3) << " Y" << _FLOAT(axis_steps_per_unit[1],3) << " Z" << _FLOAT(axis_steps_per_unit[2],3) << " E" << _FLOAT(axis_steps_per_unit[3],3));
|
||||
ECHOLN("Maximum feedrates (mm/s):");
|
||||
ECHOLN(" M203 X" <<_FLOAT(max_feedrate[0]/60,2)<<" Y" << _FLOAT(max_feedrate[1]/60,2) << " Z" << _FLOAT(max_feedrate[2]/60,2) << " E" << _FLOAT(max_feedrate[3]/60,2));
|
||||
ECHOLN("Maximum Acceleration (mm/s2):");
|
||||
ECHOLN(" M201 X" <<_FLOAT(max_acceleration_units_per_sq_second[0],0) << " Y" << _FLOAT(max_acceleration_units_per_sq_second[1],0) << " Z" << _FLOAT(max_acceleration_units_per_sq_second[2],0) << " E" << _FLOAT(max_acceleration_units_per_sq_second[3],0));
|
||||
ECHOLN("Acceleration: S=acceleration, T=retract acceleration");
|
||||
ECHOLN(" M204 S" <<_FLOAT(acceleration,2) << " T" << _FLOAT(retract_acceleration,2));
|
||||
ECHOLN("Advanced 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)");
|
||||
ECHOLN(" M205 S" <<_FLOAT(minimumfeedrate/60,2) << " T" << _FLOAT(mintravelfeedrate/60,2) << " B" << _FLOAT(minsegmenttime,2) << " X" << _FLOAT(max_xy_jerk/60,2) << " Z" << _FLOAT(max_z_jerk/60,2));
|
||||
#ifdef PIDTEMP
|
||||
ECHOLN("PID settings:");
|
||||
ECHOLN(" M301 P" << _FLOAT(Kp,3) << " I" << _FLOAT(Ki,3) << " D" << _FLOAT(Kd,3));
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifndef __EEPROMH
|
||||
#define __EEPROMH
|
||||
#include "planner.h"
|
||||
#include "temperature.h"
|
||||
#include <EEPROM.h>
|
||||
#include "Marlin.h"
|
||||
#include "streaming.h"
|
||||
|
||||
//======================================================================================
|
||||
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(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(ee++);
|
||||
return i;
|
||||
}
|
||||
//======================================================================================
|
||||
|
||||
#define EEPROM_OFFSET 100
|
||||
|
||||
#define EEPROM_VERSION "V04" // 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.
|
||||
void StoreSettings() {
|
||||
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,acceleration);
|
||||
EEPROM_writeAnything(i,retract_acceleration);
|
||||
EEPROM_writeAnything(i,minimumfeedrate);
|
||||
EEPROM_writeAnything(i,mintravelfeedrate);
|
||||
EEPROM_writeAnything(i,minsegmenttime);
|
||||
EEPROM_writeAnything(i,max_xy_jerk);
|
||||
EEPROM_writeAnything(i,max_z_jerk);
|
||||
#ifdef PIDTEMP
|
||||
EEPROM_writeAnything(i,Kp);
|
||||
EEPROM_writeAnything(i,Ki);
|
||||
EEPROM_writeAnything(i,Kd);
|
||||
#else
|
||||
EEPROM_writeAnything(i,3000);
|
||||
EEPROM_writeAnything(i,0);
|
||||
EEPROM_writeAnything(i,0);
|
||||
#endif
|
||||
char ver2[4]=EEPROM_VERSION;
|
||||
i=EEPROM_OFFSET;
|
||||
EEPROM_writeAnything(i,ver2); // validate data
|
||||
ECHOLN("Settings Stored");
|
||||
|
||||
}
|
||||
|
||||
void RetrieveSettings(bool def=false){ // if def=true, the default values will be used
|
||||
int i=EEPROM_OFFSET;
|
||||
char stored_ver[4];
|
||||
char ver[4]=EEPROM_VERSION;
|
||||
EEPROM_readAnything(i,stored_ver); //read stored version
|
||||
// ECHOLN("Version: [" << ver << "] Stored version: [" << stored_ver << "]");
|
||||
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,acceleration);
|
||||
EEPROM_readAnything(i,retract_acceleration);
|
||||
EEPROM_readAnything(i,minimumfeedrate);
|
||||
EEPROM_readAnything(i,mintravelfeedrate);
|
||||
EEPROM_readAnything(i,minsegmenttime);
|
||||
EEPROM_readAnything(i,max_xy_jerk);
|
||||
EEPROM_readAnything(i,max_z_jerk);
|
||||
#ifndef PIDTEMP
|
||||
float Kp,Ki,Kd;
|
||||
#endif
|
||||
EEPROM_readAnything(i,Kp);
|
||||
EEPROM_readAnything(i,Ki);
|
||||
EEPROM_readAnything(i,Kd);
|
||||
|
||||
ECHOLN("Stored settings retreived:");
|
||||
}
|
||||
else {
|
||||
float tmp1[]=DEFAULT_AXIS_STEPS_PER_UNIT;
|
||||
float tmp2[]=DEFAULT_MAX_FEEDRATE;
|
||||
long tmp3[]=DEFAULT_MAX_ACCELERATION;
|
||||
for (int 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];
|
||||
}
|
||||
acceleration=DEFAULT_ACCELERATION;
|
||||
retract_acceleration=DEFAULT_RETRACT_ACCELERATION;
|
||||
minimumfeedrate=DEFAULT_MINIMUMFEEDRATE;
|
||||
minsegmenttime=DEFAULT_MINSEGMENTTIME;
|
||||
mintravelfeedrate=DEFAULT_MINTRAVELFEEDRATE;
|
||||
max_xy_jerk=DEFAULT_XYJERK;
|
||||
max_z_jerk=DEFAULT_ZJERK;
|
||||
ECHOLN("Using Default settings:");
|
||||
}
|
||||
ECHOLN("Steps per unit:");
|
||||
ECHOLN(" M92 X" <<_FLOAT(axis_steps_per_unit[0],3) << " Y" << _FLOAT(axis_steps_per_unit[1],3) << " Z" << _FLOAT(axis_steps_per_unit[2],3) << " E" << _FLOAT(axis_steps_per_unit[3],3));
|
||||
ECHOLN("Maximum feedrates (mm/s):");
|
||||
ECHOLN(" M203 X" <<_FLOAT(max_feedrate[0]/60,2)<<" Y" << _FLOAT(max_feedrate[1]/60,2) << " Z" << _FLOAT(max_feedrate[2]/60,2) << " E" << _FLOAT(max_feedrate[3]/60,2));
|
||||
ECHOLN("Maximum Acceleration (mm/s2):");
|
||||
ECHOLN(" M201 X" <<_FLOAT(max_acceleration_units_per_sq_second[0],0) << " Y" << _FLOAT(max_acceleration_units_per_sq_second[1],0) << " Z" << _FLOAT(max_acceleration_units_per_sq_second[2],0) << " E" << _FLOAT(max_acceleration_units_per_sq_second[3],0));
|
||||
ECHOLN("Acceleration: S=acceleration, T=retract acceleration");
|
||||
ECHOLN(" M204 S" <<_FLOAT(acceleration,2) << " T" << _FLOAT(retract_acceleration,2));
|
||||
ECHOLN("Advanced 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)");
|
||||
ECHOLN(" M205 S" <<_FLOAT(minimumfeedrate/60,2) << " T" << _FLOAT(mintravelfeedrate/60,2) << " B" << _FLOAT(minsegmenttime,2) << " X" << _FLOAT(max_xy_jerk/60,2) << " Z" << _FLOAT(max_z_jerk/60,2));
|
||||
#ifdef PIDTEMP
|
||||
ECHOLN("PID settings:");
|
||||
ECHOLN(" M301 P" << _FLOAT(Kp,3) << " I" << _FLOAT(Ki,3) << " D" << _FLOAT(Kd,3));
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
508
Marlin/Makefile
508
Marlin/Makefile
@ -1,274 +1,320 @@
|
||||
TARGET = $(notdir $(CURDIR))
|
||||
# CHANGE BELOW:
|
||||
#~ INSTALL_DIR = /Applications/Arduino.app/Contents/Resources/Java
|
||||
INSTALL_DIR = /home/bkubicek/software/arduino-0022
|
||||
#~ PORT = /dev/cu.usbserial*
|
||||
PORT = /dev/ttyACM0
|
||||
|
||||
# Get these values from:
|
||||
# $(INSTALL_DIR)/hardware/boards.txt
|
||||
# (arduino-0022/hardware/arduino/boards.txt)
|
||||
# The values below are for the "Arduino Duemilanove or Nano w/ ATmega328"
|
||||
# now for "Arduino Mega 2560"
|
||||
UPLOAD_SPEED = 115200
|
||||
UPLOAD_PROTOCOL = stk500v2
|
||||
BUILD_MCU = atmega2560
|
||||
BUILD_F_CPU = 16000000L
|
||||
|
||||
# getting undefined reference to `__cxa_pure_virtual'
|
||||
#~ [http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1254180518 Arduino Forum - Makefile]
|
||||
#~ http://www.arduino.cc/playground/OpenBSD/CLI
|
||||
#~ [http://arduino.cc/forum/index.php?topic=52041.0 A "simple" makefile for Arduino]
|
||||
#~ [http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1275488191 Arduino Forum - Configuring avr-gcc options in arduino IDE]
|
||||
# found in /usr/lib/gcc/avr/4.3.5/cc1plus; fixed with -Wl,--gc-section
|
||||
|
||||
############################################################################
|
||||
# Below here nothing should be changed...
|
||||
|
||||
ARDUINO = $(INSTALL_DIR)/hardware/arduino/cores/arduino
|
||||
#
|
||||
# Arduino 0022 Makefile
|
||||
# Uno with DOGS102 Shield
|
||||
#
|
||||
# written by olikraus@gmail.com
|
||||
#
|
||||
# Features:
|
||||
# - boards.txt is used to derive parameters
|
||||
# - All intermediate files are put into a separate directory (TMPDIRNAME)
|
||||
# - Simple use: Copy Makefile into the same directory of the .pde file
|
||||
#
|
||||
# Limitations:
|
||||
# - requires UNIX environment
|
||||
# - TMPDIRNAME must be subdirectory of the current directory.
|
||||
#
|
||||
# Targets
|
||||
# all build everything
|
||||
# upload build and upload to arduino
|
||||
# clean remove all temporary files (includes final hex file)
|
||||
#
|
||||
# History
|
||||
# 001 28 Apr 2010 first release
|
||||
# 002 05 Oct 2010 added 'uno'
|
||||
#~ AVR_TOOLS_PATH = $(INSTALL_DIR)/hardware/tools/avr/bin
|
||||
# in Ubuntu, avr-gcc is installed separate;
|
||||
# only avrdude comes with the IDE
|
||||
AVR_TOOLS_PATH = /usr/bin
|
||||
AVR_DUDE_PATH = $(INSTALL_DIR)/hardware/tools
|
||||
#
|
||||
SRC = $(ARDUINO)/pins_arduino.c $(ARDUINO)/wiring.c \
|
||||
$(ARDUINO)/wiring_analog.c $(ARDUINO)/wiring_digital.c \
|
||||
$(ARDUINO)/wiring_pulse.c \
|
||||
$(ARDUINO)/wiring_shift.c $(ARDUINO)/WInterrupts.c
|
||||
# added applet/$(TARGET).cpp as in IDE 0022
|
||||
CXXSRC = $(ARDUINO)/HardwareSerial.cpp $(ARDUINO)/WMath.cpp \
|
||||
$(ARDUINO)/Print.cpp \
|
||||
$(ARDUINO)/main.cpp
|
||||
# applet/$(TARGET).cpp # no need, having a rule now for applet/$(TARGET).cpp.o
|
||||
# added main.cpp, as in 0022
|
||||
FORMAT = ihex
|
||||
|
||||
#=== user configuration ===
|
||||
# All ...PATH variables must have a '/' at the end
|
||||
# Name of this Makefile (used for "make depend").
|
||||
MAKEFILE = Makefile
|
||||
|
||||
# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt
|
||||
# Some examples:
|
||||
# BOARD DESCRIPTION
|
||||
# uno Arduino Uno
|
||||
# atmega328 Arduino Duemilanove or Nano w/ ATmega328
|
||||
# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168
|
||||
# mega Arduino Mega
|
||||
# mini Arduino Mini
|
||||
# lilypad328 LilyPad Arduino w/ ATmega328
|
||||
BOARD:=mega
|
||||
# Debugging format.
|
||||
# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
|
||||
# AVR (extended) COFF requires stabs, plus an avr-objcopy run.
|
||||
DEBUG = stabs
|
||||
|
||||
# additional (comma separated) defines
|
||||
# -DDOGM128_HW board is connected to DOGM128 display
|
||||
# -DDOGM132_HW board is connected to DOGM132 display
|
||||
# -DDOGS102_HW board is connected to DOGS102 display
|
||||
# -DDOG_REVERSE 180 degree rotation
|
||||
# -DDOG_SPI_SW_ARDUINO force SW shiftOut
|
||||
DEFS=-DDOGS102_HW -DDOG_DOUBLE_MEMORY -DDOG_SPI_SW_ARDUINO
|
||||
OPT = 2
|
||||
|
||||
# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end.
|
||||
# Can be empty if all tools are accessable through the search path
|
||||
AVR_TOOLS_PATH:=/usr/bin/
|
||||
# Place -D or -U options here
|
||||
#~ CDEFS = -DBUILD_F_CPU=$(BUILD_F_CPU)
|
||||
#~ CXXDEFS = -DBUILD_F_CPU=$(BUILD_F_CPU)
|
||||
# now called DF_CPU
|
||||
CDEFS = -DF_CPU=$(BUILD_F_CPU) -DARDUINO=22
|
||||
CXXDEFS = -DF_CPU=$(BUILD_F_CPU) -DARDUINO=22
|
||||
|
||||
# Install path of the arduino software. Requires a '/' at the end.
|
||||
ARDUINO_PATH:=/home/bkubicek/software/arduino-0022/
|
||||
# Place -I options here
|
||||
CINCS = -I$(ARDUINO) -I$(INSTALL_DIR)/libraries/LiquidCrystal/ -I$(INSTALL_DIR)/libraries/EEPROM/
|
||||
CXXINCS = -I$(ARDUINO)
|
||||
|
||||
# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path.
|
||||
AVRDUDE_PATH:=
|
||||
# Compiler flag to set the C Standard level.
|
||||
# c89 - "ANSI" C
|
||||
# gnu89 - c89 plus GCC extensions
|
||||
# c99 - ISO C99 standard (not yet fully implemented)
|
||||
# gnu99 - c99 plus GCC extensions
|
||||
CSTANDARD = -std=gnu99
|
||||
CDEBUG = -g$(DEBUG)
|
||||
# note that typically, IDE 0022 uses -w to suppress warnings (both in cpp and c)!
|
||||
CWARN = -Wall
|
||||
#~ CWARN = -w
|
||||
# "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++:
|
||||
CCWARN = -Wstrict-prototypes
|
||||
CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
|
||||
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
|
||||
|
||||
# The unix device where we can reach the arduino board
|
||||
# Uno: /dev/ttyACM0
|
||||
# Duemilanove: /dev/ttyUSB0
|
||||
AVRDUDE_PORT:=/dev/ttyACM0
|
||||
# to eliminate pins_ardiuno warnings:
|
||||
# http://arduino.cc/pipermail/developers_arduino.cc/2010-December/004005.html
|
||||
|
||||
# List of all libaries which should be included.
|
||||
#EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/
|
||||
#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/Dogm/
|
||||
#EXTRA_DIRS+=/home/kraus/src/arduino/dogm128/hg/libraries/Dogm/
|
||||
# [http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1254180518 Arduino Forum - Makefile]
|
||||
#~ For building the objects files "-ffunction-sections -fdata-sections" was missing
|
||||
#~ and the final avr-gcc call needs "-Wl,--gc-section".
|
||||
CXSECTF = -fno-exceptions -ffunction-sections -fdata-sections
|
||||
CFINALF = -Wl,--gc-section
|
||||
|
||||
#=== fetch parameter from boards.txt processor parameter ===
|
||||
# the basic idea is to get most of the information from boards.txt
|
||||
CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CWARN) $(CCWARN) $(CSTANDARD) $(CEXTRA)
|
||||
# added CWARN also to .cpp
|
||||
CXXFLAGS = $(CDEFS) $(CINCS) -O$(OPT) $(CWARN) $(CXSECTF)
|
||||
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
|
||||
LDFLAGS = -lm
|
||||
|
||||
BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt
|
||||
# Programming support using avrdude. Settings and variables.
|
||||
AVRDUDE_PORT = $(PORT)
|
||||
AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex
|
||||
AVRDUDE_FLAGS = -V -F \
|
||||
-p $(BUILD_MCU) -P $(AVRDUDE_PORT) -c $(UPLOAD_PROTOCOL) \
|
||||
-b $(UPLOAD_SPEED) -C $(INSTALL_DIR)/hardware/tools/avrdude.conf
|
||||
# -b $(UPLOAD_SPEED) -C $(INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf
|
||||
|
||||
# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p
|
||||
MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT))
|
||||
# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000
|
||||
F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT))
|
||||
# Program settings
|
||||
CC = $(AVR_TOOLS_PATH)/avr-gcc
|
||||
CXX = $(AVR_TOOLS_PATH)/avr-g++
|
||||
OBJCOPY = $(AVR_TOOLS_PATH)/avr-objcopy
|
||||
OBJDUMP = $(AVR_TOOLS_PATH)/avr-objdump
|
||||
AR = $(AVR_TOOLS_PATH)/avr-ar
|
||||
SIZE = $(AVR_TOOLS_PATH)/avr-size
|
||||
NM = $(AVR_TOOLS_PATH)/avr-nm
|
||||
#~ AVRDUDE = $(AVR_TOOLS_PATH)/avrdude
|
||||
AVRDUDE = $(AVR_DUDE_PATH)/avrdude
|
||||
REMOVE = rm -f
|
||||
MV = mv -f
|
||||
|
||||
# avrdude
|
||||
# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600
|
||||
AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT))
|
||||
# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500
|
||||
# AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT))
|
||||
# use stk500v1, because stk500 will default to stk500v2
|
||||
AVRDUDE_PROGRAMMER:=stk500v1
|
||||
# Define all object files.
|
||||
# NOTE: obj files will be created in respective src directories (libraries or $(INSTALL_DIR));
|
||||
# make clean deletes them fine
|
||||
# note that srcs are in libraries or other directories;
|
||||
# $(CXXSRC:.cpp=.o) will cause obj files to be in same loc as src files
|
||||
#~ OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o)
|
||||
# to change the output directory for object files;
|
||||
# must change the obj list here!
|
||||
# and then, match to corresponding rule somehow?
|
||||
# or leave this - and parse in rule (auth automatic variable $(@F))?
|
||||
# "Suffix Replacement"
|
||||
OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o)
|
||||
|
||||
#=== identify user files ===
|
||||
PDESRC:=$(shell ls *.pde)
|
||||
TARGETNAME=$(basename $(PDESRC))
|
||||
# added - OBJ list, transformed into applet/
|
||||
OBJT = $(addprefix applet/,$(notdir $(OBJ)))
|
||||
ALLSRC = $(SRC) $(CXXSRC) $(ASRC)
|
||||
|
||||
CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS))
|
||||
CDIRS:=*.c utility/*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c
|
||||
CSRC:=$(shell ls $(CDIRS) 2>/dev/null)
|
||||
# Define all listing files.
|
||||
LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst)
|
||||
|
||||
CCSRC:=$(shell ls *.cc 2>/dev/null)
|
||||
# Combine all necessary flags and optional flags.
|
||||
# Add target processor to flags.
|
||||
ALL_CFLAGS = -mmcu=$(BUILD_MCU) -I. $(CFLAGS)
|
||||
ALL_CXXFLAGS = -mmcu=$(BUILD_MCU) -I. $(CXXFLAGS)
|
||||
ALL_ASFLAGS = -mmcu=$(BUILD_MCU) -I. -x assembler-with-cpp $(ASFLAGS)
|
||||
|
||||
CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS))
|
||||
CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp
|
||||
CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null)
|
||||
# depended libraries of .pde need to be added from
|
||||
# $(INSTALL_DIR)/libraries (TODO: and/or ~/sketchbook/libraries)
|
||||
# grep for 'include', test if exists, add...
|
||||
# note: prefix "a real tab character" http://www.delorie.com/djgpp/doc/ug/larger/makefiles.html
|
||||
# $$ to escape $ for shell;
|
||||
# note: must NOT put comments # inside bash execution;
|
||||
# those would get removed by make; making shell see "EOF in backquote substitution"
|
||||
# echo $$ix ; \
|
||||
# 'shell' twice - for each subprocess! Backtick doesn't get expanded?
|
||||
GREPRES:=$(shell for ix in $(shell grep include $(TARGET).pde | sed 's/.*[<"]\(.*\).h[>"].*/\1/'); do \
|
||||
if [ -d $(INSTALL_DIR)/libraries/$$ix ] ; then \
|
||||
LINCS="$$LINCS -I$(INSTALL_DIR)/libraries/$$ix" ;\
|
||||
fi; \
|
||||
done; \
|
||||
echo $$LINCS)
|
||||
# append includes:
|
||||
CINCS += $(GREPRES)
|
||||
CXXINCS += $(GREPRES)
|
||||
# append library source .cpp files too (CXXSRC)
|
||||
GREPRESB:=$(shell for ix in $(shell grep include $(TARGET).pde | sed 's/.*[<"]\(.*\).h[>"].*/\1/'); do \
|
||||
if [ -d $(INSTALL_DIR)/libraries/$$ix ] ; then \
|
||||
CPPSRCS="$$CPPSRCS $(INSTALL_DIR)/libraries/$$ix/*.cpp" ;\
|
||||
fi; \
|
||||
done; \
|
||||
echo $$CPPSRCS)
|
||||
CXXSRC += $(GREPRESB)
|
||||
# added - only CXX obj from libraries:
|
||||
CXXLIBOBJ = $(GREPRESB:.cpp=.o)
|
||||
|
||||
#=== build internal variables ===
|
||||
# Default target.
|
||||
all: applet_files build sizeafter
|
||||
|
||||
# the name of the subdirectory where everything is stored
|
||||
TMPDIRNAME:=tmp
|
||||
TMPDIRPATH:=$(TMPDIRNAME)/
|
||||
build: elf hex
|
||||
|
||||
AVRTOOLSPATH:=$(AVR_TOOLS_PATH)
|
||||
|
||||
OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy
|
||||
OBJDUMP:=$(AVRTOOLSPATH)avr-objdump
|
||||
SIZE:=$(AVRTOOLSPATH)avr-size
|
||||
|
||||
CPPSRC:=$(addprefix $(TMPDIRPATH),$(PDESRC:.pde=.cpp)) $(CPPSRC)
|
||||
|
||||
COBJ:=$(CSRC:.c=.o)
|
||||
CCOBJ:=$(CCSRC:.cc=.o)
|
||||
CPPOBJ:=$(CPPSRC:.cpp=.o)
|
||||
|
||||
OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ)
|
||||
DIRS:= $(dir $(OBJFILES))
|
||||
|
||||
DEPFILES:=$(OBJFILES:.o=.d)
|
||||
# assembler files from avr-gcc -S
|
||||
ASSFILES:=$(OBJFILES:.o=.s)
|
||||
# disassembled object files with avr-objdump -S
|
||||
DISFILES:=$(OBJFILES:.o=.dis)
|
||||
applet_files: $(TARGET).pde
|
||||
# Here is the "preprocessing".
|
||||
# It creates a .cpp file based with the same name as the .pde file.
|
||||
# On top of the new .cpp file comes the WProgram.h header.
|
||||
# At the end there is a generic main() function attached.
|
||||
# Then the .cpp file will be compiled. Errors during compile will
|
||||
# refer to this new, automatically generated, file.
|
||||
# Not the original .pde file you actually edit...
|
||||
test -d applet || mkdir applet
|
||||
# @ supresses printout of the cmdline itself; so only the out of echo is printed
|
||||
@echo ALL OBJT: $(OBJT)
|
||||
@echo ALL CXXLIBOBJ: $(CXXLIBOBJ)
|
||||
# echo '#include "WProgram.h"' > applet/$(TARGET).cpp
|
||||
@echo "#include \"WProgram.h\"\nvoid setup();\nvoid loop();\n" > applet/$(TARGET).cpp
|
||||
cat $(TARGET).pde >> applet/$(TARGET).cpp
|
||||
# no more need to cat main.cpp (v0022) - now it is compiled in
|
||||
# cat $(ARDUINO)/main.cpp >> applet/$(TARGET).cpp
|
||||
|
||||
|
||||
LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a
|
||||
ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf
|
||||
HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex
|
||||
elf: applet/$(TARGET).elf
|
||||
hex: applet/$(TARGET).hex
|
||||
eep: applet/$(TARGET).eep
|
||||
lss: applet/$(TARGET).lss
|
||||
sym: applet/$(TARGET).sym
|
||||
|
||||
AVRDUDE_FLAGS = -V -F
|
||||
AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf
|
||||
AVRDUDE_FLAGS += -p $(MCU)
|
||||
AVRDUDE_FLAGS += -P $(AVRDUDE_PORT)
|
||||
AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER)
|
||||
AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE)
|
||||
AVRDUDE_FLAGS += -U flash:w:$(HEXNAME)
|
||||
# Program the device.
|
||||
upload: applet/$(TARGET).hex
|
||||
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH)
|
||||
|
||||
AVRDUDE = avrdude
|
||||
# Display size of file.
|
||||
HEXSIZE = $(SIZE) --target=$(FORMAT) applet/$(TARGET).hex
|
||||
ELFSIZE = $(SIZE) applet/$(TARGET).elf
|
||||
sizebefore:
|
||||
@if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(HEXSIZE); echo; fi
|
||||
|
||||
#=== predefined variable override ===
|
||||
# use "make -p -f/dev/null" to see the default rules and definitions
|
||||
sizeafter:
|
||||
@if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(HEXSIZE); echo; fi
|
||||
|
||||
# Build C and C++ flags. Include path information must be placed here
|
||||
COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS)
|
||||
# COMMON_FLAGS += -gdwarf-2
|
||||
COMMON_FLAGS += -Os
|
||||
COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
|
||||
COMMON_FLAGS += -I.
|
||||
COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino
|
||||
COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS))
|
||||
COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections
|
||||
COMMON_FLAGS += -Wl,--relax
|
||||
COMMON_FLAGS += -mcall-prologues
|
||||
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
|
||||
COFFCONVERT=$(OBJCOPY) --debugging \
|
||||
--change-section-address .data-0x800000 \
|
||||
--change-section-address .bss-0x800000 \
|
||||
--change-section-address .noinit-0x800000 \
|
||||
--change-section-address .eeprom-0x810000
|
||||
|
||||
CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes
|
||||
CXXFLAGS = $(COMMON_FLAGS)
|
||||
coff: applet/$(TARGET).elf
|
||||
$(COFFCONVERT) -O coff-avr applet/$(TARGET).elf $(TARGET).cof
|
||||
|
||||
# Replace standard build tools by avr tools
|
||||
CC = $(AVRTOOLSPATH)avr-gcc
|
||||
CXX = $(AVRTOOLSPATH)avr-g++
|
||||
AR = @$(AVRTOOLSPATH)avr-ar
|
||||
extcoff: $(TARGET).elf
|
||||
$(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf $(TARGET).cof
|
||||
|
||||
|
||||
# "rm" must be able to delete a directory tree
|
||||
RM = rm -rf
|
||||
|
||||
#=== rules ===
|
||||
|
||||
# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH
|
||||
# reuse existing variables as far as possible
|
||||
|
||||
$(TMPDIRPATH)%.o: %.c
|
||||
@echo compile $<
|
||||
@$(COMPILE.c) $(OUTPUT_OPTION) $<
|
||||
|
||||
$(TMPDIRPATH)%.o: %.cc
|
||||
@echo compile $<
|
||||
@$(COMPILE.cc) $(OUTPUT_OPTION) $<
|
||||
|
||||
$(TMPDIRPATH)%.o: %.cpp
|
||||
@echo compile $<
|
||||
@$(COMPILE.cpp) $(OUTPUT_OPTION) $<
|
||||
|
||||
$(TMPDIRPATH)%.s: %.c
|
||||
@$(COMPILE.c) $(OUTPUT_OPTION) -S $<
|
||||
|
||||
$(TMPDIRPATH)%.s: %.cc
|
||||
@$(COMPILE.cc) $(OUTPUT_OPTION) -S $<
|
||||
|
||||
$(TMPDIRPATH)%.s: %.cpp
|
||||
@$(COMPILE.cpp) $(OUTPUT_OPTION) -S $<
|
||||
|
||||
$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o
|
||||
@$(OBJDUMP) -S $< > $@
|
||||
|
||||
.SUFFIXES: .elf .hex .pde
|
||||
.SUFFIXES: .elf .hex .eep .lss .sym
|
||||
|
||||
.elf.hex:
|
||||
@$(OBJCOPY) -O ihex -R .eeprom $< $@
|
||||
|
||||
$(TMPDIRPATH)%.cpp: %.pde
|
||||
@cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@
|
||||
@cat $< >> $@
|
||||
@echo >> $@
|
||||
@echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@
|
||||
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
|
||||
|
||||
.elf.eep:
|
||||
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
|
||||
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
|
||||
|
||||
.PHONY: all
|
||||
all: tmpdir $(HEXNAME) assemblersource showsize
|
||||
ls -al $(HEXNAME) $(ELFNAME)
|
||||
# Create extended listing file from ELF output file.
|
||||
.elf.lss:
|
||||
$(OBJDUMP) -h -S $< > $@
|
||||
|
||||
$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES)))
|
||||
$(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@
|
||||
# Create a symbol table from ELF output file.
|
||||
.elf.sym:
|
||||
$(NM) -n $< > $@
|
||||
|
||||
$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES))
|
||||
# Link: create ELF output file from library.
|
||||
# NOTE: applet/$(TARGET).cpp.o MUST BE BEFORE applet/core.a
|
||||
# in the dependency list, so its rule runs first!
|
||||
applet/$(TARGET).elf: $(TARGET).pde applet/$(TARGET).cpp.o applet/core.a
|
||||
# $(CC) $(ALL_CFLAGS) -o $@ applet/$(TARGET).cpp -L. applet/core.a $(LDFLAGS)
|
||||
# changed as in IDE v0022: link cpp obj files
|
||||
@echo $$(tput bold)$$(tput setaf 2) $(CC) $$(tput sgr0) $(ALL_CFLAGS) $(CFINALF) -o $@ applet/$(TARGET).cpp.o $(CXXOBJ) -L. applet/core.a $(LDFLAGS)
|
||||
@$(CC) $(ALL_CFLAGS) $(CFINALF) -o $@ applet/$(TARGET).cpp.o $(CXXOBJ) -L. applet/core.a $(LDFLAGS)
|
||||
|
||||
#=== create temp directory ===
|
||||
# not really required, because it will be also created during the dependency handling
|
||||
.PHONY: tmpdir
|
||||
tmpdir:
|
||||
@test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH)
|
||||
# added: cpp.o depends on cpp (and .pde which generates it)
|
||||
# $< "first item in the dependencies list"; $@ "left side of the :"; $^ "right side of the :"
|
||||
# http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/
|
||||
applet/$(TARGET).cpp.o: applet/$(TARGET).cpp
|
||||
@echo $$(tput bold) $(CXX) $$(tput sgr0) -c $(ALL_CXXFLAGS) $< -o $@
|
||||
@$(CXX) -c $(ALL_CXXFLAGS) $< -o $@
|
||||
|
||||
#=== create assembler files for each C/C++ file ===
|
||||
.PHONY: assemblersource
|
||||
assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES))
|
||||
#~ applet/core.a: $(OBJ)
|
||||
#~ @for i in $(OBJ); do echo $(AR) rcs applet/core.a $$i; $(AR) rcs applet/core.a $$i; done
|
||||
|
||||
applet/core.a: $(OBJT)
|
||||
@for i in $(OBJT); do echo $(AR) rcs applet/core.a $$i; $(AR) rcs applet/core.a $$i; done
|
||||
|
||||
#=== show the section sizes of the ELF file ===
|
||||
.PHONY: showsize
|
||||
showsize: $(ELFNAME)
|
||||
$(SIZE) $<
|
||||
# iterate through OBJ to find the original location; then build depending on source extension
|
||||
# TODO: add handling of assembler files
|
||||
applet/%.o:
|
||||
@for iob in $(OBJ); do \
|
||||
if [ "`basename $$iob`" = "`basename $@`" ]; then \
|
||||
for ios in $(ALLSRC); do \
|
||||
if [ "$${iob%%.*}" = "$${ios%%.*}" ]; then \
|
||||
case $${ios##*.} in \
|
||||
"cpp") \
|
||||
echo "$$(tput bold)$$(tput setaf 1) $(CXX) $$(tput sgr0) -c $(ALL_CXXFLAGS) $$ios -o $@"; \
|
||||
$(CXX) -c $(ALL_CXXFLAGS) $$ios -o $@;; \
|
||||
"c") \
|
||||
echo "$$(tput bold)$$(tput setaf 1) $(CC) $$(tput sgr0) -c $(ALL_CFLAGS) $$ios -o $@"; \
|
||||
$(CC) -c $(ALL_CFLAGS) $$ios -o $@;; \
|
||||
esac; \
|
||||
fi; \
|
||||
done; \
|
||||
fi; \
|
||||
done;
|
||||
|
||||
#=== clean up target ===
|
||||
# this is simple: the TMPDIRPATH is removed
|
||||
.PHONY: clean
|
||||
#~ # Compile: create object files from C++ source files.
|
||||
#~ .cpp.o:
|
||||
#~ $(CXX) -c $(ALL_CXXFLAGS) $< -o $@
|
||||
|
||||
#~ # Compile: create object files from C source files.
|
||||
#~ .c.o:
|
||||
#~ $(CC) -c $(ALL_CFLAGS) $< -o $@
|
||||
|
||||
#~ # Compile: create assembler files from C source files.
|
||||
#~ .c.s:
|
||||
#~ $(CC) -S $(ALL_CFLAGS) $< -o $@
|
||||
|
||||
#~ # Assemble: create object files from assembler source files.
|
||||
#~ .S.o:
|
||||
#~ $(CC) -c $(ALL_ASFLAGS) $< -o $@
|
||||
|
||||
#~ # Automatic dependencies
|
||||
#~ %.d: %.c
|
||||
#~ $(CC) -M $(ALL_CFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@
|
||||
|
||||
#~ %.d: %.cpp
|
||||
#~ $(CXX) -M $(ALL_CXXFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@
|
||||
|
||||
# Target: clean project.
|
||||
clean:
|
||||
$(RM) $(TMPDIRPATH)
|
||||
|
||||
# Program the device.
|
||||
# step 1: reset the arduino board with the stty command
|
||||
# step 2: user avrdude to upload the software
|
||||
.PHONY: upload
|
||||
upload: $(HEXNAME)
|
||||
stty -F $(AVRDUDE_PORT) hupcl
|
||||
$(AVRDUDE) $(AVRDUDE_FLAGS)
|
||||
|
||||
|
||||
# === dependency handling ===
|
||||
# From the gnu make manual (section 4.14, Generating Prerequisites Automatically)
|
||||
# Additionally (because this will be the first executed rule) TMPDIRPATH is created here.
|
||||
# Instead of "sed" the "echo" command is used
|
||||
# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd ..
|
||||
DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\
|
||||
mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\
|
||||
set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@
|
||||
|
||||
|
||||
$(TMPDIRPATH)%.d: %.c
|
||||
@$(DEPACTION)
|
||||
|
||||
$(TMPDIRPATH)%.d: %.cc
|
||||
@$(DEPACTION)
|
||||
|
||||
|
||||
$(TMPDIRPATH)%.d: %.cpp
|
||||
@$(DEPACTION)
|
||||
|
||||
# Include dependency files. If a .d file is missing, a warning is created and the .d file is created
|
||||
# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles)
|
||||
-include $(addprefix $(TMPDIRPATH),$(DEPFILES))
|
||||
|
||||
$(REMOVE) applet/$(TARGET).hex applet/$(TARGET).eep applet/$(TARGET).cof applet/$(TARGET).elf \
|
||||
applet/$(TARGET).map applet/$(TARGET).sym applet/$(TARGET).lss applet/core.a \
|
||||
$(OBJT) applet/$(TARGET).cpp.o \
|
||||
$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d)
|
||||
|
||||
.PHONY: all build elf hex eep lss sym program coff extcoff clean applet_files sizebefore sizeafter
|
||||
|
165
Marlin/Marlin.h
165
Marlin/Marlin.h
@ -1,83 +1,82 @@
|
||||
#ifndef __MARLINH
|
||||
#define __MARLINH
|
||||
|
||||
// Tonokip RepRap firmware rewrite based off of Hydra-mmm firmware.
|
||||
// Licence: GPL
|
||||
#include <WProgram.h>
|
||||
#include "fastio.h"
|
||||
|
||||
|
||||
#define ECHO(x) Serial << "echo: " << x;
|
||||
#define ECHOLN(x) Serial << "echo: "<<x<<endl;
|
||||
|
||||
void get_command();
|
||||
void process_commands();
|
||||
|
||||
void manage_inactivity(byte debug);
|
||||
|
||||
#if X_ENABLE_PIN > -1
|
||||
#define enable_x() WRITE(X_ENABLE_PIN, X_ENABLE_ON)
|
||||
#define disable_x() WRITE(X_ENABLE_PIN,!X_ENABLE_ON)
|
||||
#else
|
||||
#define enable_x() ;
|
||||
#define disable_x() ;
|
||||
#endif
|
||||
#if Y_ENABLE_PIN > -1
|
||||
#define enable_y() WRITE(Y_ENABLE_PIN, Y_ENABLE_ON)
|
||||
#define disable_y() WRITE(Y_ENABLE_PIN,!Y_ENABLE_ON)
|
||||
#else
|
||||
#define enable_y() ;
|
||||
#define disable_y() ;
|
||||
#endif
|
||||
#if Z_ENABLE_PIN > -1
|
||||
#define enable_z() WRITE(Z_ENABLE_PIN, Z_ENABLE_ON)
|
||||
#define disable_z() WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON)
|
||||
#else
|
||||
#define enable_z() ;
|
||||
#define disable_z() ;
|
||||
#endif
|
||||
|
||||
#if E_ENABLE_PIN > -1
|
||||
|
||||
#define enable_e() WRITE(E_ENABLE_PIN, E_ENABLE_ON)
|
||||
#define disable_e() WRITE(E_ENABLE_PIN,!E_ENABLE_ON)
|
||||
|
||||
#else
|
||||
#define enable_e() ;
|
||||
#define disable_e() ;
|
||||
#endif
|
||||
|
||||
#define X_AXIS 0
|
||||
#define Y_AXIS 1
|
||||
#define Z_AXIS 2
|
||||
#define E_AXIS 3
|
||||
|
||||
void FlushSerialRequestResend();
|
||||
void ClearToSend();
|
||||
|
||||
void get_coordinates();
|
||||
void prepare_move();
|
||||
void kill(byte debug);
|
||||
|
||||
//void check_axes_activity();
|
||||
//void plan_init();
|
||||
//void st_init();
|
||||
//void tp_init();
|
||||
//void plan_buffer_line(float x, float y, float z, float e, float feed_rate);
|
||||
//void plan_set_position(float x, float y, float z, float e);
|
||||
//void st_wake_up();
|
||||
//void st_synchronize();
|
||||
void enquecommand(const char *cmd);
|
||||
void wd_reset();
|
||||
|
||||
#ifndef CRITICAL_SECTION_START
|
||||
#define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli();
|
||||
#define CRITICAL_SECTION_END SREG = _sreg;
|
||||
#endif //CRITICAL_SECTION_START
|
||||
|
||||
extern float homing_feedrate[];
|
||||
extern bool axis_relative_modes[];
|
||||
|
||||
void manage_inactivity(byte debug);
|
||||
|
||||
#endif
|
||||
#ifndef __MARLINH
|
||||
#define __MARLINH
|
||||
|
||||
// Tonokip RepRap firmware rewrite based off of Hydra-mmm firmware.
|
||||
// Licence: GPL
|
||||
#include <WProgram.h>
|
||||
#include "fastio.h"
|
||||
|
||||
|
||||
#define ECHO(x) Serial << "echo: " << x;
|
||||
#define ECHOLN(x) Serial << "echo: "<<x<<endl;
|
||||
|
||||
void get_command();
|
||||
void process_commands();
|
||||
|
||||
void manage_inactivity(byte debug);
|
||||
|
||||
#if X_ENABLE_PIN > -1
|
||||
#define enable_x() WRITE(X_ENABLE_PIN, X_ENABLE_ON)
|
||||
#define disable_x() WRITE(X_ENABLE_PIN,!X_ENABLE_ON)
|
||||
#else
|
||||
#define enable_x() ;
|
||||
#define disable_x() ;
|
||||
#endif
|
||||
#if Y_ENABLE_PIN > -1
|
||||
#define enable_y() WRITE(Y_ENABLE_PIN, Y_ENABLE_ON)
|
||||
#define disable_y() WRITE(Y_ENABLE_PIN,!Y_ENABLE_ON)
|
||||
#else
|
||||
#define enable_y() ;
|
||||
#define disable_y() ;
|
||||
#endif
|
||||
#if Z_ENABLE_PIN > -1
|
||||
#define enable_z() WRITE(Z_ENABLE_PIN, Z_ENABLE_ON)
|
||||
#define disable_z() WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON)
|
||||
#else
|
||||
#define enable_z() ;
|
||||
#define disable_z() ;
|
||||
#endif
|
||||
|
||||
#if E_ENABLE_PIN > -1
|
||||
|
||||
#define enable_e() WRITE(E_ENABLE_PIN, E_ENABLE_ON)
|
||||
#define disable_e() WRITE(E_ENABLE_PIN,!E_ENABLE_ON)
|
||||
|
||||
#else
|
||||
#define enable_e() ;
|
||||
#define disable_e() ;
|
||||
#endif
|
||||
|
||||
#define X_AXIS 0
|
||||
#define Y_AXIS 1
|
||||
#define Z_AXIS 2
|
||||
#define E_AXIS 3
|
||||
|
||||
void FlushSerialRequestResend();
|
||||
void ClearToSend();
|
||||
|
||||
void get_coordinates();
|
||||
void prepare_move();
|
||||
void kill();
|
||||
|
||||
//void check_axes_activity();
|
||||
//void plan_init();
|
||||
//void st_init();
|
||||
//void tp_init();
|
||||
//void plan_buffer_line(float x, float y, float z, float e, float feed_rate);
|
||||
//void plan_set_position(float x, float y, float z, float e);
|
||||
//void st_wake_up();
|
||||
//void st_synchronize();
|
||||
void enquecommand(const char *cmd);
|
||||
|
||||
|
||||
#ifndef CRITICAL_SECTION_START
|
||||
#define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli();
|
||||
#define CRITICAL_SECTION_END SREG = _sreg;
|
||||
#endif //CRITICAL_SECTION_START
|
||||
|
||||
extern float homing_feedrate[];
|
||||
extern bool axis_relative_modes[];
|
||||
|
||||
void wd_reset() ;
|
||||
#endif
|
||||
|
2466
Marlin/Marlin.pde
2466
Marlin/Marlin.pde
File diff suppressed because it is too large
Load Diff
@ -24,12 +24,12 @@
|
||||
*/
|
||||
|
||||
/// Read a pin
|
||||
#define _READ(IO) ((bool)(DIO ## IO ## _RPORT & MASK(DIO ## IO ## _PIN)))
|
||||
#define _READ(IO) ((bool)(DIO ## IO ## _RPORT & MASK(DIO ## IO ## _PIN)))
|
||||
/// write to a pin
|
||||
#define _WRITE(IO, v) do { if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); }; } while (0)
|
||||
//#define _WRITE(IO, v) do { #if (DIO ## IO ## _WPORT >= 0x100) CRITICAL_SECTION_START; if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); };#if (DIO ## IO ## _WPORT >= 0x100) CRITICAL_SECTION_END; } while (0)
|
||||
#define _WRITE(IO, v) do { if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); }; } while (0)
|
||||
//#define _WRITE(IO, v) do { #if (DIO ## IO ## _WPORT >= 0x100) CRITICAL_SECTION_START; if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); };#if (DIO ## IO ## _WPORT >= 0x100) CRITICAL_SECTION_END; } while (0)
|
||||
/// toggle a pin
|
||||
#define _TOGGLE(IO) do {DIO ## IO ## _RPORT = MASK(DIO ## IO ## _PIN); } while (0)
|
||||
#define _TOGGLE(IO) do {DIO ## IO ## _RPORT = MASK(DIO ## IO ## _PIN); } while (0)
|
||||
|
||||
/// set pin as input
|
||||
#define _SET_INPUT(IO) do {DIO ## IO ## _DDR &= ~MASK(DIO ## IO ## _PIN); } while (0)
|
||||
@ -2556,4 +2556,4 @@ pins
|
||||
#error pins for this chip not defined in arduino.h! If you write an appropriate pin definition and have this firmware work on your chip, please submit a pull request
|
||||
#endif
|
||||
|
||||
#endif /* _ARDUINO_H */
|
||||
#endif /* _ARDUINO_H */
|
||||
|
10
Marlin/lcd.h
10
Marlin/lcd.h
@ -1,10 +0,0 @@
|
||||
#ifndef __LCDH
|
||||
#define __LCDH
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
@ -1 +0,0 @@
|
||||
|
@ -381,13 +381,6 @@ void check_axes_activity() {
|
||||
// calculation the caller must also provide the physical length of the line in millimeters.
|
||||
void plan_buffer_line(float x, float y, float z, float e, float feed_rate) {
|
||||
|
||||
// The target position of the tool in absolute steps
|
||||
// Calculate target position in absolute steps
|
||||
long target[4];
|
||||
target[X_AXIS] = lround(x*axis_steps_per_unit[X_AXIS]);
|
||||
target[Y_AXIS] = lround(y*axis_steps_per_unit[Y_AXIS]);
|
||||
target[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]);
|
||||
target[E_AXIS] = lround(e*axis_steps_per_unit[E_AXIS]);
|
||||
|
||||
// Calculate the buffer head after we push this byte
|
||||
int next_buffer_head = (block_buffer_head + 1) & (BLOCK_BUFFER_SIZE - 1);
|
||||
@ -400,6 +393,15 @@ void plan_buffer_line(float x, float y, float z, float e, float feed_rate) {
|
||||
LCD_STATUS;
|
||||
}
|
||||
|
||||
// The target position of the tool in absolute steps
|
||||
// Calculate target position in absolute steps
|
||||
//this should be done after the wait, because otherwise a M92 code within the gcode disrupts this calculation somehow
|
||||
long target[4];
|
||||
target[X_AXIS] = lround(x*axis_steps_per_unit[X_AXIS]);
|
||||
target[Y_AXIS] = lround(y*axis_steps_per_unit[Y_AXIS]);
|
||||
target[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]);
|
||||
target[E_AXIS] = lround(e*axis_steps_per_unit[E_AXIS]);
|
||||
|
||||
// Prepare to set up new block
|
||||
block_t *block = &block_buffer[block_buffer_head];
|
||||
|
||||
@ -433,7 +435,7 @@ void plan_buffer_line(float x, float y, float z, float e, float feed_rate) {
|
||||
unsigned long microseconds;
|
||||
|
||||
if (block->steps_e == 0) {
|
||||
if(feed_rate<mintravelfeedrate) feed_rate=mintravelfeedrate;
|
||||
if(feed_rate<mintravelfeedrate) feed_rate=mintravelfeedrate;
|
||||
}
|
||||
else {
|
||||
if(feed_rate<minimumfeedrate) feed_rate=minimumfeedrate;
|
||||
|
182
Marlin/planner.h
182
Marlin/planner.h
@ -1,90 +1,92 @@
|
||||
/*
|
||||
planner.h - buffers movement commands and manages the acceleration profile plan
|
||||
Part of Grbl
|
||||
|
||||
Copyright (c) 2009-2011 Simen Svale Skogsrud
|
||||
|
||||
Grbl 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.
|
||||
|
||||
Grbl 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 Grbl. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// This module is to be considered a sub-module of stepper.c. Please don't include
|
||||
// this file from any other module.
|
||||
|
||||
#ifndef planner_h
|
||||
#define planner_h
|
||||
|
||||
// This struct is used when buffering the setup for each linear movement "nominal" values are as specified in
|
||||
// the source g-code and may never actually be reached if acceleration management is active.
|
||||
typedef struct {
|
||||
// Fields used by the bresenham algorithm for tracing the line
|
||||
long steps_x, steps_y, steps_z, steps_e; // Step count along each axis
|
||||
long step_event_count; // The number of step events required to complete this block
|
||||
volatile long accelerate_until; // The index of the step event on which to stop acceleration
|
||||
volatile long decelerate_after; // The index of the step event on which to start decelerating
|
||||
volatile long acceleration_rate; // The acceleration rate used for acceleration calculation
|
||||
unsigned char direction_bits; // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h)
|
||||
#ifdef ADVANCE
|
||||
long advance_rate;
|
||||
volatile long initial_advance;
|
||||
volatile long final_advance;
|
||||
float advance;
|
||||
#endif
|
||||
|
||||
// Fields used by the motion planner to manage acceleration
|
||||
float speed_x, speed_y, speed_z, speed_e; // Nominal mm/minute for each axis
|
||||
float nominal_speed; // The nominal speed for this block in mm/min
|
||||
float millimeters; // The total travel of this block in mm
|
||||
float entry_speed;
|
||||
float acceleration; // acceleration mm/sec^2
|
||||
|
||||
// Settings for the trapezoid generator
|
||||
long nominal_rate; // The nominal step rate for this block in step_events/sec
|
||||
volatile long initial_rate; // The jerk-adjusted step rate at start of block
|
||||
volatile long final_rate; // The minimal rate at exit
|
||||
long acceleration_st; // acceleration steps/sec^2
|
||||
volatile char busy;
|
||||
} block_t;
|
||||
|
||||
// Initialize the motion plan subsystem
|
||||
void plan_init();
|
||||
|
||||
// Add a new linear movement to the buffer. x, y and z is the signed, absolute target position in
|
||||
// millimaters. Feed rate specifies the speed of the motion.
|
||||
void plan_buffer_line(float x, float y, float z, float e, float feed_rate);
|
||||
|
||||
// Set position. Used for G92 instructions.
|
||||
void plan_set_position(float x, float y, float z, float e);
|
||||
|
||||
// Called when the current block is no longer needed. Discards the block and makes the memory
|
||||
// availible for new blocks.
|
||||
void plan_discard_current_block();
|
||||
|
||||
// Gets the current block. Returns NULL if buffer empty
|
||||
block_t *plan_get_current_block();
|
||||
|
||||
void check_axes_activity();
|
||||
|
||||
extern unsigned long minsegmenttime;
|
||||
extern float max_feedrate[4]; // set the max speeds
|
||||
extern float axis_steps_per_unit[4];
|
||||
extern long max_acceleration_units_per_sq_second[4]; // Use M201 to override by software
|
||||
extern float minimumfeedrate;
|
||||
extern float acceleration; // Normal acceleration mm/s^2 THIS IS THE DEFAULT ACCELERATION for all moves. M204 SXXXX
|
||||
extern float retract_acceleration; // mm/s^2 filament pull-pack and push-forward while standing still in the other axis M204 TXXXX
|
||||
extern float max_xy_jerk; //speed than can be stopped at once, if i understand correctly.
|
||||
extern float max_z_jerk;
|
||||
extern float mintravelfeedrate;
|
||||
extern unsigned long axis_steps_per_sqr_second[NUM_AXIS];
|
||||
|
||||
#endif
|
||||
/*
|
||||
planner.h - buffers movement commands and manages the acceleration profile plan
|
||||
Part of Grbl
|
||||
|
||||
Copyright (c) 2009-2011 Simen Svale Skogsrud
|
||||
|
||||
Grbl 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.
|
||||
|
||||
Grbl 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 Grbl. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// This module is to be considered a sub-module of stepper.c. Please don't include
|
||||
// this file from any other module.
|
||||
|
||||
#ifndef planner_h
|
||||
#define planner_h
|
||||
|
||||
#include "Configuration.h"
|
||||
|
||||
// This struct is used when buffering the setup for each linear movement "nominal" values are as specified in
|
||||
// the source g-code and may never actually be reached if acceleration management is active.
|
||||
typedef struct {
|
||||
// Fields used by the bresenham algorithm for tracing the line
|
||||
long steps_x, steps_y, steps_z, steps_e; // Step count along each axis
|
||||
long step_event_count; // The number of step events required to complete this block
|
||||
volatile long accelerate_until; // The index of the step event on which to stop acceleration
|
||||
volatile long decelerate_after; // The index of the step event on which to start decelerating
|
||||
volatile long acceleration_rate; // The acceleration rate used for acceleration calculation
|
||||
unsigned char direction_bits; // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h)
|
||||
#ifdef ADVANCE
|
||||
long advance_rate;
|
||||
volatile long initial_advance;
|
||||
volatile long final_advance;
|
||||
float advance;
|
||||
#endif
|
||||
|
||||
// Fields used by the motion planner to manage acceleration
|
||||
float speed_x, speed_y, speed_z, speed_e; // Nominal mm/minute for each axis
|
||||
float nominal_speed; // The nominal speed for this block in mm/min
|
||||
float millimeters; // The total travel of this block in mm
|
||||
float entry_speed;
|
||||
float acceleration; // acceleration mm/sec^2
|
||||
|
||||
// Settings for the trapezoid generator
|
||||
long nominal_rate; // The nominal step rate for this block in step_events/sec
|
||||
volatile long initial_rate; // The jerk-adjusted step rate at start of block
|
||||
volatile long final_rate; // The minimal rate at exit
|
||||
long acceleration_st; // acceleration steps/sec^2
|
||||
volatile char busy;
|
||||
} block_t;
|
||||
|
||||
// Initialize the motion plan subsystem
|
||||
void plan_init();
|
||||
|
||||
// Add a new linear movement to the buffer. x, y and z is the signed, absolute target position in
|
||||
// millimaters. Feed rate specifies the speed of the motion.
|
||||
void plan_buffer_line(float x, float y, float z, float e, float feed_rate);
|
||||
|
||||
// Set position. Used for G92 instructions.
|
||||
void plan_set_position(float x, float y, float z, float e);
|
||||
|
||||
// Called when the current block is no longer needed. Discards the block and makes the memory
|
||||
// availible for new blocks.
|
||||
void plan_discard_current_block();
|
||||
|
||||
// Gets the current block. Returns NULL if buffer empty
|
||||
block_t *plan_get_current_block();
|
||||
|
||||
void check_axes_activity();
|
||||
|
||||
extern unsigned long minsegmenttime;
|
||||
extern float max_feedrate[4]; // set the max speeds
|
||||
extern float axis_steps_per_unit[4];
|
||||
extern long max_acceleration_units_per_sq_second[4]; // Use M201 to override by software
|
||||
extern float minimumfeedrate;
|
||||
extern float acceleration; // Normal acceleration mm/s^2 THIS IS THE DEFAULT ACCELERATION for all moves. M204 SXXXX
|
||||
extern float retract_acceleration; // mm/s^2 filament pull-pack and push-forward while standing still in the other axis M204 TXXXX
|
||||
extern float max_xy_jerk; //speed than can be stopped at once, if i understand correctly.
|
||||
extern float max_z_jerk;
|
||||
extern float mintravelfeedrate;
|
||||
extern unsigned long axis_steps_per_sqr_second[NUM_AXIS];
|
||||
|
||||
#endif
|
||||
|
@ -115,7 +115,7 @@ asm volatile ( \
|
||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 |= (1<<OCIE1A)
|
||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 &= ~(1<<OCIE1A)
|
||||
|
||||
static block_t *current_block; // A pointer to the block currently being traced
|
||||
block_t *current_block; // A pointer to the block currently being traced
|
||||
|
||||
// Variables used by The Stepper Driver Interrupt
|
||||
static unsigned char out_bits; // The next stepping-bits to be output
|
||||
|
@ -1,40 +1,44 @@
|
||||
/*
|
||||
stepper.h - stepper motor driver: executes motion plans of planner.c using the stepper motors
|
||||
Part of Grbl
|
||||
|
||||
Copyright (c) 2009-2011 Simen Svale Skogsrud
|
||||
|
||||
Grbl 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.
|
||||
|
||||
Grbl 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 Grbl. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef stepper_h
|
||||
#define stepper_h
|
||||
// Initialize and start the stepper motor subsystem
|
||||
void st_init();
|
||||
|
||||
// Block until all buffered steps are executed
|
||||
void st_synchronize();
|
||||
|
||||
// The stepper subsystem goes to sleep when it runs out of things to execute. Call this
|
||||
// to notify the subsystem that it is time to go to work.
|
||||
void st_wake_up();
|
||||
|
||||
// if DEBUG_STEPS is enabled, M114 can be used to compare two methods of determining the X,Y,Z position of the printer.
|
||||
// for debugging purposes only, should be disabled by default
|
||||
#ifdef DEBUG_STEPS
|
||||
extern volatile long count_position[NUM_AXIS];
|
||||
extern volatile int count_direction[NUM_AXIS];
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/*
|
||||
stepper.h - stepper motor driver: executes motion plans of planner.c using the stepper motors
|
||||
Part of Grbl
|
||||
|
||||
Copyright (c) 2009-2011 Simen Svale Skogsrud
|
||||
|
||||
Grbl 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.
|
||||
|
||||
Grbl 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 Grbl. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef stepper_h
|
||||
#define stepper_h
|
||||
|
||||
#include "planner.h"
|
||||
|
||||
// Initialize and start the stepper motor subsystem
|
||||
void st_init();
|
||||
|
||||
// Block until all buffered steps are executed
|
||||
void st_synchronize();
|
||||
|
||||
// The stepper subsystem goes to sleep when it runs out of things to execute. Call this
|
||||
// to notify the subsystem that it is time to go to work.
|
||||
void st_wake_up();
|
||||
|
||||
// if DEBUG_STEPS is enabled, M114 can be used to compare two methods of determining the X,Y,Z position of the printer.
|
||||
// for debugging purposes only, should be disabled by default
|
||||
#ifdef DEBUG_STEPS
|
||||
extern volatile long count_position[NUM_AXIS];
|
||||
extern volatile int count_direction[NUM_AXIS];
|
||||
#endif
|
||||
|
||||
extern block_t *current_block; // A pointer to the block currently being traced
|
||||
#endif
|
||||
|
@ -90,14 +90,15 @@ void manage_heater()
|
||||
|
||||
float pid_input;
|
||||
float pid_output;
|
||||
if(temp_meas_ready == true) {
|
||||
if(temp_meas_ready != true) //better readability
|
||||
return;
|
||||
|
||||
CRITICAL_SECTION_START;
|
||||
temp_meas_ready = false;
|
||||
CRITICAL_SECTION_END;
|
||||
|
||||
#ifdef PIDTEMP
|
||||
pid_input = analog2temp(current_raw[0]);
|
||||
pid_input = analog2temp(current_raw[TEMPSENSOR_HOTEND]);
|
||||
|
||||
#ifndef PID_OPENLOOP
|
||||
pid_error = pid_setpoint - pid_input;
|
||||
@ -118,10 +119,13 @@ CRITICAL_SECTION_END;
|
||||
temp_iState += pid_error;
|
||||
temp_iState = constrain(temp_iState, temp_iState_min, temp_iState_max);
|
||||
iTerm = Ki * temp_iState;
|
||||
#define K1 0.95
|
||||
//K1 defined in Configuration.h in the PID settings
|
||||
#define K2 (1.0-K1)
|
||||
dTerm = (Kd * (pid_input - temp_dState))*K2 + (K1 * dTerm);
|
||||
temp_dState = pid_input;
|
||||
#ifdef PID_ADD_EXTRUSION_RATE
|
||||
pTerm+=Kc*current_block->speed_e; //additional heating if extrusion speed is high
|
||||
#endif
|
||||
pid_output = constrain(pTerm + iTerm - dTerm, 0, PID_MAX);
|
||||
}
|
||||
#endif //PID_OPENLOOP
|
||||
@ -157,7 +161,7 @@ CRITICAL_SECTION_END;
|
||||
previous_millis_bed_heater = millis();
|
||||
|
||||
#if TEMP_1_PIN > -1
|
||||
if(current_raw[1] >= target_raw[1])
|
||||
if(current_raw[TEMPSENSOR_BED] >= target_raw[TEMPSENSOR_BED])
|
||||
{
|
||||
WRITE(HEATER_1_PIN,LOW);
|
||||
}
|
||||
@ -167,7 +171,6 @@ CRITICAL_SECTION_END;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
// Takes hot end temperature value as input and returns corresponding raw value.
|
||||
// For a thermistor, it uses the RepRap thermistor temp table.
|
||||
@ -428,15 +431,15 @@ ISR(TIMER0_COMPB_vect)
|
||||
raw_temp_2_value = 0;
|
||||
#ifdef MAXTEMP
|
||||
#if (HEATER_0_PIN > -1)
|
||||
if(current_raw[0] >= maxttemp) {
|
||||
target_raw[0] = 0;
|
||||
if(current_raw[TEMPSENSOR_HOTEND] >= maxttemp) {
|
||||
target_raw[TEMPSENSOR_HOTEND] = 0;
|
||||
analogWrite(HEATER_0_PIN, 0);
|
||||
Serial.println("!! Temperature extruder 0 switched off. MAXTEMP triggered !!");
|
||||
}
|
||||
#endif
|
||||
#if (HEATER_2_PIN > -1)
|
||||
if(current_raw[2] >= maxttemp) {
|
||||
target_raw[2] = 0;
|
||||
if(current_raw[TEMPSENSOR_AUX] >= maxttemp) {
|
||||
target_raw[TEMPSENSOR_AUX] = 0;
|
||||
analogWrite(HEATER_2_PIN, 0);
|
||||
Serial.println("!! Temperature extruder 1 switched off. MAXTEMP triggered !!");
|
||||
}
|
||||
@ -444,15 +447,15 @@ ISR(TIMER0_COMPB_vect)
|
||||
#endif //MAXTEMP
|
||||
#ifdef MINTEMP
|
||||
#if (HEATER_0_PIN > -1)
|
||||
if(current_raw[0] <= minttemp) {
|
||||
target_raw[0] = 0;
|
||||
if(current_raw[TEMPSENSOR_HOTEND] <= minttemp) {
|
||||
target_raw[TEMPSENSOR_HOTEND] = 0;
|
||||
analogWrite(HEATER_0_PIN, 0);
|
||||
Serial.println("!! Temperature extruder 0 switched off. MINTEMP triggered !!");
|
||||
}
|
||||
#endif
|
||||
#if (HEATER_2_PIN > -1)
|
||||
if(current_raw[2] <= minttemp) {
|
||||
target_raw[2] = 0;
|
||||
if(current_raw[TEMPSENSOR_AUX] <= minttemp) {
|
||||
target_raw[TEMPSENSOR_AUX] = 0;
|
||||
analogWrite(HEATER_2_PIN, 0);
|
||||
Serial.println("!! Temperature extruder 1 switched off. MINTEMP triggered !!");
|
||||
}
|
||||
|
@ -1,55 +1,58 @@
|
||||
/*
|
||||
temperature.h - temperature controller
|
||||
Part of Marlin
|
||||
|
||||
Copyright (c) 2011 Erik van der Zalm
|
||||
|
||||
Grbl 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.
|
||||
|
||||
Grbl 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 Grbl. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef temperature_h
|
||||
#define temperature_h
|
||||
|
||||
void manage_inactivity(byte debug);
|
||||
|
||||
void tp_init();
|
||||
void manage_heater();
|
||||
//int temp2analogu(int celsius, const short table[][2], int numtemps);
|
||||
//float analog2tempu(int raw, const short table[][2], int numtemps);
|
||||
float temp2analog(int celsius);
|
||||
float temp2analogBed(int celsius);
|
||||
float analog2temp(int raw);
|
||||
float analog2tempBed(int raw);
|
||||
|
||||
#ifdef HEATER_USES_THERMISTOR
|
||||
#define HEATERSOURCE 1
|
||||
#endif
|
||||
#ifdef BED_USES_THERMISTOR
|
||||
#define BEDSOURCE 1
|
||||
#endif
|
||||
|
||||
//#define temp2analogh( c ) temp2analogu((c),temptable,NUMTEMPS)
|
||||
//#define analog2temp( c ) analog2tempu((c),temptable,NUMTEMPS
|
||||
|
||||
|
||||
extern float Kp;
|
||||
extern float Ki;
|
||||
extern float Kd;
|
||||
extern float Kc;
|
||||
|
||||
extern int target_raw[3];
|
||||
extern int current_raw[3];
|
||||
extern double pid_setpoint;
|
||||
|
||||
#endif
|
||||
/*
|
||||
temperature.h - temperature controller
|
||||
Part of Marlin
|
||||
|
||||
Copyright (c) 2011 Erik van der Zalm
|
||||
|
||||
Grbl 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.
|
||||
|
||||
Grbl 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 Grbl. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef temperature_h
|
||||
#define temperature_h
|
||||
|
||||
#include "Marlin.h"
|
||||
#ifdef PID_ADD_EXTRUSION_RATE
|
||||
#include "stepper.h"
|
||||
#endif
|
||||
void tp_init();
|
||||
void manage_heater();
|
||||
//int temp2analogu(int celsius, const short table[][2], int numtemps);
|
||||
//float analog2tempu(int raw, const short table[][2], int numtemps);
|
||||
float temp2analog(int celsius);
|
||||
float temp2analogBed(int celsius);
|
||||
float analog2temp(int raw);
|
||||
float analog2tempBed(int raw);
|
||||
|
||||
#ifdef HEATER_USES_THERMISTOR
|
||||
#define HEATERSOURCE 1
|
||||
#endif
|
||||
#ifdef BED_USES_THERMISTOR
|
||||
#define BEDSOURCE 1
|
||||
#endif
|
||||
|
||||
//#define temp2analogh( c ) temp2analogu((c),temptable,NUMTEMPS)
|
||||
//#define analog2temp( c ) analog2tempu((c),temptable,NUMTEMPS
|
||||
|
||||
|
||||
extern float Kp;
|
||||
extern float Ki;
|
||||
extern float Kd;
|
||||
extern float Kc;
|
||||
|
||||
enum {TEMPSENSOR_HOTEND=0,TEMPSENSOR_BED=1, TEMPSENSOR_AUX=2};
|
||||
extern int target_raw[3];
|
||||
extern int current_raw[3];
|
||||
extern double pid_setpoint;
|
||||
|
||||
#endif
|
||||
|
@ -7,67 +7,67 @@
|
||||
|
||||
#define NUMTEMPS_1 61
|
||||
const short temptable_1[NUMTEMPS_1][2] = {
|
||||
{ 23*OVERSAMPLENR , 300 },
|
||||
{ 25*OVERSAMPLENR , 295 },
|
||||
{ 27*OVERSAMPLENR , 290 },
|
||||
{ 28*OVERSAMPLENR , 285 },
|
||||
{ 31*OVERSAMPLENR , 280 },
|
||||
{ 33*OVERSAMPLENR , 275 },
|
||||
{ 35*OVERSAMPLENR , 270 },
|
||||
{ 38*OVERSAMPLENR , 265 },
|
||||
{ 41*OVERSAMPLENR , 260 },
|
||||
{ 44*OVERSAMPLENR , 255 },
|
||||
{ 48*OVERSAMPLENR , 250 },
|
||||
{ 52*OVERSAMPLENR , 245 },
|
||||
{ 56*OVERSAMPLENR , 240 },
|
||||
{ 61*OVERSAMPLENR , 235 },
|
||||
{ 66*OVERSAMPLENR , 230 },
|
||||
{ 71*OVERSAMPLENR , 225 },
|
||||
{ 78*OVERSAMPLENR , 220 },
|
||||
{ 84*OVERSAMPLENR , 215 },
|
||||
{ 92*OVERSAMPLENR , 210 },
|
||||
{ 100*OVERSAMPLENR , 205 },
|
||||
{ 109*OVERSAMPLENR , 200 },
|
||||
{ 120*OVERSAMPLENR , 195 },
|
||||
{ 131*OVERSAMPLENR , 190 },
|
||||
{ 143*OVERSAMPLENR , 185 },
|
||||
{ 156*OVERSAMPLENR , 180 },
|
||||
{ 171*OVERSAMPLENR , 175 },
|
||||
{ 187*OVERSAMPLENR , 170 },
|
||||
{ 205*OVERSAMPLENR , 165 },
|
||||
{ 224*OVERSAMPLENR , 160 },
|
||||
{ 245*OVERSAMPLENR , 155 },
|
||||
{ 268*OVERSAMPLENR , 150 },
|
||||
{ 293*OVERSAMPLENR , 145 },
|
||||
{ 320*OVERSAMPLENR , 140 },
|
||||
{ 348*OVERSAMPLENR , 135 },
|
||||
{ 379*OVERSAMPLENR , 130 },
|
||||
{ 411*OVERSAMPLENR , 125 },
|
||||
{ 445*OVERSAMPLENR , 120 },
|
||||
{ 480*OVERSAMPLENR , 115 },
|
||||
{ 516*OVERSAMPLENR , 110 },
|
||||
{ 553*OVERSAMPLENR , 105 },
|
||||
{ 591*OVERSAMPLENR , 100 },
|
||||
{ 628*OVERSAMPLENR , 95 },
|
||||
{ 665*OVERSAMPLENR , 90 },
|
||||
{ 702*OVERSAMPLENR , 85 },
|
||||
{ 737*OVERSAMPLENR , 80 },
|
||||
{ 770*OVERSAMPLENR , 75 },
|
||||
{ 801*OVERSAMPLENR , 70 },
|
||||
{ 830*OVERSAMPLENR , 65 },
|
||||
{ 857*OVERSAMPLENR , 60 },
|
||||
{ 881*OVERSAMPLENR , 55 },
|
||||
{ 903*OVERSAMPLENR , 50 },
|
||||
{ 922*OVERSAMPLENR , 45 },
|
||||
{ 939*OVERSAMPLENR , 40 },
|
||||
{ 954*OVERSAMPLENR , 35 },
|
||||
{ 966*OVERSAMPLENR , 30 },
|
||||
{ 977*OVERSAMPLENR , 25 },
|
||||
{ 985*OVERSAMPLENR , 20 },
|
||||
{ 993*OVERSAMPLENR , 15 },
|
||||
{ 999*OVERSAMPLENR , 10 },
|
||||
{ 1004*OVERSAMPLENR , 5 },
|
||||
{ 1008*OVERSAMPLENR , 0 } //safety
|
||||
{ 23*OVERSAMPLENR , 300 },
|
||||
{ 25*OVERSAMPLENR , 295 },
|
||||
{ 27*OVERSAMPLENR , 290 },
|
||||
{ 28*OVERSAMPLENR , 285 },
|
||||
{ 31*OVERSAMPLENR , 280 },
|
||||
{ 33*OVERSAMPLENR , 275 },
|
||||
{ 35*OVERSAMPLENR , 270 },
|
||||
{ 38*OVERSAMPLENR , 265 },
|
||||
{ 41*OVERSAMPLENR , 260 },
|
||||
{ 44*OVERSAMPLENR , 255 },
|
||||
{ 48*OVERSAMPLENR , 250 },
|
||||
{ 52*OVERSAMPLENR , 245 },
|
||||
{ 56*OVERSAMPLENR , 240 },
|
||||
{ 61*OVERSAMPLENR , 235 },
|
||||
{ 66*OVERSAMPLENR , 230 },
|
||||
{ 71*OVERSAMPLENR , 225 },
|
||||
{ 78*OVERSAMPLENR , 220 },
|
||||
{ 84*OVERSAMPLENR , 215 },
|
||||
{ 92*OVERSAMPLENR , 210 },
|
||||
{ 100*OVERSAMPLENR , 205 },
|
||||
{ 109*OVERSAMPLENR , 200 },
|
||||
{ 120*OVERSAMPLENR , 195 },
|
||||
{ 131*OVERSAMPLENR , 190 },
|
||||
{ 143*OVERSAMPLENR , 185 },
|
||||
{ 156*OVERSAMPLENR , 180 },
|
||||
{ 171*OVERSAMPLENR , 175 },
|
||||
{ 187*OVERSAMPLENR , 170 },
|
||||
{ 205*OVERSAMPLENR , 165 },
|
||||
{ 224*OVERSAMPLENR , 160 },
|
||||
{ 245*OVERSAMPLENR , 155 },
|
||||
{ 268*OVERSAMPLENR , 150 },
|
||||
{ 293*OVERSAMPLENR , 145 },
|
||||
{ 320*OVERSAMPLENR , 140 },
|
||||
{ 348*OVERSAMPLENR , 135 },
|
||||
{ 379*OVERSAMPLENR , 130 },
|
||||
{ 411*OVERSAMPLENR , 125 },
|
||||
{ 445*OVERSAMPLENR , 120 },
|
||||
{ 480*OVERSAMPLENR , 115 },
|
||||
{ 516*OVERSAMPLENR , 110 },
|
||||
{ 553*OVERSAMPLENR , 105 },
|
||||
{ 591*OVERSAMPLENR , 100 },
|
||||
{ 628*OVERSAMPLENR , 95 },
|
||||
{ 665*OVERSAMPLENR , 90 },
|
||||
{ 702*OVERSAMPLENR , 85 },
|
||||
{ 737*OVERSAMPLENR , 80 },
|
||||
{ 770*OVERSAMPLENR , 75 },
|
||||
{ 801*OVERSAMPLENR , 70 },
|
||||
{ 830*OVERSAMPLENR , 65 },
|
||||
{ 857*OVERSAMPLENR , 60 },
|
||||
{ 881*OVERSAMPLENR , 55 },
|
||||
{ 903*OVERSAMPLENR , 50 },
|
||||
{ 922*OVERSAMPLENR , 45 },
|
||||
{ 939*OVERSAMPLENR , 40 },
|
||||
{ 954*OVERSAMPLENR , 35 },
|
||||
{ 966*OVERSAMPLENR , 30 },
|
||||
{ 977*OVERSAMPLENR , 25 },
|
||||
{ 985*OVERSAMPLENR , 20 },
|
||||
{ 993*OVERSAMPLENR , 15 },
|
||||
{ 999*OVERSAMPLENR , 10 },
|
||||
{ 1004*OVERSAMPLENR , 5 },
|
||||
{ 1008*OVERSAMPLENR , 0 } //safety
|
||||
};
|
||||
#endif
|
||||
#if (THERMISTORHEATER_1 == 2) || (THERMISTORHEATER_2 == 2) || (THERMISTORBED == 2) //200k bed thermistor
|
||||
@ -100,35 +100,35 @@ const short temptable_2[NUMTEMPS_2][2] = {
|
||||
#if (THERMISTORHEATER_1 == 3) || (THERMISTORHEATER_2 == 3) || (THERMISTORBED == 3) //mendel-parts
|
||||
#define NUMTEMPS_3 28
|
||||
const short temptable_3[NUMTEMPS_3][2] = {
|
||||
{1*OVERSAMPLENR,864},
|
||||
{21*OVERSAMPLENR,300},
|
||||
{25*OVERSAMPLENR,290},
|
||||
{29*OVERSAMPLENR,280},
|
||||
{33*OVERSAMPLENR,270},
|
||||
{39*OVERSAMPLENR,260},
|
||||
{46*OVERSAMPLENR,250},
|
||||
{54*OVERSAMPLENR,240},
|
||||
{64*OVERSAMPLENR,230},
|
||||
{75*OVERSAMPLENR,220},
|
||||
{90*OVERSAMPLENR,210},
|
||||
{107*OVERSAMPLENR,200},
|
||||
{128*OVERSAMPLENR,190},
|
||||
{154*OVERSAMPLENR,180},
|
||||
{184*OVERSAMPLENR,170},
|
||||
{221*OVERSAMPLENR,160},
|
||||
{265*OVERSAMPLENR,150},
|
||||
{316*OVERSAMPLENR,140},
|
||||
{375*OVERSAMPLENR,130},
|
||||
{441*OVERSAMPLENR,120},
|
||||
{513*OVERSAMPLENR,110},
|
||||
{588*OVERSAMPLENR,100},
|
||||
{734*OVERSAMPLENR,80},
|
||||
{856*OVERSAMPLENR,60},
|
||||
{938*OVERSAMPLENR,40},
|
||||
{986*OVERSAMPLENR,20},
|
||||
{1008*OVERSAMPLENR,0},
|
||||
{1018*OVERSAMPLENR,-20}
|
||||
};
|
||||
{1*OVERSAMPLENR,864},
|
||||
{21*OVERSAMPLENR,300},
|
||||
{25*OVERSAMPLENR,290},
|
||||
{29*OVERSAMPLENR,280},
|
||||
{33*OVERSAMPLENR,270},
|
||||
{39*OVERSAMPLENR,260},
|
||||
{46*OVERSAMPLENR,250},
|
||||
{54*OVERSAMPLENR,240},
|
||||
{64*OVERSAMPLENR,230},
|
||||
{75*OVERSAMPLENR,220},
|
||||
{90*OVERSAMPLENR,210},
|
||||
{107*OVERSAMPLENR,200},
|
||||
{128*OVERSAMPLENR,190},
|
||||
{154*OVERSAMPLENR,180},
|
||||
{184*OVERSAMPLENR,170},
|
||||
{221*OVERSAMPLENR,160},
|
||||
{265*OVERSAMPLENR,150},
|
||||
{316*OVERSAMPLENR,140},
|
||||
{375*OVERSAMPLENR,130},
|
||||
{441*OVERSAMPLENR,120},
|
||||
{513*OVERSAMPLENR,110},
|
||||
{588*OVERSAMPLENR,100},
|
||||
{734*OVERSAMPLENR,80},
|
||||
{856*OVERSAMPLENR,60},
|
||||
{938*OVERSAMPLENR,40},
|
||||
{986*OVERSAMPLENR,20},
|
||||
{1008*OVERSAMPLENR,0},
|
||||
{1018*OVERSAMPLENR,-20}
|
||||
};
|
||||
|
||||
#endif
|
||||
#if (THERMISTORHEATER_1 == 4) || (THERMISTORHEATER_2 == 4) || (THERMISTORBED == 4) //10k thermistor
|
||||
|
@ -153,4 +153,4 @@
|
||||
#define BLOCK ;
|
||||
#endif
|
||||
#endif //ULTRALCD
|
||||
|
||||
|
||||
|
3186
Marlin/ultralcd.pde
3186
Marlin/ultralcd.pde
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user