@ -71,7 +71,7 @@ float current_temperature_bed = 0.0;
unsigned char soft_pwm_bed ;
unsigned char soft_pwm_bed ;
# ifdef BABYSTEPPING
# ifdef BABYSTEPPING
volatile int babystepsTodo [ 3 ] = { 0 , 0 , 0 } ;
volatile int babystepsTodo [ 3 ] = { 0 } ;
# endif
# endif
# ifdef FILAMENT_SENSOR
# ifdef FILAMENT_SENSOR
@ -191,6 +191,13 @@ unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0,0);
static int read_max6675 ( ) ;
static int read_max6675 ( ) ;
# endif
# endif
# define HAS_TEMP_0 (defined(TEMP_0_PIN) && TEMP_0_PIN > -1)
# define HAS_TEMP_1 (defined(TEMP_1_PIN) && TEMP_1_PIN > -1)
# define HAS_TEMP_2 (defined(TEMP_2_PIN) && TEMP_2_PIN > -1)
# define HAS_TEMP_3 (defined(TEMP_3_PIN) && TEMP_3_PIN > -1)
# define HAS_TEMP_BED (defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1)
# define HAS_FILAMENT_SENSOR (defined(FILAMENT_SENSOR) && defined(FILWIDTH_PIN) && FILWIDTH_PIN > -1)
//===========================================================================
//===========================================================================
//============================= functions ============================
//============================= functions ============================
//===========================================================================
//===========================================================================
@ -201,11 +208,8 @@ void PID_autotune(float temp, int extruder, int ncycles)
int cycles = 0 ;
int cycles = 0 ;
bool heating = true ;
bool heating = true ;
unsigned long temp_millis = millis ( ) ;
unsigned long temp_millis = millis ( ) , t1 = temp_millis , t2 = temp_millis ;
unsigned long t1 = temp_millis ;
long t_high = 0 , t_low = 0 ;
unsigned long t2 = temp_millis ;
long t_high = 0 ;
long t_low = 0 ;
long bias , d ;
long bias , d ;
float Ku , Tu ;
float Ku , Tu ;
@ -216,12 +220,12 @@ void PID_autotune(float temp, int extruder, int ncycles)
( defined ( EXTRUDER_1_AUTO_FAN_PIN ) & & EXTRUDER_1_AUTO_FAN_PIN > - 1 ) | | \
( defined ( EXTRUDER_1_AUTO_FAN_PIN ) & & EXTRUDER_1_AUTO_FAN_PIN > - 1 ) | | \
( defined ( EXTRUDER_2_AUTO_FAN_PIN ) & & EXTRUDER_2_AUTO_FAN_PIN > - 1 ) | | \
( defined ( EXTRUDER_2_AUTO_FAN_PIN ) & & EXTRUDER_2_AUTO_FAN_PIN > - 1 ) | | \
( defined ( EXTRUDER_3_AUTO_FAN_PIN ) & & EXTRUDER_3_AUTO_FAN_PIN > - 1 )
( defined ( EXTRUDER_3_AUTO_FAN_PIN ) & & EXTRUDER_3_AUTO_FAN_PIN > - 1 )
unsigned long extruder_autofan_last_check = millis( ) ;
unsigned long extruder_autofan_last_check = temp_ millis;
# endif
# endif
if ( ( extruder > = EXTRUDERS )
if ( extruder > = EXTRUDERS
# if (TEMP_BED_PIN <= -1)
# if !HAS_TEMP_BED
| | ( extruder < 0 )
| | extruder < 0
# endif
# endif
) {
) {
SERIAL_ECHOLN ( " PID Autotune failed. Bad extruder number. " ) ;
SERIAL_ECHOLN ( " PID Autotune failed. Bad extruder number. " ) ;
@ -233,21 +237,15 @@ void PID_autotune(float temp, int extruder, int ncycles)
disable_heater ( ) ; // switch off all heaters.
disable_heater ( ) ; // switch off all heaters.
if ( extruder < 0 )
if ( extruder < 0 )
{
soft_pwm_bed = bias = d = MAX_BED_POWER / 2 ;
soft_pwm_bed = ( MAX_BED_POWER ) / 2 ;
bias = d = ( MAX_BED_POWER ) / 2 ;
}
else
else
{
soft_pwm [ extruder ] = bias = d = PID_MAX / 2 ;
soft_pwm [ extruder ] = ( PID_MAX ) / 2 ;
bias = d = ( PID_MAX ) / 2 ;
}
// PID Tuning loop
for ( ; ; ) {
for ( ; ; ) {
unsigned long ms = millis ( ) ;
if ( temp_meas_ready = = true ) { // temp sample ready
if ( temp_meas_ready = = true ) { // temp sample ready
updateTemperaturesFromRawValues ( ) ;
updateTemperaturesFromRawValues ( ) ;
@ -260,41 +258,41 @@ void PID_autotune(float temp, int extruder, int ncycles)
( defined ( EXTRUDER_1_AUTO_FAN_PIN ) & & EXTRUDER_1_AUTO_FAN_PIN > - 1 ) | | \
( defined ( EXTRUDER_1_AUTO_FAN_PIN ) & & EXTRUDER_1_AUTO_FAN_PIN > - 1 ) | | \
( defined ( EXTRUDER_2_AUTO_FAN_PIN ) & & EXTRUDER_2_AUTO_FAN_PIN > - 1 ) | | \
( defined ( EXTRUDER_2_AUTO_FAN_PIN ) & & EXTRUDER_2_AUTO_FAN_PIN > - 1 ) | | \
( defined ( EXTRUDER_3_AUTO_FAN_PIN ) & & EXTRUDER_3_AUTO_FAN_PIN > - 1 )
( defined ( EXTRUDER_3_AUTO_FAN_PIN ) & & EXTRUDER_3_AUTO_FAN_PIN > - 1 )
if ( millis ( ) - extruder_autofan_last_check > 2500 ) {
if ( ms > extruder_autofan_last_check + 2500 ) {
checkExtruderAutoFans ( ) ;
checkExtruderAutoFans ( ) ;
extruder_autofan_last_check = m illi s( ) ;
extruder_autofan_last_check = m s;
}
}
# endif
# endif
if ( heating = = true & & input > temp ) {
if ( heating = = true & & input > temp ) {
if ( m illi s( ) - t2 > 5000 ) {
if ( m s - t2 > 5000 ) {
heating = false ;
heating = false ;
if ( extruder < 0 )
if ( extruder < 0 )
soft_pwm_bed = ( bias - d ) > > 1 ;
soft_pwm_bed = ( bias - d ) > > 1 ;
else
else
soft_pwm [ extruder ] = ( bias - d ) > > 1 ;
soft_pwm [ extruder ] = ( bias - d ) > > 1 ;
t1 = m illi s( ) ;
t1 = m s;
t_high = t1 - t2 ;
t_high = t1 - t2 ;
max = temp ;
max = temp ;
}
}
}
}
if ( heating = = false & & input < temp ) {
if ( heating = = false & & input < temp ) {
if ( m illi s( ) - t1 > 5000 ) {
if ( m s - t1 > 5000 ) {
heating = true ;
heating = true ;
t2 = m illi s( ) ;
t2 = m s;
t_low = t2 - t1 ;
t_low = t2 - t1 ;
if ( cycles > 0 ) {
if ( cycles > 0 ) {
long max_pow = extruder < 0 ? MAX_BED_POWER : PID_MAX ;
bias + = ( d * ( t_high - t_low ) ) / ( t_low + t_high ) ;
bias + = ( d * ( t_high - t_low ) ) / ( t_low + t_high ) ;
bias = constrain ( bias , 20 , ( extruder < 0 ? ( MAX_BED_POWER ) : ( PID_MAX ) ) - 20 ) ;
bias = constrain ( bias , 20 , max_pow - 20 ) ;
if ( bias > ( extruder < 0 ? ( MAX_BED_POWER ) : ( PID_MAX ) ) / 2 ) d = ( extruder < 0 ? ( MAX_BED_POWER ) : ( PID_MAX ) ) - 1 - bias ;
d = ( bias > max_pow / 2 ) ? max_pow - 1 - bias : bias ;
else d = bias ;
SERIAL_PROTOCOLPGM ( " bias: " ) ; SERIAL_PROTOCOL ( bias ) ;
SERIAL_PROTOCOLPGM ( " bias: " ) ; SERIAL_PROTOCOL ( bias ) ;
SERIAL_PROTOCOLPGM ( " d: " ) ; SERIAL_PROTOCOL ( d ) ;
SERIAL_PROTOCOLPGM ( " d: " ) ; SERIAL_PROTOCOL ( d ) ;
SERIAL_PROTOCOLPGM ( " min: " ) ; SERIAL_PROTOCOL ( min ) ;
SERIAL_PROTOCOLPGM ( " min: " ) ; SERIAL_PROTOCOL ( min ) ;
SERIAL_PROTOCOLPGM ( " max: " ) ; SERIAL_PROTOCOLLN ( max ) ;
SERIAL_PROTOCOLPGM ( " max: " ) ; SERIAL_PROTOCOLLN ( max ) ;
if ( cycles > 2 ) {
if ( cycles > 2 ) {
Ku = ( 4.0 * d ) / ( 3.14159 * ( max - min ) / 2.0 ) ;
Ku = ( 4.0 * d ) / ( 3.14159 265 * ( max - min ) / 2.0 ) ;
Tu = ( ( float ) ( t_low + t_high ) / 1000.0 ) ;
Tu = ( ( float ) ( t_low + t_high ) / 1000.0 ) ;
SERIAL_PROTOCOLPGM ( " Ku: " ) ; SERIAL_PROTOCOL ( Ku ) ;
SERIAL_PROTOCOLPGM ( " Ku: " ) ; SERIAL_PROTOCOL ( Ku ) ;
SERIAL_PROTOCOLPGM ( " Tu: " ) ; SERIAL_PROTOCOLLN ( Tu ) ;
SERIAL_PROTOCOLPGM ( " Tu: " ) ; SERIAL_PROTOCOLLN ( Tu ) ;
@ -332,16 +330,18 @@ void PID_autotune(float temp, int extruder, int ncycles)
}
}
}
}
}
}
if ( input > ( temp + 20 ) ) {
if ( input > temp + 20 ) {
SERIAL_PROTOCOLLNPGM ( " PID Autotune failed! Temperature too high " ) ;
SERIAL_PROTOCOLLNPGM ( " PID Autotune failed! Temperature too high " ) ;
return ;
return ;
}
}
if ( millis ( ) - temp_millis > 2000 ) {
// Every 2 seconds...
if ( ms - temp_millis > 2000 ) {
int p ;
int p ;
if ( extruder < 0 ) {
if ( extruder < 0 ) {
p = soft_pwm_bed ;
p = soft_pwm_bed ;
SERIAL_PROTOCOLPGM ( " ok B: " ) ;
SERIAL_PROTOCOLPGM ( " ok B: " ) ;
} else {
}
else {
p = soft_pwm [ extruder ] ;
p = soft_pwm [ extruder ] ;
SERIAL_PROTOCOLPGM ( " ok T: " ) ;
SERIAL_PROTOCOLPGM ( " ok T: " ) ;
}
}
@ -350,9 +350,10 @@ void PID_autotune(float temp, int extruder, int ncycles)
SERIAL_PROTOCOLPGM ( " @: " ) ;
SERIAL_PROTOCOLPGM ( " @: " ) ;
SERIAL_PROTOCOLLN ( p ) ;
SERIAL_PROTOCOLLN ( p ) ;
temp_millis = millis ( ) ;
temp_millis = ms ;
}
} // every 2 seconds
if ( ( ( millis ( ) - t1 ) + ( millis ( ) - t2 ) ) > ( 10L * 60L * 1000L * 2L ) ) {
// Over 2 minutes?
if ( ( ( ms - t1 ) + ( ms - t2 ) ) > ( 10L * 60L * 1000L * 2L ) ) {
SERIAL_PROTOCOLLNPGM ( " PID Autotune failed! timeout " ) ;
SERIAL_PROTOCOLLNPGM ( " PID Autotune failed! timeout " ) ;
return ;
return ;
}
}
@ -364,8 +365,7 @@ void PID_autotune(float temp, int extruder, int ncycles)
}
}
}
}
void updatePID ( )
void updatePID ( ) {
{
# ifdef PIDTEMP
# ifdef PIDTEMP
for ( int e = 0 ; e < EXTRUDERS ; e + + ) {
for ( int e = 0 ; e < EXTRUDERS ; e + + ) {
temp_iState_max [ e ] = PID_INTEGRAL_DRIVE_MAX / PID_PARAM ( Ki , e ) ;
temp_iState_max [ e ] = PID_INTEGRAL_DRIVE_MAX / PID_PARAM ( Ki , e ) ;
@ -377,9 +377,7 @@ void updatePID()
}
}
int getHeaterPower ( int heater ) {
int getHeaterPower ( int heater ) {
if ( heater < 0 )
return heater < 0 ? soft_pwm_bed : soft_pwm [ heater ] ;
return soft_pwm_bed ;
return soft_pwm [ heater ] ;
}
}
# if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \
# if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \
@ -473,27 +471,58 @@ void checkExtruderAutoFans()
# endif // any extruder auto fan pins set
# endif // any extruder auto fan pins set
void manage_heater ( )
//
{
// Error checking and Write Routines
float pid_input ;
//
float pid_output ;
# if !defined(HEATER_0_PIN) || HEATER_0_PIN < 0
# error HEATER_0_PIN not defined for this board
# endif
# define WRITE_HEATER_0P(v) WRITE(HEATER_0_PIN, v)
# if EXTRUDERS > 1 || defined(HEATERS_PARALLEL)
# if !defined(HEATER_1_PIN) || HEATER_1_PIN < 0
# error HEATER_1_PIN not defined for this board
# endif
# define WRITE_HEATER_1(v) WRITE(HEATER_1_PIN, v)
# if EXTRUDERS > 2
# if !defined(HEATER_2_PIN) || HEATER_2_PIN < 0
# error HEATER_2_PIN not defined for this board
# endif
# define WRITE_HEATER_2(v) WRITE(HEATER_2_PIN, v)
# if EXTRUDERS > 3
# if !defined(HEATER_3_PIN) || HEATER_3_PIN < 0
# error HEATER_3_PIN not defined for this board
# endif
# define WRITE_HEATER_3(v) WRITE(HEATER_3_PIN, v)
# endif
# endif
# endif
# ifdef HEATERS_PARALLEL
# define WRITE_HEATER_0(v) { WRITE_HEATER_0P(v); WRITE_HEATER_1(v); }
# else
# define WRITE_HEATER_0(v) WRITE_HEATER_0P(v)
# endif
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
# define WRITE_HEATER_BED(v) WRITE(HEATER_BED_PIN, v)
# endif
if ( temp_meas_ready ! = true ) //better readability
void manage_heater ( ) {
return ;
if ( ! temp_meas_ready ) return ;
float pid_input , pid_output ;
updateTemperaturesFromRawValues ( ) ;
updateTemperaturesFromRawValues ( ) ;
# ifdef HEATER_0_USES_MAX6675
# ifdef HEATER_0_USES_MAX6675
if ( current_temperature [ 0 ] > 1023 | | current_temperature [ 0 ] > HEATER_0_MAXTEMP ) {
float ct = current_temperature [ 0 ] ;
max_temp_error ( 0 ) ;
if ( ct > min ( HEATER_0_MAXTEMP , 1023 ) ) max_temp_error ( 0 ) ;
}
if ( ct < max ( HEATER_0_MINTEMP , 0.01 ) ) min_temp_error ( 0 ) ;
if ( current_temperature [ 0 ] = = 0 | | current_temperature [ 0 ] < HEATER_0_MINTEMP ) {
min_temp_error ( 0 ) ;
}
# endif //HEATER_0_USES_MAX6675
# endif //HEATER_0_USES_MAX6675
for ( int e = 0 ; e < EXTRUDERS ; e + + )
unsigned long ms = millis ( ) ;
{
// Loop through all extruders
for ( int e = 0 ; e < EXTRUDERS ; e + + ) {
# if defined (THERMAL_RUNAWAY_PROTECTION_PERIOD) && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0
# if defined (THERMAL_RUNAWAY_PROTECTION_PERIOD) && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0
thermal_runaway_protection ( & thermal_runaway_state_machine [ e ] , & thermal_runaway_timer [ e ] , current_temperature [ e ] , target_temperature [ e ] , e , THERMAL_RUNAWAY_PROTECTION_PERIOD , THERMAL_RUNAWAY_PROTECTION_HYSTERESIS ) ;
thermal_runaway_protection ( & thermal_runaway_state_machine [ e ] , & thermal_runaway_timer [ e ] , current_temperature [ e ] , target_temperature [ e ] , e , THERMAL_RUNAWAY_PROTECTION_PERIOD , THERMAL_RUNAWAY_PROTECTION_HYSTERESIS ) ;
@ -529,7 +558,8 @@ void manage_heater()
if ( pid_output > PID_MAX ) {
if ( pid_output > PID_MAX ) {
if ( pid_error [ e ] > 0 ) temp_iState [ e ] - = pid_error [ e ] ; // conditional un-integration
if ( pid_error [ e ] > 0 ) temp_iState [ e ] - = pid_error [ e ] ; // conditional un-integration
pid_output = PID_MAX ;
pid_output = PID_MAX ;
} else if ( pid_output < 0 ) {
}
else if ( pid_output < 0 ) {
if ( pid_error [ e ] < 0 ) temp_iState [ e ] - = pid_error [ e ] ; // conditional un-integration
if ( pid_error [ e ] < 0 ) temp_iState [ e ] - = pid_error [ e ] ; // conditional un-integration
pid_output = 0 ;
pid_output = 0 ;
}
}
@ -538,6 +568,7 @@ void manage_heater()
# else
# else
pid_output = constrain ( target_temperature [ e ] , 0 , PID_MAX ) ;
pid_output = constrain ( target_temperature [ e ] , 0 , PID_MAX ) ;
# endif //PID_OPENLOOP
# endif //PID_OPENLOOP
# ifdef PID_DEBUG
# ifdef PID_DEBUG
SERIAL_ECHO_START ;
SERIAL_ECHO_START ;
SERIAL_ECHO ( " PID_DEBUG " ) ;
SERIAL_ECHO ( " PID_DEBUG " ) ;
@ -553,36 +584,31 @@ void manage_heater()
SERIAL_ECHO ( " dTerm " ) ;
SERIAL_ECHO ( " dTerm " ) ;
SERIAL_ECHOLN ( dTerm [ e ] ) ;
SERIAL_ECHOLN ( dTerm [ e ] ) ;
# endif //PID_DEBUG
# endif //PID_DEBUG
# else /* PID off */
# else /* PID off */
pid_output = 0 ;
pid_output = 0 ;
if ( current_temperature [ e ] < target_temperature [ e ] ) {
if ( current_temperature [ e ] < target_temperature [ e ] ) pid_output = PID_MAX ;
pid_output = PID_MAX ;
}
# endif
# endif
// Check if temperature is within the correct range
// Check if temperature is within the correct range
if ( ( current_temperature [ e ] > minttemp [ e ] ) & & ( current_temperature [ e ] < maxttemp [ e ] ) )
soft_pwm [ e ] = current_temperature [ e ] > minttemp [ e ] & & current_temperature [ e ] < maxttemp [ e ] ? ( int ) pid_output > > 1 : 0 ;
{
soft_pwm [ e ] = ( int ) pid_output > > 1 ;
}
else {
soft_pwm [ e ] = 0 ;
}
# ifdef WATCH_TEMP_PERIOD
# ifdef WATCH_TEMP_PERIOD
if ( watchmillis [ e ] & & millis ( ) - watchmillis [ e ] > WATCH_TEMP_PERIOD )
if ( watchmillis [ e ] & & ms > watchmillis [ e ] + WATCH_TEMP_PERIOD ) {
{
if ( degHotend ( e ) < watch_start_temp [ e ] + WATCH_TEMP_INCREASE ) {
if ( degHotend ( e ) < watch_start_temp [ e ] + WATCH_TEMP_INCREASE )
{
setTargetHotend ( 0 , e ) ;
setTargetHotend ( 0 , e ) ;
LCD_MESSAGEPGM ( " Heating failed " ) ;
LCD_MESSAGEPGM ( " Heating failed " ) ;
SERIAL_ECHO_START ;
SERIAL_ECHO_START ;
SERIAL_ECHOLN ( " Heating failed " ) ;
SERIAL_ECHOLNPGM ( " Heating failed " ) ;
} else {
}
else {
watchmillis [ e ] = 0 ;
watchmillis [ e ] = 0 ;
}
}
}
}
# endif
# endif //WATCH_TEMP_PERIOD
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
if ( fabs ( current_temperature [ 0 ] - redundant_temperature ) > MAX_REDUNDANT_TEMP_SENSOR_DIFF ) {
if ( fabs ( current_temperature [ 0 ] - redundant_temperature ) > MAX_REDUNDANT_TEMP_SENSOR_DIFF ) {
disable_heater ( ) ;
disable_heater ( ) ;
@ -595,24 +621,23 @@ void manage_heater()
Stop ( ) ;
Stop ( ) ;
# endif
# endif
}
}
# endif
# endif //TEMP_SENSOR_1_AS_REDUNDANT
} // End extruder for loop
} // Extruders Loop
# if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \
# if (defined(EXTRUDER_0_AUTO_FAN_PIN) && EXTRUDER_0_AUTO_FAN_PIN > -1) || \
( defined ( EXTRUDER_1_AUTO_FAN_PIN ) & & EXTRUDER_1_AUTO_FAN_PIN > - 1 ) | | \
( defined ( EXTRUDER_1_AUTO_FAN_PIN ) & & EXTRUDER_1_AUTO_FAN_PIN > - 1 ) | | \
( defined ( EXTRUDER_2_AUTO_FAN_PIN ) & & EXTRUDER_2_AUTO_FAN_PIN > - 1 )
( defined ( EXTRUDER_2_AUTO_FAN_PIN ) & & EXTRUDER_2_AUTO_FAN_PIN > - 1 )
if ( millis ( ) - extruder_autofan_last_check > 2500 ) // only need to check fan state very infrequently
if ( ms > extruder_autofan_last_check + 2500 ) { // only need to check fan state very infrequently
{
checkExtruderAutoFans ( ) ;
checkExtruderAutoFans ( ) ;
extruder_autofan_last_check = m illi s( ) ;
extruder_autofan_last_check = m s;
}
}
# endif
# endif
# ifndef PIDTEMPBED
# ifndef PIDTEMPBED
if ( millis ( ) - previous_millis_bed_heater < BED_CHECK_INTERVAL )
if ( ms < previous_millis_bed_heater + BED_CHECK_INTERVAL ) return ;
return ;
previous_millis_bed_heater = ms ;
previous_millis_bed_heater = millis ( ) ;
# endif //PIDTEMPBED
# endif
# if TEMP_SENSOR_BED != 0
# if TEMP_SENSOR_BED != 0
@ -639,7 +664,8 @@ void manage_heater()
if ( pid_output > MAX_BED_POWER ) {
if ( pid_output > MAX_BED_POWER ) {
if ( pid_error_bed > 0 ) temp_iState_bed - = pid_error_bed ; // conditional un-integration
if ( pid_error_bed > 0 ) temp_iState_bed - = pid_error_bed ; // conditional un-integration
pid_output = MAX_BED_POWER ;
pid_output = MAX_BED_POWER ;
} else if ( pid_output < 0 ) {
}
else if ( pid_output < 0 ) {
if ( pid_error_bed < 0 ) temp_iState_bed - = pid_error_bed ; // conditional un-integration
if ( pid_error_bed < 0 ) temp_iState_bed - = pid_error_bed ; // conditional un-integration
pid_output = 0 ;
pid_output = 0 ;
}
}
@ -648,74 +674,46 @@ void manage_heater()
pid_output = constrain ( target_temperature_bed , 0 , MAX_BED_POWER ) ;
pid_output = constrain ( target_temperature_bed , 0 , MAX_BED_POWER ) ;
# endif //PID_OPENLOOP
# endif //PID_OPENLOOP
if ( ( current_temperature_bed > BED_MINTEMP ) & & ( current_temperature_bed < BED_MAXTEMP ) )
soft_pwm_bed = current_temperature_bed > BED_MINTEMP & & current_temperature_bed < BED_MAXTEMP ? ( int ) pid_output > > 1 : 0 ;
{
soft_pwm_bed = ( int ) pid_output > > 1 ;
}
else {
soft_pwm_bed = 0 ;
}
# elif !defined(BED_LIMIT_SWITCHING)
# elif !defined(BED_LIMIT_SWITCHING)
// Check if temperature is within the correct range
// Check if temperature is within the correct range
if ( ( current_temperature_bed > BED_MINTEMP ) & & ( current_temperature_bed < BED_MAXTEMP ) )
if ( current_temperature_bed > BED_MINTEMP & & current_temperature_bed < BED_MAXTEMP ) {
{
soft_pwm_bed = current_temperature_bed > = target_temperature_bed ? 0 : MAX_BED_POWER > > 1 ;
if ( current_temperature_bed > = target_temperature_bed )
{
soft_pwm_bed = 0 ;
}
}
else
else {
{
soft_pwm_bed = MAX_BED_POWER > > 1 ;
}
}
else
{
soft_pwm_bed = 0 ;
soft_pwm_bed = 0 ;
WRITE ( HEATER_BED_PIN , LOW ) ;
WRITE_HEATER_BED ( LOW ) ;
}
}
# else //#ifdef BED_LIMIT_SWITCHING
# else //#ifdef BED_LIMIT_SWITCHING
// Check if temperature is within the correct band
// Check if temperature is within the correct band
if ( ( current_temperature_bed > BED_MINTEMP ) & & ( current_temperature_bed < BED_MAXTEMP ) )
if ( current_temperature_bed > BED_MINTEMP & & current_temperature_bed < BED_MAXTEMP ) {
{
if ( current_temperature_bed > = target_temperature_bed + BED_HYSTERESIS )
if ( current_temperature_bed > target_temperature_bed + BED_HYSTERESIS )
{
soft_pwm_bed = 0 ;
soft_pwm_bed = 0 ;
}
else if ( current_temperature_bed < = target_temperature_bed - BED_HYSTERESIS )
else if ( current_temperature_bed < = target_temperature_bed - BED_HYSTERESIS )
{
soft_pwm_bed = MAX_BED_POWER > > 1 ;
soft_pwm_bed = MAX_BED_POWER > > 1 ;
}
}
}
else {
else
{
soft_pwm_bed = 0 ;
soft_pwm_bed = 0 ;
WRITE ( HEATER_BED_PIN , LOW ) ;
WRITE_HEATER_BED ( LOW ) ;
}
}
# endif
# endif
# endif
# endif //TEMP_SENSOR_BED != 0
//code for controlling the extruder rate based on the width sensor
// Control the extruder rate based on the width sensor
# ifdef FILAMENT_SENSOR
# ifdef FILAMENT_SENSOR
if ( filament_sensor )
if ( filament_sensor ) {
{
meas_shift_index = delay_index1 - meas_delay_cm ;
meas_shift_index = delay_index1 - meas_delay_cm ;
if ( meas_shift_index < 0 )
if ( meas_shift_index < 0 ) meas_shift_index + = MAX_MEASUREMENT_DELAY + 1 ; //loop around buffer if needed
meas_shift_index = meas_shift_index + ( MAX_MEASUREMENT_DELAY + 1 ) ; //loop around buffer if needed
//get the delayed info and add 100 to reconstitute to a percent of the nominal filament diameter
// Get the delayed info and add 100 to reconstitute to a percent of
//then square it to get an area
// the nominal filament diameter then square it to get an area
meas_shift_index = constrain ( meas_shift_index , 0 , MAX_MEASUREMENT_DELAY ) ;
if ( meas_shift_index < 0 )
float vm = pow ( ( measurement_delay [ meas_shift_index ] + 100.0 ) / 100.0 , 2 ) ;
meas_shift_index = 0 ;
if ( vm < 0.01 ) vm = 0.01 ;
else if ( meas_shift_index > MAX_MEASUREMENT_DELAY )
volumetric_multiplier [ FILAMENT_SENSOR_EXTRUDER_NUM ] = vm ;
meas_shift_index = MAX_MEASUREMENT_DELAY ;
volumetric_multiplier [ FILAMENT_SENSOR_EXTRUDER_NUM ] = pow ( ( float ) ( 100 + measurement_delay [ meas_shift_index ] ) / 100.0 , 2 ) ;
if ( volumetric_multiplier [ FILAMENT_SENSOR_EXTRUDER_NUM ] < 0.01 )
volumetric_multiplier [ FILAMENT_SENSOR_EXTRUDER_NUM ] = 0.01 ;
}
}
# endif
# endif //FILAMENT_SENSOR
}
}
# define PGM_RD_W(x) (short)pgm_read_word(&x)
# define PGM_RD_W(x) (short)pgm_read_word(&x)
@ -812,7 +810,7 @@ static void updateTemperaturesFromRawValues()
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
redundant_temperature = analog2temp ( redundant_temperature_raw , 1 ) ;
redundant_temperature = analog2temp ( redundant_temperature_raw , 1 ) ;
# endif
# endif
# if defined (FILAMENT_SENSOR) && (FILWIDTH_PIN > -1) //check if a sensor is supported
# if HAS_FILAMENT_SENSOR
filament_width_meas = analog2widthFil ( ) ;
filament_width_meas = analog2widthFil ( ) ;
# endif
# endif
//Reset the watchdog after we know we have a temperature measurement.
//Reset the watchdog after we know we have a temperature measurement.
@ -824,29 +822,22 @@ static void updateTemperaturesFromRawValues()
}
}
// For converting raw Filament Width to milimeters
# ifdef FILAMENT_SENSOR
# ifdef FILAMENT_SENSOR
// Convert raw Filament Width to millimeters
float analog2widthFil ( ) {
float analog2widthFil ( ) {
return current_raw_filwidth / 16383.0 * 5.0 ;
return current_raw_filwidth / 16383.0 * 5.0 ;
//return current_raw_filwidth;
//return current_raw_filwidth;
}
}
// For converting raw Filament Width to a ratio
// Convert raw Filament Width to a ratio
int widthFil_to_size_ratio ( ) {
int widthFil_to_size_ratio ( ) {
float temp = filament_width_meas ;
float temp ;
if ( temp < MEASURED_LOWER_LIMIT ) temp = filament_width_nominal ; //assume sensor cut out
else if ( temp > MEASURED_UPPER_LIMIT ) temp = MEASURED_UPPER_LIMIT ;
temp = filament_width_meas ;
return filament_width_nominal / temp * 100 ;
if ( filament_width_meas < MEASURED_LOWER_LIMIT )
temp = filament_width_nominal ; //assume sensor cut out
else if ( filament_width_meas > MEASURED_UPPER_LIMIT )
temp = MEASURED_UPPER_LIMIT ;
return ( filament_width_nominal / temp * 100 ) ;
}
}
# endif
# endif
@ -921,57 +912,35 @@ void tp_init()
# endif //HEATER_0_USES_MAX6675
# endif //HEATER_0_USES_MAX6675
# ifdef DIDR2
# define ANALOG_SELECT(pin) do{ if (pin < 8) DIDR0 |= 1 << pin; else DIDR2 |= 1 << (pin - 8); }while(0)
# else
# define ANALOG_SELECT(pin) do{ DIDR0 |= 1 << pin; }while(0)
# endif
// Set analog inputs
// Set analog inputs
ADCSRA = 1 < < ADEN | 1 < < ADSC | 1 < < ADIF | 0x07 ;
ADCSRA = 1 < < ADEN | 1 < < ADSC | 1 < < ADIF | 0x07 ;
DIDR0 = 0 ;
DIDR0 = 0 ;
# ifdef DIDR2
# ifdef DIDR2
DIDR2 = 0 ;
DIDR2 = 0 ;
# endif
# endif
# if defined(TEMP_0_PIN) && (TEMP_0_PIN > -1)
# if HAS_TEMP_0
# if TEMP_0_PIN < 8
ANALOG_SELECT ( TEMP_0_PIN ) ;
DIDR0 | = 1 < < TEMP_0_PIN ;
# else
DIDR2 | = 1 < < ( TEMP_0_PIN - 8 ) ;
# endif
# endif
# if HAS_TEMP_1
ANALOG_SELECT ( TEMP_1_PIN ) ;
# endif
# endif
# if defined(TEMP_1_PIN) && (TEMP_1_PIN > -1)
# if HAS_TEMP_2
# if TEMP_1_PIN < 8
ANALOG_SELECT ( TEMP_2_PIN ) ;
DIDR0 | = 1 < < TEMP_1_PIN ;
# else
DIDR2 | = 1 < < ( TEMP_1_PIN - 8 ) ;
# endif
# endif
# if HAS_TEMP_3
ANALOG_SELECT ( TEMP_3_PIN ) ;
# endif
# endif
# if defined(TEMP_2_PIN) && (TEMP_2_PIN > -1)
# if HAS_TEMP_BED
# if TEMP_2_PIN < 8
ANALOG_SELECT ( TEMP_BED_PIN ) ;
DIDR0 | = 1 < < TEMP_2_PIN ;
# else
DIDR2 | = 1 < < ( TEMP_2_PIN - 8 ) ;
# endif
# endif
# if defined(TEMP_3_PIN) && (TEMP_3_PIN > -1)
# if TEMP_3_PIN < 8
DIDR0 | = 1 < < TEMP_3_PIN ;
# else
DIDR2 | = 1 < < ( TEMP_3_PIN - 8 ) ;
# endif
# endif
# if defined(TEMP_BED_PIN) && (TEMP_BED_PIN > -1)
# if TEMP_BED_PIN < 8
DIDR0 | = 1 < < TEMP_BED_PIN ;
# else
DIDR2 | = 1 < < ( TEMP_BED_PIN - 8 ) ;
# endif
# endif
//Added for Filament Sensor
# ifdef FILAMENT_SENSOR
# if defined(FILWIDTH_PIN) && (FILWIDTH_PIN > -1)
# if FILWIDTH_PIN < 8
DIDR0 | = 1 < < FILWIDTH_PIN ;
# else
DIDR2 | = 1 < < ( FILWIDTH_PIN - 8 ) ;
# endif
# endif
# endif
# if HAS_FILAMENT_SENSOR
ANALOG_SELECT ( FILWIDTH_PIN ) ;
# endif
# endif
// Use timer0 for temperature measurement
// Use timer0 for temperature measurement
@ -982,90 +951,53 @@ void tp_init()
// Wait for temperature measurement to settle
// Wait for temperature measurement to settle
delay ( 250 ) ;
delay ( 250 ) ;
# define TEMP_MIN_ROUTINE(NR) \
minttemp [ NR ] = HEATER_ # # NR # # _MINTEMP ; \
while ( analog2temp ( minttemp_raw [ NR ] , NR ) < HEATER_ # # NR # # _MINTEMP ) { \
if ( HEATER_ # # NR # # _RAW_LO_TEMP < HEATER_ # # NR # # _RAW_HI_TEMP ) \
minttemp_raw [ NR ] + = OVERSAMPLENR ; \
else \
minttemp_raw [ NR ] - = OVERSAMPLENR ; \
}
# define TEMP_MAX_ROUTINE(NR) \
maxttemp [ NR ] = HEATER_ # # NR # # _MAXTEMP ; \
while ( analog2temp ( maxttemp_raw [ NR ] , NR ) > HEATER_ # # NR # # _MAXTEMP ) { \
if ( HEATER_ # # NR # # _RAW_LO_TEMP < HEATER_ # # NR # # _RAW_HI_TEMP ) \
maxttemp_raw [ NR ] - = OVERSAMPLENR ; \
else \
maxttemp_raw [ NR ] + = OVERSAMPLENR ; \
}
# ifdef HEATER_0_MINTEMP
# ifdef HEATER_0_MINTEMP
minttemp [ 0 ] = HEATER_0_MINTEMP ;
TEMP_MIN_ROUTINE ( 0 ) ;
while ( analog2temp ( minttemp_raw [ 0 ] , 0 ) < HEATER_0_MINTEMP ) {
# if HEATER_0_RAW_LO_TEMP < HEATER_0_RAW_HI_TEMP
minttemp_raw [ 0 ] + = OVERSAMPLENR ;
# else
minttemp_raw [ 0 ] - = OVERSAMPLENR ;
# endif
# endif
}
# endif //MINTEMP
# ifdef HEATER_0_MAXTEMP
# ifdef HEATER_0_MAXTEMP
maxttemp [ 0 ] = HEATER_0_MAXTEMP ;
TEMP_MAX_ROUTINE ( 0 ) ;
while ( analog2temp ( maxttemp_raw [ 0 ] , 0 ) > HEATER_0_MAXTEMP ) {
# if HEATER_0_RAW_LO_TEMP < HEATER_0_RAW_HI_TEMP
maxttemp_raw [ 0 ] - = OVERSAMPLENR ;
# else
maxttemp_raw [ 0 ] + = OVERSAMPLENR ;
# endif
# endif
}
# if EXTRUDERS > 1
# endif //MAXTEMP
# ifdef HEATER_1_MINTEMP
TEMP_MIN_ROUTINE ( 1 ) ;
# if (EXTRUDERS > 1) && defined(HEATER_1_MINTEMP)
minttemp [ 1 ] = HEATER_1_MINTEMP ;
while ( analog2temp ( minttemp_raw [ 1 ] , 1 ) < HEATER_1_MINTEMP ) {
# if HEATER_1_RAW_LO_TEMP < HEATER_1_RAW_HI_TEMP
minttemp_raw [ 1 ] + = OVERSAMPLENR ;
# else
minttemp_raw [ 1 ] - = OVERSAMPLENR ;
# endif
# endif
}
# ifdef HEATER_1_MAXTEMP
# endif // MINTEMP 1
TEMP_MAX_ROUTINE ( 1 ) ;
# if (EXTRUDERS > 1) && defined(HEATER_1_MAXTEMP)
maxttemp [ 1 ] = HEATER_1_MAXTEMP ;
while ( analog2temp ( maxttemp_raw [ 1 ] , 1 ) > HEATER_1_MAXTEMP ) {
# if HEATER_1_RAW_LO_TEMP < HEATER_1_RAW_HI_TEMP
maxttemp_raw [ 1 ] - = OVERSAMPLENR ;
# else
maxttemp_raw [ 1 ] + = OVERSAMPLENR ;
# endif
# endif
}
# if EXTRUDERS > 2
# endif //MAXTEMP 1
# ifdef HEATER_2_MINTEMP
TEMP_MIN_ROUTINE ( 2 ) ;
# if (EXTRUDERS > 2) && defined(HEATER_2_MINTEMP)
minttemp [ 2 ] = HEATER_2_MINTEMP ;
while ( analog2temp ( minttemp_raw [ 2 ] , 2 ) < HEATER_2_MINTEMP ) {
# if HEATER_2_RAW_LO_TEMP < HEATER_2_RAW_HI_TEMP
minttemp_raw [ 2 ] + = OVERSAMPLENR ;
# else
minttemp_raw [ 2 ] - = OVERSAMPLENR ;
# endif
# endif
}
# ifdef HEATER_2_MAXTEMP
# endif //MINTEMP 2
TEMP_MAX_ROUTINE ( 2 ) ;
# if (EXTRUDERS > 2) && defined(HEATER_2_MAXTEMP)
maxttemp [ 2 ] = HEATER_2_MAXTEMP ;
while ( analog2temp ( maxttemp_raw [ 2 ] , 2 ) > HEATER_2_MAXTEMP ) {
# if HEATER_2_RAW_LO_TEMP < HEATER_2_RAW_HI_TEMP
maxttemp_raw [ 2 ] - = OVERSAMPLENR ;
# else
maxttemp_raw [ 2 ] + = OVERSAMPLENR ;
# endif
# endif
}
# if EXTRUDERS > 3
# endif //MAXTEMP 2
# ifdef HEATER_3_MINTEMP
TEMP_MIN_ROUTINE ( 3 ) ;
# if (EXTRUDERS > 3) && defined(HEATER_3_MINTEMP)
minttemp [ 3 ] = HEATER_3_MINTEMP ;
while ( analog2temp ( minttemp_raw [ 3 ] , 3 ) < HEATER_3_MINTEMP ) {
# if HEATER_3_RAW_LO_TEMP < HEATER_3_RAW_HI_TEMP
minttemp_raw [ 3 ] + = OVERSAMPLENR ;
# else
minttemp_raw [ 3 ] - = OVERSAMPLENR ;
# endif
# endif
}
# ifdef HEATER_3_MAXTEMP
# endif //MINTEMP 3
TEMP_MAX_ROUTINE ( 3 ) ;
# if (EXTRUDERS > 3) && defined(HEATER_3_MAXTEMP)
maxttemp [ 3 ] = HEATER_3_MAXTEMP ;
while ( analog2temp ( maxttemp_raw [ 3 ] , 3 ) > HEATER_3_MAXTEMP ) {
# if HEATER_3_RAW_LO_TEMP < HEATER_3_RAW_HI_TEMP
maxttemp_raw [ 3 ] - = OVERSAMPLENR ;
# else
maxttemp_raw [ 3 ] + = OVERSAMPLENR ;
# endif
# endif
}
# endif // EXTRUDERS > 3
# endif // MAXTEMP 3
# endif // EXTRUDERS > 2
# endif // EXTRUDERS > 1
# ifdef BED_MINTEMP
# ifdef BED_MINTEMP
/* No bed MINTEMP error implemented?!? */ /*
/* No bed MINTEMP error implemented?!? */ /*
@ -1089,15 +1021,13 @@ void tp_init()
# endif //BED_MAXTEMP
# endif //BED_MAXTEMP
}
}
void setWatch ( )
void setWatch ( ) {
{
# ifdef WATCH_TEMP_PERIOD
# ifdef WATCH_TEMP_PERIOD
for ( int e = 0 ; e < EXTRUDERS ; e + + )
unsigned long ms = millis ( ) ;
{
for ( int e = 0 ; e < EXTRUDERS ; e + + ) {
if ( degHotend ( e ) < degTargetHotend ( e ) - ( WATCH_TEMP_INCREASE * 2 ) )
if ( degHotend ( e ) < degTargetHotend ( e ) - ( WATCH_TEMP_INCREASE * 2 ) ) {
{
watch_start_temp [ e ] = degHotend ( e ) ;
watch_start_temp [ e ] = degHotend ( e ) ;
watchmillis [ e ] = m illi s( ) ;
watchmillis [ e ] = m s;
}
}
}
}
# endif
# endif
@ -1135,11 +1065,13 @@ void thermal_runaway_protection(int *state, unsigned long *timer, float temperat
if ( temperature > = target_temperature ) * state = 2 ;
if ( temperature > = target_temperature ) * state = 2 ;
break ;
break ;
case 2 : // "Temperature Stable" state
case 2 : // "Temperature Stable" state
{
unsigned long ms = millis ( ) ;
if ( temperature > = ( target_temperature - hysteresis_degc ) )
if ( temperature > = ( target_temperature - hysteresis_degc ) )
{
{
* timer = m illi s( ) ;
* timer = m s;
}
}
else if ( ( m illi s( ) - * timer ) > ( ( unsigned long ) period_seconds ) * 1000 )
else if ( ( m s - * timer ) > ( ( unsigned long ) period_seconds ) * 1000 )
{
{
SERIAL_ERROR_START ;
SERIAL_ERROR_START ;
SERIAL_ERRORLNPGM ( " Thermal Runaway, system stopped! Heater_ID: " ) ;
SERIAL_ERRORLNPGM ( " Thermal Runaway, system stopped! Heater_ID: " ) ;
@ -1160,54 +1092,45 @@ void thermal_runaway_protection(int *state, unsigned long *timer, float temperat
lcd_update ( ) ;
lcd_update ( ) ;
}
}
}
}
break ;
} break ;
}
}
}
}
# endif
# endif //THERMAL_RUNAWAY_PROTECTION_PERIOD
void disable_heater ( )
{
void disable_heater ( ) {
for ( int i = 0 ; i < EXTRUDERS ; i + + )
for ( int i = 0 ; i < EXTRUDERS ; i + + ) setTargetHotend ( 0 , i ) ;
setTargetHotend ( 0 , i ) ;
setTargetBed ( 0 ) ;
setTargetBed ( 0 ) ;
# if defined(TEMP_0_PIN) && TEMP_0_PIN > -1
# if HAS_TEMP_0
target_temperature [ 0 ] = 0 ;
target_temperature [ 0 ] = 0 ;
soft_pwm [ 0 ] = 0 ;
soft_pwm [ 0 ] = 0 ;
# if defined(HEATER_0_PIN) && HEATER_0_PIN > -1
WRITE_HEATER_0P ( LOW ) ; // If HEATERS_PARALLEL should apply, change to WRITE_HEATER_0
WRITE ( HEATER_0_PIN , LOW ) ;
# endif
# endif
# endif
# if defined(TEMP_1_PIN) && TEMP_1_PIN > -1 && EXTRUDERS > 1
# if EXTRUDERS > 1 && HAS_TEMP_ 1
target_temperature [ 1 ] = 0 ;
target_temperature [ 1 ] = 0 ;
soft_pwm [ 1 ] = 0 ;
soft_pwm [ 1 ] = 0 ;
# if defined(HEATER_1_PIN) && HEATER_1_PIN > -1
WRITE_HEATER_1 ( LOW ) ;
WRITE ( HEATER_1_PIN , LOW ) ;
# endif
# endif
# endif
# if defined(TEMP_2_PIN) && TEMP_2_PIN > -1 && EXTRUDERS > 2
# if EXTRUDERS > 2 && HAS_TEMP_ 2
target_temperature [ 2 ] = 0 ;
target_temperature [ 2 ] = 0 ;
soft_pwm [ 2 ] = 0 ;
soft_pwm [ 2 ] = 0 ;
# if defined(HEATER_2_PIN) && HEATER_2_PIN > -1
WRITE_HEATER_2 ( LOW ) ;
WRITE ( HEATER_2_PIN , LOW ) ;
# endif
# endif
# endif
# if defined(TEMP_3_PIN) && TEMP_3_PIN > -1 && EXTRUDERS > 3
# if EXTRUDERS > 3 && HAS_TEMP_ 3
target_temperature [ 3 ] = 0 ;
target_temperature [ 3 ] = 0 ;
soft_pwm [ 3 ] = 0 ;
soft_pwm [ 3 ] = 0 ;
# if defined(HEATER_3_PIN) && HEATER_3_PIN > -1
WRITE_HEATER_3 ( LOW ) ;
WRITE ( HEATER_3_PIN , LOW ) ;
# endif
# endif
# endif
# if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
# if HAS_TEMP_BED
target_temperature_bed = 0 ;
target_temperature_bed = 0 ;
soft_pwm_bed = 0 ;
soft_pwm_bed = 0 ;
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
WRITE ( HEATER_BED_PIN , LOW ) ;
WRITE _HEATER_BED( LOW ) ;
# endif
# endif
# endif
# endif
}
}
@ -1239,8 +1162,8 @@ void min_temp_error(uint8_t e) {
}
}
void bed_max_temp_error ( void ) {
void bed_max_temp_error ( void ) {
# if HEATER_BED_PIN > -1
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
WRITE ( HEATER_BED_PIN , 0 ) ;
WRITE_HEATER_BED ( 0 ) ;
# endif
# endif
if ( IsStopped ( ) = = false ) {
if ( IsStopped ( ) = = false ) {
SERIAL_ERROR_START ;
SERIAL_ERROR_START ;
@ -1257,12 +1180,13 @@ void bed_max_temp_error(void) {
long max6675_previous_millis = MAX6675_HEAT_INTERVAL ;
long max6675_previous_millis = MAX6675_HEAT_INTERVAL ;
int max6675_temp = 2000 ;
int max6675_temp = 2000 ;
static int read_max6675 ( )
static int read_max6675 ( ) {
{
if ( millis ( ) - max6675_previous_millis < MAX6675_HEAT_INTERVAL )
unsigned long ms = millis ( ) ;
if ( ms < max6675_previous_millis + MAX6675_HEAT_INTERVAL )
return max6675_temp ;
return max6675_temp ;
max6675_previous_millis = m illi s( ) ;
max6675_previous_millis = m s;
max6675_temp = 0 ;
max6675_temp = 0 ;
# ifdef PRR
# ifdef PRR
@ -1294,13 +1218,11 @@ static int read_max6675()
// disable TT_MAX6675
// disable TT_MAX6675
WRITE ( MAX6675_SS , 1 ) ;
WRITE ( MAX6675_SS , 1 ) ;
if ( max6675_temp & 4 )
if ( max6675_temp & 4 ) {
{
// thermocouple open
// thermocouple open
max6675_temp = 4000 ;
max6675_temp = 4000 ;
}
}
else
else {
{
max6675_temp = max6675_temp > > 3 ;
max6675_temp = max6675_temp > > 3 ;
}
}
@ -1309,10 +1231,26 @@ static int read_max6675()
# endif //HEATER_0_USES_MAX6675
# endif //HEATER_0_USES_MAX6675
enum TempState {
PrepareTemp_0 ,
MeasureTemp_0 ,
PrepareTemp_BED ,
MeasureTemp_BED ,
PrepareTemp_1 ,
MeasureTemp_1 ,
PrepareTemp_2 ,
MeasureTemp_2 ,
PrepareTemp_3 ,
MeasureTemp_3 ,
Prepare_FILWIDTH ,
Measure_FILWIDTH ,
StartupDelay // Startup, delay initial temp reading a tiny bit so the hardware can settle
} ;
//
// Timer 0 is shared with millies
// Timer 0 is shared with millies
ISR ( TIMER0_COMPB_vect )
//
{
ISR ( TIMER0_COMPB_vect ) {
//these variables are only accesible from the ISR, but static, so they don't lose their value
//these variables are only accesible from the ISR, but static, so they don't lose their value
static unsigned char temp_count = 0 ;
static unsigned char temp_count = 0 ;
static unsigned long raw_temp_0_value = 0 ;
static unsigned long raw_temp_0_value = 0 ;
@ -1320,105 +1258,88 @@ ISR(TIMER0_COMPB_vect)
static unsigned long raw_temp_2_value = 0 ;
static unsigned long raw_temp_2_value = 0 ;
static unsigned long raw_temp_3_value = 0 ;
static unsigned long raw_temp_3_value = 0 ;
static unsigned long raw_temp_bed_value = 0 ;
static unsigned long raw_temp_bed_value = 0 ;
static unsigned char temp_state = 12 ;
static TempState temp_state = StartupDelay ;
static unsigned char pwm_count = ( 1 < < SOFT_PWM_SCALE ) ;
static unsigned char pwm_count = ( 1 < < SOFT_PWM_SCALE ) ;
static unsigned char soft_pwm_0 ;
// Static members for each heater
# ifdef SLOW_PWM_HEATERS
# ifdef SLOW_PWM_HEATERS
static unsigned char slow_pwm_count = 0 ;
static unsigned char slow_pwm_count = 0 ;
static unsigned char state_heater_0 = 0 ;
# define ISR_STATICS(n) \
static unsigned char state_timer_heater_0 = 0 ;
static unsigned char soft_pwm_ # # n ; \
static unsigned char state_heater_ # # n = 0 ; \
static unsigned char state_timer_heater_ # # n = 0
# else
# define ISR_STATICS(n) static unsigned char soft_pwm_ ## n
# endif
# endif
// Statics per heater
ISR_STATICS ( 0 ) ;
# if (EXTRUDERS > 1) || defined(HEATERS_PARALLEL)
# if (EXTRUDERS > 1) || defined(HEATERS_PARALLEL)
static unsigned char soft_pwm_1 ;
ISR_STATICS ( 1 ) ;
# ifdef SLOW_PWM_HEATERS
static unsigned char state_heater_1 = 0 ;
static unsigned char state_timer_heater_1 = 0 ;
# endif
# endif
# if EXTRUDERS > 2
# if EXTRUDERS > 2
static unsigned char soft_pwm_2 ;
ISR_STATICS ( 2 ) ;
# ifdef SLOW_PWM_HEATERS
static unsigned char state_heater_2 = 0 ;
static unsigned char state_timer_heater_2 = 0 ;
# endif
# endif
# if EXTRUDERS > 3
# if EXTRUDERS > 3
static unsigned char soft_pwm_3 ;
ISR_STATICS ( 3 ) ;
# ifdef SLOW_PWM_HEATERS
static unsigned char state_heater_3 = 0 ;
static unsigned char state_timer_heater_3 = 0 ;
# endif
# endif
# endif
# endif
# if HEATER_BED_PIN > -1
static unsigned char soft_pwm_b ;
# ifdef SLOW_PWM_HEATERS
static unsigned char state_heater_b = 0 ;
static unsigned char state_timer_heater_b = 0 ;
# endif
# endif
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
ISR_STATICS ( BED ) ;
# endif
# endif
# if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1)
# if HAS_FILAMENT_SENSOR
static unsigned long raw_filwidth_value = 0 ; //added for filament width sensor
static unsigned long raw_filwidth_value = 0 ;
# endif
# endif
# ifndef SLOW_PWM_HEATERS
# ifndef SLOW_PWM_HEATERS
/ *
/ * *
* standard PWM modulation
* standard PWM modulation
*/
*/
if ( pwm_count = = 0 ) {
if ( pwm_count = = 0 ) {
soft_pwm_0 = soft_pwm [ 0 ] ;
soft_pwm_0 = soft_pwm [ 0 ] ;
if ( soft_pwm_0 > 0 ) {
if ( soft_pwm_0 > 0 ) {
WRITE ( HEATER_0_PIN , 1 ) ;
WRITE_HEATER_0 ( 1 ) ;
# ifdef HEATERS_PARALLEL
}
WRITE ( HEATER_1_PIN , 1 ) ;
else WRITE_HEATER_0P ( 0 ) ; // If HEATERS_PARALLEL should apply, change to WRITE_HEATER_0
# endif
} else WRITE ( HEATER_0_PIN , 0 ) ;
# if EXTRUDERS > 1
# if EXTRUDERS > 1
soft_pwm_1 = soft_pwm [ 1 ] ;
soft_pwm_1 = soft_pwm [ 1 ] ;
if ( soft_pwm_1 > 0 ) WRITE ( HEATER_1_PIN , 1 ) ; else WRITE ( HEATER_1_PIN , 0 ) ;
WRITE_HEATER_1 ( soft_pwm_1 > 0 ? 1 : 0 ) ;
# endif
# if EXTRUDERS > 2
# if EXTRUDERS > 2
soft_pwm_2 = soft_pwm [ 2 ] ;
soft_pwm_2 = soft_pwm [ 2 ] ;
if ( soft_pwm_2 > 0 ) WRITE ( HEATER_2_PIN , 1 ) ; else WRITE ( HEATER_2_PIN , 0 ) ;
WRITE_HEATER_2 ( soft_pwm_2 > 0 ? 1 : 0 ) ;
# endif
# if EXTRUDERS > 3
# if EXTRUDERS > 3
soft_pwm_3 = soft_pwm [ 3 ] ;
soft_pwm_3 = soft_pwm [ 3 ] ;
if ( soft_pwm_3 > 0 ) WRITE ( HEATER_3_PIN , 1 ) ; else WRITE ( HEATER_3_PIN , 0 ) ;
WRITE_HEATER_3 ( soft_pwm_3 > 0 ? 1 : 0 ) ;
# endif
# endif
# endif
# endif
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
soft_pwm_b = soft_pwm_bed ;
soft_pwm_BED = soft_pwm_bed ;
if ( soft_pwm_b > 0 ) WRITE ( HEATER_BED_PIN , 1 ) ; else WRITE ( HEATER_BED_PIN , 0 ) ;
WRITE_HEATER_BED ( soft_pwm_BED > 0 ? 1 : 0 ) ;
# endif
# endif
# ifdef FAN_SOFT_PWM
# ifdef FAN_SOFT_PWM
soft_pwm_fan = fanSpeedSoftPwm / 2 ;
soft_pwm_fan = fanSpeedSoftPwm / 2 ;
if ( soft_pwm_fan > 0 ) WRITE ( FAN_PIN , 1 ) ; else WRITE ( FAN_PIN , 0 ) ;
WRITE ( FAN_PIN , soft_pwm_fan > 0 ? 1 : 0 ) ;
# endif
}
if ( soft_pwm_0 < pwm_count ) {
WRITE ( HEATER_0_PIN , 0 ) ;
# ifdef HEATERS_PARALLEL
WRITE ( HEATER_1_PIN , 0 ) ;
# endif
# endif
}
}
if ( soft_pwm_0 < pwm_count ) { WRITE_HEATER_0 ( 0 ) ; }
# if EXTRUDERS > 1
# if EXTRUDERS > 1
if ( soft_pwm_1 < pwm_count ) WRITE ( HEATER_1_PIN , 0 ) ;
if ( soft_pwm_1 < pwm_count ) WRITE_HEATER_1 ( 0 ) ;
# endif
# if EXTRUDERS > 2
# if EXTRUDERS > 2
if ( soft_pwm_2 < pwm_count ) WRITE ( HEATER_2_PIN , 0 ) ;
if ( soft_pwm_2 < pwm_count ) WRITE_HEATER_2 ( 0 ) ;
# endif
# if EXTRUDERS > 3
# if EXTRUDERS > 3
if ( soft_pwm_3 < pwm_count ) WRITE ( HEATER_3_PIN , 0 ) ;
if ( soft_pwm_3 < pwm_count ) WRITE_HEATER_3 ( 0 ) ;
# endif
# endif
# endif
# endif
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
if ( soft_pwm_b < pwm_count ) WRITE ( HEATER_BED_PIN , 0 ) ;
if ( soft_pwm_BED < pwm_count ) WRITE_HEATER_BED ( 0 ) ;
# endif
# endif
# ifdef FAN_SOFT_PWM
# ifdef FAN_SOFT_PWM
if ( soft_pwm_fan < pwm_count ) WRITE ( FAN_PIN , 0 ) ;
if ( soft_pwm_fan < pwm_count ) WRITE ( FAN_PIN , 0 ) ;
# endif
# endif
@ -1426,7 +1347,7 @@ ISR(TIMER0_COMPB_vect)
pwm_count + = ( 1 < < SOFT_PWM_SCALE ) ;
pwm_count + = ( 1 < < SOFT_PWM_SCALE ) ;
pwm_count & = 0x7f ;
pwm_count & = 0x7f ;
# else // ifndef SLOW_PWM_HEATERS
# else // SLOW_PWM_HEATERS
/*
/*
* SLOW PWM HEATERS
* SLOW PWM HEATERS
*
*
@ -1435,225 +1356,74 @@ ISR(TIMER0_COMPB_vect)
# ifndef MIN_STATE_TIME
# ifndef MIN_STATE_TIME
# define MIN_STATE_TIME 16 // MIN_STATE_TIME * 65.5 = time in milliseconds
# define MIN_STATE_TIME 16 // MIN_STATE_TIME * 65.5 = time in milliseconds
# endif
# endif
if ( slow_pwm_count = = 0 ) {
// EXTRUDER 0
soft_pwm_0 = soft_pwm [ 0 ] ;
if ( soft_pwm_0 > 0 ) {
// turn ON heather only if the minimum time is up
if ( state_timer_heater_0 = = 0 ) {
// if change state set timer
if ( state_heater_0 = = 0 ) {
state_timer_heater_0 = MIN_STATE_TIME ;
}
state_heater_0 = 1 ;
WRITE ( HEATER_0_PIN , 1 ) ;
# ifdef HEATERS_PARALLEL
WRITE ( HEATER_1_PIN , 1 ) ;
# endif
}
} else {
// turn OFF heather only if the minimum time is up
if ( state_timer_heater_0 = = 0 ) {
// if change state set timer
if ( state_heater_0 = = 1 ) {
state_timer_heater_0 = MIN_STATE_TIME ;
}
state_heater_0 = 0 ;
WRITE ( HEATER_0_PIN , 0 ) ;
# ifdef HEATERS_PARALLEL
WRITE ( HEATER_1_PIN , 0 ) ;
# endif
}
}
# if EXTRUDERS > 1
// Macros for Slow PWM timer logic - HEATERS_PARALLEL applies
// EXTRUDER 1
# define _SLOW_PWM_ROUTINE(NR, src) \
soft_pwm_1 = soft_pwm [ 1 ] ;
soft_pwm_ # # NR = src ; \
if ( soft_pwm_1 > 0 ) {
if ( soft_pwm_ # # NR > 0 ) { \
// turn ON heather only if the minimum time is up
if ( state_timer_heater_ # # NR = = 0 ) { \
if ( state_timer_heater_1 = = 0 ) {
if ( state_heater_ # # NR = = 0 ) state_timer_heater_ # # NR = MIN_STATE_TIME ; \
// if change state set timer
state_heater_ # # NR = 1 ; \
if ( state_heater_1 = = 0 ) {
WRITE_HEATER_ # # NR ( 1 ) ; \
state_timer_heater_1 = MIN_STATE_TIME ;
} \
}
} \
state_heater_1 = 1 ;
else { \
WRITE ( HEATER_1_PIN , 1 ) ;
if ( state_timer_heater_ # # NR = = 0 ) { \
}
if ( state_heater_ # # NR = = 1 ) state_timer_heater_ # # NR = MIN_STATE_TIME ; \
} else {
state_heater_ # # NR = 0 ; \
// turn OFF heather only if the minimum time is up
WRITE_HEATER_ # # NR ( 0 ) ; \
if ( state_timer_heater_1 = = 0 ) {
} \
// if change state set timer
}
if ( state_heater_1 = = 1 ) {
# define SLOW_PWM_ROUTINE(n) _SLOW_PWM_ROUTINE(n, soft_pwm[n])
state_timer_heater_1 = MIN_STATE_TIME ;
# define PWM_OFF_ROUTINE(NR) \
if ( soft_pwm_ # # NR < slow_pwm_count ) { \
if ( state_timer_heater_ # # NR = = 0 ) { \
if ( state_heater_ # # NR = = 1 ) state_timer_heater_ # # NR = MIN_STATE_TIME ; \
state_heater_ # # NR = 0 ; \
WRITE_HEATER_ # # NR ( 0 ) ; \
} \
}
}
state_heater_1 = 0 ;
WRITE ( HEATER_1_PIN , 0 ) ;
}
}
# endif
# if EXTRUDERS > 2
if ( slow_pwm_count = = 0 ) {
// EXTRUDER 2
soft_pwm_2 = soft_pwm [ 2 ] ;
if ( soft_pwm_2 > 0 ) {
// turn ON heather only if the minimum time is up
if ( state_timer_heater_2 = = 0 ) {
// if change state set timer
if ( state_heater_2 = = 0 ) {
state_timer_heater_2 = MIN_STATE_TIME ;
}
state_heater_2 = 1 ;
WRITE ( HEATER_2_PIN , 1 ) ;
}
} else {
// turn OFF heather only if the minimum time is up
if ( state_timer_heater_2 = = 0 ) {
// if change state set timer
if ( state_heater_2 = = 1 ) {
state_timer_heater_2 = MIN_STATE_TIME ;
}
state_heater_2 = 0 ;
WRITE ( HEATER_2_PIN , 0 ) ;
}
}
# endif
SLOW_PWM_ROUTINE ( 0 ) ; // EXTRUDER 0
# if EXTRUDERS > 1
SLOW_PWM_ROUTINE ( 1 ) ; // EXTRUDER 1
# if EXTRUDERS > 2
SLOW_PWM_ROUTINE ( 2 ) ; // EXTRUDER 2
# if EXTRUDERS > 3
# if EXTRUDERS > 3
// EXTRUDER 3
SLOW_PWM_ROUTINE ( 3 ) ; // EXTRUDER 3
soft_pwm_3 = soft_pwm [ 3 ] ;
# endif
if ( soft_pwm_3 > 0 ) {
# endif
// turn ON heather only if the minimum time is up
if ( state_timer_heater_3 = = 0 ) {
// if change state set timer
if ( state_heater_3 = = 0 ) {
state_timer_heater_3 = MIN_STATE_TIME ;
}
state_heater_3 = 1 ;
WRITE ( HEATER_3_PIN , 1 ) ;
}
} else {
// turn OFF heather only if the minimum time is up
if ( state_timer_heater_3 = = 0 ) {
// if change state set timer
if ( state_heater_3 = = 1 ) {
state_timer_heater_3 = MIN_STATE_TIME ;
}
state_heater_3 = 0 ;
WRITE ( HEATER_3_PIN , 0 ) ;
}
}
# endif
# endif
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
// BED
_SLOW_PWM_ROUTINE ( BED , soft_pwm_bed ) ; // BED
soft_pwm_b = soft_pwm_bed ;
if ( soft_pwm_b > 0 ) {
// turn ON heather only if the minimum time is up
if ( state_timer_heater_b = = 0 ) {
// if change state set timer
if ( state_heater_b = = 0 ) {
state_timer_heater_b = MIN_STATE_TIME ;
}
state_heater_b = 1 ;
WRITE ( HEATER_BED_PIN , 1 ) ;
}
} else {
// turn OFF heather only if the minimum time is up
if ( state_timer_heater_b = = 0 ) {
// if change state set timer
if ( state_heater_b = = 1 ) {
state_timer_heater_b = MIN_STATE_TIME ;
}
state_heater_b = 0 ;
WRITE ( HEATER_BED_PIN , 0 ) ;
}
}
# endif
# endif
} // if (slow_pwm_count == 0)
// EXTRUDER 0
} // slow_pwm_count == 0
if ( soft_pwm_0 < slow_pwm_count ) {
// turn OFF heather only if the minimum time is up
if ( state_timer_heater_0 = = 0 ) {
// if change state set timer
if ( state_heater_0 = = 1 ) {
state_timer_heater_0 = MIN_STATE_TIME ;
}
state_heater_0 = 0 ;
WRITE ( HEATER_0_PIN , 0 ) ;
# ifdef HEATERS_PARALLEL
WRITE ( HEATER_1_PIN , 0 ) ;
# endif
}
}
PWM_OFF_ROUTINE ( 0 ) ; // EXTRUDER 0
# if EXTRUDERS > 1
# if EXTRUDERS > 1
// EXTRUDER 1
PWM_OFF_ROUTINE ( 1 ) ; // EXTRUDER 1
if ( soft_pwm_1 < slow_pwm_count ) {
// turn OFF heather only if the minimum time is up
if ( state_timer_heater_1 = = 0 ) {
// if change state set timer
if ( state_heater_1 = = 1 ) {
state_timer_heater_1 = MIN_STATE_TIME ;
}
state_heater_1 = 0 ;
WRITE ( HEATER_1_PIN , 0 ) ;
}
}
# endif
# if EXTRUDERS > 2
# if EXTRUDERS > 2
// EXTRUDER 2
PWM_OFF_ROUTINE ( 2 ) ; // EXTRUDER 2
if ( soft_pwm_2 < slow_pwm_count ) {
// turn OFF heather only if the minimum time is up
if ( state_timer_heater_2 = = 0 ) {
// if change state set timer
if ( state_heater_2 = = 1 ) {
state_timer_heater_2 = MIN_STATE_TIME ;
}
state_heater_2 = 0 ;
WRITE ( HEATER_2_PIN , 0 ) ;
}
}
# endif
# if EXTRUDERS > 3
# if EXTRUDERS > 3
// EXTRUDER 3
PWM_OFF_ROUTINE ( 3 ) ; // EXTRUDER 3
if ( soft_pwm_3 < slow_pwm_count ) {
# endif
// turn OFF heather only if the minimum time is up
# endif
if ( state_timer_heater_3 = = 0 ) {
// if change state set timer
if ( state_heater_3 = = 1 ) {
state_timer_heater_3 = MIN_STATE_TIME ;
}
state_heater_3 = 0 ;
WRITE ( HEATER_3_PIN , 0 ) ;
}
}
# endif
# endif
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
// BED
PWM_OFF_ROUTINE ( BED ) ; // BED
if ( soft_pwm_b < slow_pwm_count ) {
// turn OFF heather only if the minimum time is up
if ( state_timer_heater_b = = 0 ) {
// if change state set timer
if ( state_heater_b = = 1 ) {
state_timer_heater_b = MIN_STATE_TIME ;
}
state_heater_b = 0 ;
WRITE ( HEATER_BED_PIN , 0 ) ;
}
}
# endif
# endif
# ifdef FAN_SOFT_PWM
# ifdef FAN_SOFT_PWM
if ( pwm_count = = 0 ) {
if ( pwm_count = = 0 ) {
soft_pwm_fan = fanSpeedSoftPwm / 2 ;
soft_pwm_fan = fanSpeedSoftPwm / 2 ;
if ( soft_pwm_fan > 0 ) WRITE ( FAN_PIN , 1 ) ; else WRITE ( FAN_PIN , 0 ) ;
WRITE ( FAN_PIN , soft_pwm_fan > 0 ? 1 : 0 ) ;
}
}
if ( soft_pwm_fan < pwm_count ) WRITE ( FAN_PIN , 0 ) ;
if ( soft_pwm_fan < pwm_count ) WRITE ( FAN_PIN , 0 ) ;
# endif
# endif //FAN_SOFT_PWM
pwm_count + = ( 1 < < SOFT_PWM_SCALE ) ;
pwm_count + = ( 1 < < SOFT_PWM_SCALE ) ;
pwm_count & = 0x7f ;
pwm_count & = 0x7f ;
@ -1663,200 +1433,150 @@ ISR(TIMER0_COMPB_vect)
slow_pwm_count + + ;
slow_pwm_count + + ;
slow_pwm_count & = 0x7f ;
slow_pwm_count & = 0x7f ;
// Extruder 0
// EXTRUDER 0
if ( state_timer_heater_0 > 0 ) {
if ( state_timer_heater_0 > 0 ) state_timer_heater_0 - - ;
state_timer_heater_0 - - ;
# if EXTRUDERS > 1 // EXTRUDER 1
}
if ( state_timer_heater_1 > 0 ) state_timer_heater_1 - - ;
# if EXTRUDERS > 2 // EXTRUDER 2
# if EXTRUDERS > 1
if ( state_timer_heater_2 > 0 ) state_timer_heater_2 - - ;
// Extruder 1
# if EXTRUDERS > 3 // EXTRUDER 3
if ( state_timer_heater_1 > 0 )
if ( state_timer_heater_3 > 0 ) state_timer_heater_3 - - ;
state_timer_heater_1 - - ;
# endif
# endif
# if EXTRUDERS > 2
// Extruder 2
if ( state_timer_heater_2 > 0 )
state_timer_heater_2 - - ;
# endif
# endif
# if EXTRUDERS > 3
// Extruder 3
if ( state_timer_heater_3 > 0 )
state_timer_heater_3 - - ;
# endif
# endif
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1 // BED
# if defined(HEATER_BED_PIN) && HEATER_BED_PIN > -1
if ( state_timer_heater_BED > 0 ) state_timer_heater_BED - - ;
// Bed
if ( state_timer_heater_b > 0 )
state_timer_heater_b - - ;
# endif
# endif
} // if ( (pwm_count % 64) == 0) {
} // (pwm_count % 64) == 0
# endif // ifndef SLOW_PWM_HEATERS
# endif // SLOW_PWM_HEATERS
switch ( temp_state ) {
# define SET_ADMUX_ADCSRA(pin) ADMUX = (1 << REFS0) | (pin & 0x07); ADCSRA |= 1<<ADSC
case 0 : // Prepare TEMP_0
# ifdef MUX5
# if defined(TEMP_0_PIN) && (TEMP_0_PIN > -1)
# define SET_ADCSRB(pin) if (pin > 7) ADCSRB = 1 << MUX5; else ADCSRB = 0; SET_ADMUX_ADCSRA(pin)
# if TEMP_0_PIN > 7
ADCSRB = 1 < < MUX5 ;
# else
# else
ADCSRB = 0 ;
# define SET_ADCSRB(pin) ADCSRB = 0; SET_ADMUX_ADCSRA(pin)
# endif
# endif
ADMUX = ( ( 1 < < REFS0 ) | ( TEMP_0_PIN & 0x07 ) ) ;
ADCSRA | = 1 < < ADSC ; // Start conversion
switch ( temp_state ) {
case PrepareTemp_0 :
# if HAS_TEMP_0
SET_ADCSRB ( TEMP_0_PIN ) ;
# endif
# endif
lcd_buttons_update ( ) ;
lcd_buttons_update ( ) ;
temp_state = 1 ;
temp_state = MeasureTemp_0 ;
break ;
break ;
case 1 : // Measure TEMP_0
case MeasureTemp_0 :
# if defined(TEMP_0_PIN) && (TEMP_0_PIN > -1)
# if HAS_TEMP_0
raw_temp_0_value + = ADC ;
raw_temp_0_value + = ADC ;
# endif
# endif
temp_state = 2 ;
temp_state = PrepareTemp_BED ;
break ;
break ;
case 2 : // Prepare TEMP_BED
case PrepareTemp_BED :
# if defined(TEMP_BED_PIN) && (TEMP_BED_PIN > -1)
# if HAS_TEMP_BED
# if TEMP_BED_PIN > 7
SET_ADCSRB ( TEMP_BED_PIN ) ;
ADCSRB = 1 < < MUX5 ;
# else
ADCSRB = 0 ;
# endif
ADMUX = ( ( 1 < < REFS0 ) | ( TEMP_BED_PIN & 0x07 ) ) ;
ADCSRA | = 1 < < ADSC ; // Start conversion
# endif
# endif
lcd_buttons_update ( ) ;
lcd_buttons_update ( ) ;
temp_state = 3 ;
temp_state = MeasureTemp_BED ;
break ;
break ;
case 3 : // Measure TEMP_BED
case MeasureTemp_BED :
# if defined(TEMP_BED_PIN) && (TEMP_BED_PIN > -1)
# if HAS_TEMP_BED
raw_temp_bed_value + = ADC ;
raw_temp_bed_value + = ADC ;
# endif
# endif
temp_state = 4 ;
temp_state = PrepareTemp_1 ;
break ;
break ;
case 4 : // Prepare TEMP_1
case PrepareTemp_1 :
# if defined(TEMP_1_PIN) && (TEMP_1_PIN > -1)
# if HAS_TEMP_1
# if TEMP_1_PIN > 7
SET_ADCSRB ( TEMP_1_PIN ) ;
ADCSRB = 1 < < MUX5 ;
# else
ADCSRB = 0 ;
# endif
ADMUX = ( ( 1 < < REFS0 ) | ( TEMP_1_PIN & 0x07 ) ) ;
ADCSRA | = 1 < < ADSC ; // Start conversion
# endif
# endif
lcd_buttons_update ( ) ;
lcd_buttons_update ( ) ;
temp_state = 5 ;
temp_state = MeasureTemp_1 ;
break ;
break ;
case 5 : // Measure TEMP_1
case MeasureTemp_1 :
# if defined(TEMP_1_PIN) && (TEMP_1_PIN > -1)
# if HAS_TEMP_1
raw_temp_1_value + = ADC ;
raw_temp_1_value + = ADC ;
# endif
# endif
temp_state = 6 ;
temp_state = PrepareTemp_2 ;
break ;
break ;
case 6 : // Prepare TEMP_2
case PrepareTemp_2 :
# if defined(TEMP_2_PIN) && (TEMP_2_PIN > -1)
# if HAS_TEMP_2
# if TEMP_2_PIN > 7
SET_ADCSRB ( TEMP_2_PIN ) ;
ADCSRB = 1 < < MUX5 ;
# else
ADCSRB = 0 ;
# endif
ADMUX = ( ( 1 < < REFS0 ) | ( TEMP_2_PIN & 0x07 ) ) ;
ADCSRA | = 1 < < ADSC ; // Start conversion
# endif
# endif
lcd_buttons_update ( ) ;
lcd_buttons_update ( ) ;
temp_state = 7 ;
temp_state = MeasureTemp_2 ;
break ;
break ;
case 7 : // Measure TEMP_2
case MeasureTemp_2 :
# if defined(TEMP_2_PIN) && (TEMP_2_PIN > -1)
# if HAS_TEMP_2
raw_temp_2_value + = ADC ;
raw_temp_2_value + = ADC ;
# endif
# endif
temp_state = 8 ;
temp_state = PrepareTemp_3 ;
break ;
break ;
case 8 : // Prepare TEMP_3
case PrepareTemp_3 :
# if defined(TEMP_3_PIN) && (TEMP_3_PIN > -1)
# if HAS_TEMP_3
# if TEMP_3_PIN > 7
SET_ADCSRB ( TEMP_3_PIN ) ;
ADCSRB = 1 < < MUX5 ;
# else
ADCSRB = 0 ;
# endif
ADMUX = ( ( 1 < < REFS0 ) | ( TEMP_3_PIN & 0x07 ) ) ;
ADCSRA | = 1 < < ADSC ; // Start conversion
# endif
# endif
lcd_buttons_update ( ) ;
lcd_buttons_update ( ) ;
temp_state = 9 ;
temp_state = MeasureTemp_3 ;
break ;
break ;
case 9 : // Measure TEMP_3
case MeasureTemp_3 :
# if defined(TEMP_3_PIN) && (TEMP_3_PIN > -1)
# if HAS_TEMP_3
raw_temp_3_value + = ADC ;
raw_temp_3_value + = ADC ;
# endif
# endif
temp_state = 10 ; //change so that Filament Width is also measured
temp_state = Prepare_FILWIDTH ;
break ;
break ;
case 10 : //Prepare FILWIDTH
case Prepare_FILWIDTH :
# if defined(FILWIDTH_PIN) && (FILWIDTH_PIN> -1)
# if HAS_FILAMENT_SENSOR
# if FILWIDTH_PIN>7
SET_ADCSRB ( FILWIDTH_PIN ) ;
ADCSRB = 1 < < MUX5 ;
# else
ADCSRB = 0 ;
# endif
ADMUX = ( ( 1 < < REFS0 ) | ( FILWIDTH_PIN & 0x07 ) ) ;
ADCSRA | = 1 < < ADSC ; // Start conversion
# endif
# endif
lcd_buttons_update ( ) ;
lcd_buttons_update ( ) ;
temp_state = 11 ;
temp_state = Measure_FILWIDTH ;
break ;
break ;
case 11 : //Measure FILWIDTH
case Measure_FILWIDTH :
# if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1)
# if HAS_FILAMENT_SENSOR
// raw_filwidth_value += ADC; //remove to use an IIR filter approach
// raw_filwidth_value += ADC; //remove to use an IIR filter approach
if ( ADC > 102 ) //check that ADC is reading a voltage > 0.5 volts, otherwise don't take in the data.
if ( ADC > 102 ) { //check that ADC is reading a voltage > 0.5 volts, otherwise don't take in the data.
{
raw_filwidth_value - = ( raw_filwidth_value > > 7 ) ; //multiply raw_filwidth_value by 127/128
raw_filwidth_value = raw_filwidth_value - ( raw_filwidth_value > > 7 ) ; //multipliy raw_filwidth_value by 127/128
raw_filwidth_value + = ( ( unsigned long ) ADC < < 7 ) ; //add new ADC reading
raw_filwidth_value = raw_filwidth_value + ( ( unsigned long ) ADC < < 7 ) ; //add new ADC reading
}
}
# endif
# endif
temp_state = 0 ;
temp_state = PrepareTemp_0 ;
temp_count + + ;
temp_count + + ;
break ;
break ;
case StartupDelay :
temp_state = PrepareTemp_0 ;
case 12 : //Startup, delay initial temp reading a tiny bit so the hardware can settle.
temp_state = 0 ;
break ;
break ;
// default:
// default:
// SERIAL_ERROR_START;
// SERIAL_ERROR_START;
// SERIAL_ERRORLNPGM("Temp measurement error!");
// SERIAL_ERRORLNPGM("Temp measurement error!");
// break;
// break;
}
} // switch(temp_state)
if ( temp_count > = OVERSAMPLENR ) // 10 * 16 * 1/(16000000/64/256) = 164ms.
if ( temp_count > = OVERSAMPLENR ) { // 10 * 16 * 1/(16000000/64/256) = 164ms.
{
if ( ! temp_meas_ready ) { //Only update the raw values if they have been read. Else we could be updating them during reading.
if ( ! temp_meas_ready ) //Only update the raw values if they have been read. Else we could be updating them during reading.
{
# ifndef HEATER_0_USES_MAX6675
# ifndef HEATER_0_USES_MAX6675
current_temperature_raw [ 0 ] = raw_temp_0_value ;
current_temperature_raw [ 0 ] = raw_temp_0_value ;
# endif
# endif
# if EXTRUDERS > 1
# if EXTRUDERS > 1
current_temperature_raw [ 1 ] = raw_temp_1_value ;
current_temperature_raw [ 1 ] = raw_temp_1_value ;
# endif
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
redundant_temperature_raw = raw_temp_1_value ;
# endif
# if EXTRUDERS > 2
# if EXTRUDERS > 2
current_temperature_raw [ 2 ] = raw_temp_2_value ;
current_temperature_raw [ 2 ] = raw_temp_2_value ;
# endif
# if EXTRUDERS > 3
# if EXTRUDERS > 3
current_temperature_raw [ 3 ] = raw_temp_3_value ;
current_temperature_raw [ 3 ] = raw_temp_3_value ;
# endif
# endif
# endif
# endif
# ifdef TEMP_SENSOR_1_AS_REDUNDANT
redundant_temperature_raw = raw_temp_1_value ;
# endif
current_temperature_bed_raw = raw_temp_bed_value ;
current_temperature_bed_raw = raw_temp_bed_value ;
}
} //!temp_meas_ready
//Add similar code for Filament Sensor - can be read any time since IIR filtering is used
// Filament Sensor - can be read any time since IIR filtering is used
# if defined(FILWIDTH_PIN) &&(FILWIDTH_PIN > -1)
# if HAS_FILAMENT_SENSOR
current_raw_filwidth = raw_filwidth_value > > 10 ; //need to d ivide to get to 0-16384 range since we used 1/128 IIR filter approach
current_raw_filwidth = raw_filwidth_value > > 10 ; // D ivide to get to 0-16384 range since we used 1/128 IIR filter approach
# endif
# endif
temp_meas_ready = true ;
temp_meas_ready = true ;
temp_count = 0 ;
temp_count = 0 ;
raw_temp_0_value = 0 ;
raw_temp_0_value = 0 ;
@ -1866,101 +1586,35 @@ ISR(TIMER0_COMPB_vect)
raw_temp_bed_value = 0 ;
raw_temp_bed_value = 0 ;
# if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP
# if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP
if ( current_temperature_raw [ 0 ] < = maxttemp_raw [ 0 ] ) {
# define MAXTEST <=
# define MINTEST >=
# else
# else
if ( current_temperature_raw [ 0 ] > = maxttemp_raw [ 0 ] ) {
# define MAXTEST >=
# define MINTEST <=
# endif
# endif
# ifndef HEATER_0_USES_MAX6675
max_temp_error ( 0 ) ;
# endif
}
# if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP
if ( current_temperature_raw [ 0 ] > = minttemp_raw [ 0 ] ) {
# else
if ( current_temperature_raw [ 0 ] < = minttemp_raw [ 0 ] ) {
# endif
# ifndef HEATER_0_USES_MAX6675
min_temp_error ( 0 ) ;
# endif
}
for ( int i = 0 ; i < EXTRUDERS ; i + + ) {
# if EXTRUDERS > 1
if ( current_temperature_raw [ i ] MAXTEST maxttemp_raw [ i ] ) max_temp_error ( i ) ;
# if HEATER_1_RAW_LO_TEMP > HEATER_1_RAW_HI_TEMP
else if ( current_temperature_raw [ i ] MINTEST minttemp_raw [ i ] ) min_temp_error ( i ) ;
if ( current_temperature_raw [ 1 ] < = maxttemp_raw [ 1 ] ) {
# else
if ( current_temperature_raw [ 1 ] > = maxttemp_raw [ 1 ] ) {
# endif
max_temp_error ( 1 ) ;
}
# if HEATER_1_RAW_LO_TEMP > HEATER_1_RAW_HI_TEMP
if ( current_temperature_raw [ 1 ] > = minttemp_raw [ 1 ] ) {
# else
if ( current_temperature_raw [ 1 ] < = minttemp_raw [ 1 ] ) {
# endif
min_temp_error ( 1 ) ;
}
# endif
# if EXTRUDERS > 2
# if HEATER_2_RAW_LO_TEMP > HEATER_2_RAW_HI_TEMP
if ( current_temperature_raw [ 2 ] < = maxttemp_raw [ 2 ] ) {
# else
if ( current_temperature_raw [ 2 ] > = maxttemp_raw [ 2 ] ) {
# endif
max_temp_error ( 2 ) ;
}
}
# if HEATER_2_RAW_LO_TEMP > HEATER_2_RAW_HI_TEMP
if ( current_temperature_raw [ 2 ] > = minttemp_raw [ 2 ] ) {
# else
if ( current_temperature_raw [ 2 ] < = minttemp_raw [ 2 ] ) {
# endif
min_temp_error ( 2 ) ;
}
# endif
# if EXTRUDERS > 3
# if HEATER_3_RAW_LO_TEMP > HEATER_3_RAW_HI_TEMP
if ( current_temperature_raw [ 3 ] < = maxttemp_raw [ 3 ] ) {
# else
if ( current_temperature_raw [ 3 ] > = maxttemp_raw [ 3 ] ) {
# endif
max_temp_error ( 3 ) ;
}
# if HEATER_3_RAW_LO_TEMP > HEATER_3_RAW_HI_TEMP
if ( current_temperature_raw [ 3 ] > = minttemp_raw [ 3 ] ) {
# else
if ( current_temperature_raw [ 3 ] < = minttemp_raw [ 3 ] ) {
# endif
min_temp_error ( 3 ) ;
}
# endif
/* No bed MINTEMP error? */
/* No bed MINTEMP error? */
# if defined(BED_MAXTEMP) && (TEMP_SENSOR_BED != 0)
# if defined(BED_MAXTEMP) && (TEMP_SENSOR_BED != 0)
# if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP
if ( current_temperature_bed_raw MAXTEST bed_maxttemp_raw ) {
if ( current_temperature_bed_raw < = bed_maxttemp_raw ) {
# else
if ( current_temperature_bed_raw > = bed_maxttemp_raw ) {
# endif
target_temperature_bed = 0 ;
target_temperature_bed = 0 ;
bed_max_temp_error ( ) ;
bed_max_temp_error ( ) ;
}
}
# endif
# endif
}
} // temp_count >= OVERSAMPLENR
# ifdef BABYSTEPPING
# ifdef BABYSTEPPING
for ( uint8_t axis = 0 ; axis < 3 ; axis + + )
for ( uint8_t axis = X_AXIS ; axis < = Z_AXIS ; axis + + ) {
{
int curTodo = babystepsTodo [ axis ] ; //get rid of volatile for performance
int curTodo = babystepsTodo [ axis ] ; //get rid of volatile for performance
if ( curTodo > 0 )
if ( curTodo > 0 ) {
{
babystep ( axis , /*fwd*/ true ) ;
babystep ( axis , /*fwd*/ true ) ;
babystepsTodo [ axis ] - - ; //less to do next time
babystepsTodo [ axis ] - - ; //less to do next time
}
}
else
else if ( curTodo < 0 ) {
if ( curTodo < 0 )
{
babystep ( axis , /*fwd*/ false ) ;
babystep ( axis , /*fwd*/ false ) ;
babystepsTodo [ axis ] + + ; //less to do next time
babystepsTodo [ axis ] + + ; //less to do next time
}
}
@ -1970,26 +1624,8 @@ ISR(TIMER0_COMPB_vect)
# ifdef PIDTEMP
# ifdef PIDTEMP
// Apply the scale factors to the PID values
// Apply the scale factors to the PID values
float scalePID_i ( float i ) { return i * PID_dT ; }
float unscalePID_i ( float i ) { return i / PID_dT ; }
float scalePID_i ( float i )
float scalePID_d ( float d ) { return d / PID_dT ; }
{
float unscalePID_d ( float d ) { return d * PID_dT ; }
return i * PID_dT ;
}
float unscalePID_i ( float i )
{
return i / PID_dT ;
}
float scalePID_d ( float d )
{
return d / PID_dT ;
}
float unscalePID_d ( float d )
{
return d * PID_dT ;
}
# endif //PIDTEMP
# endif //PIDTEMP