Super Super Firmware Optimization (giving you more free memory!) October 28, 2008 05:19PM |
Registered: 16 years ago Posts: 293 |
#define EXTRUDER_THERMISTOR_PIN 0 //comment out to use THERMOCOUPLE instead. Uncomment next line. //#define EXTRUDER_THERMOCOUPLE_PIN 0 //comment out to use THERMISTOR.When either one is commented out, you can use #ifdef and #ifndef (if defined and if not defined). These conditions are not checked by the Atmega chip, but by the compiler to decide what to put there. Now the thermistor table can be surrounded by:int extruder_get_temperature()#ifdef EXTRUDER_THERMISTOR_PIN #define NUMTEMPS 20 short temptable[NUMTEMPS][2] = { {1, 841}, ... etc... ... {1008, 3} }; #endif
The extruder_get_temperature() should contain these two statements:
{
#ifdef EXTRUDER_THERMISTOR_PIN
return extruder_read_thermistor();
#endif
#ifndef EXTRUDER_THERMISTOR_PIN
return extruder_read_thermocouple();
#endif
}
#ifdef EXTRUDER_THERMISTOR_PIN int extruder_read_thermistor() { ... } #endif
#ifndef EXTRUDER_THERMISTOR_PIN int extruder_read_thermocouple() { ... } #endif
#ifdef EXTRUDER_THERMISTOR_PIN int current_celsius = extruder_read_thermistor(); #endif #ifndef EXTRUDER_THERMISTOR_PIN int current_celsius = extruder_read_thermocouple(); #endif
Re: Super Super Firmware Optimization (giving you more free memory!) October 28, 2008 07:14PM |
Admin Registered: 17 years ago Posts: 7,879 |
Re: Super Super Firmware Optimization (giving you more free memory!) October 28, 2008 07:36PM |
Registered: 16 years ago Posts: 293 |
Binary sketch size: 14914 bytes (of a 14336 byte maximum)
// Yep, this is actually -*- c++ -*- #ifdef EXTRUDER_THERMISTOR_PIN #include "ThermistorTable.h" #endif #define EXTRUDER_FORWARD true #define EXTRUDER_REVERSE false //these our the default values for the extruder. int extruder_speed = 128; int extruder_target_celsius = 0; int extruder_max_celsius = 0; byte extruder_heater_low = 64; byte extruder_heater_high = 255; byte extruder_heater_current = 0; //this is for doing encoder based extruder control int extruder_rpm = 0; long extruder_delay = 0; int extruder_error = 0; int last_extruder_error = 0; int extruder_error_delta = 0; bool extruder_direction = EXTRUDER_FORWARD; void init_extruder() { //default to room temp. //extruder_set_temperature(21); //setup our pins pinMode(EXTRUDER_MOTOR_DIR_PIN, OUTPUT); pinMode(EXTRUDER_MOTOR_SPEED_PIN, OUTPUT); pinMode(EXTRUDER_HEATER_PIN, OUTPUT); pinMode(EXTRUDER_FAN_PIN, OUTPUT); //initialize values digitalWrite(EXTRUDER_MOTOR_DIR_PIN, EXTRUDER_FORWARD); analogWrite(EXTRUDER_FAN_PIN, 0); analogWrite(EXTRUDER_HEATER_PIN, 0); analogWrite(EXTRUDER_MOTOR_SPEED_PIN, 0); } void extruder_set_direction(bool direction) { extruder_direction = direction; digitalWrite(EXTRUDER_MOTOR_DIR_PIN, direction); } void extruder_set_speed(byte speed) { analogWrite(EXTRUDER_MOTOR_SPEED_PIN, speed); } void extruder_set_cooler(byte speed) { analogWrite(EXTRUDER_FAN_PIN, speed); } void extruder_set_temperature(int temp) { extruder_target_celsius = temp; extruder_max_celsius = (int)((float)temp * 1.1); } /** * Samples the temperature and converts it to degrees celsius. * Returns degrees celsius. */ int extruder_get_temperature() { #ifdef EXTRUDER_THERMISTOR_PIN int raw = extruder_sample_temperature(EXTRUDER_THERMISTOR_PIN); int celsius = 0; byte i; for (i=1; i raw) { celsius = temptable[i-1][1] + (raw - temptable[i-1][0]) * (temptable[1] - temptable[i-1][1]) / (temptable[0] - temptable[i-1][0]); break; } } // Overflow: Set to last value in the table if (i == NUMTEMPS) celsius = temptable[i-1][1]; // Clamp to byte if (celsius > 255) celsius = 255; else if (celsius < 0) celsius = 0; return celsius; #endif #ifndef EXTRUDER_THERMISTOR_PIN return ( 5.0 * extruder_sample_temperature(EXTRUDER_THERMOCOUPLE_PIN) * 100.0) / 1024.0; #endif } /* * This function gives us an averaged sample of the analog temperature pin. */ int extruder_sample_temperature(byte pin) { // can be smaller when not using a single sample #if TEMPERATURE_SAMPLES==1 return analogRead(pin); #endif int raw = 0; //read in a certain number of samples for (byte i=0; iRegards, Erik de Bruijn [Ultimaker.com] - [blog.erikdebruijn.nl]
Re: Super Super Firmware Optimization (giving you more free memory!) October 28, 2008 07:45PM |
Registered: 16 years ago Posts: 293 |
int extruder_get_temperature() { return 1; // instead of: ( 5.0 * extruder_sample_temperature(EXTRUDER_THERMOCOUPLE_PIN) * 100.0) / 1024.0; }