// This determines the communication speed of the printer
-//#define BAUDRATE 250000
-#define BAUDRATE 115200
+#define BAUDRATE 250000
+//#define BAUDRATE 115200
//#define BAUDRATE 230400
-#define EXTRUDERS 2
+#define EXTRUDERS 1
// Frequency limit
// See nophead's blog for more info
// Sanguinololu 1.2 and above = 62
// Ultimaker = 7,
// Teensylu = 8
-#define MOTHERBOARD 33
+#define MOTHERBOARD 7
//===========================================================================
//=============================Thermal Settings ============================
// 5 is ParCan supplied 104GT-2 100K
// 6 is EPCOS 100k
// 7 is 100k Honeywell thermistor 135-104LAG-J01
-#define THERMISTORHEATER_0 1
-#define THERMISTORHEATER_1 1
-#define HEATER_0_USES_THERMISTOR
-#define HEATER_1_USES_THERMISTOR
-//#define HEATER_0_USES_AD595
+
+//#define THERMISTORHEATER_0 3
+//#define THERMISTORHEATER_1 1
+//#define THERMISTORHEATER_2 1
+
+//#define HEATER_0_USES_THERMISTOR
+//#define HEATER_1_USES_THERMISTOR
+//#define HEATER_2_USES_THERMISTOR
+#define HEATER_0_USES_AD595
//#define HEATER_1_USES_AD595
+//#define HEATER_2_USES_AD595
// Select one of these only to define how the bed temp is read.
-#define THERMISTORBED 1
-#define BED_USES_THERMISTOR
+//#define THERMISTORBED 1
+//#define BED_USES_THERMISTOR
//#define BED_USES_AD595
#define BED_CHECK_INTERVAL 5000 //ms
//// The minimal temperature defines the temperature below which the heater will not be enabled
#define HEATER_0_MINTEMP 5
//#define HEATER_1_MINTEMP 5
-#define BED_MINTEMP 5
+//#define HEATER_2_MINTEMP 5
+//#define BED_MINTEMP 5
// When temperature exceeds max temp, your heater will be switched off.
// You should use MINTEMP for thermistor short/failure protection.
#define HEATER_0_MAXTEMP 275
//#define HEATER_1_MAXTEMP 275
-#define BED_MAXTEMP 150
+//#define HEATER_2_MAXTEMP 275
+//#define BED_MAXTEMP 150
// Wait for Cooldown
// Heating is finished if a temperature close to this degree shift is reached
#define HEATING_EARLY_FINISH_DEG_OFFSET 1 //Degree
+
// PID settings:
// Uncomment the following line to enable PID support.
-
#define PIDTEMP
+#define PID_MAX 255 // limits current to nozzle; 255=full current
#ifdef PIDTEMP
- #if MOTHERBOARD == 62
- #error Sanguinololu does not support PID, sorry. Please disable it.
- #endif
//#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; 255=full current
#define PID_INTEGRAL_DRIVE_MAX 255 //limit for the integral term
#define K1 0.95 //smoothing factor withing the PID
- #define PID_dT 0.1 //sampling period of the PID
+ #define PID_dT 0.128 //sampling period of the PID
//To develop some PID settings for your machine, you can initiall follow
// the Ziegler-Nichols method.
// #define DEFAULT_Kd (PID_SWING_AT_CRITIAL/8./PID_dT)
// Ultitmaker
-// #define DEFAULT_Kp 22.2
-// #define DEFAULT_Ki (1.25*PID_dT)
-// #define DEFAULT_Kd (99/PID_dT)
+ #define DEFAULT_Kp 22.2
+ #define DEFAULT_Ki (1.25*PID_dT)
+ #define DEFAULT_Kd (99/PID_dT)
// Makergear
- #define DEFAULT_Kp 7.0
- #define DEFAULT_Ki 0.1
- #define DEFAULT_Kd 12
+// #define DEFAULT_Kp 7.0
+// #define DEFAULT_Ki 0.1
+// #define DEFAULT_Kd 12
// Mendel Parts V9 on 12V
// #define DEFAULT_Kp 63.0
#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 X_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.
-const bool Y_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.
-const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.
+const bool X_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
+const bool Y_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
+const bool Z_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
-//#define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing
+#define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
#define X_ENABLE_ON 0
// Disables axis when it's not being used.
#define DISABLE_X false
#define DISABLE_Y false
-#define DISABLE_Z true
+#define DISABLE_Z false
#define DISABLE_E false // For all extruders
// Inverting axis direction
//#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true
//#define INVERT_E*_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false, used for all extruders
-#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true
+#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_E0_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
-#define INVERT_E1_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false
+#define INVERT_E1_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
#define INVERT_E2_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
//// ENDSTOP SETTINGS:
#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
+#define min_software_endstops true //If true, axis won't move to coordinates less than zero.
+#define max_software_endstops true //If true, axis won't move to coordinates greater than the defined lengths below.
+#define X_MAX_LENGTH 205
+#define Y_MAX_LENGTH 205
+#define Z_MAX_LENGTH 200
//// MOVEMENT SETTINGS
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
-#define HOMING_FEEDRATE {30*60, 30*60, 2*60, 0} // set the homing speeds (mm/min)
+#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0} // set the homing speeds (mm/min)
//homing hits the endstop, then retracts by this distance, before it tries to slowly bump again:
#define X_HOME_RETRACT_MM 5
// default settings
-//#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200*8/3,760*1.1} // default steps per unit for ultimaker
-//#define DEFAULT_AXIS_STEPS_PER_UNIT {40, 40, 3333.92, 67} //sells mendel with v9 extruder
-#define DEFAULT_AXIS_STEPS_PER_UNIT {80.3232, 80.8900, 2284.7651, 757.2218} // SAE Prusa w/ Wade extruder
+#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200*8/3,760*1.1} // default steps per unit for ultimaker
+//#define DEFAULT_AXIS_STEPS_PER_UNIT {40, 40, 3333.92, 360} //sells mendel with v9 extruder
+//#define DEFAULT_AXIS_STEPS_PER_UNIT {80.3232, 80.8900, 2284.7651, 757.2218} // SAE Prusa w/ Wade extruder
#define DEFAULT_MAX_FEEDRATE {500, 500, 5, 45} // (mm/sec)
#define DEFAULT_MAX_ACCELERATION {9000,9000,100,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.
// 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
+#define ADVANCE
#ifdef ADVANCE
- #define EXTRUDER_ADVANCE_K .3
+ #define EXTRUDER_ADVANCE_K .0
#define D_FILAMENT 2.85
#define STEPS_MM_E 836
//LCD and SD support
//#define ULTRA_LCD //general lcd support, also 16x2
-#define SDSUPPORT // Enable SD Card Support in Hardware Console
+//#define SDSUPPORT // Enable SD Card Support in Hardware Console
#define SD_FINISHED_STEPPERRELEASE true //if sd support and the file is finished: disable steppers?
-//#define ULTIPANEL
+#define ULTIPANEL
#ifdef ULTIPANEL
//#define NEWPANEL //enable this if you have a click-encoder panel
#define SDSUPPORT
#define SERIAL_ECHOPAIR(name,value) {SERIAL_ECHOPGM(name);SERIAL_ECHO(value);}
-// Macro for getting current active extruder
-#define ACTIVE_EXTRUDER (active_extruder)
//things to write to serial from Programmemory. saves 400 to 2k of RAM.
#define SerialprintPGM(x) serialprintPGM(MYPGM(x))
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); \
destination[LETTER##_AXIS] = 1.5 * LETTER##_MAX_LENGTH * LETTER##_HOME_DIR; \
feedrate = homing_feedrate[LETTER##_AXIS]; \
- prepare_move(); \
+ plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); \
\
current_position[LETTER##_AXIS] = 0;\
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);\
destination[LETTER##_AXIS] = -LETTER##_HOME_RETRACT_MM * LETTER##_HOME_DIR;\
- prepare_move(); \
+ plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); \
\
destination[LETTER##_AXIS] = 2*LETTER##_HOME_RETRACT_MM * LETTER##_HOME_DIR;\
feedrate = homing_feedrate[LETTER##_AXIS]/2 ; \
- prepare_move(); \
+ plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); \
\
current_position[LETTER##_AXIS] = (LETTER##_HOME_DIR == -1) ? 0 : LETTER##_MAX_LENGTH;\
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);\
if( code_seen(axis_codes[0]) && code_seen(axis_codes[1]) ) //first diagonal move
{
current_position[X_AXIS] = 0; current_position[Y_AXIS] = 0;
+
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
destination[X_AXIS] = 1.5 * X_MAX_LENGTH * X_HOME_DIR;
destination[Y_AXIS] = 1.5 * Y_MAX_LENGTH * Y_HOME_DIR;
if (code_seen('S')) setTargetBed(code_value());
break;
case 105 : // M105
- tmp_extruder = ACTIVE_EXTRUDER;
+ tmp_extruder = active_extruder;
if(code_seen('T')) {
tmp_extruder = code_value();
if(tmp_extruder >= EXTRUDERS) {
#else
SERIAL_ERROR_START;
SERIAL_ERRORLNPGM("No thermistors - no temp");
+ #endif
+ #ifdef PIDTEMP
+ SERIAL_PROTOCOLPGM(" @:");
+ SERIAL_PROTOCOL(getHeaterPower(tmp_extruder));
#endif
SERIAL_PROTOCOLLN("");
return;
while((residencyStart == -1) ||
(residencyStart > -1 && (millis() - residencyStart) < TEMP_RESIDENCY_TIME*1000) ) {
#else
- while ( target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder)&&(CooldownNoWait==false)) ) {\r
+ while ( target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder)&&(CooldownNoWait==false)) ) {
#endif //TEMP_RESIDENCY_TIME
if( (millis() - codenum) > 1000 )
{ //Print Temp Reading and remaining time every 1 second while heating up/cooling down
SERIAL_PROTOCOLPGM("T:");
- SERIAL_PROTOCOLLN( degHotend(tmp_extruder) );
+ SERIAL_PROTOCOL( degHotend(tmp_extruder) );
SERIAL_PROTOCOLPGM(" E:");
SERIAL_PROTOCOLLN( (int)tmp_extruder );
- SERIAL_PROTOCOLPGM(" W:");
- if(residencyStart > -1)
- {
- codenum = TEMP_RESIDENCY_TIME - ((millis() - residencyStart) / 1000);
- SERIAL_PROTOCOLLN( codenum );
- }
- else
- {
- SERIAL_PROTOCOLLN( "?" );
- }
+ #ifdef TEMP_RESIDENCY_TIME
+ SERIAL_PROTOCOLPGM(" W:");
+ if(residencyStart > -1)
+ {
+ codenum = TEMP_RESIDENCY_TIME - ((millis() - residencyStart) / 1000);
+ SERIAL_PROTOCOLLN( codenum );
+ }
+ else
+ {
+ SERIAL_PROTOCOLLN( "?" );
+ }
+ #endif
codenum = millis();
}
manage_heater();
{
if( (millis()-codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
{
- float tt=degHotend(ACTIVE_EXTRUDER);
+ float tt=degHotend(active_extruder);
SERIAL_PROTOCOLPGM("T:");
SERIAL_PROTOCOL(tt);
SERIAL_PROTOCOLPGM(" E:");
- SERIAL_PROTOCOLLN( (int)tmp_extruder );
+ SERIAL_PROTOCOLLN( (int)active_extruder );
SERIAL_PROTOCOLPGM(" B:");
SERIAL_PROTOCOLLN(degBed());
codenum = millis();
void kill()
{
+ cli(); // Stop interrupts
disable_heater();
disable_x();
while(1); // Wait for reset
}
-
+\r
-/*\r
- This code contibuted by Triffid_Hunter and modified by Kliment\r
- why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html\r
-*/\r
-\r
-#ifndef _ARDUINO_H\r
-#define _ARDUINO_H\r
-\r
-#include <avr/io.h>\r
-\r
-/*\r
- utility functions\r
-*/\r
-\r
-#ifndef MASK\r
-/// MASKING- returns \f$2^PIN\f$\r
- #define MASK(PIN) (1 << PIN)\r
-#endif\r
-\r
-/*\r
- magic I/O routines\r
-\r
- now you can simply SET_OUTPUT(STEP); WRITE(STEP, 1); WRITE(STEP, 0);\r
-*/\r
-\r
-/// Read a pin\r
-#define _READ(IO) ((bool)(DIO ## IO ## _RPORT & MASK(DIO ## IO ## _PIN)))\r
-/// write to a pin\r
-#define _WRITE(IO, v) do { if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); }; } while (0)\r
-//#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)\r
-/// toggle a pin\r
-#define _TOGGLE(IO) do {DIO ## IO ## _RPORT = MASK(DIO ## IO ## _PIN); } while (0)\r
-\r
-/// set pin as input\r
-#define _SET_INPUT(IO) do {DIO ## IO ## _DDR &= ~MASK(DIO ## IO ## _PIN); } while (0)\r
-/// set pin as output\r
-#define _SET_OUTPUT(IO) do {DIO ## IO ## _DDR |= MASK(DIO ## IO ## _PIN); } while (0)\r
-\r
-/// check if pin is an input\r
-#define _GET_INPUT(IO) ((DIO ## IO ## _DDR & MASK(DIO ## IO ## _PIN)) == 0)\r
-/// check if pin is an output\r
-#define _GET_OUTPUT(IO) ((DIO ## IO ## _DDR & MASK(DIO ## IO ## _PIN)) != 0)\r
-\r
-// why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html\r
-\r
-/// Read a pin wrapper\r
-#define READ(IO) _READ(IO)\r
-/// Write to a pin wrapper\r
-#define WRITE(IO, v) _WRITE(IO, v)\r
-#if EXTRUDERS > 2\r
- #define WRITE_E_STEP(v) { if(ACTIVE_EXTRUDER == 2) { WRITE(E2_STEP_PIN, v); } else { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}}\r
- #define NORM_E_DIR() { if(ACTIVE_EXTRUDER == 2) { WRITE(E2_DIR_PIN, INVERT_E2_DIR); } else { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}}\r
- #define REV_E_DIR() { if(ACTIVE_EXTRUDER == 2) { WRITE(E2_DIR_PIN, !INVERT_E2_DIR); } else { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_DIR_PIN, !INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}}\r
-#elif EXTRUDERS > 1\r
- #define WRITE_E_STEP(v) { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}\r
- #define NORM_E_DIR() { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}\r
- #define REV_E_DIR() { if(ACTIVE_EXTRUDER == 1) { WRITE(E1_DIR_PIN, !INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}\r
-#else\r
- #define WRITE_E_STEP(v) WRITE(E0_STEP_PIN, v)\r
- #define NORM_E_DIR() WRITE(E0_DIR_PIN, INVERT_E0_DIR)\r
- #define REV_E_DIR() WRITE(E0_DIR_PIN, !INVERT_E0_DIR)\r
-#endif\r
-\r
-/// toggle a pin wrapper\r
-#define TOGGLE(IO) _TOGGLE(IO)\r
-\r
-/// set pin as input wrapper\r
-#define SET_INPUT(IO) _SET_INPUT(IO)\r
-/// set pin as output wrapper\r
-#define SET_OUTPUT(IO) _SET_OUTPUT(IO)\r
-\r
-/// check if pin is an input wrapper\r
-#define GET_INPUT(IO) _GET_INPUT(IO)\r
-/// check if pin is an output wrapper\r
-#define GET_OUTPUT(IO) _GET_OUTPUT(IO)\r
-\r
-/*\r
- ports and functions\r
-\r
- added as necessary or if I feel like it- not a comprehensive list!\r
-*/\r
-\r
-#if defined (__AVR_ATmega168__) || defined (__AVR_ATmega328__) || defined (__AVR_ATmega328P__)\r
-// UART\r
-#define RXD DIO0\r
-#define TXD DIO1\r
-\r
-// SPI\r
-#define SCK DIO13\r
-#define MISO DIO12\r
-#define MOSI DIO11\r
-#define SS DIO10\r
-\r
-// TWI (I2C)\r
-#define SCL AIO5\r
-#define SDA AIO4\r
-\r
-// timers and PWM\r
-#define OC0A DIO6\r
-#define OC0B DIO5\r
-#define OC1A DIO9\r
-#define OC1B DIO10\r
-#define OC2A DIO11\r
-#define OC2B DIO3\r
-\r
-#define DEBUG_LED AIO5\r
-\r
-/*\r
-pins\r
-*/\r
-\r
-#define DIO0_PIN PIND0\r
-#define DIO0_RPORT PIND\r
-#define DIO0_WPORT PORTD\r
-#define DIO0_DDR DDRD\r
-#define DIO0_PWM NULL\r
-\r
-#define DIO1_PIN PIND1\r
-#define DIO1_RPORT PIND\r
-#define DIO1_WPORT PORTD\r
-#define DIO1_DDR DDRD\r
-#define DIO1_PWM NULL\r
-\r
-#define DIO2_PIN PIND2\r
-#define DIO2_RPORT PIND\r
-#define DIO2_WPORT PORTD\r
-#define DIO2_DDR DDRD\r
-#define DIO2_PWM NULL\r
-\r
-#define DIO3_PIN PIND3\r
-#define DIO3_RPORT PIND\r
-#define DIO3_WPORT PORTD\r
-#define DIO3_DDR DDRD\r
-#define DIO3_PWM &OCR2B\r
-\r
-#define DIO4_PIN PIND4\r
-#define DIO4_RPORT PIND\r
-#define DIO4_WPORT PORTD\r
-#define DIO4_DDR DDRD\r
-#define DIO4_PWM NULL\r
-\r
-#define DIO5_PIN PIND5\r
-#define DIO5_RPORT PIND\r
-#define DIO5_WPORT PORTD\r
-#define DIO5_DDR DDRD\r
-#define DIO5_PWM &OCR0B\r
-\r
-#define DIO6_PIN PIND6\r
-#define DIO6_RPORT PIND\r
-#define DIO6_WPORT PORTD\r
-#define DIO6_DDR DDRD\r
-#define DIO6_PWM &OCR0A\r
-\r
-#define DIO7_PIN PIND7\r
-#define DIO7_RPORT PIND\r
-#define DIO7_WPORT PORTD\r
-#define DIO7_DDR DDRD\r
-#define DIO7_PWM NULL\r
-\r
-#define DIO8_PIN PINB0\r
-#define DIO8_RPORT PINB\r
-#define DIO8_WPORT PORTB\r
-#define DIO8_DDR DDRB\r
-#define DIO8_PWM NULL\r
-\r
-#define DIO9_PIN PINB1\r
-#define DIO9_RPORT PINB\r
-#define DIO9_WPORT PORTB\r
-#define DIO9_DDR DDRB\r
-#define DIO9_PWM NULL\r
-\r
-#define DIO10_PIN PINB2\r
-#define DIO10_RPORT PINB\r
-#define DIO10_WPORT PORTB\r
-#define DIO10_DDR DDRB\r
-#define DIO10_PWM NULL\r
-\r
-#define DIO11_PIN PINB3\r
-#define DIO11_RPORT PINB\r
-#define DIO11_WPORT PORTB\r
-#define DIO11_DDR DDRB\r
-#define DIO11_PWM &OCR2A\r
-\r
-#define DIO12_PIN PINB4\r
-#define DIO12_RPORT PINB\r
-#define DIO12_WPORT PORTB\r
-#define DIO12_DDR DDRB\r
-#define DIO12_PWM NULL\r
-\r
-#define DIO13_PIN PINB5\r
-#define DIO13_RPORT PINB\r
-#define DIO13_WPORT PORTB\r
-#define DIO13_DDR DDRB\r
-#define DIO13_PWM NULL\r
-\r
-\r
-#define DIO14_PIN PINC0\r
-#define DIO14_RPORT PINC\r
-#define DIO14_WPORT PORTC\r
-#define DIO14_DDR DDRC\r
-#define DIO14_PWM NULL\r
-\r
-#define DIO15_PIN PINC1\r
-#define DIO15_RPORT PINC\r
-#define DIO15_WPORT PORTC\r
-#define DIO15_DDR DDRC\r
-#define DIO15_PWM NULL\r
-\r
-#define DIO16_PIN PINC2\r
-#define DIO16_RPORT PINC\r
-#define DIO16_WPORT PORTC\r
-#define DIO16_DDR DDRC\r
-#define DIO16_PWM NULL\r
-\r
-#define DIO17_PIN PINC3\r
-#define DIO17_RPORT PINC\r
-#define DIO17_WPORT PORTC\r
-#define DIO17_DDR DDRC\r
-#define DIO17_PWM NULL\r
-\r
-#define DIO18_PIN PINC4\r
-#define DIO18_RPORT PINC\r
-#define DIO18_WPORT PORTC\r
-#define DIO18_DDR DDRC\r
-#define DIO18_PWM NULL\r
-\r
-#define DIO19_PIN PINC5\r
-#define DIO19_RPORT PINC\r
-#define DIO19_WPORT PORTC\r
-#define DIO19_DDR DDRC\r
-#define DIO19_PWM NULL\r
-\r
-#define DIO20_PIN PINC6\r
-#define DIO20_RPORT PINC\r
-#define DIO20_WPORT PORTC\r
-#define DIO20_DDR DDRC\r
-#define DIO20_PWM NULL\r
-\r
-#define DIO21_PIN PINC7\r
-#define DIO21_RPORT PINC\r
-#define DIO21_WPORT PORTC\r
-#define DIO21_DDR DDRC\r
-#define DIO21_PWM NULL\r
-\r
-\r
-\r
-#undef PB0\r
-#define PB0_PIN PINB0\r
-#define PB0_RPORT PINB\r
-#define PB0_WPORT PORTB\r
-#define PB0_DDR DDRB\r
-#define PB0_PWM NULL\r
-\r
-#undef PB1\r
-#define PB1_PIN PINB1\r
-#define PB1_RPORT PINB\r
-#define PB1_WPORT PORTB\r
-#define PB1_DDR DDRB\r
-#define PB1_PWM NULL\r
-\r
-#undef PB2\r
-#define PB2_PIN PINB2\r
-#define PB2_RPORT PINB\r
-#define PB2_WPORT PORTB\r
-#define PB2_DDR DDRB\r
-#define PB2_PWM NULL\r
-\r
-#undef PB3\r
-#define PB3_PIN PINB3\r
-#define PB3_RPORT PINB\r
-#define PB3_WPORT PORTB\r
-#define PB3_DDR DDRB\r
-#define PB3_PWM &OCR2A\r
-\r
-#undef PB4\r
-#define PB4_PIN PINB4\r
-#define PB4_RPORT PINB\r
-#define PB4_WPORT PORTB\r
-#define PB4_DDR DDRB\r
-#define PB4_PWM NULL\r
-\r
-#undef PB5\r
-#define PB5_PIN PINB5\r
-#define PB5_RPORT PINB\r
-#define PB5_WPORT PORTB\r
-#define PB5_DDR DDRB\r
-#define PB5_PWM NULL\r
-\r
-#undef PB6\r
-#define PB6_PIN PINB6\r
-#define PB6_RPORT PINB\r
-#define PB6_WPORT PORTB\r
-#define PB6_DDR DDRB\r
-#define PB6_PWM NULL\r
-\r
-#undef PB7\r
-#define PB7_PIN PINB7\r
-#define PB7_RPORT PINB\r
-#define PB7_WPORT PORTB\r
-#define PB7_DDR DDRB\r
-#define PB7_PWM NULL\r
-\r
-\r
-#undef PC0\r
-#define PC0_PIN PINC0\r
-#define PC0_RPORT PINC\r
-#define PC0_WPORT PORTC\r
-#define PC0_DDR DDRC\r
-#define PC0_PWM NULL\r
-\r
-#undef PC1\r
-#define PC1_PIN PINC1\r
-#define PC1_RPORT PINC\r
-#define PC1_WPORT PORTC\r
-#define PC1_DDR DDRC\r
-#define PC1_PWM NULL\r
-\r
-#undef PC2\r
-#define PC2_PIN PINC2\r
-#define PC2_RPORT PINC\r
-#define PC2_WPORT PORTC\r
-#define PC2_DDR DDRC\r
-#define PC2_PWM NULL\r
-\r
-#undef PC3\r
-#define PC3_PIN PINC3\r
-#define PC3_RPORT PINC\r
-#define PC3_WPORT PORTC\r
-#define PC3_DDR DDRC\r
-#define PC3_PWM NULL\r
-\r
-#undef PC4\r
-#define PC4_PIN PINC4\r
-#define PC4_RPORT PINC\r
-#define PC4_WPORT PORTC\r
-#define PC4_DDR DDRC\r
-#define PC4_PWM NULL\r
-\r
-#undef PC5\r
-#define PC5_PIN PINC5\r
-#define PC5_RPORT PINC\r
-#define PC5_WPORT PORTC\r
-#define PC5_DDR DDRC\r
-#define PC5_PWM NULL\r
-\r
-#undef PC6\r
-#define PC6_PIN PINC6\r
-#define PC6_RPORT PINC\r
-#define PC6_WPORT PORTC\r
-#define PC6_DDR DDRC\r
-#define PC6_PWM NULL\r
-\r
-#undef PC7\r
-#define PC7_PIN PINC7\r
-#define PC7_RPORT PINC\r
-#define PC7_WPORT PORTC\r
-#define PC7_DDR DDRC\r
-#define PC7_PWM NULL\r
-\r
-\r
-#undef PD0\r
-#define PD0_PIN PIND0\r
-#define PD0_RPORT PIND\r
-#define PD0_WPORT PORTD\r
-#define PD0_DDR DDRD\r
-#define PD0_PWM NULL\r
-\r
-#undef PD1\r
-#define PD1_PIN PIND1\r
-#define PD1_RPORT PIND\r
-#define PD1_WPORT PORTD\r
-#define PD1_DDR DDRD\r
-#define PD1_PWM NULL\r
-\r
-#undef PD2\r
-#define PD2_PIN PIND2\r
-#define PD2_RPORT PIND\r
-#define PD2_WPORT PORTD\r
-#define PD2_DDR DDRD\r
-#define PD2_PWM NULL\r
-\r
-#undef PD3\r
-#define PD3_PIN PIND3\r
-#define PD3_RPORT PIND\r
-#define PD3_WPORT PORTD\r
-#define PD3_DDR DDRD\r
-#define PD3_PWM &OCR2B\r
-\r
-#undef PD4\r
-#define PD4_PIN PIND4\r
-#define PD4_RPORT PIND\r
-#define PD4_WPORT PORTD\r
-#define PD4_DDR DDRD\r
-#define PD4_PWM NULL\r
-\r
-#undef PD5\r
-#define PD5_PIN PIND5\r
-#define PD5_RPORT PIND\r
-#define PD5_WPORT PORTD\r
-#define PD5_DDR DDRD\r
-#define PD5_PWM &OCR0B\r
-\r
-#undef PD6\r
-#define PD6_PIN PIND6\r
-#define PD6_RPORT PIND\r
-#define PD6_WPORT PORTD\r
-#define PD6_DDR DDRD\r
-#define PD6_PWM &OCR0A\r
-\r
-#undef PD7\r
-#define PD7_PIN PIND7\r
-#define PD7_RPORT PIND\r
-#define PD7_WPORT PORTD\r
-#define PD7_DDR DDRD\r
-#define PD7_PWM NULL\r
-#endif /* _AVR_ATmega{168,328,328P}__ */\r
-\r
-#if defined (__AVR_ATmega644__) || defined (__AVR_ATmega644P__) || defined (__AVR_ATmega644PA__)\r
-// UART\r
-#define RXD DIO8\r
-#define TXD DIO9\r
-#define RXD0 DIO8\r
-#define TXD0 DIO9\r
-\r
-#define RXD1 DIO10\r
-#define TXD1 DIO11\r
-\r
-// SPI\r
-#define SCK DIO7\r
-#define MISO DIO6\r
-#define MOSI DIO5\r
-#define SS DIO4\r
-\r
-// TWI (I2C)\r
-#define SCL DIO16\r
-#define SDA DIO17\r
-\r
-// timers and PWM\r
-#define OC0A DIO3\r
-#define OC0B DIO4\r
-#define OC1A DIO13\r
-#define OC1B DIO12\r
-#define OC2A DIO15\r
-#define OC2B DIO14\r
-\r
-#define DEBUG_LED DIO0\r
-/*\r
-pins\r
-*/\r
-\r
-#define DIO0_PIN PINB0\r
-#define DIO0_RPORT PINB\r
-#define DIO0_WPORT PORTB\r
-#define DIO0_DDR DDRB\r
-#define DIO0_PWM NULL\r
-\r
-#define DIO1_PIN PINB1\r
-#define DIO1_RPORT PINB\r
-#define DIO1_WPORT PORTB\r
-#define DIO1_DDR DDRB\r
-#define DIO1_PWM NULL\r
-\r
-#define DIO2_PIN PINB2\r
-#define DIO2_RPORT PINB\r
-#define DIO2_WPORT PORTB\r
-#define DIO2_DDR DDRB\r
-#define DIO2_PWM NULL\r
-\r
-#define DIO3_PIN PINB3\r
-#define DIO3_RPORT PINB\r
-#define DIO3_WPORT PORTB\r
-#define DIO3_DDR DDRB\r
-#define DIO3_PWM &OCR0A\r
-\r
-#define DIO4_PIN PINB4\r
-#define DIO4_RPORT PINB\r
-#define DIO4_WPORT PORTB\r
-#define DIO4_DDR DDRB\r
-#define DIO4_PWM &OCR0B\r
-\r
-#define DIO5_PIN PINB5\r
-#define DIO5_RPORT PINB\r
-#define DIO5_WPORT PORTB\r
-#define DIO5_DDR DDRB\r
-#define DIO5_PWM NULL\r
-\r
-#define DIO6_PIN PINB6\r
-#define DIO6_RPORT PINB\r
-#define DIO6_WPORT PORTB\r
-#define DIO6_DDR DDRB\r
-#define DIO6_PWM NULL\r
-\r
-#define DIO7_PIN PINB7\r
-#define DIO7_RPORT PINB\r
-#define DIO7_WPORT PORTB\r
-#define DIO7_DDR DDRB\r
-#define DIO7_PWM NULL\r
-\r
-#define DIO8_PIN PIND0\r
-#define DIO8_RPORT PIND\r
-#define DIO8_WPORT PORTD\r
-#define DIO8_DDR DDRD\r
-#define DIO8_PWM NULL\r
-\r
-#define DIO9_PIN PIND1\r
-#define DIO9_RPORT PIND\r
-#define DIO9_WPORT PORTD\r
-#define DIO9_DDR DDRD\r
-#define DIO9_PWM NULL\r
-\r
-#define DIO10_PIN PIND2\r
-#define DIO10_RPORT PIND\r
-#define DIO10_WPORT PORTD\r
-#define DIO10_DDR DDRD\r
-#define DIO10_PWM NULL\r
-\r
-#define DIO11_PIN PIND3\r
-#define DIO11_RPORT PIND\r
-#define DIO11_WPORT PORTD\r
-#define DIO11_DDR DDRD\r
-#define DIO11_PWM NULL\r
-\r
-#define DIO12_PIN PIND4\r
-#define DIO12_RPORT PIND\r
-#define DIO12_WPORT PORTD\r
-#define DIO12_DDR DDRD\r
-#define DIO12_PWM NULL\r
-\r
-#define DIO13_PIN PIND5\r
-#define DIO13_RPORT PIND\r
-#define DIO13_WPORT PORTD\r
-#define DIO13_DDR DDRD\r
-#define DIO13_PWM NULL\r
-\r
-#define DIO14_PIN PIND6\r
-#define DIO14_RPORT PIND\r
-#define DIO14_WPORT PORTD\r
-#define DIO14_DDR DDRD\r
-#define DIO14_PWM &OCR2B\r
-\r
-#define DIO15_PIN PIND7\r
-#define DIO15_RPORT PIND\r
-#define DIO15_WPORT PORTD\r
-#define DIO15_DDR DDRD\r
-#define DIO15_PWM &OCR2A\r
-\r
-#define DIO16_PIN PINC0\r
-#define DIO16_RPORT PINC\r
-#define DIO16_WPORT PORTC\r
-#define DIO16_DDR DDRC\r
-#define DIO16_PWM NULL\r
-\r
-#define DIO17_PIN PINC1\r
-#define DIO17_RPORT PINC\r
-#define DIO17_WPORT PORTC\r
-#define DIO17_DDR DDRC\r
-#define DIO17_PWM NULL\r
-\r
-#define DIO18_PIN PINC2\r
-#define DIO18_RPORT PINC\r
-#define DIO18_WPORT PORTC\r
-#define DIO18_DDR DDRC\r
-#define DIO18_PWM NULL\r
-\r
-#define DIO19_PIN PINC3\r
-#define DIO19_RPORT PINC\r
-#define DIO19_WPORT PORTC\r
-#define DIO19_DDR DDRC\r
-#define DIO19_PWM NULL\r
-\r
-#define DIO20_PIN PINC4\r
-#define DIO20_RPORT PINC\r
-#define DIO20_WPORT PORTC\r
-#define DIO20_DDR DDRC\r
-#define DIO20_PWM NULL\r
-\r
-#define DIO21_PIN PINC5\r
-#define DIO21_RPORT PINC\r
-#define DIO21_WPORT PORTC\r
-#define DIO21_DDR DDRC\r
-#define DIO21_PWM NULL\r
-\r
-#define DIO22_PIN PINC6\r
-#define DIO22_RPORT PINC\r
-#define DIO22_WPORT PORTC\r
-#define DIO22_DDR DDRC\r
-#define DIO22_PWM NULL\r
-\r
-#define DIO23_PIN PINC7\r
-#define DIO23_RPORT PINC\r
-#define DIO23_WPORT PORTC\r
-#define DIO23_DDR DDRC\r
-#define DIO23_PWM NULL\r
-\r
-#define DIO24_PIN PINA7\r
-#define DIO24_RPORT PINA\r
-#define DIO24_WPORT PORTA\r
-#define DIO24_DDR DDRA\r
-#define DIO24_PWM NULL\r
-\r
-#define DIO25_PIN PINA6\r
-#define DIO25_RPORT PINA\r
-#define DIO25_WPORT PORTA\r
-#define DIO25_DDR DDRA\r
-#define DIO25_PWM NULL\r
-\r
-#define DIO26_PIN PINA5\r
-#define DIO26_RPORT PINA\r
-#define DIO26_WPORT PORTA\r
-#define DIO26_DDR DDRA\r
-#define DIO26_PWM NULL\r
-\r
-#define DIO27_PIN PINA4\r
-#define DIO27_RPORT PINA\r
-#define DIO27_WPORT PORTA\r
-#define DIO27_DDR DDRA\r
-#define DIO27_PWM NULL\r
-\r
-#define DIO28_PIN PINA3\r
-#define DIO28_RPORT PINA\r
-#define DIO28_WPORT PORTA\r
-#define DIO28_DDR DDRA\r
-#define DIO28_PWM NULL\r
-\r
-#define DIO29_PIN PINA2\r
-#define DIO29_RPORT PINA\r
-#define DIO29_WPORT PORTA\r
-#define DIO29_DDR DDRA\r
-#define DIO29_PWM NULL\r
-\r
-#define DIO30_PIN PINA1\r
-#define DIO30_RPORT PINA\r
-#define DIO30_WPORT PORTA\r
-#define DIO30_DDR DDRA\r
-#define DIO30_PWM NULL\r
-\r
-#define DIO31_PIN PINA0\r
-#define DIO31_RPORT PINA\r
-#define DIO31_WPORT PORTA\r
-#define DIO31_DDR DDRA\r
-#define DIO31_PWM NULL\r
-\r
-#define AIO0_PIN PINA0\r
-#define AIO0_RPORT PINA\r
-#define AIO0_WPORT PORTA\r
-#define AIO0_DDR DDRA\r
-#define AIO0_PWM NULL\r
-\r
-#define AIO1_PIN PINA1\r
-#define AIO1_RPORT PINA\r
-#define AIO1_WPORT PORTA\r
-#define AIO1_DDR DDRA\r
-#define AIO1_PWM NULL\r
-\r
-#define AIO2_PIN PINA2\r
-#define AIO2_RPORT PINA\r
-#define AIO2_WPORT PORTA\r
-#define AIO2_DDR DDRA\r
-#define AIO2_PWM NULL\r
-\r
-#define AIO3_PIN PINA3\r
-#define AIO3_RPORT PINA\r
-#define AIO3_WPORT PORTA\r
-#define AIO3_DDR DDRA\r
-#define AIO3_PWM NULL\r
-\r
-#define AIO4_PIN PINA4\r
-#define AIO4_RPORT PINA\r
-#define AIO4_WPORT PORTA\r
-#define AIO4_DDR DDRA\r
-#define AIO4_PWM NULL\r
-\r
-#define AIO5_PIN PINA5\r
-#define AIO5_RPORT PINA\r
-#define AIO5_WPORT PORTA\r
-#define AIO5_DDR DDRA\r
-#define AIO5_PWM NULL\r
-\r
-#define AIO6_PIN PINA6\r
-#define AIO6_RPORT PINA\r
-#define AIO6_WPORT PORTA\r
-#define AIO6_DDR DDRA\r
-#define AIO6_PWM NULL\r
-\r
-#define AIO7_PIN PINA7\r
-#define AIO7_RPORT PINA\r
-#define AIO7_WPORT PORTA\r
-#define AIO7_DDR DDRA\r
-#define AIO7_PWM NULL\r
-\r
-\r
-\r
-#undef PA0\r
-#define PA0_PIN PINA0\r
-#define PA0_RPORT PINA\r
-#define PA0_WPORT PORTA\r
-#define PA0_DDR DDRA\r
-#define PA0_PWM NULL\r
-\r
-#undef PA1\r
-#define PA1_PIN PINA1\r
-#define PA1_RPORT PINA\r
-#define PA1_WPORT PORTA\r
-#define PA1_DDR DDRA\r
-#define PA1_PWM NULL\r
-\r
-#undef PA2\r
-#define PA2_PIN PINA2\r
-#define PA2_RPORT PINA\r
-#define PA2_WPORT PORTA\r
-#define PA2_DDR DDRA\r
-#define PA2_PWM NULL\r
-\r
-#undef PA3\r
-#define PA3_PIN PINA3\r
-#define PA3_RPORT PINA\r
-#define PA3_WPORT PORTA\r
-#define PA3_DDR DDRA\r
-#define PA3_PWM NULL\r
-\r
-#undef PA4\r
-#define PA4_PIN PINA4\r
-#define PA4_RPORT PINA\r
-#define PA4_WPORT PORTA\r
-#define PA4_DDR DDRA\r
-#define PA4_PWM NULL\r
-\r
-#undef PA5\r
-#define PA5_PIN PINA5\r
-#define PA5_RPORT PINA\r
-#define PA5_WPORT PORTA\r
-#define PA5_DDR DDRA\r
-#define PA5_PWM NULL\r
-\r
-#undef PA6\r
-#define PA6_PIN PINA6\r
-#define PA6_RPORT PINA\r
-#define PA6_WPORT PORTA\r
-#define PA6_DDR DDRA\r
-#define PA6_PWM NULL\r
-\r
-#undef PA7\r
-#define PA7_PIN PINA7\r
-#define PA7_RPORT PINA\r
-#define PA7_WPORT PORTA\r
-#define PA7_DDR DDRA\r
-#define PA7_PWM NULL\r
-\r
-\r
-#undef PB0\r
-#define PB0_PIN PINB0\r
-#define PB0_RPORT PINB\r
-#define PB0_WPORT PORTB\r
-#define PB0_DDR DDRB\r
-#define PB0_PWM NULL\r
-\r
-#undef PB1\r
-#define PB1_PIN PINB1\r
-#define PB1_RPORT PINB\r
-#define PB1_WPORT PORTB\r
-#define PB1_DDR DDRB\r
-#define PB1_PWM NULL\r
-\r
-#undef PB2\r
-#define PB2_PIN PINB2\r
-#define PB2_RPORT PINB\r
-#define PB2_WPORT PORTB\r
-#define PB2_DDR DDRB\r
-#define PB2_PWM NULL\r
-\r
-#undef PB3\r
-#define PB3_PIN PINB3\r
-#define PB3_RPORT PINB\r
-#define PB3_WPORT PORTB\r
-#define PB3_DDR DDRB\r
-#define PB3_PWM &OCR0A\r
-\r
-#undef PB4\r
-#define PB4_PIN PINB4\r
-#define PB4_RPORT PINB\r
-#define PB4_WPORT PORTB\r
-#define PB4_DDR DDRB\r
-#define PB4_PWM &OCR0B\r
-\r
-#undef PB5\r
-#define PB5_PIN PINB5\r
-#define PB5_RPORT PINB\r
-#define PB5_WPORT PORTB\r
-#define PB5_DDR DDRB\r
-#define PB5_PWM NULL\r
-\r
-#undef PB6\r
-#define PB6_PIN PINB6\r
-#define PB6_RPORT PINB\r
-#define PB6_WPORT PORTB\r
-#define PB6_DDR DDRB\r
-#define PB6_PWM NULL\r
-\r
-#undef PB7\r
-#define PB7_PIN PINB7\r
-#define PB7_RPORT PINB\r
-#define PB7_WPORT PORTB\r
-#define PB7_DDR DDRB\r
-#define PB7_PWM NULL\r
-\r
-\r
-#undef PC0\r
-#define PC0_PIN PINC0\r
-#define PC0_RPORT PINC\r
-#define PC0_WPORT PORTC\r
-#define PC0_DDR DDRC\r
-#define PC0_PWM NULL\r
-\r
-#undef PC1\r
-#define PC1_PIN PINC1\r
-#define PC1_RPORT PINC\r
-#define PC1_WPORT PORTC\r
-#define PC1_DDR DDRC\r
-#define PC1_PWM NULL\r
-\r
-#undef PC2\r
-#define PC2_PIN PINC2\r
-#define PC2_RPORT PINC\r
-#define PC2_WPORT PORTC\r
-#define PC2_DDR DDRC\r
-#define PC2_PWM NULL\r
-\r
-#undef PC3\r
-#define PC3_PIN PINC3\r
-#define PC3_RPORT PINC\r
-#define PC3_WPORT PORTC\r
-#define PC3_DDR DDRC\r
-#define PC3_PWM NULL\r
-\r
-#undef PC4\r
-#define PC4_PIN PINC4\r
-#define PC4_RPORT PINC\r
-#define PC4_WPORT PORTC\r
-#define PC4_DDR DDRC\r
-#define PC4_PWM NULL\r
-\r
-#undef PC5\r
-#define PC5_PIN PINC5\r
-#define PC5_RPORT PINC\r
-#define PC5_WPORT PORTC\r
-#define PC5_DDR DDRC\r
-#define PC5_PWM NULL\r
-\r
-#undef PC6\r
-#define PC6_PIN PINC6\r
-#define PC6_RPORT PINC\r
-#define PC6_WPORT PORTC\r
-#define PC6_DDR DDRC\r
-#define PC6_PWM NULL\r
-\r
-#undef PC7\r
-#define PC7_PIN PINC7\r
-#define PC7_RPORT PINC\r
-#define PC7_WPORT PORTC\r
-#define PC7_DDR DDRC\r
-#define PC7_PWM NULL\r
-\r
-\r
-#undef PD0\r
-#define PD0_PIN PIND0\r
-#define PD0_RPORT PIND\r
-#define PD0_WPORT PORTD\r
-#define PD0_DDR DDRD\r
-#define PD0_PWM NULL\r
-\r
-#undef PD1\r
-#define PD1_PIN PIND1\r
-#define PD1_RPORT PIND\r
-#define PD1_WPORT PORTD\r
-#define PD1_DDR DDRD\r
-#define PD1_PWM NULL\r
-\r
-#undef PD2\r
-#define PD2_PIN PIND2\r
-#define PD2_RPORT PIND\r
-#define PD2_WPORT PORTD\r
-#define PD2_DDR DDRD\r
-#define PD2_PWM NULL\r
-\r
-#undef PD3\r
-#define PD3_PIN PIND3\r
-#define PD3_RPORT PIND\r
-#define PD3_WPORT PORTD\r
-#define PD3_DDR DDRD\r
-#define PD3_PWM NULL\r
-\r
-#undef PD4\r
-#define PD4_PIN PIND4\r
-#define PD4_RPORT PIND\r
-#define PD4_WPORT PORTD\r
-#define PD4_DDR DDRD\r
-#define PD4_PWM NULL\r
-\r
-#undef PD5\r
-#define PD5_PIN PIND5\r
-#define PD5_RPORT PIND\r
-#define PD5_WPORT PORTD\r
-#define PD5_DDR DDRD\r
-#define PD5_PWM NULL\r
-\r
-#undef PD6\r
-#define PD6_PIN PIND6\r
-#define PD6_RPORT PIND\r
-#define PD6_WPORT PORTD\r
-#define PD6_DDR DDRD\r
-#define PD6_PWM &OCR2B\r
-\r
-#undef PD7\r
-#define PD7_PIN PIND7\r
-#define PD7_RPORT PIND\r
-#define PD7_WPORT PORTD\r
-#define PD7_DDR DDRD\r
-#define PD7_PWM &OCR2A\r
-#endif /* _AVR_ATmega{644,644P,644PA}__ */\r
-\r
-#if defined (__AVR_ATmega1280__) || defined (__AVR_ATmega2560__)\r
-// UART\r
-#define RXD DIO0\r
-#define TXD DIO1\r
-\r
-// SPI\r
-#define SCK DIO52\r
-#define MISO DIO50\r
-#define MOSI DIO51\r
-#define SS DIO53\r
-\r
-// TWI (I2C)\r
-#define SCL DIO21\r
-#define SDA DIO20\r
-\r
-// timers and PWM\r
-#define OC0A DIO13\r
-#define OC0B DIO4\r
-#define OC1A DIO11\r
-#define OC1B DIO12\r
-#define OC2A DIO10\r
-#define OC2B DIO9\r
-#define OC3A DIO5\r
-#define OC3B DIO2\r
-#define OC3C DIO3\r
-#define OC4A DIO6\r
-#define OC4B DIO7\r
-#define OC4C DIO8\r
-#define OC5A DIO46\r
-#define OC5B DIO45\r
-#define OC5C DIO44\r
-\r
-// change for your board\r
-#define DEBUG_LED DIO21\r
-\r
-/*\r
-pins\r
-*/\r
-#define DIO0_PIN PINE0\r
-#define DIO0_RPORT PINE\r
-#define DIO0_WPORT PORTE\r
-#define DIO0_DDR DDRE\r
-#define DIO0_PWM NULL\r
-\r
-#define DIO1_PIN PINE1\r
-#define DIO1_RPORT PINE\r
-#define DIO1_WPORT PORTE\r
-#define DIO1_DDR DDRE\r
-#define DIO1_PWM NULL\r
-\r
-#define DIO2_PIN PINE4\r
-#define DIO2_RPORT PINE\r
-#define DIO2_WPORT PORTE\r
-#define DIO2_DDR DDRE\r
-#define DIO2_PWM &OCR3BL\r
-\r
-#define DIO3_PIN PINE5\r
-#define DIO3_RPORT PINE\r
-#define DIO3_WPORT PORTE\r
-#define DIO3_DDR DDRE\r
-#define DIO3_PWM &OCR3CL\r
-\r
-#define DIO4_PIN PING5\r
-#define DIO4_RPORT PING\r
-#define DIO4_WPORT PORTG\r
-#define DIO4_DDR DDRG\r
-#define DIO4_PWM &OCR0B\r
-\r
-#define DIO5_PIN PINE3\r
-#define DIO5_RPORT PINE\r
-#define DIO5_WPORT PORTE\r
-#define DIO5_DDR DDRE\r
-#define DIO5_PWM &OCR3AL\r
-\r
-#define DIO6_PIN PINH3\r
-#define DIO6_RPORT PINH\r
-#define DIO6_WPORT PORTH\r
-#define DIO6_DDR DDRH\r
-#define DIO6_PWM &OCR4AL\r
-\r
-#define DIO7_PIN PINH4\r
-#define DIO7_RPORT PINH\r
-#define DIO7_WPORT PORTH\r
-#define DIO7_DDR DDRH\r
-#define DIO7_PWM &OCR4BL\r
-\r
-#define DIO8_PIN PINH5\r
-#define DIO8_RPORT PINH\r
-#define DIO8_WPORT PORTH\r
-#define DIO8_DDR DDRH\r
-#define DIO8_PWM &OCR4CL\r
-\r
-#define DIO9_PIN PINH6\r
-#define DIO9_RPORT PINH\r
-#define DIO9_WPORT PORTH\r
-#define DIO9_DDR DDRH\r
-#define DIO9_PWM &OCR2B\r
-\r
-#define DIO10_PIN PINB4\r
-#define DIO10_RPORT PINB\r
-#define DIO10_WPORT PORTB\r
-#define DIO10_DDR DDRB\r
-#define DIO10_PWM &OCR2A\r
-\r
-#define DIO11_PIN PINB5\r
-#define DIO11_RPORT PINB\r
-#define DIO11_WPORT PORTB\r
-#define DIO11_DDR DDRB\r
-#define DIO11_PWM NULL\r
-\r
-#define DIO12_PIN PINB6\r
-#define DIO12_RPORT PINB\r
-#define DIO12_WPORT PORTB\r
-#define DIO12_DDR DDRB\r
-#define DIO12_PWM NULL\r
-\r
-#define DIO13_PIN PINB7\r
-#define DIO13_RPORT PINB\r
-#define DIO13_WPORT PORTB\r
-#define DIO13_DDR DDRB\r
-#define DIO13_PWM &OCR0A\r
-\r
-#define DIO14_PIN PINJ1\r
-#define DIO14_RPORT PINJ\r
-#define DIO14_WPORT PORTJ\r
-#define DIO14_DDR DDRJ\r
-#define DIO14_PWM NULL\r
-\r
-#define DIO15_PIN PINJ0\r
-#define DIO15_RPORT PINJ\r
-#define DIO15_WPORT PORTJ\r
-#define DIO15_DDR DDRJ\r
-#define DIO15_PWM NULL\r
-\r
-#define DIO16_PIN PINH1\r
-#define DIO16_RPORT PINH\r
-#define DIO16_WPORT PORTH\r
-#define DIO16_DDR DDRH\r
-#define DIO16_PWM NULL\r
-\r
-#define DIO17_PIN PINH0\r
-#define DIO17_RPORT PINH\r
-#define DIO17_WPORT PORTH\r
-#define DIO17_DDR DDRH\r
-#define DIO17_PWM NULL\r
-\r
-#define DIO18_PIN PIND3\r
-#define DIO18_RPORT PIND\r
-#define DIO18_WPORT PORTD\r
-#define DIO18_DDR DDRD\r
-#define DIO18_PWM NULL\r
-\r
-#define DIO19_PIN PIND2\r
-#define DIO19_RPORT PIND\r
-#define DIO19_WPORT PORTD\r
-#define DIO19_DDR DDRD\r
-#define DIO19_PWM NULL\r
-\r
-#define DIO20_PIN PIND1\r
-#define DIO20_RPORT PIND\r
-#define DIO20_WPORT PORTD\r
-#define DIO20_DDR DDRD\r
-#define DIO20_PWM NULL\r
-\r
-#define DIO21_PIN PIND0\r
-#define DIO21_RPORT PIND\r
-#define DIO21_WPORT PORTD\r
-#define DIO21_DDR DDRD\r
-#define DIO21_PWM NULL\r
-\r
-#define DIO22_PIN PINA0\r
-#define DIO22_RPORT PINA\r
-#define DIO22_WPORT PORTA\r
-#define DIO22_DDR DDRA\r
-#define DIO22_PWM NULL\r
-\r
-#define DIO23_PIN PINA1\r
-#define DIO23_RPORT PINA\r
-#define DIO23_WPORT PORTA\r
-#define DIO23_DDR DDRA\r
-#define DIO23_PWM NULL\r
-\r
-#define DIO24_PIN PINA2\r
-#define DIO24_RPORT PINA\r
-#define DIO24_WPORT PORTA\r
-#define DIO24_DDR DDRA\r
-#define DIO24_PWM NULL\r
-\r
-#define DIO25_PIN PINA3\r
-#define DIO25_RPORT PINA\r
-#define DIO25_WPORT PORTA\r
-#define DIO25_DDR DDRA\r
-#define DIO25_PWM NULL\r
-\r
-#define DIO26_PIN PINA4\r
-#define DIO26_RPORT PINA\r
-#define DIO26_WPORT PORTA\r
-#define DIO26_DDR DDRA\r
-#define DIO26_PWM NULL\r
-\r
-#define DIO27_PIN PINA5\r
-#define DIO27_RPORT PINA\r
-#define DIO27_WPORT PORTA\r
-#define DIO27_DDR DDRA\r
-#define DIO27_PWM NULL\r
-\r
-#define DIO28_PIN PINA6\r
-#define DIO28_RPORT PINA\r
-#define DIO28_WPORT PORTA\r
-#define DIO28_DDR DDRA\r
-#define DIO28_PWM NULL\r
-\r
-#define DIO29_PIN PINA7\r
-#define DIO29_RPORT PINA\r
-#define DIO29_WPORT PORTA\r
-#define DIO29_DDR DDRA\r
-#define DIO29_PWM NULL\r
-\r
-#define DIO30_PIN PINC7\r
-#define DIO30_RPORT PINC\r
-#define DIO30_WPORT PORTC\r
-#define DIO30_DDR DDRC\r
-#define DIO30_PWM NULL\r
-\r
-#define DIO31_PIN PINC6\r
-#define DIO31_RPORT PINC\r
-#define DIO31_WPORT PORTC\r
-#define DIO31_DDR DDRC\r
-#define DIO31_PWM NULL\r
-\r
-#define DIO32_PIN PINC5\r
-#define DIO32_RPORT PINC\r
-#define DIO32_WPORT PORTC\r
-#define DIO32_DDR DDRC\r
-#define DIO32_PWM NULL\r
-\r
-#define DIO33_PIN PINC4\r
-#define DIO33_RPORT PINC\r
-#define DIO33_WPORT PORTC\r
-#define DIO33_DDR DDRC\r
-#define DIO33_PWM NULL\r
-\r
-#define DIO34_PIN PINC3\r
-#define DIO34_RPORT PINC\r
-#define DIO34_WPORT PORTC\r
-#define DIO34_DDR DDRC\r
-#define DIO34_PWM NULL\r
-\r
-#define DIO35_PIN PINC2\r
-#define DIO35_RPORT PINC\r
-#define DIO35_WPORT PORTC\r
-#define DIO35_DDR DDRC\r
-#define DIO35_PWM NULL\r
-\r
-#define DIO36_PIN PINC1\r
-#define DIO36_RPORT PINC\r
-#define DIO36_WPORT PORTC\r
-#define DIO36_DDR DDRC\r
-#define DIO36_PWM NULL\r
-\r
-#define DIO37_PIN PINC0\r
-#define DIO37_RPORT PINC\r
-#define DIO37_WPORT PORTC\r
-#define DIO37_DDR DDRC\r
-#define DIO37_PWM NULL\r
-\r
-#define DIO38_PIN PIND7\r
-#define DIO38_RPORT PIND\r
-#define DIO38_WPORT PORTD\r
-#define DIO38_DDR DDRD\r
-#define DIO38_PWM NULL\r
-\r
-#define DIO39_PIN PING2\r
-#define DIO39_RPORT PING\r
-#define DIO39_WPORT PORTG\r
-#define DIO39_DDR DDRG\r
-#define DIO39_PWM NULL\r
-\r
-#define DIO40_PIN PING1\r
-#define DIO40_RPORT PING\r
-#define DIO40_WPORT PORTG\r
-#define DIO40_DDR DDRG\r
-#define DIO40_PWM NULL\r
-\r
-#define DIO41_PIN PING0\r
-#define DIO41_RPORT PING\r
-#define DIO41_WPORT PORTG\r
-#define DIO41_DDR DDRG\r
-#define DIO41_PWM NULL\r
-\r
-#define DIO42_PIN PINL7\r
-#define DIO42_RPORT PINL\r
-#define DIO42_WPORT PORTL\r
-#define DIO42_DDR DDRL\r
-#define DIO42_PWM NULL\r
-\r
-#define DIO43_PIN PINL6\r
-#define DIO43_RPORT PINL\r
-#define DIO43_WPORT PORTL\r
-#define DIO43_DDR DDRL\r
-#define DIO43_PWM NULL\r
-\r
-#define DIO44_PIN PINL5\r
-#define DIO44_RPORT PINL\r
-#define DIO44_WPORT PORTL\r
-#define DIO44_DDR DDRL\r
-#define DIO44_PWM &OCR5CL\r
-\r
-#define DIO45_PIN PINL4\r
-#define DIO45_RPORT PINL\r
-#define DIO45_WPORT PORTL\r
-#define DIO45_DDR DDRL\r
-#define DIO45_PWM &OCR5BL\r
-\r
-#define DIO46_PIN PINL3\r
-#define DIO46_RPORT PINL\r
-#define DIO46_WPORT PORTL\r
-#define DIO46_DDR DDRL\r
-#define DIO46_PWM &OCR5AL\r
-\r
-#define DIO47_PIN PINL2\r
-#define DIO47_RPORT PINL\r
-#define DIO47_WPORT PORTL\r
-#define DIO47_DDR DDRL\r
-#define DIO47_PWM NULL\r
-\r
-#define DIO48_PIN PINL1\r
-#define DIO48_RPORT PINL\r
-#define DIO48_WPORT PORTL\r
-#define DIO48_DDR DDRL\r
-#define DIO48_PWM NULL\r
-\r
-#define DIO49_PIN PINL0\r
-#define DIO49_RPORT PINL\r
-#define DIO49_WPORT PORTL\r
-#define DIO49_DDR DDRL\r
-#define DIO49_PWM NULL\r
-\r
-#define DIO50_PIN PINB3\r
-#define DIO50_RPORT PINB\r
-#define DIO50_WPORT PORTB\r
-#define DIO50_DDR DDRB\r
-#define DIO50_PWM NULL\r
-\r
-#define DIO51_PIN PINB2\r
-#define DIO51_RPORT PINB\r
-#define DIO51_WPORT PORTB\r
-#define DIO51_DDR DDRB\r
-#define DIO51_PWM NULL\r
-\r
-#define DIO52_PIN PINB1\r
-#define DIO52_RPORT PINB\r
-#define DIO52_WPORT PORTB\r
-#define DIO52_DDR DDRB\r
-#define DIO52_PWM NULL\r
-\r
-#define DIO53_PIN PINB0\r
-#define DIO53_RPORT PINB\r
-#define DIO53_WPORT PORTB\r
-#define DIO53_DDR DDRB\r
-#define DIO53_PWM NULL\r
-\r
-#define DIO54_PIN PINF0\r
-#define DIO54_RPORT PINF\r
-#define DIO54_WPORT PORTF\r
-#define DIO54_DDR DDRF\r
-#define DIO54_PWM NULL\r
-\r
-#define DIO55_PIN PINF1\r
-#define DIO55_RPORT PINF\r
-#define DIO55_WPORT PORTF\r
-#define DIO55_DDR DDRF\r
-#define DIO55_PWM NULL\r
-\r
-#define DIO56_PIN PINF2\r
-#define DIO56_RPORT PINF\r
-#define DIO56_WPORT PORTF\r
-#define DIO56_DDR DDRF\r
-#define DIO56_PWM NULL\r
-\r
-#define DIO57_PIN PINF3\r
-#define DIO57_RPORT PINF\r
-#define DIO57_WPORT PORTF\r
-#define DIO57_DDR DDRF\r
-#define DIO57_PWM NULL\r
-\r
-#define DIO58_PIN PINF4\r
-#define DIO58_RPORT PINF\r
-#define DIO58_WPORT PORTF\r
-#define DIO58_DDR DDRF\r
-#define DIO58_PWM NULL\r
-\r
-#define DIO59_PIN PINF5\r
-#define DIO59_RPORT PINF\r
-#define DIO59_WPORT PORTF\r
-#define DIO59_DDR DDRF\r
-#define DIO59_PWM NULL\r
-\r
-#define DIO60_PIN PINF6\r
-#define DIO60_RPORT PINF\r
-#define DIO60_WPORT PORTF\r
-#define DIO60_DDR DDRF\r
-#define DIO60_PWM NULL\r
-\r
-#define DIO61_PIN PINF7\r
-#define DIO61_RPORT PINF\r
-#define DIO61_WPORT PORTF\r
-#define DIO61_DDR DDRF\r
-#define DIO61_PWM NULL\r
-\r
-#define DIO62_PIN PINK0\r
-#define DIO62_RPORT PINK\r
-#define DIO62_WPORT PORTK\r
-#define DIO62_DDR DDRK\r
-#define DIO62_PWM NULL\r
-\r
-#define DIO63_PIN PINK1\r
-#define DIO63_RPORT PINK\r
-#define DIO63_WPORT PORTK\r
-#define DIO63_DDR DDRK\r
-#define DIO63_PWM NULL\r
-\r
-#define DIO64_PIN PINK2\r
-#define DIO64_RPORT PINK\r
-#define DIO64_WPORT PORTK\r
-#define DIO64_DDR DDRK\r
-#define DIO64_PWM NULL\r
-\r
-#define DIO65_PIN PINK3\r
-#define DIO65_RPORT PINK\r
-#define DIO65_WPORT PORTK\r
-#define DIO65_DDR DDRK\r
-#define DIO65_PWM NULL\r
-\r
-#define DIO66_PIN PINK4\r
-#define DIO66_RPORT PINK\r
-#define DIO66_WPORT PORTK\r
-#define DIO66_DDR DDRK\r
-#define DIO66_PWM NULL\r
-\r
-#define DIO67_PIN PINK5\r
-#define DIO67_RPORT PINK\r
-#define DIO67_WPORT PORTK\r
-#define DIO67_DDR DDRK\r
-#define DIO67_PWM NULL\r
-\r
-#define DIO68_PIN PINK6\r
-#define DIO68_RPORT PINK\r
-#define DIO68_WPORT PORTK\r
-#define DIO68_DDR DDRK\r
-#define DIO68_PWM NULL\r
-\r
-#define DIO69_PIN PINK7\r
-#define DIO69_RPORT PINK\r
-#define DIO69_WPORT PORTK\r
-#define DIO69_DDR DDRK\r
-#define DIO69_PWM NULL\r
-\r
-\r
-\r
-#undef PA0\r
-#define PA0_PIN PINA0\r
-#define PA0_RPORT PINA\r
-#define PA0_WPORT PORTA\r
-#define PA0_DDR DDRA\r
-#define PA0_PWM NULL\r
-#undef PA1\r
-#define PA1_PIN PINA1\r
-#define PA1_RPORT PINA\r
-#define PA1_WPORT PORTA\r
-#define PA1_DDR DDRA\r
-#define PA1_PWM NULL\r
-#undef PA2\r
-#define PA2_PIN PINA2\r
-#define PA2_RPORT PINA\r
-#define PA2_WPORT PORTA\r
-#define PA2_DDR DDRA\r
-#define PA2_PWM NULL\r
-#undef PA3\r
-#define PA3_PIN PINA3\r
-#define PA3_RPORT PINA\r
-#define PA3_WPORT PORTA\r
-#define PA3_DDR DDRA\r
-#define PA3_PWM NULL\r
-#undef PA4\r
-#define PA4_PIN PINA4\r
-#define PA4_RPORT PINA\r
-#define PA4_WPORT PORTA\r
-#define PA4_DDR DDRA\r
-#define PA4_PWM NULL\r
-#undef PA5\r
-#define PA5_PIN PINA5\r
-#define PA5_RPORT PINA\r
-#define PA5_WPORT PORTA\r
-#define PA5_DDR DDRA\r
-#define PA5_PWM NULL\r
-#undef PA6\r
-#define PA6_PIN PINA6\r
-#define PA6_RPORT PINA\r
-#define PA6_WPORT PORTA\r
-#define PA6_DDR DDRA\r
-#define PA6_PWM NULL\r
-#undef PA7\r
-#define PA7_PIN PINA7\r
-#define PA7_RPORT PINA\r
-#define PA7_WPORT PORTA\r
-#define PA7_DDR DDRA\r
-#define PA7_PWM NULL\r
-\r
-#undef PB0\r
-#define PB0_PIN PINB0\r
-#define PB0_RPORT PINB\r
-#define PB0_WPORT PORTB\r
-#define PB0_DDR DDRB\r
-#define PB0_PWM NULL\r
-#undef PB1\r
-#define PB1_PIN PINB1\r
-#define PB1_RPORT PINB\r
-#define PB1_WPORT PORTB\r
-#define PB1_DDR DDRB\r
-#define PB1_PWM NULL\r
-#undef PB2\r
-#define PB2_PIN PINB2\r
-#define PB2_RPORT PINB\r
-#define PB2_WPORT PORTB\r
-#define PB2_DDR DDRB\r
-#define PB2_PWM NULL\r
-#undef PB3\r
-#define PB3_PIN PINB3\r
-#define PB3_RPORT PINB\r
-#define PB3_WPORT PORTB\r
-#define PB3_DDR DDRB\r
-#define PB3_PWM NULL\r
-#undef PB4\r
-#define PB4_PIN PINB4\r
-#define PB4_RPORT PINB\r
-#define PB4_WPORT PORTB\r
-#define PB4_DDR DDRB\r
-#define PB4_PWM &OCR2A\r
-#undef PB5\r
-#define PB5_PIN PINB5\r
-#define PB5_RPORT PINB\r
-#define PB5_WPORT PORTB\r
-#define PB5_DDR DDRB\r
-#define PB5_PWM NULL\r
-#undef PB6\r
-#define PB6_PIN PINB6\r
-#define PB6_RPORT PINB\r
-#define PB6_WPORT PORTB\r
-#define PB6_DDR DDRB\r
-#define PB6_PWM NULL\r
-#undef PB7\r
-#define PB7_PIN PINB7\r
-#define PB7_RPORT PINB\r
-#define PB7_WPORT PORTB\r
-#define PB7_DDR DDRB\r
-#define PB7_PWM &OCR0A\r
-\r
-#undef PC0\r
-#define PC0_PIN PINC0\r
-#define PC0_RPORT PINC\r
-#define PC0_WPORT PORTC\r
-#define PC0_DDR DDRC\r
-#define PC0_PWM NULL\r
-#undef PC1\r
-#define PC1_PIN PINC1\r
-#define PC1_RPORT PINC\r
-#define PC1_WPORT PORTC\r
-#define PC1_DDR DDRC\r
-#define PC1_PWM NULL\r
-#undef PC2\r
-#define PC2_PIN PINC2\r
-#define PC2_RPORT PINC\r
-#define PC2_WPORT PORTC\r
-#define PC2_DDR DDRC\r
-#define PC2_PWM NULL\r
-#undef PC3\r
-#define PC3_PIN PINC3\r
-#define PC3_RPORT PINC\r
-#define PC3_WPORT PORTC\r
-#define PC3_DDR DDRC\r
-#define PC3_PWM NULL\r
-#undef PC4\r
-#define PC4_PIN PINC4\r
-#define PC4_RPORT PINC\r
-#define PC4_WPORT PORTC\r
-#define PC4_DDR DDRC\r
-#define PC4_PWM NULL\r
-#undef PC5\r
-#define PC5_PIN PINC5\r
-#define PC5_RPORT PINC\r
-#define PC5_WPORT PORTC\r
-#define PC5_DDR DDRC\r
-#define PC5_PWM NULL\r
-#undef PC6\r
-#define PC6_PIN PINC6\r
-#define PC6_RPORT PINC\r
-#define PC6_WPORT PORTC\r
-#define PC6_DDR DDRC\r
-#define PC6_PWM NULL\r
-#undef PC7\r
-#define PC7_PIN PINC7\r
-#define PC7_RPORT PINC\r
-#define PC7_WPORT PORTC\r
-#define PC7_DDR DDRC\r
-#define PC7_PWM NULL\r
-\r
-#undef PD0\r
-#define PD0_PIN PIND0\r
-#define PD0_RPORT PIND\r
-#define PD0_WPORT PORTD\r
-#define PD0_DDR DDRD\r
-#define PD0_PWM NULL\r
-#undef PD1\r
-#define PD1_PIN PIND1\r
-#define PD1_RPORT PIND\r
-#define PD1_WPORT PORTD\r
-#define PD1_DDR DDRD\r
-#define PD1_PWM NULL\r
-#undef PD2\r
-#define PD2_PIN PIND2\r
-#define PD2_RPORT PIND\r
-#define PD2_WPORT PORTD\r
-#define PD2_DDR DDRD\r
-#define PD2_PWM NULL\r
-#undef PD3\r
-#define PD3_PIN PIND3\r
-#define PD3_RPORT PIND\r
-#define PD3_WPORT PORTD\r
-#define PD3_DDR DDRD\r
-#define PD3_PWM NULL\r
-#undef PD4\r
-#define PD4_PIN PIND4\r
-#define PD4_RPORT PIND\r
-#define PD4_WPORT PORTD\r
-#define PD4_DDR DDRD\r
-#define PD4_PWM NULL\r
-#undef PD5\r
-#define PD5_PIN PIND5\r
-#define PD5_RPORT PIND\r
-#define PD5_WPORT PORTD\r
-#define PD5_DDR DDRD\r
-#define PD5_PWM NULL\r
-#undef PD6\r
-#define PD6_PIN PIND6\r
-#define PD6_RPORT PIND\r
-#define PD6_WPORT PORTD\r
-#define PD6_DDR DDRD\r
-#define PD6_PWM NULL\r
-#undef PD7\r
-#define PD7_PIN PIND7\r
-#define PD7_RPORT PIND\r
-#define PD7_WPORT PORTD\r
-#define PD7_DDR DDRD\r
-#define PD7_PWM NULL\r
-\r
-#undef PE0\r
-#define PE0_PIN PINE0\r
-#define PE0_RPORT PINE\r
-#define PE0_WPORT PORTE\r
-#define PE0_DDR DDRE\r
-#define PE0_PWM NULL\r
-#undef PE1\r
-#define PE1_PIN PINE1\r
-#define PE1_RPORT PINE\r
-#define PE1_WPORT PORTE\r
-#define PE1_DDR DDRE\r
-#define PE1_PWM NULL\r
-#undef PE2\r
-#define PE2_PIN PINE2\r
-#define PE2_RPORT PINE\r
-#define PE2_WPORT PORTE\r
-#define PE2_DDR DDRE\r
-#define PE2_PWM NULL\r
-#undef PE3\r
-#define PE3_PIN PINE3\r
-#define PE3_RPORT PINE\r
-#define PE3_WPORT PORTE\r
-#define PE3_DDR DDRE\r
-#define PE3_PWM &OCR3AL\r
-#undef PE4\r
-#define PE4_PIN PINE4\r
-#define PE4_RPORT PINE\r
-#define PE4_WPORT PORTE\r
-#define PE4_DDR DDRE\r
-#define PE4_PWM &OCR3BL\r
-#undef PE5\r
-#define PE5_PIN PINE5\r
-#define PE5_RPORT PINE\r
-#define PE5_WPORT PORTE\r
-#define PE5_DDR DDRE\r
-#define PE5_PWM &OCR3CL\r
-#undef PE6\r
-#define PE6_PIN PINE6\r
-#define PE6_RPORT PINE\r
-#define PE6_WPORT PORTE\r
-#define PE6_DDR DDRE\r
-#define PE6_PWM NULL\r
-#undef PE7\r
-#define PE7_PIN PINE7\r
-#define PE7_RPORT PINE\r
-#define PE7_WPORT PORTE\r
-#define PE7_DDR DDRE\r
-#define PE7_PWM NULL\r
-\r
-#undef PF0\r
-#define PF0_PIN PINF0\r
-#define PF0_RPORT PINF\r
-#define PF0_WPORT PORTF\r
-#define PF0_DDR DDRF\r
-#define PF0_PWM NULL\r
-#undef PF1\r
-#define PF1_PIN PINF1\r
-#define PF1_RPORT PINF\r
-#define PF1_WPORT PORTF\r
-#define PF1_DDR DDRF\r
-#define PF1_PWM NULL\r
-#undef PF2\r
-#define PF2_PIN PINF2\r
-#define PF2_RPORT PINF\r
-#define PF2_WPORT PORTF\r
-#define PF2_DDR DDRF\r
-#define PF2_PWM NULL\r
-#undef PF3\r
-#define PF3_PIN PINF3\r
-#define PF3_RPORT PINF\r
-#define PF3_WPORT PORTF\r
-#define PF3_DDR DDRF\r
-#define PF3_PWM NULL\r
-#undef PF4\r
-#define PF4_PIN PINF4\r
-#define PF4_RPORT PINF\r
-#define PF4_WPORT PORTF\r
-#define PF4_DDR DDRF\r
-#define PF4_PWM NULL\r
-#undef PF5\r
-#define PF5_PIN PINF5\r
-#define PF5_RPORT PINF\r
-#define PF5_WPORT PORTF\r
-#define PF5_DDR DDRF\r
-#define PF5_PWM NULL\r
-#undef PF6\r
-#define PF6_PIN PINF6\r
-#define PF6_RPORT PINF\r
-#define PF6_WPORT PORTF\r
-#define PF6_DDR DDRF\r
-#define PF6_PWM NULL\r
-#undef PF7\r
-#define PF7_PIN PINF7\r
-#define PF7_RPORT PINF\r
-#define PF7_WPORT PORTF\r
-#define PF7_DDR DDRF\r
-#define PF7_PWM NULL\r
-\r
-#undef PG0\r
-#define PG0_PIN PING0\r
-#define PG0_RPORT PING\r
-#define PG0_WPORT PORTG\r
-#define PG0_DDR DDRG\r
-#define PG0_PWM NULL\r
-#undef PG1\r
-#define PG1_PIN PING1\r
-#define PG1_RPORT PING\r
-#define PG1_WPORT PORTG\r
-#define PG1_DDR DDRG\r
-#define PG1_PWM NULL\r
-#undef PG2\r
-#define PG2_PIN PING2\r
-#define PG2_RPORT PING\r
-#define PG2_WPORT PORTG\r
-#define PG2_DDR DDRG\r
-#define PG2_PWM NULL\r
-#undef PG3\r
-#define PG3_PIN PING3\r
-#define PG3_RPORT PING\r
-#define PG3_WPORT PORTG\r
-#define PG3_DDR DDRG\r
-#define PG3_PWM NULL\r
-#undef PG4\r
-#define PG4_PIN PING4\r
-#define PG4_RPORT PING\r
-#define PG4_WPORT PORTG\r
-#define PG4_DDR DDRG\r
-#define PG4_PWM NULL\r
-#undef PG5\r
-#define PG5_PIN PING5\r
-#define PG5_RPORT PING\r
-#define PG5_WPORT PORTG\r
-#define PG5_DDR DDRG\r
-#define PG5_PWM &OCR0B\r
-#undef PG6\r
-#define PG6_PIN PING6\r
-#define PG6_RPORT PING\r
-#define PG6_WPORT PORTG\r
-#define PG6_DDR DDRG\r
-#define PG6_PWM NULL\r
-#undef PG7\r
-#define PG7_PIN PING7\r
-#define PG7_RPORT PING\r
-#define PG7_WPORT PORTG\r
-#define PG7_DDR DDRG\r
-#define PG7_PWM NULL\r
-\r
-#undef PH0\r
-#define PH0_PIN PINH0\r
-#define PH0_RPORT PINH\r
-#define PH0_WPORT PORTH\r
-#define PH0_DDR DDRH\r
-#define PH0_PWM NULL\r
-#undef PH1\r
-#define PH1_PIN PINH1\r
-#define PH1_RPORT PINH\r
-#define PH1_WPORT PORTH\r
-#define PH1_DDR DDRH\r
-#define PH1_PWM NULL\r
-#undef PH2\r
-#define PH2_PIN PINH2\r
-#define PH2_RPORT PINH\r
-#define PH2_WPORT PORTH\r
-#define PH2_DDR DDRH\r
-#define PH2_PWM NULL\r
-#undef PH3\r
-#define PH3_PIN PINH3\r
-#define PH3_RPORT PINH\r
-#define PH3_WPORT PORTH\r
-#define PH3_DDR DDRH\r
-#define PH3_PWM &OCR4AL\r
-#undef PH4\r
-#define PH4_PIN PINH4\r
-#define PH4_RPORT PINH\r
-#define PH4_WPORT PORTH\r
-#define PH4_DDR DDRH\r
-#define PH4_PWM &OCR4BL\r
-#undef PH5\r
-#define PH5_PIN PINH5\r
-#define PH5_RPORT PINH\r
-#define PH5_WPORT PORTH\r
-#define PH5_DDR DDRH\r
-#define PH5_PWM &OCR4CL\r
-#undef PH6\r
-#define PH6_PIN PINH6\r
-#define PH6_RPORT PINH\r
-#define PH6_WPORT PORTH\r
-#define PH6_DDR DDRH\r
-#define PH6_PWM &OCR2B\r
-#undef PH7\r
-#define PH7_PIN PINH7\r
-#define PH7_RPORT PINH\r
-#define PH7_WPORT PORTH\r
-#define PH7_DDR DDRH\r
-#define PH7_PWM NULL\r
-\r
-#undef PJ0\r
-#define PJ0_PIN PINJ0\r
-#define PJ0_RPORT PINJ\r
-#define PJ0_WPORT PORTJ\r
-#define PJ0_DDR DDRJ\r
-#define PJ0_PWM NULL\r
-#undef PJ1\r
-#define PJ1_PIN PINJ1\r
-#define PJ1_RPORT PINJ\r
-#define PJ1_WPORT PORTJ\r
-#define PJ1_DDR DDRJ\r
-#define PJ1_PWM NULL\r
-#undef PJ2\r
-#define PJ2_PIN PINJ2\r
-#define PJ2_RPORT PINJ\r
-#define PJ2_WPORT PORTJ\r
-#define PJ2_DDR DDRJ\r
-#define PJ2_PWM NULL\r
-#undef PJ3\r
-#define PJ3_PIN PINJ3\r
-#define PJ3_RPORT PINJ\r
-#define PJ3_WPORT PORTJ\r
-#define PJ3_DDR DDRJ\r
-#define PJ3_PWM NULL\r
-#undef PJ4\r
-#define PJ4_PIN PINJ4\r
-#define PJ4_RPORT PINJ\r
-#define PJ4_WPORT PORTJ\r
-#define PJ4_DDR DDRJ\r
-#define PJ4_PWM NULL\r
-#undef PJ5\r
-#define PJ5_PIN PINJ5\r
-#define PJ5_RPORT PINJ\r
-#define PJ5_WPORT PORTJ\r
-#define PJ5_DDR DDRJ\r
-#define PJ5_PWM NULL\r
-#undef PJ6\r
-#define PJ6_PIN PINJ6\r
-#define PJ6_RPORT PINJ\r
-#define PJ6_WPORT PORTJ\r
-#define PJ6_DDR DDRJ\r
-#define PJ6_PWM NULL\r
-#undef PJ7\r
-#define PJ7_PIN PINJ7\r
-#define PJ7_RPORT PINJ\r
-#define PJ7_WPORT PORTJ\r
-#define PJ7_DDR DDRJ\r
-#define PJ7_PWM NULL\r
-\r
-#undef PK0\r
-#define PK0_PIN PINK0\r
-#define PK0_RPORT PINK\r
-#define PK0_WPORT PORTK\r
-#define PK0_DDR DDRK\r
-#define PK0_PWM NULL\r
-#undef PK1\r
-#define PK1_PIN PINK1\r
-#define PK1_RPORT PINK\r
-#define PK1_WPORT PORTK\r
-#define PK1_DDR DDRK\r
-#define PK1_PWM NULL\r
-#undef PK2\r
-#define PK2_PIN PINK2\r
-#define PK2_RPORT PINK\r
-#define PK2_WPORT PORTK\r
-#define PK2_DDR DDRK\r
-#define PK2_PWM NULL\r
-#undef PK3\r
-#define PK3_PIN PINK3\r
-#define PK3_RPORT PINK\r
-#define PK3_WPORT PORTK\r
-#define PK3_DDR DDRK\r
-#define PK3_PWM NULL\r
-#undef PK4\r
-#define PK4_PIN PINK4\r
-#define PK4_RPORT PINK\r
-#define PK4_WPORT PORTK\r
-#define PK4_DDR DDRK\r
-#define PK4_PWM NULL\r
-#undef PK5\r
-#define PK5_PIN PINK5\r
-#define PK5_RPORT PINK\r
-#define PK5_WPORT PORTK\r
-#define PK5_DDR DDRK\r
-#define PK5_PWM NULL\r
-#undef PK6\r
-#define PK6_PIN PINK6\r
-#define PK6_RPORT PINK\r
-#define PK6_WPORT PORTK\r
-#define PK6_DDR DDRK\r
-#define PK6_PWM NULL\r
-#undef PK7\r
-#define PK7_PIN PINK7\r
-#define PK7_RPORT PINK\r
-#define PK7_WPORT PORTK\r
-#define PK7_DDR DDRK\r
-#define PK7_PWM NULL\r
-\r
-#undef PL0\r
-#define PL0_PIN PINL0\r
-#define PL0_RPORT PINL\r
-#define PL0_WPORT PORTL\r
-#define PL0_DDR DDRL\r
-#define PL0_PWM NULL\r
-#undef PL1\r
-#define PL1_PIN PINL1\r
-#define PL1_RPORT PINL\r
-#define PL1_WPORT PORTL\r
-#define PL1_DDR DDRL\r
-#define PL1_PWM NULL\r
-#undef PL2\r
-#define PL2_PIN PINL2\r
-#define PL2_RPORT PINL\r
-#define PL2_WPORT PORTL\r
-#define PL2_DDR DDRL\r
-#define PL2_PWM NULL\r
-#undef PL3\r
-#define PL3_PIN PINL3\r
-#define PL3_RPORT PINL\r
-#define PL3_WPORT PORTL\r
-#define PL3_DDR DDRL\r
-#define PL3_PWM &OCR5AL\r
-#undef PL4\r
-#define PL4_PIN PINL4\r
-#define PL4_RPORT PINL\r
-#define PL4_WPORT PORTL\r
-#define PL4_DDR DDRL\r
-#define PL4_PWM &OCR5BL\r
-#undef PL5\r
-#define PL5_PIN PINL5\r
-#define PL5_RPORT PINL\r
-#define PL5_WPORT PORTL\r
-#define PL5_DDR DDRL\r
-#define PL5_PWM &OCR5CL\r
-#undef PL6\r
-#define PL6_PIN PINL6\r
-#define PL6_RPORT PINL\r
-#define PL6_WPORT PORTL\r
-#define PL6_DDR DDRL\r
-#define PL6_PWM NULL\r
-#undef PL7\r
-#define PL7_PIN PINL7\r
-#define PL7_RPORT PINL\r
-#define PL7_WPORT PORTL\r
-#define PL7_DDR DDRL\r
-#define PL7_PWM NULL\r
-\r
-#endif\r
-\r
-#if defined (__AVR_AT90USB1287__)\r
-// SPI\r
-#define SCK DIO9\r
-#define MISO DIO11\r
-#define MOSI DIO10\r
-#define SS DIO8\r
-\r
-// change for your board\r
-#define DEBUG_LED DIO31 /* led D5 red */\r
-\r
-/*\r
-pins\r
-*/\r
-#define DIO0_PIN PINA0\r
-#define DIO0_RPORT PINA\r
-#define DIO0_WPORT PORTA\r
-#define DIO0_PWM NULL\r
-#define DIO0_DDR DDRA\r
-\r
-#define DIO1_PIN PINA1\r
-#define DIO1_RPORT PINA\r
-#define DIO1_WPORT PORTA\r
-#define DIO1_PWM NULL\r
-#define DIO1_DDR DDRA\r
-\r
-#define DIO2_PIN PINA2\r
-#define DIO2_RPORT PINA\r
-#define DIO2_WPORT PORTA\r
-#define DIO2_PWM NULL\r
-#define DIO2_DDR DDRA\r
-\r
-#define DIO3_PIN PINA3\r
-#define DIO3_RPORT PINA\r
-#define DIO3_WPORT PORTA\r
-#define DIO3_PWM NULL\r
-#define DIO3_DDR DDRA\r
-\r
-#define DIO4_PIN PINA4\r
-#define DIO4_RPORT PINA\r
-#define DIO4_WPORT PORTA\r
-#define DIO4_PWM NULL\r
-#define DIO4_DDR DDRA\r
-\r
-#define DIO5_PIN PINA5\r
-#define DIO5_RPORT PINA\r
-#define DIO5_WPORT PORTA\r
-#define DIO5_PWM NULL\r
-#define DIO5_DDR DDRA\r
-\r
-#define DIO6_PIN PINA6\r
-#define DIO6_RPORT PINA\r
-#define DIO6_WPORT PORTA\r
-#define DIO6_PWM NULL\r
-#define DIO6_DDR DDRA\r
-\r
-#define DIO7_PIN PINA7\r
-#define DIO7_RPORT PINA\r
-#define DIO7_WPORT PORTA\r
-#define DIO7_PWM NULL\r
-#define DIO7_DDR DDRA\r
-\r
-#define DIO8_PIN PINB0\r
-#define DIO8_RPORT PINB\r
-#define DIO8_WPORT PORTB\r
-#define DIO8_PWM NULL\r
-#define DIO8_DDR DDRB\r
-\r
-#define DIO9_PIN PINB1\r
-#define DIO9_RPORT PINB\r
-#define DIO9_WPORT PORTB\r
-#define DIO9_PWM NULL\r
-#define DIO9_DDR DDRB\r
-\r
-#define DIO10_PIN PINB2\r
-#define DIO10_RPORT PINB\r
-#define DIO10_WPORT PORTB\r
-#define DIO10_PWM NULL\r
-#define DIO10_DDR DDRB\r
-\r
-#define DIO11_PIN PINB3\r
-#define DIO11_RPORT PINB\r
-#define DIO11_WPORT PORTB\r
-#define DIO11_PWM NULL\r
-#define DIO11_DDR DDRB\r
-\r
-#define DIO12_PIN PINB4\r
-#define DIO12_RPORT PINB\r
-#define DIO12_WPORT PORTB\r
-#define DIO12_PWM NULL\r
-#define DIO12_DDR DDRB\r
-\r
-#define DIO13_PIN PINB5\r
-#define DIO13_RPORT PINB\r
-#define DIO13_WPORT PORTB\r
-#define DIO13_PWM NULL\r
-#define DIO13_DDR DDRB\r
-\r
-#define DIO14_PIN PINB6\r
-#define DIO14_RPORT PINB\r
-#define DIO14_WPORT PORTB\r
-#define DIO14_PWM NULL\r
-#define DIO14_DDR DDRB\r
-\r
-#define DIO15_PIN PINB7\r
-#define DIO15_RPORT PINB\r
-#define DIO15_WPORT PORTB\r
-#define DIO15_PWM NULL\r
-#define DIO15_DDR DDRB\r
-\r
-#define DIO16_PIN PINC0\r
-#define DIO16_RPORT PINC\r
-#define DIO16_WPORT PORTC\r
-#define DIO16_PWM NULL\r
-#define DIO16_DDR DDRC\r
-\r
-#define DIO17_PIN PINC1\r
-#define DIO17_RPORT PINC\r
-#define DIO17_WPORT PORTC\r
-#define DIO17_PWM NULL\r
-#define DIO17_DDR DDRC\r
-\r
-#define DIO18_PIN PINC2\r
-#define DIO18_RPORT PINC\r
-#define DIO18_WPORT PORTC\r
-#define DIO18_PWM NULL\r
-#define DIO18_DDR DDRC\r
-\r
-#define DIO19_PIN PINC3\r
-#define DIO19_RPORT PINC\r
-#define DIO19_WPORT PORTC\r
-#define DIO19_PWM NULL\r
-#define DIO19_DDR DDRC\r
-\r
-#define DIO20_PIN PINC4\r
-#define DIO20_RPORT PINC\r
-#define DIO20_WPORT PORTC\r
-#define DIO20_PWM NULL\r
-#define DIO20_DDR DDRC\r
-\r
-#define DIO21_PIN PINC5\r
-#define DIO21_RPORT PINC\r
-#define DIO21_WPORT PORTC\r
-#define DIO21_PWM NULL\r
-#define DIO21_DDR DDRC\r
-\r
-#define DIO22_PIN PINC6\r
-#define DIO22_RPORT PINC\r
-#define DIO22_WPORT PORTC\r
-#define DIO22_PWM NULL\r
-#define DIO22_DDR DDRC\r
-\r
-#define DIO23_PIN PINC7\r
-#define DIO23_RPORT PINC\r
-#define DIO23_WPORT PORTC\r
-#define DIO23_PWM NULL\r
-#define DIO23_DDR DDRC\r
-\r
-#define DIO24_PIN PIND0\r
-#define DIO24_RPORT PIND\r
-#define DIO24_WPORT PORTD\r
-#define DIO24_PWM NULL\r
-#define DIO24_DDR DDRD\r
-\r
-#define DIO25_PIN PIND1\r
-#define DIO25_RPORT PIND\r
-#define DIO25_WPORT PORTD\r
-#define DIO25_PWM NULL\r
-#define DIO25_DDR DDRD\r
-\r
-#define DIO26_PIN PIND2\r
-#define DIO26_RPORT PIND\r
-#define DIO26_WPORT PORTD\r
-#define DIO26_PWM NULL\r
-#define DIO26_DDR DDRD\r
-\r
-#define DIO27_PIN PIND3\r
-#define DIO27_RPORT PIND\r
-#define DIO27_WPORT PORTD\r
-#define DIO27_PWM NULL\r
-#define DIO27_DDR DDRD\r
-\r
-#define DIO28_PIN PIND4\r
-#define DIO28_RPORT PIND\r
-#define DIO28_WPORT PORTD\r
-#define DIO28_PWM NULL\r
-#define DIO28_DDR DDRD\r
-\r
-#define DIO29_PIN PIND5\r
-#define DIO29_RPORT PIND\r
-#define DIO29_WPORT PORTD\r
-#define DIO29_PWM NULL\r
-#define DIO29_DDR DDRD\r
-\r
-#define DIO30_PIN PIND6\r
-#define DIO30_RPORT PIND\r
-#define DIO30_WPORT PORTD\r
-#define DIO30_PWM NULL\r
-#define DIO30_DDR DDRD\r
-\r
-#define DIO31_PIN PIND7\r
-#define DIO31_RPORT PIND\r
-#define DIO31_WPORT PORTD\r
-#define DIO31_PWM NULL\r
-#define DIO31_DDR DDRD\r
-\r
-\r
-#define DIO32_PIN PINE0\r
-#define DIO32_RPORT PINE\r
-#define DIO32_WPORT PORTE\r
-#define DIO32_PWM NULL\r
-#define DIO32_DDR DDRE\r
-\r
-#define DIO33_PIN PINE1\r
-#define DIO33_RPORT PINE\r
-#define DIO33_WPORT PORTE\r
-#define DIO33_PWM NULL\r
-#define DIO33_DDR DDRE\r
-\r
-#define DIO34_PIN PINE2\r
-#define DIO34_RPORT PINE\r
-#define DIO34_WPORT PORTE\r
-#define DIO34_PWM NULL\r
-#define DIO34_DDR DDRE\r
-\r
-#define DIO35_PIN PINE3\r
-#define DIO35_RPORT PINE\r
-#define DIO35_WPORT PORTE\r
-#define DIO35_PWM NULL\r
-#define DIO35_DDR DDRE\r
-\r
-#define DIO36_PIN PINE4\r
-#define DIO36_RPORT PINE\r
-#define DIO36_WPORT PORTE\r
-#define DIO36_PWM NULL\r
-#define DIO36_DDR DDRE\r
-\r
-#define DIO37_PIN PINE5\r
-#define DIO37_RPORT PINE\r
-#define DIO37_WPORT PORTE\r
-#define DIO37_PWM NULL\r
-#define DIO37_DDR DDRE\r
-\r
-#define DIO38_PIN PINE6\r
-#define DIO38_RPORT PINE\r
-#define DIO38_WPORT PORTE\r
-#define DIO38_PWM NULL\r
-#define DIO38_DDR DDRE\r
-\r
-#define DIO39_PIN PINE7\r
-#define DIO39_RPORT PINE\r
-#define DIO39_WPORT PORTE\r
-#define DIO39_PWM NULL\r
-#define DIO39_DDR DDRE\r
-\r
-#define AIO0_PIN PINF0\r
-#define AIO0_RPORT PINF\r
-#define AIO0_WPORT PORTF\r
-#define AIO0_PWM NULL\r
-#define AIO0_DDR DDRF\r
-\r
-#define AIO1_PIN PINF1\r
-#define AIO1_RPORT PINF\r
-#define AIO1_WPORT PORTF\r
-#define AIO1_PWM NULL\r
-#define AIO1_DDR DDRF\r
-\r
-#define AIO2_PIN PINF2\r
-#define AIO2_RPORT PINF\r
-#define AIO2_WPORT PORTF\r
-#define AIO2_PWM NULL\r
-#define AIO2_DDR DDRF\r
-\r
-#define AIO3_PIN PINF3\r
-#define AIO3_RPORT PINF\r
-#define AIO3_WPORT PORTF\r
-#define AIO3_PWM NULL\r
-#define AIO3_DDR DDRF\r
-\r
-#define AIO4_PIN PINF4\r
-#define AIO4_RPORT PINF\r
-#define AIO4_WPORT PORTF\r
-#define AIO4_PWM NULL\r
-#define AIO4_DDR DDRF\r
-\r
-#define AIO5_PIN PINF5\r
-#define AIO5_RPORT PINF\r
-#define AIO5_WPORT PORTF\r
-#define AIO5_PWM NULL\r
-#define AIO5_DDR DDRF\r
-\r
-#define AIO6_PIN PINF6\r
-#define AIO6_RPORT PINF\r
-#define AIO6_WPORT PORTF\r
-#define AIO6_PWM NULL\r
-#define AIO6_DDR DDRF\r
-\r
-#define AIO7_PIN PINF7\r
-#define AIO7_RPORT PINF\r
-#define AIO7_WPORT PORTF\r
-#define AIO7_PWM NULL\r
-#define AIO7_DDR DDRF\r
-\r
-#define DIO40_PIN PINF0\r
-#define DIO40_RPORT PINF\r
-#define DIO40_WPORT PORTF\r
-#define DIO40_PWM NULL\r
-#define DIO40_DDR DDRF\r
-\r
-#define DIO41_PIN PINF1\r
-#define DIO41_RPORT PINF\r
-#define DIO41_WPORT PORTF\r
-#define DIO41_PWM NULL\r
-#define DIO41_DDR DDRF\r
-\r
-#define DIO42_PIN PINF2\r
-#define DIO42_RPORT PINF\r
-#define DIO42_WPORT PORTF\r
-#define DIO42_PWM NULL\r
-#define DIO42_DDR DDRF\r
-\r
-#define DIO43_PIN PINF3\r
-#define DIO43_RPORT PINF\r
-#define DIO43_WPORT PORTF\r
-#define DIO43_PWM NULL\r
-#define DIO43_DDR DDRF\r
-\r
-#define DIO44_PIN PINF4\r
-#define DIO44_RPORT PINF\r
-#define DIO44_WPORT PORTF\r
-#define DIO44_PWM NULL\r
-#define DIO44_DDR DDRF\r
-\r
-#define DIO45_PIN PINF5\r
-#define DIO45_RPORT PINF\r
-#define DIO45_WPORT PORTF\r
-#define DIO45_PWM NULL\r
-#define DIO45_DDR DDRF\r
-\r
-#define DIO46_PIN PINF6\r
-#define DIO46_RPORT PINF\r
-#define DIO46_WPORT PORTF\r
-#define DIO46_PWM NULL\r
-#define DIO46_DDR DDRF\r
-\r
-#define DIO47_PIN PINF7\r
-#define DIO47_RPORT PINF\r
-#define DIO47_WPORT PORTF\r
-#define DIO47_PWM NULL\r
-#define DIO47_DDR DDRF\r
-\r
-\r
-\r
-#undef PA0\r
-#define PA0_PIN PINA0\r
-#define PA0_RPORT PINA\r
-#define PA0_WPORT PORTA\r
-#define PA0_PWM NULL\r
-#define PA0_DDR DDRA\r
-#undef PA1\r
-#define PA1_PIN PINA1\r
-#define PA1_RPORT PINA\r
-#define PA1_WPORT PORTA\r
-#define PA1_PWM NULL\r
-#define PA1_DDR DDRA\r
-#undef PA2\r
-#define PA2_PIN PINA2\r
-#define PA2_RPORT PINA\r
-#define PA2_WPORT PORTA\r
-#define PA2_PWM NULL\r
-#define PA2_DDR DDRA\r
-#undef PA3\r
-#define PA3_PIN PINA3\r
-#define PA3_RPORT PINA\r
-#define PA3_WPORT PORTA\r
-#define PA3_PWM NULL\r
-#define PA3_DDR DDRA\r
-#undef PA4\r
-#define PA4_PIN PINA4\r
-#define PA4_RPORT PINA\r
-#define PA4_WPORT PORTA\r
-#define PA4_PWM NULL\r
-#define PA4_DDR DDRA\r
-#undef PA5\r
-#define PA5_PIN PINA5\r
-#define PA5_RPORT PINA\r
-#define PA5_WPORT PORTA\r
-#define PA5_PWM NULL\r
-#define PA5_DDR DDRA\r
-#undef PA6\r
-#define PA6_PIN PINA6\r
-#define PA6_RPORT PINA\r
-#define PA6_WPORT PORTA\r
-#define PA6_PWM NULL\r
-#define PA6_DDR DDRA\r
-#undef PA7\r
-#define PA7_PIN PINA7\r
-#define PA7_RPORT PINA\r
-#define PA7_WPORT PORTA\r
-#define PA7_PWM NULL\r
-#define PA7_DDR DDRA\r
-\r
-#undef PB0\r
-#define PB0_PIN PINB0\r
-#define PB0_RPORT PINB\r
-#define PB0_WPORT PORTB\r
-#define PB0_PWM NULL\r
-#define PB0_DDR DDRB\r
-#undef PB1\r
-#define PB1_PIN PINB1\r
-#define PB1_RPORT PINB\r
-#define PB1_WPORT PORTB\r
-#define PB1_PWM NULL\r
-#define PB1_DDR DDRB\r
-#undef PB2\r
-#define PB2_PIN PINB2\r
-#define PB2_RPORT PINB\r
-#define PB2_WPORT PORTB\r
-#define PB2_PWM NULL\r
-#define PB2_DDR DDRB\r
-#undef PB3\r
-#define PB3_PIN PINB3\r
-#define PB3_RPORT PINB\r
-#define PB3_WPORT PORTB\r
-#define PB3_PWM NULL\r
-#define PB3_DDR DDRB\r
-#undef PB4\r
-#define PB4_PIN PINB4\r
-#define PB4_RPORT PINB\r
-#define PB4_WPORT PORTB\r
-#define PB4_PWM NULL\r
-#define PB4_DDR DDRB\r
-#undef PB5\r
-#define PB5_PIN PINB5\r
-#define PB5_RPORT PINB\r
-#define PB5_WPORT PORTB\r
-#define PB5_PWM NULL\r
-#define PB5_DDR DDRB\r
-#undef PB6\r
-#define PB6_PIN PINB6\r
-#define PB6_RPORT PINB\r
-#define PB6_WPORT PORTB\r
-#define PB6_PWM NULL\r
-#define PB6_DDR DDRB\r
-#undef PB7\r
-#define PB7_PIN PINB7\r
-#define PB7_RPORT PINB\r
-#define PB7_WPORT PORTB\r
-#define PB7_PWM NULL\r
-#define PB7_DDR DDRB\r
-\r
-#undef PC0\r
-#define PC0_PIN PINC0\r
-#define PC0_RPORT PINC\r
-#define PC0_WPORT PORTC\r
-#define PC0_PWM NULL\r
-#define PC0_DDR DDRC\r
-#undef PC1\r
-#define PC1_PIN PINC1\r
-#define PC1_RPORT PINC\r
-#define PC1_WPORT PORTC\r
-#define PC1_PWM NULL\r
-#define PC1_DDR DDRC\r
-#undef PC2\r
-#define PC2_PIN PINC2\r
-#define PC2_RPORT PINC\r
-#define PC2_WPORT PORTC\r
-#define PC2_PWM NULL\r
-#define PC2_DDR DDRC\r
-#undef PC3\r
-#define PC3_PIN PINC3\r
-#define PC3_RPORT PINC\r
-#define PC3_WPORT PORTC\r
-#define PC3_PWM NULL\r
-#define PC3_DDR DDRC\r
-#undef PC4\r
-#define PC4_PIN PINC4\r
-#define PC4_RPORT PINC\r
-#define PC4_WPORT PORTC\r
-#define PC4_PWM NULL\r
-#define PC4_DDR DDRC\r
-#undef PC5\r
-#define PC5_PIN PINC5\r
-#define PC5_RPORT PINC\r
-#define PC5_WPORT PORTC\r
-#define PC5_PWM NULL\r
-#define PC5_DDR DDRC\r
-#undef PC6\r
-#define PC6_PIN PINC6\r
-#define PC6_RPORT PINC\r
-#define PC6_WPORT PORTC\r
-#define PC6_PWM NULL\r
-#define PC6_DDR DDRC\r
-#undef PC7\r
-#define PC7_PIN PINC7\r
-#define PC7_RPORT PINC\r
-#define PC7_WPORT PORTC\r
-#define PC7_PWM NULL\r
-#define PC7_DDR DDRC\r
-\r
-#undef PD0\r
-#define PD0_PIN PIND0\r
-#define PD0_RPORT PIND\r
-#define PD0_WPORT PORTD\r
-#define PD0_PWM NULL\r
-#define PD0_DDR DDRD\r
-#undef PD1\r
-#define PD1_PIN PIND1\r
-#define PD1_RPORT PIND\r
-#define PD1_WPORT PORTD\r
-#define PD1_PWM NULL\r
-#define PD1_DDR DDRD\r
-#undef PD2\r
-#define PD2_PIN PIND2\r
-#define PD2_RPORT PIND\r
-#define PD2_WPORT PORTD\r
-#define PD2_PWM NULL\r
-#define PD2_DDR DDRD\r
-#undef PD3\r
-#define PD3_PIN PIND3\r
-#define PD3_RPORT PIND\r
-#define PD3_WPORT PORTD\r
-#define PD3_PWM NULL\r
-#define PD3_DDR DDRD\r
-#undef PD4\r
-#define PD4_PIN PIND4\r
-#define PD4_RPORT PIND\r
-#define PD4_WPORT PORTD\r
-#define PD4_PWM NULL\r
-#define PD4_DDR DDRD\r
-#undef PD5\r
-#define PD5_PIN PIND5\r
-#define PD5_RPORT PIND\r
-#define PD5_WPORT PORTD\r
-#define PD5_PWM NULL\r
-#define PD5_DDR DDRD\r
-#undef PD6\r
-#define PD6_PIN PIND6\r
-#define PD6_RPORT PIND\r
-#define PD6_WPORT PORTD\r
-#define PD6_PWM NULL\r
-#define PD6_DDR DDRD\r
-#undef PD7\r
-#define PD7_PIN PIND7\r
-#define PD7_RPORT PIND\r
-#define PD7_WPORT PORTD\r
-#define PD7_PWM NULL\r
-#define PD7_DDR DDRD\r
-\r
-#undef PE0\r
-#define PE0_PIN PINE0\r
-#define PE0_RPORT PINE\r
-#define PE0_WPORT PORTE\r
-#define PE0_PWM NULL\r
-#define PE0_DDR DDRE\r
-#undef PE1\r
-#define PE1_PIN PINE1\r
-#define PE1_RPORT PINE\r
-#define PE1_WPORT PORTE\r
-#define PE1_PWM NULL\r
-#define PE1_DDR DDRE\r
-#undef PE2\r
-#define PE2_PIN PINE2\r
-#define PE2_RPORT PINE\r
-#define PE2_WPORT PORTE\r
-#define PE2_PWM NULL\r
-#define PE2_DDR DDRE\r
-#undef PE3\r
-#define PE3_PIN PINE3\r
-#define PE3_RPORT PINE\r
-#define PE3_WPORT PORTE\r
-#define PE3_PWM NULL\r
-#define PE3_DDR DDRE\r
-#undef PE4\r
-#define PE4_PIN PINE4\r
-#define PE4_RPORT PINE\r
-#define PE4_WPORT PORTE\r
-#define PE4_PWM NULL\r
-#define PE4_DDR DDRE\r
-#undef PE5\r
-#define PE5_PIN PINE5\r
-#define PE5_RPORT PINE\r
-#define PE5_WPORT PORTE\r
-#define PE5_PWM NULL\r
-#define PE5_DDR DDRE\r
-#undef PE6\r
-#define PE6_PIN PINE6\r
-#define PE6_RPORT PINE\r
-#define PE6_WPORT PORTE\r
-#define PE6_PWM NULL\r
-#define PE6_DDR DDRE\r
-#undef PE7\r
-#define PE7_PIN PINE7\r
-#define PE7_RPORT PINE\r
-#define PE7_WPORT PORTE\r
-#define PE7_PWM NULL\r
-#define PE7_DDR DDRE\r
-\r
-#undef PF0\r
-#define PF0_PIN PINF0\r
-#define PF0_RPORT PINF\r
-#define PF0_WPORT PORTF\r
-#define PF0_PWM NULL\r
-#define PF0_DDR DDRF\r
-#undef PF1\r
-#define PF1_PIN PINF1\r
-#define PF1_RPORT PINF\r
-#define PF1_WPORT PORTF\r
-#define PF1_PWM NULL\r
-#define PF1_DDR DDRF\r
-#undef PF2\r
-#define PF2_PIN PINF2\r
-#define PF2_RPORT PINF\r
-#define PF2_WPORT PORTF\r
-#define PF2_PWM NULL\r
-#define PF2_DDR DDRF\r
-#undef PF3\r
-#define PF3_PIN PINF3\r
-#define PF3_RPORT PINF\r
-#define PF3_WPORT PORTF\r
-#define PF3_PWM NULL\r
-#define PF3_DDR DDRF\r
-#undef PF4\r
-#define PF4_PIN PINF4\r
-#define PF4_RPORT PINF\r
-#define PF4_WPORT PORTF\r
-#define PF4_PWM NULL\r
-#define PF4_DDR DDRF\r
-#undef PF5\r
-#define PF5_PIN PINF5\r
-#define PF5_RPORT PINF\r
-#define PF5_WPORT PORTF\r
-#define PF5_PWM NULL\r
-#define PF5_DDR DDRF\r
-#undef PF6\r
-#define PF6_PIN PINF6\r
-#define PF6_RPORT PINF\r
-#define PF6_WPORT PORTF\r
-#define PF6_PWM NULL\r
-#define PF6_DDR DDRF\r
-#undef PF7\r
-#define PF7_PIN PINF7\r
-#define PF7_RPORT PINF\r
-#define PF7_WPORT PORTF\r
-#define PF7_PWM NULL\r
-#define PF7_DDR DDRF\r
-#endif\r
-\r
-#ifndef DIO0_PIN\r
-#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\r
-#endif\r
-\r
+/*
+ This code contibuted by Triffid_Hunter and modified by Kliment
+ why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html
+*/
+
+#ifndef _ARDUINO_H
+#define _ARDUINO_H
+
+#include <avr/io.h>
+
+/*
+ utility functions
+*/
+
+#ifndef MASK
+/// MASKING- returns \f$2^PIN\f$
+#define MASK(PIN) (1 << PIN)
+#endif
+
+/*
+ magic I/O routines
+ now you can simply SET_OUTPUT(STEP); WRITE(STEP, 1); WRITE(STEP, 0);
+*/
+
+/// Read a pin
+#define _READ(IO) ((bool)(DIO ## IO ## _RPORT & MASK(DIO ## IO ## _PIN)))
+/// write to a pin
+// On some boards pins > 0x100 are used. These are not converted to atomic actions. An critical section is needed.
+
+#define _WRITE_NC(IO, v) do { if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); }; } while (0)
+
+#define _WRITE_C(IO, v) do { if (v) { \
+ CRITICAL_SECTION_START; \
+ {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); }\
+ CRITICAL_SECTION_END; \
+ }\
+ else {\
+ CRITICAL_SECTION_START; \
+ {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); }\
+ CRITICAL_SECTION_END; \
+ }\
+ }\
+ while (0)
+
+#define _WRITE(IO, v) do { if (&(DIO ## IO ## _RPORT) >= (uint8_t *)0x100) {_WRITE_C(IO, v); } else {_WRITE_NC(IO, v); }; } while (0)
+
+/// toggle a pin
+#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)
+/// set pin as output
+#define _SET_OUTPUT(IO) do {DIO ## IO ## _DDR |= MASK(DIO ## IO ## _PIN); } while (0)
+
+/// check if pin is an input
+#define _GET_INPUT(IO) ((DIO ## IO ## _DDR & MASK(DIO ## IO ## _PIN)) == 0)
+/// check if pin is an output
+#define _GET_OUTPUT(IO) ((DIO ## IO ## _DDR & MASK(DIO ## IO ## _PIN)) != 0)
+
+/// check if pin is an timer
+#define _GET_TIMER(IO) ((DIO ## IO ## _PWM)
+
+// why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html
+
+/// Read a pin wrapper
+#define READ(IO) _READ(IO)
+/// Write to a pin wrapper
+#define WRITE(IO, v) _WRITE(IO, v)
+
+/// toggle a pin wrapper
+#define TOGGLE(IO) _TOGGLE(IO)
+
+/// set pin as input wrapper
+#define SET_INPUT(IO) _SET_INPUT(IO)
+/// set pin as output wrapper
+#define SET_OUTPUT(IO) _SET_OUTPUT(IO)
+
+/// check if pin is an input wrapper
+#define GET_INPUT(IO) _GET_INPUT(IO)
+/// check if pin is an output wrapper
+#define GET_OUTPUT(IO) _GET_OUTPUT(IO)
+
+/// check if pin is an timer wrapper
+#define GET_TIMER(IO) _GET_TIMER(IO)
+
+/*
+ ports and functions
+
+ added as necessary or if I feel like it- not a comprehensive list!
+*/
+
+#if defined (__AVR_ATmega168__) || defined (__AVR_ATmega328__) || defined (__AVR_ATmega328P__)
+// UART
+#define RXD DIO0
+#define TXD DIO1
+
+// SPI
+#define SCK DIO13
+#define MISO DIO12
+#define MOSI DIO11
+#define SS DIO10
+
+// TWI (I2C)
+#define SCL AIO5
+#define SDA AIO4
+
+// timers and PWM
+#define OC0A DIO6
+#define OC0B DIO5
+#define OC1A DIO9
+#define OC1B DIO10
+#define OC2A DIO11
+#define OC2B DIO3
+
+#define DEBUG_LED AIO5
+
+/*
+pins
+*/
+
+#define DIO0_PIN PIND0
+#define DIO0_RPORT PIND
+#define DIO0_WPORT PORTD
+#define DIO0_DDR DDRD
+#define DIO0_PWM NULL
+
+#define DIO1_PIN PIND1
+#define DIO1_RPORT PIND
+#define DIO1_WPORT PORTD
+#define DIO1_DDR DDRD
+#define DIO1_PWM NULL
+
+#define DIO2_PIN PIND2
+#define DIO2_RPORT PIND
+#define DIO2_WPORT PORTD
+#define DIO2_DDR DDRD
+#define DIO2_PWM NULL
+
+#define DIO3_PIN PIND3
+#define DIO3_RPORT PIND
+#define DIO3_WPORT PORTD
+#define DIO3_DDR DDRD
+#define DIO3_PWM &OCR2B
+
+#define DIO4_PIN PIND4
+#define DIO4_RPORT PIND
+#define DIO4_WPORT PORTD
+#define DIO4_DDR DDRD
+#define DIO4_PWM NULL
+
+#define DIO5_PIN PIND5
+#define DIO5_RPORT PIND
+#define DIO5_WPORT PORTD
+#define DIO5_DDR DDRD
+#define DIO5_PWM &OCR0B
+
+#define DIO6_PIN PIND6
+#define DIO6_RPORT PIND
+#define DIO6_WPORT PORTD
+#define DIO6_DDR DDRD
+#define DIO6_PWM &OCR0A
+
+#define DIO7_PIN PIND7
+#define DIO7_RPORT PIND
+#define DIO7_WPORT PORTD
+#define DIO7_DDR DDRD
+#define DIO7_PWM NULL
+
+#define DIO8_PIN PINB0
+#define DIO8_RPORT PINB
+#define DIO8_WPORT PORTB
+#define DIO8_DDR DDRB
+#define DIO8_PWM NULL
+
+#define DIO9_PIN PINB1
+#define DIO9_RPORT PINB
+#define DIO9_WPORT PORTB
+#define DIO9_DDR DDRB
+#define DIO9_PWM NULL
+
+#define DIO10_PIN PINB2
+#define DIO10_RPORT PINB
+#define DIO10_WPORT PORTB
+#define DIO10_DDR DDRB
+#define DIO10_PWM NULL
+
+#define DIO11_PIN PINB3
+#define DIO11_RPORT PINB
+#define DIO11_WPORT PORTB
+#define DIO11_DDR DDRB
+#define DIO11_PWM &OCR2A
+
+#define DIO12_PIN PINB4
+#define DIO12_RPORT PINB
+#define DIO12_WPORT PORTB
+#define DIO12_DDR DDRB
+#define DIO12_PWM NULL
+
+#define DIO13_PIN PINB5
+#define DIO13_RPORT PINB
+#define DIO13_WPORT PORTB
+#define DIO13_DDR DDRB
+#define DIO13_PWM NULL
+
+
+#define DIO14_PIN PINC0
+#define DIO14_RPORT PINC
+#define DIO14_WPORT PORTC
+#define DIO14_DDR DDRC
+#define DIO14_PWM NULL
+
+#define DIO15_PIN PINC1
+#define DIO15_RPORT PINC
+#define DIO15_WPORT PORTC
+#define DIO15_DDR DDRC
+#define DIO15_PWM NULL
+
+#define DIO16_PIN PINC2
+#define DIO16_RPORT PINC
+#define DIO16_WPORT PORTC
+#define DIO16_DDR DDRC
+#define DIO16_PWM NULL
+
+#define DIO17_PIN PINC3
+#define DIO17_RPORT PINC
+#define DIO17_WPORT PORTC
+#define DIO17_DDR DDRC
+#define DIO17_PWM NULL
+
+#define DIO18_PIN PINC4
+#define DIO18_RPORT PINC
+#define DIO18_WPORT PORTC
+#define DIO18_DDR DDRC
+#define DIO18_PWM NULL
+
+#define DIO19_PIN PINC5
+#define DIO19_RPORT PINC
+#define DIO19_WPORT PORTC
+#define DIO19_DDR DDRC
+#define DIO19_PWM NULL
+
+#define DIO20_PIN PINC6
+#define DIO20_RPORT PINC
+#define DIO20_WPORT PORTC
+#define DIO20_DDR DDRC
+#define DIO20_PWM NULL
+
+#define DIO21_PIN PINC7
+#define DIO21_RPORT PINC
+#define DIO21_WPORT PORTC
+#define DIO21_DDR DDRC
+#define DIO21_PWM NULL
+
+
+
+#undef PB0
+#define PB0_PIN PINB0
+#define PB0_RPORT PINB
+#define PB0_WPORT PORTB
+#define PB0_DDR DDRB
+#define PB0_PWM NULL
+
+#undef PB1
+#define PB1_PIN PINB1
+#define PB1_RPORT PINB
+#define PB1_WPORT PORTB
+#define PB1_DDR DDRB
+#define PB1_PWM NULL
+
+#undef PB2
+#define PB2_PIN PINB2
+#define PB2_RPORT PINB
+#define PB2_WPORT PORTB
+#define PB2_DDR DDRB
+#define PB2_PWM NULL
+
+#undef PB3
+#define PB3_PIN PINB3
+#define PB3_RPORT PINB
+#define PB3_WPORT PORTB
+#define PB3_DDR DDRB
+#define PB3_PWM &OCR2A
+
+#undef PB4
+#define PB4_PIN PINB4
+#define PB4_RPORT PINB
+#define PB4_WPORT PORTB
+#define PB4_DDR DDRB
+#define PB4_PWM NULL
+
+#undef PB5
+#define PB5_PIN PINB5
+#define PB5_RPORT PINB
+#define PB5_WPORT PORTB
+#define PB5_DDR DDRB
+#define PB5_PWM NULL
+
+#undef PB6
+#define PB6_PIN PINB6
+#define PB6_RPORT PINB
+#define PB6_WPORT PORTB
+#define PB6_DDR DDRB
+#define PB6_PWM NULL
+
+#undef PB7
+#define PB7_PIN PINB7
+#define PB7_RPORT PINB
+#define PB7_WPORT PORTB
+#define PB7_DDR DDRB
+#define PB7_PWM NULL
+
+
+#undef PC0
+#define PC0_PIN PINC0
+#define PC0_RPORT PINC
+#define PC0_WPORT PORTC
+#define PC0_DDR DDRC
+#define PC0_PWM NULL
+
+#undef PC1
+#define PC1_PIN PINC1
+#define PC1_RPORT PINC
+#define PC1_WPORT PORTC
+#define PC1_DDR DDRC
+#define PC1_PWM NULL
+
+#undef PC2
+#define PC2_PIN PINC2
+#define PC2_RPORT PINC
+#define PC2_WPORT PORTC
+#define PC2_DDR DDRC
+#define PC2_PWM NULL
+
+#undef PC3
+#define PC3_PIN PINC3
+#define PC3_RPORT PINC
+#define PC3_WPORT PORTC
+#define PC3_DDR DDRC
+#define PC3_PWM NULL
+
+#undef PC4
+#define PC4_PIN PINC4
+#define PC4_RPORT PINC
+#define PC4_WPORT PORTC
+#define PC4_DDR DDRC
+#define PC4_PWM NULL
+
+#undef PC5
+#define PC5_PIN PINC5
+#define PC5_RPORT PINC
+#define PC5_WPORT PORTC
+#define PC5_DDR DDRC
+#define PC5_PWM NULL
+
+#undef PC6
+#define PC6_PIN PINC6
+#define PC6_RPORT PINC
+#define PC6_WPORT PORTC
+#define PC6_DDR DDRC
+#define PC6_PWM NULL
+
+#undef PC7
+#define PC7_PIN PINC7
+#define PC7_RPORT PINC
+#define PC7_WPORT PORTC
+#define PC7_DDR DDRC
+#define PC7_PWM NULL
+
+
+#undef PD0
+#define PD0_PIN PIND0
+#define PD0_RPORT PIND
+#define PD0_WPORT PORTD
+#define PD0_DDR DDRD
+#define PD0_PWM NULL
+
+#undef PD1
+#define PD1_PIN PIND1
+#define PD1_RPORT PIND
+#define PD1_WPORT PORTD
+#define PD1_DDR DDRD
+#define PD1_PWM NULL
+
+#undef PD2
+#define PD2_PIN PIND2
+#define PD2_RPORT PIND
+#define PD2_WPORT PORTD
+#define PD2_DDR DDRD
+#define PD2_PWM NULL
+
+#undef PD3
+#define PD3_PIN PIND3
+#define PD3_RPORT PIND
+#define PD3_WPORT PORTD
+#define PD3_DDR DDRD
+#define PD3_PWM &OCR2B
+
+#undef PD4
+#define PD4_PIN PIND4
+#define PD4_RPORT PIND
+#define PD4_WPORT PORTD
+#define PD4_DDR DDRD
+#define PD4_PWM NULL
+
+#undef PD5
+#define PD5_PIN PIND5
+#define PD5_RPORT PIND
+#define PD5_WPORT PORTD
+#define PD5_DDR DDRD
+#define PD5_PWM &OCR0B
+
+#undef PD6
+#define PD6_PIN PIND6
+#define PD6_RPORT PIND
+#define PD6_WPORT PORTD
+#define PD6_DDR DDRD
+#define PD6_PWM &OCR0A
+
+#undef PD7
+#define PD7_PIN PIND7
+#define PD7_RPORT PIND
+#define PD7_WPORT PORTD
+#define PD7_DDR DDRD
+#define PD7_PWM NULL
+#endif /* _AVR_ATmega{168,328,328P}__ */
+
+#if defined (__AVR_ATmega644__) || defined (__AVR_ATmega644P__) || defined (__AVR_ATmega644PA__)
+// UART
+#define RXD DIO8
+#define TXD DIO9
+#define RXD0 DIO8
+#define TXD0 DIO9
+
+#define RXD1 DIO10
+#define TXD1 DIO11
+
+// SPI
+#define SCK DIO7
+#define MISO DIO6
+#define MOSI DIO5
+#define SS DIO4
+
+// TWI (I2C)
+#define SCL DIO16
+#define SDA DIO17
+
+// timers and PWM
+#define OC0A DIO3
+#define OC0B DIO4
+#define OC1A DIO13
+#define OC1B DIO12
+#define OC2A DIO15
+#define OC2B DIO14
+
+#define DEBUG_LED DIO0
+/*
+pins
+*/
+
+#define DIO0_PIN PINB0
+#define DIO0_RPORT PINB
+#define DIO0_WPORT PORTB
+#define DIO0_DDR DDRB
+#define DIO0_PWM NULL
+
+#define DIO1_PIN PINB1
+#define DIO1_RPORT PINB
+#define DIO1_WPORT PORTB
+#define DIO1_DDR DDRB
+#define DIO1_PWM NULL
+
+#define DIO2_PIN PINB2
+#define DIO2_RPORT PINB
+#define DIO2_WPORT PORTB
+#define DIO2_DDR DDRB
+#define DIO2_PWM NULL
+
+#define DIO3_PIN PINB3
+#define DIO3_RPORT PINB
+#define DIO3_WPORT PORTB
+#define DIO3_DDR DDRB
+#define DIO3_PWM OCR0A
+
+#define DIO4_PIN PINB4
+#define DIO4_RPORT PINB
+#define DIO4_WPORT PORTB
+#define DIO4_DDR DDRB
+#define DIO4_PWM OCR0B
+
+#define DIO5_PIN PINB5
+#define DIO5_RPORT PINB
+#define DIO5_WPORT PORTB
+#define DIO5_DDR DDRB
+#define DIO5_PWM NULL
+
+#define DIO6_PIN PINB6
+#define DIO6_RPORT PINB
+#define DIO6_WPORT PORTB
+#define DIO6_DDR DDRB
+#define DIO6_PWM NULL
+
+#define DIO7_PIN PINB7
+#define DIO7_RPORT PINB
+#define DIO7_WPORT PORTB
+#define DIO7_DDR DDRB
+#define DIO7_PWM NULL
+
+#define DIO8_PIN PIND0
+#define DIO8_RPORT PIND
+#define DIO8_WPORT PORTD
+#define DIO8_DDR DDRD
+#define DIO8_PWM NULL
+
+#define DIO9_PIN PIND1
+#define DIO9_RPORT PIND
+#define DIO9_WPORT PORTD
+#define DIO9_DDR DDRD
+#define DIO9_PWM NULL
+
+#define DIO10_PIN PIND2
+#define DIO10_RPORT PIND
+#define DIO10_WPORT PORTD
+#define DIO10_DDR DDRD
+#define DIO10_PWM NULL
+
+#define DIO11_PIN PIND3
+#define DIO11_RPORT PIND
+#define DIO11_WPORT PORTD
+#define DIO11_DDR DDRD
+#define DIO11_PWM NULL
+
+#define DIO12_PIN PIND4
+#define DIO12_RPORT PIND
+#define DIO12_WPORT PORTD
+#define DIO12_DDR DDRD
+#define DIO12_PWM OCR1B
+
+#define DIO13_PIN PIND5
+#define DIO13_RPORT PIND
+#define DIO13_WPORT PORTD
+#define DIO13_DDR DDRD
+#define DIO13_PWM OCR1A
+
+#define DIO14_PIN PIND6
+#define DIO14_RPORT PIND
+#define DIO14_WPORT PORTD
+#define DIO14_DDR DDRD
+#define DIO14_PWM OCR2B
+
+#define DIO15_PIN PIND7
+#define DIO15_RPORT PIND
+#define DIO15_WPORT PORTD
+#define DIO15_DDR DDRD
+#define DIO15_PWM OCR2A
+
+#define DIO16_PIN PINC0
+#define DIO16_RPORT PINC
+#define DIO16_WPORT PORTC
+#define DIO16_DDR DDRC
+#define DIO16_PWM NULL
+
+#define DIO17_PIN PINC1
+#define DIO17_RPORT PINC
+#define DIO17_WPORT PORTC
+#define DIO17_DDR DDRC
+#define DIO17_PWM NULL
+
+#define DIO18_PIN PINC2
+#define DIO18_RPORT PINC
+#define DIO18_WPORT PORTC
+#define DIO18_DDR DDRC
+#define DIO18_PWM NULL
+
+#define DIO19_PIN PINC3
+#define DIO19_RPORT PINC
+#define DIO19_WPORT PORTC
+#define DIO19_DDR DDRC
+#define DIO19_PWM NULL
+
+#define DIO20_PIN PINC4
+#define DIO20_RPORT PINC
+#define DIO20_WPORT PORTC
+#define DIO20_DDR DDRC
+#define DIO20_PWM NULL
+
+#define DIO21_PIN PINC5
+#define DIO21_RPORT PINC
+#define DIO21_WPORT PORTC
+#define DIO21_DDR DDRC
+#define DIO21_PWM NULL
+
+#define DIO22_PIN PINC6
+#define DIO22_RPORT PINC
+#define DIO22_WPORT PORTC
+#define DIO22_DDR DDRC
+#define DIO22_PWM NULL
+
+#define DIO23_PIN PINC7
+#define DIO23_RPORT PINC
+#define DIO23_WPORT PORTC
+#define DIO23_DDR DDRC
+#define DIO23_PWM NULL
+
+#define DIO24_PIN PINA7
+#define DIO24_RPORT PINA
+#define DIO24_WPORT PORTA
+#define DIO24_DDR DDRA
+#define DIO24_PWM NULL
+
+#define DIO25_PIN PINA6
+#define DIO25_RPORT PINA
+#define DIO25_WPORT PORTA
+#define DIO25_DDR DDRA
+#define DIO25_PWM NULL
+
+#define DIO26_PIN PINA5
+#define DIO26_RPORT PINA
+#define DIO26_WPORT PORTA
+#define DIO26_DDR DDRA
+#define DIO26_PWM NULL
+
+#define DIO27_PIN PINA4
+#define DIO27_RPORT PINA
+#define DIO27_WPORT PORTA
+#define DIO27_DDR DDRA
+#define DIO27_PWM NULL
+
+#define DIO28_PIN PINA3
+#define DIO28_RPORT PINA
+#define DIO28_WPORT PORTA
+#define DIO28_DDR DDRA
+#define DIO28_PWM NULL
+
+#define DIO29_PIN PINA2
+#define DIO29_RPORT PINA
+#define DIO29_WPORT PORTA
+#define DIO29_DDR DDRA
+#define DIO29_PWM NULL
+
+#define DIO30_PIN PINA1
+#define DIO30_RPORT PINA
+#define DIO30_WPORT PORTA
+#define DIO30_DDR DDRA
+#define DIO30_PWM NULL
+
+#define DIO31_PIN PINA0
+#define DIO31_RPORT PINA
+#define DIO31_WPORT PORTA
+#define DIO31_DDR DDRA
+#define DIO31_PWM NULL
+
+#define AIO0_PIN PINA0
+#define AIO0_RPORT PINA
+#define AIO0_WPORT PORTA
+#define AIO0_DDR DDRA
+#define AIO0_PWM NULL
+
+#define AIO1_PIN PINA1
+#define AIO1_RPORT PINA
+#define AIO1_WPORT PORTA
+#define AIO1_DDR DDRA
+#define AIO1_PWM NULL
+
+#define AIO2_PIN PINA2
+#define AIO2_RPORT PINA
+#define AIO2_WPORT PORTA
+#define AIO2_DDR DDRA
+#define AIO2_PWM NULL
+
+#define AIO3_PIN PINA3
+#define AIO3_RPORT PINA
+#define AIO3_WPORT PORTA
+#define AIO3_DDR DDRA
+#define AIO3_PWM NULL
+
+#define AIO4_PIN PINA4
+#define AIO4_RPORT PINA
+#define AIO4_WPORT PORTA
+#define AIO4_DDR DDRA
+#define AIO4_PWM NULL
+
+#define AIO5_PIN PINA5
+#define AIO5_RPORT PINA
+#define AIO5_WPORT PORTA
+#define AIO5_DDR DDRA
+#define AIO5_PWM NULL
+
+#define AIO6_PIN PINA6
+#define AIO6_RPORT PINA
+#define AIO6_WPORT PORTA
+#define AIO6_DDR DDRA
+#define AIO6_PWM NULL
+
+#define AIO7_PIN PINA7
+#define AIO7_RPORT PINA
+#define AIO7_WPORT PORTA
+#define AIO7_DDR DDRA
+#define AIO7_PWM NULL
+
+
+
+#undef PA0
+#define PA0_PIN PINA0
+#define PA0_RPORT PINA
+#define PA0_WPORT PORTA
+#define PA0_DDR DDRA
+#define PA0_PWM NULL
+
+#undef PA1
+#define PA1_PIN PINA1
+#define PA1_RPORT PINA
+#define PA1_WPORT PORTA
+#define PA1_DDR DDRA
+#define PA1_PWM NULL
+
+#undef PA2
+#define PA2_PIN PINA2
+#define PA2_RPORT PINA
+#define PA2_WPORT PORTA
+#define PA2_DDR DDRA
+#define PA2_PWM NULL
+
+#undef PA3
+#define PA3_PIN PINA3
+#define PA3_RPORT PINA
+#define PA3_WPORT PORTA
+#define PA3_DDR DDRA
+#define PA3_PWM NULL
+
+#undef PA4
+#define PA4_PIN PINA4
+#define PA4_RPORT PINA
+#define PA4_WPORT PORTA
+#define PA4_DDR DDRA
+#define PA4_PWM NULL
+
+#undef PA5
+#define PA5_PIN PINA5
+#define PA5_RPORT PINA
+#define PA5_WPORT PORTA
+#define PA5_DDR DDRA
+#define PA5_PWM NULL
+
+#undef PA6
+#define PA6_PIN PINA6
+#define PA6_RPORT PINA
+#define PA6_WPORT PORTA
+#define PA6_DDR DDRA
+#define PA6_PWM NULL
+
+#undef PA7
+#define PA7_PIN PINA7
+#define PA7_RPORT PINA
+#define PA7_WPORT PORTA
+#define PA7_DDR DDRA
+#define PA7_PWM NULL
+
+
+#undef PB0
+#define PB0_PIN PINB0
+#define PB0_RPORT PINB
+#define PB0_WPORT PORTB
+#define PB0_DDR DDRB
+#define PB0_PWM NULL
+
+#undef PB1
+#define PB1_PIN PINB1
+#define PB1_RPORT PINB
+#define PB1_WPORT PORTB
+#define PB1_DDR DDRB
+#define PB1_PWM NULL
+
+#undef PB2
+#define PB2_PIN PINB2
+#define PB2_RPORT PINB
+#define PB2_WPORT PORTB
+#define PB2_DDR DDRB
+#define PB2_PWM NULL
+
+#undef PB3
+#define PB3_PIN PINB3
+#define PB3_RPORT PINB
+#define PB3_WPORT PORTB
+#define PB3_DDR DDRB
+#define PB3_PWM OCR0A
+
+#undef PB4
+#define PB4_PIN PINB4
+#define PB4_RPORT PINB
+#define PB4_WPORT PORTB
+#define PB4_DDR DDRB
+#define PB4_PWM OCR0B
+
+#undef PB5
+#define PB5_PIN PINB5
+#define PB5_RPORT PINB
+#define PB5_WPORT PORTB
+#define PB5_DDR DDRB
+#define PB5_PWM NULL
+
+#undef PB6
+#define PB6_PIN PINB6
+#define PB6_RPORT PINB
+#define PB6_WPORT PORTB
+#define PB6_DDR DDRB
+#define PB6_PWM NULL
+
+#undef PB7
+#define PB7_PIN PINB7
+#define PB7_RPORT PINB
+#define PB7_WPORT PORTB
+#define PB7_DDR DDRB
+#define PB7_PWM NULL
+
+
+#undef PC0
+#define PC0_PIN PINC0
+#define PC0_RPORT PINC
+#define PC0_WPORT PORTC
+#define PC0_DDR DDRC
+#define PC0_PWM NULL
+
+#undef PC1
+#define PC1_PIN PINC1
+#define PC1_RPORT PINC
+#define PC1_WPORT PORTC
+#define PC1_DDR DDRC
+#define PC1_PWM NULL
+
+#undef PC2
+#define PC2_PIN PINC2
+#define PC2_RPORT PINC
+#define PC2_WPORT PORTC
+#define PC2_DDR DDRC
+#define PC2_PWM NULL
+
+#undef PC3
+#define PC3_PIN PINC3
+#define PC3_RPORT PINC
+#define PC3_WPORT PORTC
+#define PC3_DDR DDRC
+#define PC3_PWM NULL
+
+#undef PC4
+#define PC4_PIN PINC4
+#define PC4_RPORT PINC
+#define PC4_WPORT PORTC
+#define PC4_DDR DDRC
+#define PC4_PWM NULL
+
+#undef PC5
+#define PC5_PIN PINC5
+#define PC5_RPORT PINC
+#define PC5_WPORT PORTC
+#define PC5_DDR DDRC
+#define PC5_PWM NULL
+
+#undef PC6
+#define PC6_PIN PINC6
+#define PC6_RPORT PINC
+#define PC6_WPORT PORTC
+#define PC6_DDR DDRC
+#define PC6_PWM NULL
+
+#undef PC7
+#define PC7_PIN PINC7
+#define PC7_RPORT PINC
+#define PC7_WPORT PORTC
+#define PC7_DDR DDRC
+#define PC7_PWM NULL
+
+
+#undef PD0
+#define PD0_PIN PIND0
+#define PD0_RPORT PIND
+#define PD0_WPORT PORTD
+#define PD0_DDR DDRD
+#define PD0_PWM NULL
+
+#undef PD1
+#define PD1_PIN PIND1
+#define PD1_RPORT PIND
+#define PD1_WPORT PORTD
+#define PD1_DDR DDRD
+#define PD1_PWM NULL
+
+#undef PD2
+#define PD2_PIN PIND2
+#define PD2_RPORT PIND
+#define PD2_WPORT PORTD
+#define PD2_DDR DDRD
+#define PD2_PWM NULL
+
+#undef PD3
+#define PD3_PIN PIND3
+#define PD3_RPORT PIND
+#define PD3_WPORT PORTD
+#define PD3_DDR DDRD
+#define PD3_PWM NULL
+
+#undef PD4
+#define PD4_PIN PIND4
+#define PD4_RPORT PIND
+#define PD4_WPORT PORTD
+#define PD4_DDR DDRD
+#define PD4_PWM NULL
+
+#undef PD5
+#define PD5_PIN PIND5
+#define PD5_RPORT PIND
+#define PD5_WPORT PORTD
+#define PD5_DDR DDRD
+#define PD5_PWM NULL
+
+#undef PD6
+#define PD6_PIN PIND6
+#define PD6_RPORT PIND
+#define PD6_WPORT PORTD
+#define PD6_DDR DDRD
+#define PD6_PWM OCR2B
+
+#undef PD7
+#define PD7_PIN PIND7
+#define PD7_RPORT PIND
+#define PD7_WPORT PORTD
+#define PD7_DDR DDRD
+#define PD7_PWM OCR2A
+#endif /* _AVR_ATmega{644,644P,644PA}__ */
+
+#if defined (__AVR_ATmega1280__) || defined (__AVR_ATmega2560__)
+// UART
+#define RXD DIO0
+#define TXD DIO1
+
+// SPI
+#define SCK DIO52
+#define MISO DIO50
+#define MOSI DIO51
+#define SS DIO53
+
+// TWI (I2C)
+#define SCL DIO21
+#define SDA DIO20
+
+// timers and PWM
+#define OC0A DIO13
+#define OC0B DIO4
+#define OC1A DIO11
+#define OC1B DIO12
+#define OC2A DIO10
+#define OC2B DIO9
+#define OC3A DIO5
+#define OC3B DIO2
+#define OC3C DIO3
+#define OC4A DIO6
+#define OC4B DIO7
+#define OC4C DIO8
+#define OC5A DIO46
+#define OC5B DIO45
+#define OC5C DIO44
+
+// change for your board
+#define DEBUG_LED DIO21
+
+/*
+pins
+*/
+#define DIO0_PIN PINE0
+#define DIO0_RPORT PINE
+#define DIO0_WPORT PORTE
+#define DIO0_DDR DDRE
+#define DIO0_PWM NULL
+
+#define DIO1_PIN PINE1
+#define DIO1_RPORT PINE
+#define DIO1_WPORT PORTE
+#define DIO1_DDR DDRE
+#define DIO1_PWM NULL
+
+#define DIO2_PIN PINE4
+#define DIO2_RPORT PINE
+#define DIO2_WPORT PORTE
+#define DIO2_DDR DDRE
+#define DIO2_PWM &OCR3BL
+
+#define DIO3_PIN PINE5
+#define DIO3_RPORT PINE
+#define DIO3_WPORT PORTE
+#define DIO3_DDR DDRE
+#define DIO3_PWM &OCR3CL
+
+#define DIO4_PIN PING5
+#define DIO4_RPORT PING
+#define DIO4_WPORT PORTG
+#define DIO4_DDR DDRG
+#define DIO4_PWM &OCR0B
+
+#define DIO5_PIN PINE3
+#define DIO5_RPORT PINE
+#define DIO5_WPORT PORTE
+#define DIO5_DDR DDRE
+#define DIO5_PWM &OCR3AL
+
+#define DIO6_PIN PINH3
+#define DIO6_RPORT PINH
+#define DIO6_WPORT PORTH
+#define DIO6_DDR DDRH
+#define DIO6_PWM &OCR4AL
+
+#define DIO7_PIN PINH4
+#define DIO7_RPORT PINH
+#define DIO7_WPORT PORTH
+#define DIO7_DDR DDRH
+#define DIO7_PWM &OCR4BL
+
+#define DIO8_PIN PINH5
+#define DIO8_RPORT PINH
+#define DIO8_WPORT PORTH
+#define DIO8_DDR DDRH
+#define DIO8_PWM &OCR4CL
+
+#define DIO9_PIN PINH6
+#define DIO9_RPORT PINH
+#define DIO9_WPORT PORTH
+#define DIO9_DDR DDRH
+#define DIO9_PWM &OCR2B
+
+#define DIO10_PIN PINB4
+#define DIO10_RPORT PINB
+#define DIO10_WPORT PORTB
+#define DIO10_DDR DDRB
+#define DIO10_PWM &OCR2A
+
+#define DIO11_PIN PINB5
+#define DIO11_RPORT PINB
+#define DIO11_WPORT PORTB
+#define DIO11_DDR DDRB
+#define DIO11_PWM NULL
+
+#define DIO12_PIN PINB6
+#define DIO12_RPORT PINB
+#define DIO12_WPORT PORTB
+#define DIO12_DDR DDRB
+#define DIO12_PWM NULL
+
+#define DIO13_PIN PINB7
+#define DIO13_RPORT PINB
+#define DIO13_WPORT PORTB
+#define DIO13_DDR DDRB
+#define DIO13_PWM &OCR0A
+
+#define DIO14_PIN PINJ1
+#define DIO14_RPORT PINJ
+#define DIO14_WPORT PORTJ
+#define DIO14_DDR DDRJ
+#define DIO14_PWM NULL
+
+#define DIO15_PIN PINJ0
+#define DIO15_RPORT PINJ
+#define DIO15_WPORT PORTJ
+#define DIO15_DDR DDRJ
+#define DIO15_PWM NULL
+
+#define DIO16_PIN PINH1
+#define DIO16_RPORT PINH
+#define DIO16_WPORT PORTH
+#define DIO16_DDR DDRH
+#define DIO16_PWM NULL
+
+#define DIO17_PIN PINH0
+#define DIO17_RPORT PINH
+#define DIO17_WPORT PORTH
+#define DIO17_DDR DDRH
+#define DIO17_PWM NULL
+
+#define DIO18_PIN PIND3
+#define DIO18_RPORT PIND
+#define DIO18_WPORT PORTD
+#define DIO18_DDR DDRD
+#define DIO18_PWM NULL
+
+#define DIO19_PIN PIND2
+#define DIO19_RPORT PIND
+#define DIO19_WPORT PORTD
+#define DIO19_DDR DDRD
+#define DIO19_PWM NULL
+
+#define DIO20_PIN PIND1
+#define DIO20_RPORT PIND
+#define DIO20_WPORT PORTD
+#define DIO20_DDR DDRD
+#define DIO20_PWM NULL
+
+#define DIO21_PIN PIND0
+#define DIO21_RPORT PIND
+#define DIO21_WPORT PORTD
+#define DIO21_DDR DDRD
+#define DIO21_PWM NULL
+
+#define DIO22_PIN PINA0
+#define DIO22_RPORT PINA
+#define DIO22_WPORT PORTA
+#define DIO22_DDR DDRA
+#define DIO22_PWM NULL
+
+#define DIO23_PIN PINA1
+#define DIO23_RPORT PINA
+#define DIO23_WPORT PORTA
+#define DIO23_DDR DDRA
+#define DIO23_PWM NULL
+
+#define DIO24_PIN PINA2
+#define DIO24_RPORT PINA
+#define DIO24_WPORT PORTA
+#define DIO24_DDR DDRA
+#define DIO24_PWM NULL
+
+#define DIO25_PIN PINA3
+#define DIO25_RPORT PINA
+#define DIO25_WPORT PORTA
+#define DIO25_DDR DDRA
+#define DIO25_PWM NULL
+
+#define DIO26_PIN PINA4
+#define DIO26_RPORT PINA
+#define DIO26_WPORT PORTA
+#define DIO26_DDR DDRA
+#define DIO26_PWM NULL
+
+#define DIO27_PIN PINA5
+#define DIO27_RPORT PINA
+#define DIO27_WPORT PORTA
+#define DIO27_DDR DDRA
+#define DIO27_PWM NULL
+
+#define DIO28_PIN PINA6
+#define DIO28_RPORT PINA
+#define DIO28_WPORT PORTA
+#define DIO28_DDR DDRA
+#define DIO28_PWM NULL
+
+#define DIO29_PIN PINA7
+#define DIO29_RPORT PINA
+#define DIO29_WPORT PORTA
+#define DIO29_DDR DDRA
+#define DIO29_PWM NULL
+
+#define DIO30_PIN PINC7
+#define DIO30_RPORT PINC
+#define DIO30_WPORT PORTC
+#define DIO30_DDR DDRC
+#define DIO30_PWM NULL
+
+#define DIO31_PIN PINC6
+#define DIO31_RPORT PINC
+#define DIO31_WPORT PORTC
+#define DIO31_DDR DDRC
+#define DIO31_PWM NULL
+
+#define DIO32_PIN PINC5
+#define DIO32_RPORT PINC
+#define DIO32_WPORT PORTC
+#define DIO32_DDR DDRC
+#define DIO32_PWM NULL
+
+#define DIO33_PIN PINC4
+#define DIO33_RPORT PINC
+#define DIO33_WPORT PORTC
+#define DIO33_DDR DDRC
+#define DIO33_PWM NULL
+
+#define DIO34_PIN PINC3
+#define DIO34_RPORT PINC
+#define DIO34_WPORT PORTC
+#define DIO34_DDR DDRC
+#define DIO34_PWM NULL
+
+#define DIO35_PIN PINC2
+#define DIO35_RPORT PINC
+#define DIO35_WPORT PORTC
+#define DIO35_DDR DDRC
+#define DIO35_PWM NULL
+
+#define DIO36_PIN PINC1
+#define DIO36_RPORT PINC
+#define DIO36_WPORT PORTC
+#define DIO36_DDR DDRC
+#define DIO36_PWM NULL
+
+#define DIO37_PIN PINC0
+#define DIO37_RPORT PINC
+#define DIO37_WPORT PORTC
+#define DIO37_DDR DDRC
+#define DIO37_PWM NULL
+
+#define DIO38_PIN PIND7
+#define DIO38_RPORT PIND
+#define DIO38_WPORT PORTD
+#define DIO38_DDR DDRD
+#define DIO38_PWM NULL
+
+#define DIO39_PIN PING2
+#define DIO39_RPORT PING
+#define DIO39_WPORT PORTG
+#define DIO39_DDR DDRG
+#define DIO39_PWM NULL
+
+#define DIO40_PIN PING1
+#define DIO40_RPORT PING
+#define DIO40_WPORT PORTG
+#define DIO40_DDR DDRG
+#define DIO40_PWM NULL
+
+#define DIO41_PIN PING0
+#define DIO41_RPORT PING
+#define DIO41_WPORT PORTG
+#define DIO41_DDR DDRG
+#define DIO41_PWM NULL
+
+#define DIO42_PIN PINL7
+#define DIO42_RPORT PINL
+#define DIO42_WPORT PORTL
+#define DIO42_DDR DDRL
+#define DIO42_PWM NULL
+
+#define DIO43_PIN PINL6
+#define DIO43_RPORT PINL
+#define DIO43_WPORT PORTL
+#define DIO43_DDR DDRL
+#define DIO43_PWM NULL
+
+#define DIO44_PIN PINL5
+#define DIO44_RPORT PINL
+#define DIO44_WPORT PORTL
+#define DIO44_DDR DDRL
+#define DIO44_PWM &OCR5CL
+
+#define DIO45_PIN PINL4
+#define DIO45_RPORT PINL
+#define DIO45_WPORT PORTL
+#define DIO45_DDR DDRL
+#define DIO45_PWM &OCR5BL
+
+#define DIO46_PIN PINL3
+#define DIO46_RPORT PINL
+#define DIO46_WPORT PORTL
+#define DIO46_DDR DDRL
+#define DIO46_PWM &OCR5AL
+
+#define DIO47_PIN PINL2
+#define DIO47_RPORT PINL
+#define DIO47_WPORT PORTL
+#define DIO47_DDR DDRL
+#define DIO47_PWM NULL
+
+#define DIO48_PIN PINL1
+#define DIO48_RPORT PINL
+#define DIO48_WPORT PORTL
+#define DIO48_DDR DDRL
+#define DIO48_PWM NULL
+
+#define DIO49_PIN PINL0
+#define DIO49_RPORT PINL
+#define DIO49_WPORT PORTL
+#define DIO49_DDR DDRL
+#define DIO49_PWM NULL
+
+#define DIO50_PIN PINB3
+#define DIO50_RPORT PINB
+#define DIO50_WPORT PORTB
+#define DIO50_DDR DDRB
+#define DIO50_PWM NULL
+
+#define DIO51_PIN PINB2
+#define DIO51_RPORT PINB
+#define DIO51_WPORT PORTB
+#define DIO51_DDR DDRB
+#define DIO51_PWM NULL
+
+#define DIO52_PIN PINB1
+#define DIO52_RPORT PINB
+#define DIO52_WPORT PORTB
+#define DIO52_DDR DDRB
+#define DIO52_PWM NULL
+
+#define DIO53_PIN PINB0
+#define DIO53_RPORT PINB
+#define DIO53_WPORT PORTB
+#define DIO53_DDR DDRB
+#define DIO53_PWM NULL
+
+#define DIO54_PIN PINF0
+#define DIO54_RPORT PINF
+#define DIO54_WPORT PORTF
+#define DIO54_DDR DDRF
+#define DIO54_PWM NULL
+
+#define DIO55_PIN PINF1
+#define DIO55_RPORT PINF
+#define DIO55_WPORT PORTF
+#define DIO55_DDR DDRF
+#define DIO55_PWM NULL
+
+#define DIO56_PIN PINF2
+#define DIO56_RPORT PINF
+#define DIO56_WPORT PORTF
+#define DIO56_DDR DDRF
+#define DIO56_PWM NULL
+
+#define DIO57_PIN PINF3
+#define DIO57_RPORT PINF
+#define DIO57_WPORT PORTF
+#define DIO57_DDR DDRF
+#define DIO57_PWM NULL
+
+#define DIO58_PIN PINF4
+#define DIO58_RPORT PINF
+#define DIO58_WPORT PORTF
+#define DIO58_DDR DDRF
+#define DIO58_PWM NULL
+
+#define DIO59_PIN PINF5
+#define DIO59_RPORT PINF
+#define DIO59_WPORT PORTF
+#define DIO59_DDR DDRF
+#define DIO59_PWM NULL
+
+#define DIO60_PIN PINF6
+#define DIO60_RPORT PINF
+#define DIO60_WPORT PORTF
+#define DIO60_DDR DDRF
+#define DIO60_PWM NULL
+
+#define DIO61_PIN PINF7
+#define DIO61_RPORT PINF
+#define DIO61_WPORT PORTF
+#define DIO61_DDR DDRF
+#define DIO61_PWM NULL
+
+#define DIO62_PIN PINK0
+#define DIO62_RPORT PINK
+#define DIO62_WPORT PORTK
+#define DIO62_DDR DDRK
+#define DIO62_PWM NULL
+
+#define DIO63_PIN PINK1
+#define DIO63_RPORT PINK
+#define DIO63_WPORT PORTK
+#define DIO63_DDR DDRK
+#define DIO63_PWM NULL
+
+#define DIO64_PIN PINK2
+#define DIO64_RPORT PINK
+#define DIO64_WPORT PORTK
+#define DIO64_DDR DDRK
+#define DIO64_PWM NULL
+
+#define DIO65_PIN PINK3
+#define DIO65_RPORT PINK
+#define DIO65_WPORT PORTK
+#define DIO65_DDR DDRK
+#define DIO65_PWM NULL
+
+#define DIO66_PIN PINK4
+#define DIO66_RPORT PINK
+#define DIO66_WPORT PORTK
+#define DIO66_DDR DDRK
+#define DIO66_PWM NULL
+
+#define DIO67_PIN PINK5
+#define DIO67_RPORT PINK
+#define DIO67_WPORT PORTK
+#define DIO67_DDR DDRK
+#define DIO67_PWM NULL
+
+#define DIO68_PIN PINK6
+#define DIO68_RPORT PINK
+#define DIO68_WPORT PORTK
+#define DIO68_DDR DDRK
+#define DIO68_PWM NULL
+
+#define DIO69_PIN PINK7
+#define DIO69_RPORT PINK
+#define DIO69_WPORT PORTK
+#define DIO69_DDR DDRK
+#define DIO69_PWM NULL
+
+
+
+#undef PA0
+#define PA0_PIN PINA0
+#define PA0_RPORT PINA
+#define PA0_WPORT PORTA
+#define PA0_DDR DDRA
+#define PA0_PWM NULL
+#undef PA1
+#define PA1_PIN PINA1
+#define PA1_RPORT PINA
+#define PA1_WPORT PORTA
+#define PA1_DDR DDRA
+#define PA1_PWM NULL
+#undef PA2
+#define PA2_PIN PINA2
+#define PA2_RPORT PINA
+#define PA2_WPORT PORTA
+#define PA2_DDR DDRA
+#define PA2_PWM NULL
+#undef PA3
+#define PA3_PIN PINA3
+#define PA3_RPORT PINA
+#define PA3_WPORT PORTA
+#define PA3_DDR DDRA
+#define PA3_PWM NULL
+#undef PA4
+#define PA4_PIN PINA4
+#define PA4_RPORT PINA
+#define PA4_WPORT PORTA
+#define PA4_DDR DDRA
+#define PA4_PWM NULL
+#undef PA5
+#define PA5_PIN PINA5
+#define PA5_RPORT PINA
+#define PA5_WPORT PORTA
+#define PA5_DDR DDRA
+#define PA5_PWM NULL
+#undef PA6
+#define PA6_PIN PINA6
+#define PA6_RPORT PINA
+#define PA6_WPORT PORTA
+#define PA6_DDR DDRA
+#define PA6_PWM NULL
+#undef PA7
+#define PA7_PIN PINA7
+#define PA7_RPORT PINA
+#define PA7_WPORT PORTA
+#define PA7_DDR DDRA
+#define PA7_PWM NULL
+
+#undef PB0
+#define PB0_PIN PINB0
+#define PB0_RPORT PINB
+#define PB0_WPORT PORTB
+#define PB0_DDR DDRB
+#define PB0_PWM NULL
+#undef PB1
+#define PB1_PIN PINB1
+#define PB1_RPORT PINB
+#define PB1_WPORT PORTB
+#define PB1_DDR DDRB
+#define PB1_PWM NULL
+#undef PB2
+#define PB2_PIN PINB2
+#define PB2_RPORT PINB
+#define PB2_WPORT PORTB
+#define PB2_DDR DDRB
+#define PB2_PWM NULL
+#undef PB3
+#define PB3_PIN PINB3
+#define PB3_RPORT PINB
+#define PB3_WPORT PORTB
+#define PB3_DDR DDRB
+#define PB3_PWM NULL
+#undef PB4
+#define PB4_PIN PINB4
+#define PB4_RPORT PINB
+#define PB4_WPORT PORTB
+#define PB4_DDR DDRB
+#define PB4_PWM &OCR2A
+#undef PB5
+#define PB5_PIN PINB5
+#define PB5_RPORT PINB
+#define PB5_WPORT PORTB
+#define PB5_DDR DDRB
+#define PB5_PWM NULL
+#undef PB6
+#define PB6_PIN PINB6
+#define PB6_RPORT PINB
+#define PB6_WPORT PORTB
+#define PB6_DDR DDRB
+#define PB6_PWM NULL
+#undef PB7
+#define PB7_PIN PINB7
+#define PB7_RPORT PINB
+#define PB7_WPORT PORTB
+#define PB7_DDR DDRB
+#define PB7_PWM &OCR0A
+
+#undef PC0
+#define PC0_PIN PINC0
+#define PC0_RPORT PINC
+#define PC0_WPORT PORTC
+#define PC0_DDR DDRC
+#define PC0_PWM NULL
+#undef PC1
+#define PC1_PIN PINC1
+#define PC1_RPORT PINC
+#define PC1_WPORT PORTC
+#define PC1_DDR DDRC
+#define PC1_PWM NULL
+#undef PC2
+#define PC2_PIN PINC2
+#define PC2_RPORT PINC
+#define PC2_WPORT PORTC
+#define PC2_DDR DDRC
+#define PC2_PWM NULL
+#undef PC3
+#define PC3_PIN PINC3
+#define PC3_RPORT PINC
+#define PC3_WPORT PORTC
+#define PC3_DDR DDRC
+#define PC3_PWM NULL
+#undef PC4
+#define PC4_PIN PINC4
+#define PC4_RPORT PINC
+#define PC4_WPORT PORTC
+#define PC4_DDR DDRC
+#define PC4_PWM NULL
+#undef PC5
+#define PC5_PIN PINC5
+#define PC5_RPORT PINC
+#define PC5_WPORT PORTC
+#define PC5_DDR DDRC
+#define PC5_PWM NULL
+#undef PC6
+#define PC6_PIN PINC6
+#define PC6_RPORT PINC
+#define PC6_WPORT PORTC
+#define PC6_DDR DDRC
+#define PC6_PWM NULL
+#undef PC7
+#define PC7_PIN PINC7
+#define PC7_RPORT PINC
+#define PC7_WPORT PORTC
+#define PC7_DDR DDRC
+#define PC7_PWM NULL
+
+#undef PD0
+#define PD0_PIN PIND0
+#define PD0_RPORT PIND
+#define PD0_WPORT PORTD
+#define PD0_DDR DDRD
+#define PD0_PWM NULL
+#undef PD1
+#define PD1_PIN PIND1
+#define PD1_RPORT PIND
+#define PD1_WPORT PORTD
+#define PD1_DDR DDRD
+#define PD1_PWM NULL
+#undef PD2
+#define PD2_PIN PIND2
+#define PD2_RPORT PIND
+#define PD2_WPORT PORTD
+#define PD2_DDR DDRD
+#define PD2_PWM NULL
+#undef PD3
+#define PD3_PIN PIND3
+#define PD3_RPORT PIND
+#define PD3_WPORT PORTD
+#define PD3_DDR DDRD
+#define PD3_PWM NULL
+#undef PD4
+#define PD4_PIN PIND4
+#define PD4_RPORT PIND
+#define PD4_WPORT PORTD
+#define PD4_DDR DDRD
+#define PD4_PWM NULL
+#undef PD5
+#define PD5_PIN PIND5
+#define PD5_RPORT PIND
+#define PD5_WPORT PORTD
+#define PD5_DDR DDRD
+#define PD5_PWM NULL
+#undef PD6
+#define PD6_PIN PIND6
+#define PD6_RPORT PIND
+#define PD6_WPORT PORTD
+#define PD6_DDR DDRD
+#define PD6_PWM NULL
+#undef PD7
+#define PD7_PIN PIND7
+#define PD7_RPORT PIND
+#define PD7_WPORT PORTD
+#define PD7_DDR DDRD
+#define PD7_PWM NULL
+
+#undef PE0
+#define PE0_PIN PINE0
+#define PE0_RPORT PINE
+#define PE0_WPORT PORTE
+#define PE0_DDR DDRE
+#define PE0_PWM NULL
+#undef PE1
+#define PE1_PIN PINE1
+#define PE1_RPORT PINE
+#define PE1_WPORT PORTE
+#define PE1_DDR DDRE
+#define PE1_PWM NULL
+#undef PE2
+#define PE2_PIN PINE2
+#define PE2_RPORT PINE
+#define PE2_WPORT PORTE
+#define PE2_DDR DDRE
+#define PE2_PWM NULL
+#undef PE3
+#define PE3_PIN PINE3
+#define PE3_RPORT PINE
+#define PE3_WPORT PORTE
+#define PE3_DDR DDRE
+#define PE3_PWM &OCR3AL
+#undef PE4
+#define PE4_PIN PINE4
+#define PE4_RPORT PINE
+#define PE4_WPORT PORTE
+#define PE4_DDR DDRE
+#define PE4_PWM &OCR3BL
+#undef PE5
+#define PE5_PIN PINE5
+#define PE5_RPORT PINE
+#define PE5_WPORT PORTE
+#define PE5_DDR DDRE
+#define PE5_PWM &OCR3CL
+#undef PE6
+#define PE6_PIN PINE6
+#define PE6_RPORT PINE
+#define PE6_WPORT PORTE
+#define PE6_DDR DDRE
+#define PE6_PWM NULL
+#undef PE7
+#define PE7_PIN PINE7
+#define PE7_RPORT PINE
+#define PE7_WPORT PORTE
+#define PE7_DDR DDRE
+#define PE7_PWM NULL
+
+#undef PF0
+#define PF0_PIN PINF0
+#define PF0_RPORT PINF
+#define PF0_WPORT PORTF
+#define PF0_DDR DDRF
+#define PF0_PWM NULL
+#undef PF1
+#define PF1_PIN PINF1
+#define PF1_RPORT PINF
+#define PF1_WPORT PORTF
+#define PF1_DDR DDRF
+#define PF1_PWM NULL
+#undef PF2
+#define PF2_PIN PINF2
+#define PF2_RPORT PINF
+#define PF2_WPORT PORTF
+#define PF2_DDR DDRF
+#define PF2_PWM NULL
+#undef PF3
+#define PF3_PIN PINF3
+#define PF3_RPORT PINF
+#define PF3_WPORT PORTF
+#define PF3_DDR DDRF
+#define PF3_PWM NULL
+#undef PF4
+#define PF4_PIN PINF4
+#define PF4_RPORT PINF
+#define PF4_WPORT PORTF
+#define PF4_DDR DDRF
+#define PF4_PWM NULL
+#undef PF5
+#define PF5_PIN PINF5
+#define PF5_RPORT PINF
+#define PF5_WPORT PORTF
+#define PF5_DDR DDRF
+#define PF5_PWM NULL
+#undef PF6
+#define PF6_PIN PINF6
+#define PF6_RPORT PINF
+#define PF6_WPORT PORTF
+#define PF6_DDR DDRF
+#define PF6_PWM NULL
+#undef PF7
+#define PF7_PIN PINF7
+#define PF7_RPORT PINF
+#define PF7_WPORT PORTF
+#define PF7_DDR DDRF
+#define PF7_PWM NULL
+
+#undef PG0
+#define PG0_PIN PING0
+#define PG0_RPORT PING
+#define PG0_WPORT PORTG
+#define PG0_DDR DDRG
+#define PG0_PWM NULL
+#undef PG1
+#define PG1_PIN PING1
+#define PG1_RPORT PING
+#define PG1_WPORT PORTG
+#define PG1_DDR DDRG
+#define PG1_PWM NULL
+#undef PG2
+#define PG2_PIN PING2
+#define PG2_RPORT PING
+#define PG2_WPORT PORTG
+#define PG2_DDR DDRG
+#define PG2_PWM NULL
+#undef PG3
+#define PG3_PIN PING3
+#define PG3_RPORT PING
+#define PG3_WPORT PORTG
+#define PG3_DDR DDRG
+#define PG3_PWM NULL
+#undef PG4
+#define PG4_PIN PING4
+#define PG4_RPORT PING
+#define PG4_WPORT PORTG
+#define PG4_DDR DDRG
+#define PG4_PWM NULL
+#undef PG5
+#define PG5_PIN PING5
+#define PG5_RPORT PING
+#define PG5_WPORT PORTG
+#define PG5_DDR DDRG
+#define PG5_PWM &OCR0B
+#undef PG6
+#define PG6_PIN PING6
+#define PG6_RPORT PING
+#define PG6_WPORT PORTG
+#define PG6_DDR DDRG
+#define PG6_PWM NULL
+#undef PG7
+#define PG7_PIN PING7
+#define PG7_RPORT PING
+#define PG7_WPORT PORTG
+#define PG7_DDR DDRG
+#define PG7_PWM NULL
+
+#undef PH0
+#define PH0_PIN PINH0
+#define PH0_RPORT PINH
+#define PH0_WPORT PORTH
+#define PH0_DDR DDRH
+#define PH0_PWM NULL
+#undef PH1
+#define PH1_PIN PINH1
+#define PH1_RPORT PINH
+#define PH1_WPORT PORTH
+#define PH1_DDR DDRH
+#define PH1_PWM NULL
+#undef PH2
+#define PH2_PIN PINH2
+#define PH2_RPORT PINH
+#define PH2_WPORT PORTH
+#define PH2_DDR DDRH
+#define PH2_PWM NULL
+#undef PH3
+#define PH3_PIN PINH3
+#define PH3_RPORT PINH
+#define PH3_WPORT PORTH
+#define PH3_DDR DDRH
+#define PH3_PWM &OCR4AL
+#undef PH4
+#define PH4_PIN PINH4
+#define PH4_RPORT PINH
+#define PH4_WPORT PORTH
+#define PH4_DDR DDRH
+#define PH4_PWM &OCR4BL
+#undef PH5
+#define PH5_PIN PINH5
+#define PH5_RPORT PINH
+#define PH5_WPORT PORTH
+#define PH5_DDR DDRH
+#define PH5_PWM &OCR4CL
+#undef PH6
+#define PH6_PIN PINH6
+#define PH6_RPORT PINH
+#define PH6_WPORT PORTH
+#define PH6_DDR DDRH
+#define PH6_PWM &OCR2B
+#undef PH7
+#define PH7_PIN PINH7
+#define PH7_RPORT PINH
+#define PH7_WPORT PORTH
+#define PH7_DDR DDRH
+#define PH7_PWM NULL
+
+#undef PJ0
+#define PJ0_PIN PINJ0
+#define PJ0_RPORT PINJ
+#define PJ0_WPORT PORTJ
+#define PJ0_DDR DDRJ
+#define PJ0_PWM NULL
+#undef PJ1
+#define PJ1_PIN PINJ1
+#define PJ1_RPORT PINJ
+#define PJ1_WPORT PORTJ
+#define PJ1_DDR DDRJ
+#define PJ1_PWM NULL
+#undef PJ2
+#define PJ2_PIN PINJ2
+#define PJ2_RPORT PINJ
+#define PJ2_WPORT PORTJ
+#define PJ2_DDR DDRJ
+#define PJ2_PWM NULL
+#undef PJ3
+#define PJ3_PIN PINJ3
+#define PJ3_RPORT PINJ
+#define PJ3_WPORT PORTJ
+#define PJ3_DDR DDRJ
+#define PJ3_PWM NULL
+#undef PJ4
+#define PJ4_PIN PINJ4
+#define PJ4_RPORT PINJ
+#define PJ4_WPORT PORTJ
+#define PJ4_DDR DDRJ
+#define PJ4_PWM NULL
+#undef PJ5
+#define PJ5_PIN PINJ5
+#define PJ5_RPORT PINJ
+#define PJ5_WPORT PORTJ
+#define PJ5_DDR DDRJ
+#define PJ5_PWM NULL
+#undef PJ6
+#define PJ6_PIN PINJ6
+#define PJ6_RPORT PINJ
+#define PJ6_WPORT PORTJ
+#define PJ6_DDR DDRJ
+#define PJ6_PWM NULL
+#undef PJ7
+#define PJ7_PIN PINJ7
+#define PJ7_RPORT PINJ
+#define PJ7_WPORT PORTJ
+#define PJ7_DDR DDRJ
+#define PJ7_PWM NULL
+
+#undef PK0
+#define PK0_PIN PINK0
+#define PK0_RPORT PINK
+#define PK0_WPORT PORTK
+#define PK0_DDR DDRK
+#define PK0_PWM NULL
+#undef PK1
+#define PK1_PIN PINK1
+#define PK1_RPORT PINK
+#define PK1_WPORT PORTK
+#define PK1_DDR DDRK
+#define PK1_PWM NULL
+#undef PK2
+#define PK2_PIN PINK2
+#define PK2_RPORT PINK
+#define PK2_WPORT PORTK
+#define PK2_DDR DDRK
+#define PK2_PWM NULL
+#undef PK3
+#define PK3_PIN PINK3
+#define PK3_RPORT PINK
+#define PK3_WPORT PORTK
+#define PK3_DDR DDRK
+#define PK3_PWM NULL
+#undef PK4
+#define PK4_PIN PINK4
+#define PK4_RPORT PINK
+#define PK4_WPORT PORTK
+#define PK4_DDR DDRK
+#define PK4_PWM NULL
+#undef PK5
+#define PK5_PIN PINK5
+#define PK5_RPORT PINK
+#define PK5_WPORT PORTK
+#define PK5_DDR DDRK
+#define PK5_PWM NULL
+#undef PK6
+#define PK6_PIN PINK6
+#define PK6_RPORT PINK
+#define PK6_WPORT PORTK
+#define PK6_DDR DDRK
+#define PK6_PWM NULL
+#undef PK7
+#define PK7_PIN PINK7
+#define PK7_RPORT PINK
+#define PK7_WPORT PORTK
+#define PK7_DDR DDRK
+#define PK7_PWM NULL
+
+#undef PL0
+#define PL0_PIN PINL0
+#define PL0_RPORT PINL
+#define PL0_WPORT PORTL
+#define PL0_DDR DDRL
+#define PL0_PWM NULL
+#undef PL1
+#define PL1_PIN PINL1
+#define PL1_RPORT PINL
+#define PL1_WPORT PORTL
+#define PL1_DDR DDRL
+#define PL1_PWM NULL
+#undef PL2
+#define PL2_PIN PINL2
+#define PL2_RPORT PINL
+#define PL2_WPORT PORTL
+#define PL2_DDR DDRL
+#define PL2_PWM NULL
+#undef PL3
+#define PL3_PIN PINL3
+#define PL3_RPORT PINL
+#define PL3_WPORT PORTL
+#define PL3_DDR DDRL
+#define PL3_PWM &OCR5AL
+#undef PL4
+#define PL4_PIN PINL4
+#define PL4_RPORT PINL
+#define PL4_WPORT PORTL
+#define PL4_DDR DDRL
+#define PL4_PWM &OCR5BL
+#undef PL5
+#define PL5_PIN PINL5
+#define PL5_RPORT PINL
+#define PL5_WPORT PORTL
+#define PL5_DDR DDRL
+#define PL5_PWM &OCR5CL
+#undef PL6
+#define PL6_PIN PINL6
+#define PL6_RPORT PINL
+#define PL6_WPORT PORTL
+#define PL6_DDR DDRL
+#define PL6_PWM NULL
+#undef PL7
+#define PL7_PIN PINL7
+#define PL7_RPORT PINL
+#define PL7_WPORT PORTL
+#define PL7_DDR DDRL
+#define PL7_PWM NULL
+
+#endif
+
+#if defined (__AVR_AT90USB1287__)
+// SPI
+#define SCK DIO9
+#define MISO DIO11
+#define MOSI DIO10
+#define SS DIO8
+
+// change for your board
+#define DEBUG_LED DIO31 /* led D5 red */
+
+/*
+pins
+*/
+#define DIO0_PIN PINA0
+#define DIO0_RPORT PINA
+#define DIO0_WPORT PORTA
+#define DIO0_PWM NULL
+#define DIO0_DDR DDRA
+
+#define DIO1_PIN PINA1
+#define DIO1_RPORT PINA
+#define DIO1_WPORT PORTA
+#define DIO1_PWM NULL
+#define DIO1_DDR DDRA
+
+#define DIO2_PIN PINA2
+#define DIO2_RPORT PINA
+#define DIO2_WPORT PORTA
+#define DIO2_PWM NULL
+#define DIO2_DDR DDRA
+
+#define DIO3_PIN PINA3
+#define DIO3_RPORT PINA
+#define DIO3_WPORT PORTA
+#define DIO3_PWM NULL
+#define DIO3_DDR DDRA
+
+#define DIO4_PIN PINA4
+#define DIO4_RPORT PINA
+#define DIO4_WPORT PORTA
+#define DIO4_PWM NULL
+#define DIO4_DDR DDRA
+
+#define DIO5_PIN PINA5
+#define DIO5_RPORT PINA
+#define DIO5_WPORT PORTA
+#define DIO5_PWM NULL
+#define DIO5_DDR DDRA
+
+#define DIO6_PIN PINA6
+#define DIO6_RPORT PINA
+#define DIO6_WPORT PORTA
+#define DIO6_PWM NULL
+#define DIO6_DDR DDRA
+
+#define DIO7_PIN PINA7
+#define DIO7_RPORT PINA
+#define DIO7_WPORT PORTA
+#define DIO7_PWM NULL
+#define DIO7_DDR DDRA
+
+#define DIO8_PIN PINB0
+#define DIO8_RPORT PINB
+#define DIO8_WPORT PORTB
+#define DIO8_PWM NULL
+#define DIO8_DDR DDRB
+
+#define DIO9_PIN PINB1
+#define DIO9_RPORT PINB
+#define DIO9_WPORT PORTB
+#define DIO9_PWM NULL
+#define DIO9_DDR DDRB
+
+#define DIO10_PIN PINB2
+#define DIO10_RPORT PINB
+#define DIO10_WPORT PORTB
+#define DIO10_PWM NULL
+#define DIO10_DDR DDRB
+
+#define DIO11_PIN PINB3
+#define DIO11_RPORT PINB
+#define DIO11_WPORT PORTB
+#define DIO11_PWM NULL
+#define DIO11_DDR DDRB
+
+#define DIO12_PIN PINB4
+#define DIO12_RPORT PINB
+#define DIO12_WPORT PORTB
+#define DIO12_PWM NULL
+#define DIO12_DDR DDRB
+
+#define DIO13_PIN PINB5
+#define DIO13_RPORT PINB
+#define DIO13_WPORT PORTB
+#define DIO13_PWM NULL
+#define DIO13_DDR DDRB
+
+#define DIO14_PIN PINB6
+#define DIO14_RPORT PINB
+#define DIO14_WPORT PORTB
+#define DIO14_PWM NULL
+#define DIO14_DDR DDRB
+
+#define DIO15_PIN PINB7
+#define DIO15_RPORT PINB
+#define DIO15_WPORT PORTB
+#define DIO15_PWM NULL
+#define DIO15_DDR DDRB
+
+#define DIO16_PIN PINC0
+#define DIO16_RPORT PINC
+#define DIO16_WPORT PORTC
+#define DIO16_PWM NULL
+#define DIO16_DDR DDRC
+
+#define DIO17_PIN PINC1
+#define DIO17_RPORT PINC
+#define DIO17_WPORT PORTC
+#define DIO17_PWM NULL
+#define DIO17_DDR DDRC
+
+#define DIO18_PIN PINC2
+#define DIO18_RPORT PINC
+#define DIO18_WPORT PORTC
+#define DIO18_PWM NULL
+#define DIO18_DDR DDRC
+
+#define DIO19_PIN PINC3
+#define DIO19_RPORT PINC
+#define DIO19_WPORT PORTC
+#define DIO19_PWM NULL
+#define DIO19_DDR DDRC
+
+#define DIO20_PIN PINC4
+#define DIO20_RPORT PINC
+#define DIO20_WPORT PORTC
+#define DIO20_PWM NULL
+#define DIO20_DDR DDRC
+
+#define DIO21_PIN PINC5
+#define DIO21_RPORT PINC
+#define DIO21_WPORT PORTC
+#define DIO21_PWM NULL
+#define DIO21_DDR DDRC
+
+#define DIO22_PIN PINC6
+#define DIO22_RPORT PINC
+#define DIO22_WPORT PORTC
+#define DIO22_PWM NULL
+#define DIO22_DDR DDRC
+
+#define DIO23_PIN PINC7
+#define DIO23_RPORT PINC
+#define DIO23_WPORT PORTC
+#define DIO23_PWM NULL
+#define DIO23_DDR DDRC
+
+#define DIO24_PIN PIND0
+#define DIO24_RPORT PIND
+#define DIO24_WPORT PORTD
+#define DIO24_PWM NULL
+#define DIO24_DDR DDRD
+
+#define DIO25_PIN PIND1
+#define DIO25_RPORT PIND
+#define DIO25_WPORT PORTD
+#define DIO25_PWM NULL
+#define DIO25_DDR DDRD
+
+#define DIO26_PIN PIND2
+#define DIO26_RPORT PIND
+#define DIO26_WPORT PORTD
+#define DIO26_PWM NULL
+#define DIO26_DDR DDRD
+
+#define DIO27_PIN PIND3
+#define DIO27_RPORT PIND
+#define DIO27_WPORT PORTD
+#define DIO27_PWM NULL
+#define DIO27_DDR DDRD
+
+#define DIO28_PIN PIND4
+#define DIO28_RPORT PIND
+#define DIO28_WPORT PORTD
+#define DIO28_PWM NULL
+#define DIO28_DDR DDRD
+
+#define DIO29_PIN PIND5
+#define DIO29_RPORT PIND
+#define DIO29_WPORT PORTD
+#define DIO29_PWM NULL
+#define DIO29_DDR DDRD
+
+#define DIO30_PIN PIND6
+#define DIO30_RPORT PIND
+#define DIO30_WPORT PORTD
+#define DIO30_PWM NULL
+#define DIO30_DDR DDRD
+
+#define DIO31_PIN PIND7
+#define DIO31_RPORT PIND
+#define DIO31_WPORT PORTD
+#define DIO31_PWM NULL
+#define DIO31_DDR DDRD
+
+
+#define DIO32_PIN PINE0
+#define DIO32_RPORT PINE
+#define DIO32_WPORT PORTE
+#define DIO32_PWM NULL
+#define DIO32_DDR DDRE
+
+#define DIO33_PIN PINE1
+#define DIO33_RPORT PINE
+#define DIO33_WPORT PORTE
+#define DIO33_PWM NULL
+#define DIO33_DDR DDRE
+
+#define DIO34_PIN PINE2
+#define DIO34_RPORT PINE
+#define DIO34_WPORT PORTE
+#define DIO34_PWM NULL
+#define DIO34_DDR DDRE
+
+#define DIO35_PIN PINE3
+#define DIO35_RPORT PINE
+#define DIO35_WPORT PORTE
+#define DIO35_PWM NULL
+#define DIO35_DDR DDRE
+
+#define DIO36_PIN PINE4
+#define DIO36_RPORT PINE
+#define DIO36_WPORT PORTE
+#define DIO36_PWM NULL
+#define DIO36_DDR DDRE
+
+#define DIO37_PIN PINE5
+#define DIO37_RPORT PINE
+#define DIO37_WPORT PORTE
+#define DIO37_PWM NULL
+#define DIO37_DDR DDRE
+
+#define DIO38_PIN PINE6
+#define DIO38_RPORT PINE
+#define DIO38_WPORT PORTE
+#define DIO38_PWM NULL
+#define DIO38_DDR DDRE
+
+#define DIO39_PIN PINE7
+#define DIO39_RPORT PINE
+#define DIO39_WPORT PORTE
+#define DIO39_PWM NULL
+#define DIO39_DDR DDRE
+
+#define AIO0_PIN PINF0
+#define AIO0_RPORT PINF
+#define AIO0_WPORT PORTF
+#define AIO0_PWM NULL
+#define AIO0_DDR DDRF
+
+#define AIO1_PIN PINF1
+#define AIO1_RPORT PINF
+#define AIO1_WPORT PORTF
+#define AIO1_PWM NULL
+#define AIO1_DDR DDRF
+
+#define AIO2_PIN PINF2
+#define AIO2_RPORT PINF
+#define AIO2_WPORT PORTF
+#define AIO2_PWM NULL
+#define AIO2_DDR DDRF
+
+#define AIO3_PIN PINF3
+#define AIO3_RPORT PINF
+#define AIO3_WPORT PORTF
+#define AIO3_PWM NULL
+#define AIO3_DDR DDRF
+
+#define AIO4_PIN PINF4
+#define AIO4_RPORT PINF
+#define AIO4_WPORT PORTF
+#define AIO4_PWM NULL
+#define AIO4_DDR DDRF
+
+#define AIO5_PIN PINF5
+#define AIO5_RPORT PINF
+#define AIO5_WPORT PORTF
+#define AIO5_PWM NULL
+#define AIO5_DDR DDRF
+
+#define AIO6_PIN PINF6
+#define AIO6_RPORT PINF
+#define AIO6_WPORT PORTF
+#define AIO6_PWM NULL
+#define AIO6_DDR DDRF
+
+#define AIO7_PIN PINF7
+#define AIO7_RPORT PINF
+#define AIO7_WPORT PORTF
+#define AIO7_PWM NULL
+#define AIO7_DDR DDRF
+
+#define DIO40_PIN PINF0
+#define DIO40_RPORT PINF
+#define DIO40_WPORT PORTF
+#define DIO40_PWM NULL
+#define DIO40_DDR DDRF
+
+#define DIO41_PIN PINF1
+#define DIO41_RPORT PINF
+#define DIO41_WPORT PORTF
+#define DIO41_PWM NULL
+#define DIO41_DDR DDRF
+
+#define DIO42_PIN PINF2
+#define DIO42_RPORT PINF
+#define DIO42_WPORT PORTF
+#define DIO42_PWM NULL
+#define DIO42_DDR DDRF
+
+#define DIO43_PIN PINF3
+#define DIO43_RPORT PINF
+#define DIO43_WPORT PORTF
+#define DIO43_PWM NULL
+#define DIO43_DDR DDRF
+
+#define DIO44_PIN PINF4
+#define DIO44_RPORT PINF
+#define DIO44_WPORT PORTF
+#define DIO44_PWM NULL
+#define DIO44_DDR DDRF
+
+#define DIO45_PIN PINF5
+#define DIO45_RPORT PINF
+#define DIO45_WPORT PORTF
+#define DIO45_PWM NULL
+#define DIO45_DDR DDRF
+
+#define DIO46_PIN PINF6
+#define DIO46_RPORT PINF
+#define DIO46_WPORT PORTF
+#define DIO46_PWM NULL
+#define DIO46_DDR DDRF
+
+#define DIO47_PIN PINF7
+#define DIO47_RPORT PINF
+#define DIO47_WPORT PORTF
+#define DIO47_PWM NULL
+#define DIO47_DDR DDRF
+
+
+
+#undef PA0
+#define PA0_PIN PINA0
+#define PA0_RPORT PINA
+#define PA0_WPORT PORTA
+#define PA0_PWM NULL
+#define PA0_DDR DDRA
+#undef PA1
+#define PA1_PIN PINA1
+#define PA1_RPORT PINA
+#define PA1_WPORT PORTA
+#define PA1_PWM NULL
+#define PA1_DDR DDRA
+#undef PA2
+#define PA2_PIN PINA2
+#define PA2_RPORT PINA
+#define PA2_WPORT PORTA
+#define PA2_PWM NULL
+#define PA2_DDR DDRA
+#undef PA3
+#define PA3_PIN PINA3
+#define PA3_RPORT PINA
+#define PA3_WPORT PORTA
+#define PA3_PWM NULL
+#define PA3_DDR DDRA
+#undef PA4
+#define PA4_PIN PINA4
+#define PA4_RPORT PINA
+#define PA4_WPORT PORTA
+#define PA4_PWM NULL
+#define PA4_DDR DDRA
+#undef PA5
+#define PA5_PIN PINA5
+#define PA5_RPORT PINA
+#define PA5_WPORT PORTA
+#define PA5_PWM NULL
+#define PA5_DDR DDRA
+#undef PA6
+#define PA6_PIN PINA6
+#define PA6_RPORT PINA
+#define PA6_WPORT PORTA
+#define PA6_PWM NULL
+#define PA6_DDR DDRA
+#undef PA7
+#define PA7_PIN PINA7
+#define PA7_RPORT PINA
+#define PA7_WPORT PORTA
+#define PA7_PWM NULL
+#define PA7_DDR DDRA
+
+#undef PB0
+#define PB0_PIN PINB0
+#define PB0_RPORT PINB
+#define PB0_WPORT PORTB
+#define PB0_PWM NULL
+#define PB0_DDR DDRB
+#undef PB1
+#define PB1_PIN PINB1
+#define PB1_RPORT PINB
+#define PB1_WPORT PORTB
+#define PB1_PWM NULL
+#define PB1_DDR DDRB
+#undef PB2
+#define PB2_PIN PINB2
+#define PB2_RPORT PINB
+#define PB2_WPORT PORTB
+#define PB2_PWM NULL
+#define PB2_DDR DDRB
+#undef PB3
+#define PB3_PIN PINB3
+#define PB3_RPORT PINB
+#define PB3_WPORT PORTB
+#define PB3_PWM NULL
+#define PB3_DDR DDRB
+#undef PB4
+#define PB4_PIN PINB4
+#define PB4_RPORT PINB
+#define PB4_WPORT PORTB
+#define PB4_PWM NULL
+#define PB4_DDR DDRB
+#undef PB5
+#define PB5_PIN PINB5
+#define PB5_RPORT PINB
+#define PB5_WPORT PORTB
+#define PB5_PWM NULL
+#define PB5_DDR DDRB
+#undef PB6
+#define PB6_PIN PINB6
+#define PB6_RPORT PINB
+#define PB6_WPORT PORTB
+#define PB6_PWM NULL
+#define PB6_DDR DDRB
+#undef PB7
+#define PB7_PIN PINB7
+#define PB7_RPORT PINB
+#define PB7_WPORT PORTB
+#define PB7_PWM NULL
+#define PB7_DDR DDRB
+
+#undef PC0
+#define PC0_PIN PINC0
+#define PC0_RPORT PINC
+#define PC0_WPORT PORTC
+#define PC0_PWM NULL
+#define PC0_DDR DDRC
+#undef PC1
+#define PC1_PIN PINC1
+#define PC1_RPORT PINC
+#define PC1_WPORT PORTC
+#define PC1_PWM NULL
+#define PC1_DDR DDRC
+#undef PC2
+#define PC2_PIN PINC2
+#define PC2_RPORT PINC
+#define PC2_WPORT PORTC
+#define PC2_PWM NULL
+#define PC2_DDR DDRC
+#undef PC3
+#define PC3_PIN PINC3
+#define PC3_RPORT PINC
+#define PC3_WPORT PORTC
+#define PC3_PWM NULL
+#define PC3_DDR DDRC
+#undef PC4
+#define PC4_PIN PINC4
+#define PC4_RPORT PINC
+#define PC4_WPORT PORTC
+#define PC4_PWM NULL
+#define PC4_DDR DDRC
+#undef PC5
+#define PC5_PIN PINC5
+#define PC5_RPORT PINC
+#define PC5_WPORT PORTC
+#define PC5_PWM NULL
+#define PC5_DDR DDRC
+#undef PC6
+#define PC6_PIN PINC6
+#define PC6_RPORT PINC
+#define PC6_WPORT PORTC
+#define PC6_PWM NULL
+#define PC6_DDR DDRC
+#undef PC7
+#define PC7_PIN PINC7
+#define PC7_RPORT PINC
+#define PC7_WPORT PORTC
+#define PC7_PWM NULL
+#define PC7_DDR DDRC
+
+#undef PD0
+#define PD0_PIN PIND0
+#define PD0_RPORT PIND
+#define PD0_WPORT PORTD
+#define PD0_PWM NULL
+#define PD0_DDR DDRD
+#undef PD1
+#define PD1_PIN PIND1
+#define PD1_RPORT PIND
+#define PD1_WPORT PORTD
+#define PD1_PWM NULL
+#define PD1_DDR DDRD
+#undef PD2
+#define PD2_PIN PIND2
+#define PD2_RPORT PIND
+#define PD2_WPORT PORTD
+#define PD2_PWM NULL
+#define PD2_DDR DDRD
+#undef PD3
+#define PD3_PIN PIND3
+#define PD3_RPORT PIND
+#define PD3_WPORT PORTD
+#define PD3_PWM NULL
+#define PD3_DDR DDRD
+#undef PD4
+#define PD4_PIN PIND4
+#define PD4_RPORT PIND
+#define PD4_WPORT PORTD
+#define PD4_PWM NULL
+#define PD4_DDR DDRD
+#undef PD5
+#define PD5_PIN PIND5
+#define PD5_RPORT PIND
+#define PD5_WPORT PORTD
+#define PD5_PWM NULL
+#define PD5_DDR DDRD
+#undef PD6
+#define PD6_PIN PIND6
+#define PD6_RPORT PIND
+#define PD6_WPORT PORTD
+#define PD6_PWM NULL
+#define PD6_DDR DDRD
+#undef PD7
+#define PD7_PIN PIND7
+#define PD7_RPORT PIND
+#define PD7_WPORT PORTD
+#define PD7_PWM NULL
+#define PD7_DDR DDRD
+
+#undef PE0
+#define PE0_PIN PINE0
+#define PE0_RPORT PINE
+#define PE0_WPORT PORTE
+#define PE0_PWM NULL
+#define PE0_DDR DDRE
+#undef PE1
+#define PE1_PIN PINE1
+#define PE1_RPORT PINE
+#define PE1_WPORT PORTE
+#define PE1_PWM NULL
+#define PE1_DDR DDRE
+#undef PE2
+#define PE2_PIN PINE2
+#define PE2_RPORT PINE
+#define PE2_WPORT PORTE
+#define PE2_PWM NULL
+#define PE2_DDR DDRE
+#undef PE3
+#define PE3_PIN PINE3
+#define PE3_RPORT PINE
+#define PE3_WPORT PORTE
+#define PE3_PWM NULL
+#define PE3_DDR DDRE
+#undef PE4
+#define PE4_PIN PINE4
+#define PE4_RPORT PINE
+#define PE4_WPORT PORTE
+#define PE4_PWM NULL
+#define PE4_DDR DDRE
+#undef PE5
+#define PE5_PIN PINE5
+#define PE5_RPORT PINE
+#define PE5_WPORT PORTE
+#define PE5_PWM NULL
+#define PE5_DDR DDRE
+#undef PE6
+#define PE6_PIN PINE6
+#define PE6_RPORT PINE
+#define PE6_WPORT PORTE
+#define PE6_PWM NULL
+#define PE6_DDR DDRE
+#undef PE7
+#define PE7_PIN PINE7
+#define PE7_RPORT PINE
+#define PE7_WPORT PORTE
+#define PE7_PWM NULL
+#define PE7_DDR DDRE
+
+#undef PF0
+#define PF0_PIN PINF0
+#define PF0_RPORT PINF
+#define PF0_WPORT PORTF
+#define PF0_PWM NULL
+#define PF0_DDR DDRF
+#undef PF1
+#define PF1_PIN PINF1
+#define PF1_RPORT PINF
+#define PF1_WPORT PORTF
+#define PF1_PWM NULL
+#define PF1_DDR DDRF
+#undef PF2
+#define PF2_PIN PINF2
+#define PF2_RPORT PINF
+#define PF2_WPORT PORTF
+#define PF2_PWM NULL
+#define PF2_DDR DDRF
+#undef PF3
+#define PF3_PIN PINF3
+#define PF3_RPORT PINF
+#define PF3_WPORT PORTF
+#define PF3_PWM NULL
+#define PF3_DDR DDRF
+#undef PF4
+#define PF4_PIN PINF4
+#define PF4_RPORT PINF
+#define PF4_WPORT PORTF
+#define PF4_PWM NULL
+#define PF4_DDR DDRF
+#undef PF5
+#define PF5_PIN PINF5
+#define PF5_RPORT PINF
+#define PF5_WPORT PORTF
+#define PF5_PWM NULL
+#define PF5_DDR DDRF
+#undef PF6
+#define PF6_PIN PINF6
+#define PF6_RPORT PINF
+#define PF6_WPORT PORTF
+#define PF6_PWM NULL
+#define PF6_DDR DDRF
+#undef PF7
+#define PF7_PIN PINF7
+#define PF7_RPORT PINF
+#define PF7_WPORT PORTF
+#define PF7_PWM NULL
+#define PF7_DDR DDRF
+#endif
+
+#ifndef DIO0_PIN
+#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 */\r
-#ifndef PINS_H\r
-#define PINS_H\r
-\r
-/****************************************************************************************\r
-* Arduino pin assignment\r
-*\r
-* ATMega168\r
-* +-\/-+\r
-* PC6 1| |28 PC5 (AI 5 / D19)\r
-* (D 0) PD0 2| |27 PC4 (AI 4 / D18)\r
-* (D 1) PD1 3| |26 PC3 (AI 3 / D17)\r
-* (D 2) PD2 4| |25 PC2 (AI 2 / D16)\r
-* PWM+ (D 3) PD3 5| |24 PC1 (AI 1 / D15)\r
-* (D 4) PD4 6| |23 PC0 (AI 0 / D14)\r
-* VCC 7| |22 GND\r
-* GND 8| |21 AREF\r
-* PB6 9| |20 AVCC\r
-* PB7 10| |19 PB5 (D 13)\r
-* PWM+ (D 5) PD5 11| |18 PB4 (D 12)\r
-* PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM\r
-* (D 7) PD7 13| |16 PB2 (D 10) PWM\r
-* (D 8) PB0 14| |15 PB1 (D 9) PWM\r
-* +----+\r
-****************************************************************************************/\r
-#if MOTHERBOARD == 0\r
-#define KNOWN_BOARD 1\r
-\r
-#ifndef __AVR_ATmega168__\r
-#error Oops! Make sure you have 'Arduino Diecimila' selected from the boards menu.\r
-#endif\r
-\r
-#define X_STEP_PIN 2\r
-#define X_DIR_PIN 3\r
-#define X_ENABLE_PIN -1\r
-#define X_MIN_PIN 4\r
-#define X_MAX_PIN 9\r
-\r
-#define Y_STEP_PIN 10\r
-#define Y_DIR_PIN 7\r
-#define Y_ENABLE_PIN -1\r
-#define Y_MIN_PIN 8\r
-#define Y_MAX_PIN 13\r
-\r
-#define Z_STEP_PIN 19\r
-#define Z_DIR_PIN 18\r
-#define Z_ENABLE_PIN 5\r
-#define Z_MIN_PIN 17\r
-#define Z_MAX_PIN 16\r
-\r
-#define E0_STEP_PIN 11\r
-#define E0_DIR_PIN 12\r
-#define E0_ENABLE_PIN -1\r
-\r
-#define SDPOWER -1\r
-#define SDSS -1\r
-#define LED_PIN -1\r
-#define FAN_PIN -1\r
-#define PS_ON_PIN 15\r
-#define KILL_PIN -1\r
-\r
-#define HEATER_0_PIN 6\r
-#define HEATER_1_PIN -1\r
-#define HEATER_2_PIN -1\r
-#define TEMP_0_PIN 0 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!\r
-#define TEMP_1_PIN -1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!\r
-#define TEMP_2_PIN -1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!\r
-#define HEATER_BED_PIN -1\r
-#define TEMP_BED_PIN -1\r
-#endif\r
-\r
-\r
-\r
-/****************************************************************************************\r
-* Sanguino/RepRap Motherboard with direct-drive extruders\r
-*\r
-* ATMega644P\r
-*\r
-* +---\/---+\r
-* (D 0) PB0 1| |40 PA0 (AI 0 / D31)\r
-* (D 1) PB1 2| |39 PA1 (AI 1 / D30)\r
-* INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29)\r
-* PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28)\r
-* PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27)\r
-* MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26)\r
-* MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25)\r
-* SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24)\r
-* RST 9| |32 AREF\r
-* VCC 10| |31 GND \r
-* GND 11| |30 AVCC\r
-* XTAL2 12| |29 PC7 (D 23)\r
-* XTAL1 13| |28 PC6 (D 22)\r
-* RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI\r
-* TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO\r
-* INT0 RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS\r
-* INT1 TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK\r
-* PWM (D 12) PD4 18| |23 PC1 (D 17) SDA\r
-* PWM (D 13) PD5 19| |22 PC0 (D 16) SCL\r
-* PWM (D 14) PD6 20| |21 PD7 (D 15) PWM\r
-* +--------+\r
-*\r
-****************************************************************************************/\r
-#if MOTHERBOARD == 1\r
-#define KNOWN_BOARD 1\r
-\r
-#ifndef __AVR_ATmega644P__\r
-#error Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu.\r
-#endif\r
-\r
-#define X_STEP_PIN 15\r
-#define X_DIR_PIN 18\r
-#define X_ENABLE_PIN 19\r
-#define X_MIN_PIN 20\r
-#define X_MAX_PIN 21\r
-\r
-#define Y_STEP_PIN 23\r
-#define Y_DIR_PIN 22\r
-#define Y_ENABLE_PIN 19\r
-#define Y_MIN_PIN 25\r
-#define Y_MAX_PIN 26\r
-\r
-#define Z_STEP_PIN 29\r
-#define Z_DIR_PIN 30\r
-#define Z_ENABLE_PIN 31\r
-#define Z_MIN_PIN 2\r
-#define Z_MAX_PIN 1\r
-\r
-#define E0_STEP_PIN 12\r
-#define E0_DIR_PIN 16\r
-#define E0_ENABLE_PIN 3\r
-\r
-#define SDPOWER -1\r
-#define SDSS -1\r
-#define LED_PIN 0\r
-#define FAN_PIN -1\r
-#define PS_ON_PIN -1\r
-#define KILL_PIN -1\r
-\r
-#define HEATER_0_PIN 14\r
-#define HEATER_1_PIN -1\r
-#define HEATER_2_PIN -1\r
-#define TEMP_0_PIN 4 //D27 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!\r
-#define TEMP_1_PIN -1 \r
-#define TEMP_2_PIN -1 \r
-#define HEATER_BED_PIN -1\r
-#define TEMP_BED_PIN -1\r
-/* Unused (1) (2) (3) 4 5 6 7 8 9 10 11 12 13 (14) (15) (16) 17 (18) (19) (20) (21) (22) (23) 24 (25) (26) (27) 28 (29) (30) (31) */\r
-\r
-\r
-\r
-#endif\r
-\r
-\r
-/****************************************************************************************\r
-* RepRap Motherboard ****---NOOOOOO RS485/EXTRUDER CONTROLLER!!!!!!!!!!!!!!!!!---*******\r
-*\r
-****************************************************************************************/\r
-#if MOTHERBOARD == 2\r
-#define KNOWN_BOARD 1\r
-\r
-#ifndef __AVR_ATmega644P__\r
-#error Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu.\r
-#endif\r
-\r
-#define X_STEP_PIN 15\r
-#define X_DIR_PIN 18\r
-#define X_ENABLE_PIN 19\r
-#define X_MIN_PIN 20\r
-#define X_MAX_PIN 21\r
-\r
-#define Y_STEP_PIN 23\r
-#define Y_DIR_PIN 22\r
-#define Y_ENABLE_PIN 24\r
-#define Y_MIN_PIN 25\r
-#define Y_MAX_PIN 26\r
-\r
-#define Z_STEP_PINN 27\r
-#define Z_DIR_PINN 28\r
-#define Z_ENABLE_PIN 29\r
-#define Z_MIN_PIN 30\r
-#define Z_MAX_PIN 31\r
-\r
-#define E0_STEP_PIN 17\r
-#define E0_DIR_PIN 16\r
-#define E0_ENABLE_PIN -1\r
-\r
-#define SDPOWER -1\r
-#define SDSS 4\r
-#define LED_PIN 0\r
-\r
-#define SD_CARD_WRITE 2\r
-#define SD_CARD_DETECT 3\r
-#define SD_CARD_SELECT 4\r
-\r
-//our RS485 pins\r
-#define TX_ENABLE_PIN 12\r
-#define RX_ENABLE_PIN 13\r
-\r
-//pin for controlling the PSU.\r
-#define PS_ON_PIN 14\r
-\r
-#define FAN_PIN -1\r
-#define KILL_PIN -1\r
-\r
-#define HEATER_0_PIN -1\r
-#define HEATER_1_PIN -1\r
-#define HEATER_2_PIN -1\r
-#define TEMP_0_PIN -1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!\r
-#define TEMP_1_PIN -1 \r
-#define TEMP_2_PIN -1 \r
-#define HEATER_BED_PIN -1\r
-#define TEMP_BED_PIN -1\r
-\r
-#endif\r
-\r
-/****************************************************************************************\r
-* Arduino Mega pin assignment\r
-*\r
-****************************************************************************************/\r
-#if MOTHERBOARD == 33\r
-#define MOTHERBOARD 3\r
-#define RAMPS_V_1_3\r
-#endif\r
-#if MOTHERBOARD == 3\r
-#define KNOWN_BOARD 1\r
-\r
-//////////////////FIX THIS//////////////\r
-#ifndef __AVR_ATmega1280__\r
- #ifndef __AVR_ATmega2560__\r
- #error Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu.\r
- #endif\r
-#endif\r
-\r
-// uncomment one of the following lines for RAMPS v1.3 or v1.0, comment both for v1.2 or 1.1\r
-// #define RAMPS_V_1_3\r
-// #define RAMPS_V_1_0\r
-\r
-#ifdef RAMPS_V_1_3\r
-\r
-#define X_STEP_PIN 54\r
-#define X_DIR_PIN 55\r
-#define X_ENABLE_PIN 38\r
-#define X_MIN_PIN 3\r
-#define X_MAX_PIN 2 //2 //Max endstops default to disabled "-1", set to commented value to enable.\r
-\r
-#define Y_STEP_PIN 60\r
-#define Y_DIR_PIN 61\r
-#define Y_ENABLE_PIN 56\r
-#define Y_MIN_PIN 14\r
-#define Y_MAX_PIN 15 //15\r
-\r
-#define Z_STEP_PIN 46\r
-#define Z_DIR_PIN 48\r
-#define Z_ENABLE_PIN 62\r
-#define Z_MIN_PIN 18\r
-#define Z_MAX_PIN 19 //19\r
-\r
-#define E0_STEP_PIN 26\r
-#define E0_DIR_PIN 28\r
-#define E0_ENABLE_PIN 24\r
-\r
-#define E1_STEP_PIN 36\r
-#define E1_DIR_PIN 34\r
-#define E1_ENABLE_PIN 30\r
-\r
-#define SDPOWER -1\r
-#define SDSS 53\r
-#define LED_PIN 13\r
-#define FAN_PIN 4\r
-#define PS_ON_PIN 12\r
-#define KILL_PIN -1\r
-\r
-#define HEATER_0_PIN 10 // EXTRUDER 1\r
-#define HEATER_1_PIN 9 // EXTRUDER 2\r
-#define HEATER_2_PIN -1 // EXTRUDER 2\r
-#define TEMP_0_PIN 13 // ANALOG NUMBERING\r
-#define TEMP_1_PIN 15 // ANALOG NUMBERING\r
-#define TEMP_2_PIN -1 // ANALOG NUMBERING\r
-#define HEATER_BED_PIN 8 // BED\r
-#define TEMP_BED_PIN 14 // ANALOG NUMBERING\r
-\r
-\r
-#else // RAMPS_V_1_1 or RAMPS_V_1_2 as default\r
-\r
-#define X_STEP_PIN 26\r
-#define X_DIR_PIN 28\r
-#define X_ENABLE_PIN 24\r
-#define X_MIN_PIN 3\r
-#define X_MAX_PIN -1 //2\r
-\r
-#define Y_STEP_PIN 38\r
-#define Y_DIR_PIN 40\r
-#define Y_ENABLE_PIN 36\r
-#define Y_MIN_PIN 16\r
-#define Y_MAX_PIN -1 //17\r
-\r
-#define Z_STEP_PIN 44\r
-#define Z_DIR_PIN 46\r
-#define Z_ENABLE_PIN 42\r
-#define Z_MIN_PIN 18\r
-#define Z_MAX_PIN -1 //19\r
-\r
-#define E0_STEP_PIN 32\r
-#define E0_DIR_PIN 34\r
-#define E0_ENABLE_PIN 30\r
-\r
-#define SDPOWER 48\r
-#define SDSS 53\r
-#define LED_PIN 13\r
-#define PS_ON_PIN -1\r
-#define KILL_PIN -1\r
-\r
-\r
-\r
-#ifdef RAMPS_V_1_0 // RAMPS_V_1_0\r
- #define HEATER_0_PIN 12 // RAMPS 1.0\r
- #define HEATER_BED_PIN -1 // RAMPS 1.0\r
- #define FAN_PIN 11 // RAMPS 1.0\r
-#else // RAMPS_V_1_1 or RAMPS_V_1_2\r
- #define HEATER_0_PIN 10 // RAMPS 1.1\r
- #define HEATER_BED_PIN 8 // RAMPS 1.1\r
- #define FAN_PIN 9 // RAMPS 1.1\r
-#endif\r
-#define HEATER_1_PIN -1\r
-#define HEATER_2_PIN -1\r
-#define TEMP_0_PIN 2 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!\r
-#define TEMP_1_PIN -1 \r
-#define TEMP_2_PIN -1 \r
-#define TEMP_BED_PIN 1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!\r
-#endif\r
-\r
-// SPI for Max6675 Thermocouple \r
-\r
-#ifndef SDSUPPORT\r
-// these pins are defined in the SD library if building with SD support #define SCK_PIN 52\r
- #define MISO_PIN 50\r
- #define MOSI_PIN 51\r
- #define MAX6675_SS 53\r
-#else\r
- #define MAX6675_SS 49\r
-#endif\r
-\r
-\r
-#endif\r
-/****************************************************************************************\r
-* Duemilanove w/ ATMega328P pin assignment\r
-*\r
-****************************************************************************************/\r
-#if MOTHERBOARD == 4\r
-#define KNOWN_BOARD 1\r
-\r
-#ifndef __AVR_ATmega328P__\r
-#error Oops! Make sure you have 'Arduino Duemilanove w/ ATMega328' selected from the 'Tools -> Boards' menu.\r
-#endif\r
-\r
-#define X_STEP_PIN 19\r
-#define X_DIR_PIN 18\r
-#define X_ENABLE_PIN -1\r
-#define X_MIN_PIN 17\r
-#define X_MAX_PIN -1\r
-\r
-#define Y_STEP_PIN 10\r
-#define Y_DIR_PIN 7\r
-#define Y_ENABLE_PIN -1\r
-#define Y_MIN_PIN 8\r
-#define Y_MAX_PIN -1\r
-\r
-#define Z_STEP_PIN 13\r
-#define Z_DIR_PIN 3\r
-#define Z_ENABLE_PIN 2\r
-#define Z_MIN_PIN 4\r
-#define Z_MAX_PIN -1\r
-\r
-#define E0_STEP_PIN 11\r
-#define E0_DIR_PIN 12\r
-#define E0_ENABLE_PIN -1\r
-\r
-#define SDPOWER -1\r
-#define SDSS -1\r
-#define LED_PIN -1\r
-#define FAN_PIN 5\r
-#define PS_ON_PIN -1\r
-#define KILL_PIN -1\r
-\r
-#define HEATER_0_PIN 6\r
-#define HEATER_1_PIN -1\r
-#define HEATER_2_PIN -1\r
-#define TEMP_0_PIN 0 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!\r
-#define TEMP_1_PIN -1 \r
-#define TEMP_2_PIN -1 \r
-#define HEATER_BED_PIN -1\r
-#define TEMP_BED_PIN -1\r
-\r
-#endif\r
-\r
-/****************************************************************************************\r
-* Gen6 pin assignment\r
-*\r
-****************************************************************************************/\r
-#if MOTHERBOARD == 5\r
-#define KNOWN_BOARD 1\r
-\r
-#ifndef __AVR_ATmega644P__\r
- #error Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu.\r
-#endif\r
-\r
-//x axis pins\r
- #define X_STEP_PIN 15\r
- #define X_DIR_PIN 18\r
- #define X_ENABLE_PIN 19\r
- #define X_MIN_PIN 20\r
- #define X_MAX_PIN -1\r
- \r
- //y axis pins\r
- #define Y_STEP_PIN 23\r
- #define Y_DIR_PIN 22\r
- #define Y_ENABLE_PIN 24\r
- #define Y_MIN_PIN 25\r
- #define Y_MAX_PIN -1\r
- \r
- //z axis pins\r
- #define Z_STEP_PIN 27\r
- #define Z_DIR_PIN 28\r
- #define Z_ENABLE_PIN 29\r
- #define Z_MIN_PIN 30\r
- #define Z_MAX_PIN -1\r
- \r
- //extruder pins\r
- #define E0_STEP_PIN 4 //Edited @ EJE Electronics 20100715\r
- #define E0_DIR_PIN 2 //Edited @ EJE Electronics 20100715\r
- #define E0_ENABLE_PIN 3 //Added @ EJE Electronics 20100715\r
- #define TEMP_0_PIN 5 //changed @ rkoeppl 20110410\r
- #define TEMP_1_PIN -1 //changed @ rkoeppl 20110410\r
- #define TEMP_2_PIN -1 //changed @ rkoeppl 20110410\r
- #define HEATER_0_PIN 14 //changed @ rkoeppl 20110410\r
- #define HEATER_1_PIN -1\r
- #define HEATER_2_PIN -1\r
- #define HEATER_BED_PIN -1 //changed @ rkoeppl 20110410\r
- #define TEMP_BED_PIN -1 //changed @ rkoeppl 20110410\r
- \r
- #define SDPOWER -1\r
- #define SDSS 17\r
- #define LED_PIN -1 //changed @ rkoeppl 20110410\r
- #define FAN_PIN -1 //changed @ rkoeppl 20110410\r
- #define PS_ON_PIN -1 //changed @ rkoeppl 20110410\r
- //our pin for debugging.\r
- \r
- #define DEBUG_PIN 0\r
- \r
- //our RS485 pins\r
- #define TX_ENABLE_PIN 12\r
- #define RX_ENABLE_PIN 13\r
-\r
- \r
-#endif\r
-\r
-/****************************************************************************************\r
-* Sanguinololu pin assignment\r
-*\r
-****************************************************************************************/\r
-#if MOTHERBOARD == 62\r
-#define MOTHERBOARD 6\r
-#define SANGUINOLOLU_V_1_2 \r
-#endif\r
-#if MOTHERBOARD == 6\r
-#define KNOWN_BOARD 1\r
-#ifndef __AVR_ATmega644P__\r
-#error Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu.\r
-#endif\r
-\r
-#define X_STEP_PIN 15\r
-#define X_DIR_PIN 21\r
-#define X_MIN_PIN 18\r
-#define X_MAX_PIN -2\r
-\r
-#define Y_STEP_PIN 22\r
-#define Y_DIR_PIN 23\r
-#define Y_MIN_PIN 19\r
-#define Y_MAX_PIN -1\r
-\r
-#define Z_STEP_PIN 3\r
-#define Z_DIR_PIN 2\r
-#define Z_MIN_PIN 20\r
-#define Z_MAX_PIN -1\r
-\r
-#define E0_STEP_PIN 1\r
-#define E0_DIR_PIN 0\r
-\r
-#define LED_PIN -1\r
-\r
-#define FAN_PIN -1 \r
-\r
-#define PS_ON_PIN -1\r
-#define KILL_PIN -1\r
-\r
-#define HEATER_0_PIN 13 // (extruder)\r
-#define HEATER_1_PIN -1\r
-#define HEATER_2_PIN -1\r
-\r
-#ifdef SANGUINOLOLU_V_1_2\r
-\r
-#define HEATER_BED_PIN 12 // (bed)\r
-#define X_ENABLE_PIN 14\r
-#define Y_ENABLE_PIN 14\r
-#define Z_ENABLE_PIN 26\r
-#define E0_ENABLE_PIN 14\r
-\r
-#else\r
-\r
-#define HEATER_BED_PIN 14 // (bed)\r
-#define X_ENABLE_PIN -1\r
-#define Y_ENABLE_PIN -1\r
-#define Z_ENABLE_PIN -1\r
-#define E0_ENABLE_PIN -1\r
-\r
-#endif\r
-\r
-#define TEMP_0_PIN 7 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 33 extruder)\r
-#define TEMP_1_PIN -1\r
-#define TEMP_2_PIN -1\r
-#define TEMP_BED_PIN 6 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 34 bed)\r
-#define SDPOWER -1\r
-#define SDSS 31\r
-\r
-#endif\r
-\r
-\r
-#if MOTHERBOARD == 7\r
-#define KNOWN_BOARD\r
-/*****************************************************************\r
-* Ultimaker pin assignment\r
-******************************************************************/\r
-\r
-#ifndef __AVR_ATmega1280__\r
- #ifndef __AVR_ATmega2560__\r
- #error Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu.\r
- #endif\r
-#endif\r
-\r
-#define X_STEP_PIN 25\r
-#define X_DIR_PIN 23\r
-#define X_MIN_PIN 22\r
-#define X_MAX_PIN 24\r
-#define X_ENABLE_PIN 27\r
-\r
-#define Y_STEP_PIN 31\r
-#define Y_DIR_PIN 33\r
-#define Y_MIN_PIN 26\r
-#define Y_MAX_PIN 28\r
-#define Y_ENABLE_PIN 29\r
-\r
-#define Z_STEP_PIN 37 \r
-#define Z_DIR_PIN 39\r
-#define Z_MIN_PIN 30\r
-#define Z_MAX_PIN 32\r
-#define Z_ENABLE_PIN 35\r
-\r
-#define HEATER_BED_PIN 4 \r
-#define TEMP_BED_PIN 11 \r
-\r
-#define EXTRUDER_0_STEP_PIN 43 \r
-#define EXTRUDER_0_DIR_PIN 45\r
-#define EXTRUDER_0_ENABLE_PIN 41\r
-#define HEATER_0_PIN 2\r
-#define TEMP_0_PIN 8 \r
-\r
-#define EXTRUDER_1_STEP_PIN 49 \r
-#define EXTRUDER_1_DIR_PIN 47\r
-#define EXTRUDER_1_ENABLE_PIN 51\r
-#define EXTRUDER_1_HEATER_PIN 3\r
-#define EXTRUDER_1_TEMPERATURE_PIN 10 \r
-#define HEATER_1_PIN 51\r
-#define TEMP_1_PIN 3\r
-\r
-\r
-\r
-#define E0_STEP_PIN EXTRUDER_0_STEP_PIN\r
-#define E0_DIR_PIN EXTRUDER_0_DIR_PIN\r
-#define E0_ENABLE_PIN EXTRUDER_0_ENABLE_PIN\r
-\r
-#define SDPOWER -1\r
-#define SDSS 53\r
-#define LED_PIN 13\r
-#define FAN_PIN 7\r
-#define PS_ON_PIN 12\r
-#define KILL_PIN -1\r
-\r
-#ifdef ULTRA_LCD\r
-\r
- #ifdef NEWPANEL\r
- //arduino pin witch triggers an piezzo beeper\r
- #define BEEPER 18\r
-\r
- #define LCD_PINS_RS 20 \r
- #define LCD_PINS_ENABLE 17\r
- #define LCD_PINS_D4 16\r
- #define LCD_PINS_D5 21 \r
- #define LCD_PINS_D6 5\r
- #define LCD_PINS_D7 6\r
- \r
- //buttons are directly attached\r
- #define BTN_EN1 40\r
- #define BTN_EN2 42\r
- #define BTN_ENC 19 //the click\r
- \r
- #define BLEN_C 2\r
- #define BLEN_B 1\r
- #define BLEN_A 0\r
- \r
- #define SDCARDDETECT 38\r
- \r
- //encoder rotation values\r
- #define encrot0 0\r
- #define encrot1 2\r
- #define encrot2 3\r
- #define encrot3 1\r
- #else //old style panel with shift register\r
- //arduino pin witch triggers an piezzo beeper\r
- #define BEEPER 18\r
-\r
- //buttons are attached to a shift register\r
- #define SHIFT_CLK 38\r
- #define SHIFT_LD 42\r
- #define SHIFT_OUT 40\r
- #define SHIFT_EN 17\r
- \r
- #define LCD_PINS_RS 16 \r
- #define LCD_PINS_ENABLE 5\r
- #define LCD_PINS_D4 6\r
- #define LCD_PINS_D5 21 \r
- #define LCD_PINS_D6 20\r
- #define LCD_PINS_D7 19\r
- \r
- //encoder rotation values\r
- #define encrot0 0\r
- #define encrot1 2\r
- #define encrot2 3\r
- #define encrot3 1\r
-\r
- \r
- //bits in the shift register that carry the buttons for:\r
- // left up center down right red\r
- #define BL_LE 7\r
- #define BL_UP 6\r
- #define BL_MI 5\r
- #define BL_DW 4\r
- #define BL_RI 3\r
- #define BL_ST 2\r
-\r
- #define BLEN_B 1\r
- #define BLEN_A 0\r
- #endif \r
-#endif //ULTRA_LCD\r
-\r
-#endif\r
-\r
-/****************************************************************************************\r
-* Teensylu 0.7 pin assingments (ATMEGA90USB)\r
-* Requires the Teensyduino software with Teensy2.0++ selected in arduino IDE!\r
-****************************************************************************************/\r
-#if MOTHERBOARD == 8\r
-#define MOTHERBOARD 8\r
-#define KNOWN_BOARD 1\r
-\r
-\r
-#define X_STEP_PIN 0 \r
-#define X_DIR_PIN 1 \r
-#define X_ENABLE_PIN 39 \r
-#define X_MIN_PIN 13 \r
-#define X_MAX_PIN -1 \r
-\r
-#define Y_STEP_PIN 2 \r
-#define Y_DIR_PIN 3 \r
-#define Y_ENABLE_PIN 38 \r
-#define Y_MIN_PIN 14 \r
-#define Y_MAX_PIN -1 \r
-\r
-#define Z_STEP_PIN 4\r
-#define Z_DIR_PIN 5 \r
-#define Z_ENABLE_PIN 23 \r
-#define Z_MIN_PIN 15 \r
-#define Z_MAX_PIN -1 \r
-\r
-#define E0_STEP_PIN 6 \r
-#define E0_DIR_PIN 7 \r
-#define E0_ENABLE_PIN 19 \r
-\r
-\r
-\r
-#define HEATER_0_PIN 21 // Extruder\r
-#define HEATER_1_PIN -1\r
-#define HEATER_2_PIN -1\r
-#define HEATER_BED_PIN 20 // Bed\r
-#define FAN_PIN 22 // Fan \r
-\r
-#define TEMP_0_PIN 7 // Extruder\r
-#define TEMP_1_PIN -1\r
-#define TEMP_2_PIN -1\r
-#define TEMP_BED_PIN 6 // Bed\r
-\r
-#define SDPOWER -1\r
-#define SDSS 8\r
-#define LED_PIN -1\r
-#define PS_ON_PIN -1\r
-#define KILL_PIN -1 \r
-#define ALARM_PIN -1\r
-\r
-#ifndef SDSUPPORT\r
-// these pins are defined in the SD library if building with SD support \r
- #define SCK_PIN 9 \r
- #define MISO_PIN 11 \r
- #define MOSI_PIN 10 \r
-#endif\r
-#endif\r
-\r
-#ifndef KNOWN_BOARD\r
-#error Unknown MOTHERBOARD value in configuration.h\r
-#endif\r
-\r
-//List of pins which to ignore when asked to change by gcode, 0 and 1 are RX and TX, do not mess with those!\r
-#define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN\r
-#if EXTRUDERS == 3\r
- #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN\r
- #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN\r
-#elif EXTRUDERS == 2\r
- #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN\r
- #define _E2_PINS -1\r
-#elif EXTRUDERS == 1\r
- #define _E1_PINS -1 \r
- #define _E2_PINS -1\r
-#else\r
- #error Unsupported number of extruders\r
-#endif\r
-#define SENSITIVE_PINS {0, 1, X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, X_MIN_PIN, X_MAX_PIN, Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, LED_PIN, PS_ON_PIN, \\r
- HEATER_0_PIN, HEATER_1_PIN, HEATER_2_PIN, \\r
- HEATER_BED_PIN, FAN_PIN, \\r
- _E0_PINS, _E1_PINS, _E2_PINS, \\r
- TEMP_0_PIN, TEMP_1_PIN, TEMP_2_PIN, TEMP_BED_PIN }\r
+#ifndef PINS_H
+#define PINS_H
+
+/****************************************************************************************
+* Arduino pin assignment
+*
+* ATMega168
+* +-\/-+
+* PC6 1| |28 PC5 (AI 5 / D19)
+* (D 0) PD0 2| |27 PC4 (AI 4 / D18)
+* (D 1) PD1 3| |26 PC3 (AI 3 / D17)
+* (D 2) PD2 4| |25 PC2 (AI 2 / D16)
+* PWM+ (D 3) PD3 5| |24 PC1 (AI 1 / D15)
+* (D 4) PD4 6| |23 PC0 (AI 0 / D14)
+* VCC 7| |22 GND
+* GND 8| |21 AREF
+* PB6 9| |20 AVCC
+* PB7 10| |19 PB5 (D 13)
+* PWM+ (D 5) PD5 11| |18 PB4 (D 12)
+* PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM
+* (D 7) PD7 13| |16 PB2 (D 10) PWM
+* (D 8) PB0 14| |15 PB1 (D 9) PWM
+* +----+
+****************************************************************************************/
+#if MOTHERBOARD == 0
+#define KNOWN_BOARD 1
+
+#ifndef __AVR_ATmega168__
+#error Oops! Make sure you have 'Arduino Diecimila' selected from the boards menu.
+#endif
+
+#define X_STEP_PIN 2
+#define X_DIR_PIN 3
+#define X_ENABLE_PIN -1
+#define X_MIN_PIN 4
+#define X_MAX_PIN 9
+
+#define Y_STEP_PIN 10
+#define Y_DIR_PIN 7
+#define Y_ENABLE_PIN -1
+#define Y_MIN_PIN 8
+#define Y_MAX_PIN 13
+
+#define Z_STEP_PIN 19
+#define Z_DIR_PIN 18
+#define Z_ENABLE_PIN 5
+#define Z_MIN_PIN 17
+#define Z_MAX_PIN 16
+
+#define E0_STEP_PIN 11
+#define E0_DIR_PIN 12
+#define E0_ENABLE_PIN -1
+
+#define SDPOWER -1
+#define SDSS -1
+#define LED_PIN -1
+#define FAN_PIN -1
+#define PS_ON_PIN 15
+#define KILL_PIN -1
+
+#define HEATER_0_PIN 6
+#define HEATER_1_PIN -1
+#define HEATER_2_PIN -1
+#define TEMP_0_PIN 0 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
+#define TEMP_1_PIN -1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
+#define TEMP_2_PIN -1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
+#define HEATER_BED_PIN -1
+#define TEMP_BED_PIN -1
+#endif
+
+
+
+/****************************************************************************************
+* Sanguino/RepRap Motherboard with direct-drive extruders
+*
+* ATMega644P
+*
+* +---\/---+
+* (D 0) PB0 1| |40 PA0 (AI 0 / D31)
+* (D 1) PB1 2| |39 PA1 (AI 1 / D30)
+* INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29)
+* PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28)
+* PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27)
+* MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26)
+* MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25)
+* SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24)
+* RST 9| |32 AREF
+* VCC 10| |31 GND
+* GND 11| |30 AVCC
+* XTAL2 12| |29 PC7 (D 23)
+* XTAL1 13| |28 PC6 (D 22)
+* RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI
+* TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO
+* INT0 RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS
+* INT1 TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK
+* PWM (D 12) PD4 18| |23 PC1 (D 17) SDA
+* PWM (D 13) PD5 19| |22 PC0 (D 16) SCL
+* PWM (D 14) PD6 20| |21 PD7 (D 15) PWM
+* +--------+
+*
+****************************************************************************************/
+#if MOTHERBOARD == 1
+#define KNOWN_BOARD 1
+
+#ifndef __AVR_ATmega644P__
+#error Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu.
+#endif
+
+#define X_STEP_PIN 15
+#define X_DIR_PIN 18
+#define X_ENABLE_PIN 19
+#define X_MIN_PIN 20
+#define X_MAX_PIN 21
+
+#define Y_STEP_PIN 23
+#define Y_DIR_PIN 22
+#define Y_ENABLE_PIN 19
+#define Y_MIN_PIN 25
+#define Y_MAX_PIN 26
+
+#define Z_STEP_PIN 29
+#define Z_DIR_PIN 30
+#define Z_ENABLE_PIN 31
+#define Z_MIN_PIN 2
+#define Z_MAX_PIN 1
+
+#define E0_STEP_PIN 12
+#define E0_DIR_PIN 16
+#define E0_ENABLE_PIN 3
+
+#define SDPOWER -1
+#define SDSS -1
+#define LED_PIN 0
+#define FAN_PIN -1
+#define PS_ON_PIN -1
+#define KILL_PIN -1
+
+#define HEATER_0_PIN 14
+#define HEATER_1_PIN -1
+#define HEATER_2_PIN -1
+#define TEMP_0_PIN 4 //D27 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
+#define TEMP_1_PIN -1
+#define TEMP_2_PIN -1
+#define HEATER_BED_PIN -1
+#define TEMP_BED_PIN -1
+/* Unused (1) (2) (3) 4 5 6 7 8 9 10 11 12 13 (14) (15) (16) 17 (18) (19) (20) (21) (22) (23) 24 (25) (26) (27) 28 (29) (30) (31) */
+
+
+
+#endif
+
+
+/****************************************************************************************
+* RepRap Motherboard ****---NOOOOOO RS485/EXTRUDER CONTROLLER!!!!!!!!!!!!!!!!!---*******
+*
+****************************************************************************************/
+#if MOTHERBOARD == 2
+#define KNOWN_BOARD 1
+
+#ifndef __AVR_ATmega644P__
+#error Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu.
+#endif
+
+#define X_STEP_PIN 15
+#define X_DIR_PIN 18
+#define X_ENABLE_PIN 19
+#define X_MIN_PIN 20
+#define X_MAX_PIN 21
+
+#define Y_STEP_PIN 23
+#define Y_DIR_PIN 22
+#define Y_ENABLE_PIN 24
+#define Y_MIN_PIN 25
+#define Y_MAX_PIN 26
+
+#define Z_STEP_PINN 27
+#define Z_DIR_PINN 28
+#define Z_ENABLE_PIN 29
+#define Z_MIN_PIN 30
+#define Z_MAX_PIN 31
+
+#define E0_STEP_PIN 17
+#define E0_DIR_PIN 16
+#define E0_ENABLE_PIN -1
+
+#define SDPOWER -1
+#define SDSS 4
+#define LED_PIN 0
+
+#define SD_CARD_WRITE 2
+#define SD_CARD_DETECT 3
+#define SD_CARD_SELECT 4
+
+//our RS485 pins
+#define TX_ENABLE_PIN 12
+#define RX_ENABLE_PIN 13
+
+//pin for controlling the PSU.
+#define PS_ON_PIN 14
+
+#define FAN_PIN -1
+#define KILL_PIN -1
+
+#define HEATER_0_PIN -1
+#define HEATER_1_PIN -1
+#define HEATER_2_PIN -1
+#define TEMP_0_PIN -1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
+#define TEMP_1_PIN -1
+#define TEMP_2_PIN -1
+#define HEATER_BED_PIN -1
+#define TEMP_BED_PIN -1
+
+#endif
+
+/****************************************************************************************
+* Arduino Mega pin assignment
+*
+****************************************************************************************/
+#if MOTHERBOARD == 33
+#define MOTHERBOARD 3
+#define RAMPS_V_1_3
+#endif
+#if MOTHERBOARD == 3
+#define KNOWN_BOARD 1
+
+//////////////////FIX THIS//////////////
+#ifndef __AVR_ATmega1280__
+ #ifndef __AVR_ATmega2560__
+ #error Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu.
+ #endif
+#endif
+
+// uncomment one of the following lines for RAMPS v1.3 or v1.0, comment both for v1.2 or 1.1
+// #define RAMPS_V_1_3
+// #define RAMPS_V_1_0
+
+#ifdef RAMPS_V_1_3
+
+#define X_STEP_PIN 54
+#define X_DIR_PIN 55
+#define X_ENABLE_PIN 38
+#define X_MIN_PIN 3
+#define X_MAX_PIN 2 //2 //Max endstops default to disabled "-1", set to commented value to enable.
+
+#define Y_STEP_PIN 60
+#define Y_DIR_PIN 61
+#define Y_ENABLE_PIN 56
+#define Y_MIN_PIN 14
+#define Y_MAX_PIN 15 //15
+
+#define Z_STEP_PIN 46
+#define Z_DIR_PIN 48
+#define Z_ENABLE_PIN 62
+#define Z_MIN_PIN 18
+#define Z_MAX_PIN 19 //19
+
+#define E0_STEP_PIN 26
+#define E0_DIR_PIN 28
+#define E0_ENABLE_PIN 24
+
+#define E1_STEP_PIN 36
+#define E1_DIR_PIN 34
+#define E1_ENABLE_PIN 30
+
+#define SDPOWER -1
+#define SDSS 53
+#define LED_PIN 13
+#define FAN_PIN 4
+#define PS_ON_PIN 12
+#define KILL_PIN -1
+
+#define HEATER_0_PIN 10 // EXTRUDER 1
+#define HEATER_1_PIN 9 // EXTRUDER 2
+#define HEATER_2_PIN -1 // EXTRUDER 2
+#define TEMP_0_PIN 13 // ANALOG NUMBERING
+#define TEMP_1_PIN 15 // ANALOG NUMBERING
+#define TEMP_2_PIN -1 // ANALOG NUMBERING
+#define HEATER_BED_PIN 8 // BED
+#define TEMP_BED_PIN 14 // ANALOG NUMBERING
+
+
+#else // RAMPS_V_1_1 or RAMPS_V_1_2 as default
+
+#define X_STEP_PIN 26
+#define X_DIR_PIN 28
+#define X_ENABLE_PIN 24
+#define X_MIN_PIN 3
+#define X_MAX_PIN -1 //2
+
+#define Y_STEP_PIN 38
+#define Y_DIR_PIN 40
+#define Y_ENABLE_PIN 36
+#define Y_MIN_PIN 16
+#define Y_MAX_PIN -1 //17
+
+#define Z_STEP_PIN 44
+#define Z_DIR_PIN 46
+#define Z_ENABLE_PIN 42
+#define Z_MIN_PIN 18
+#define Z_MAX_PIN -1 //19
+
+#define E0_STEP_PIN 32
+#define E0_DIR_PIN 34
+#define E0_ENABLE_PIN 30
+
+#define SDPOWER 48
+#define SDSS 53
+#define LED_PIN 13
+#define PS_ON_PIN -1
+#define KILL_PIN -1
+
+
+
+#ifdef RAMPS_V_1_0 // RAMPS_V_1_0
+ #define HEATER_0_PIN 12 // RAMPS 1.0
+ #define HEATER_BED_PIN -1 // RAMPS 1.0
+ #define FAN_PIN 11 // RAMPS 1.0
+#else // RAMPS_V_1_1 or RAMPS_V_1_2
+ #define HEATER_0_PIN 10 // RAMPS 1.1
+ #define HEATER_BED_PIN 8 // RAMPS 1.1
+ #define FAN_PIN 9 // RAMPS 1.1
+#endif
+#define HEATER_1_PIN -1
+#define HEATER_2_PIN -1
+#define TEMP_0_PIN 2 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
+#define TEMP_1_PIN -1
+#define TEMP_2_PIN -1
+#define TEMP_BED_PIN 1 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
+#endif
+
+// SPI for Max6675 Thermocouple
+
+#ifndef SDSUPPORT
+// these pins are defined in the SD library if building with SD support #define SCK_PIN 52
+ #define MISO_PIN 50
+ #define MOSI_PIN 51
+ #define MAX6675_SS 53
+#else
+ #define MAX6675_SS 49
+#endif
+
+
+#endif
+/****************************************************************************************
+* Duemilanove w/ ATMega328P pin assignment
+*
+****************************************************************************************/
+#if MOTHERBOARD == 4
+#define KNOWN_BOARD 1
+
+#ifndef __AVR_ATmega328P__
+#error Oops! Make sure you have 'Arduino Duemilanove w/ ATMega328' selected from the 'Tools -> Boards' menu.
+#endif
+
+#define X_STEP_PIN 19
+#define X_DIR_PIN 18
+#define X_ENABLE_PIN -1
+#define X_MIN_PIN 17
+#define X_MAX_PIN -1
+
+#define Y_STEP_PIN 10
+#define Y_DIR_PIN 7
+#define Y_ENABLE_PIN -1
+#define Y_MIN_PIN 8
+#define Y_MAX_PIN -1
+
+#define Z_STEP_PIN 13
+#define Z_DIR_PIN 3
+#define Z_ENABLE_PIN 2
+#define Z_MIN_PIN 4
+#define Z_MAX_PIN -1
+
+#define E0_STEP_PIN 11
+#define E0_DIR_PIN 12
+#define E0_ENABLE_PIN -1
+
+#define SDPOWER -1
+#define SDSS -1
+#define LED_PIN -1
+#define FAN_PIN 5
+#define PS_ON_PIN -1
+#define KILL_PIN -1
+
+#define HEATER_0_PIN 6
+#define HEATER_1_PIN -1
+#define HEATER_2_PIN -1
+#define TEMP_0_PIN 0 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
+#define TEMP_1_PIN -1
+#define TEMP_2_PIN -1
+#define HEATER_BED_PIN -1
+#define TEMP_BED_PIN -1
+
+#endif
+
+/****************************************************************************************
+* Gen6 pin assignment
+*
+****************************************************************************************/
+#if MOTHERBOARD == 5
+#define KNOWN_BOARD 1
+
+#ifndef __AVR_ATmega644P__
+ #error Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu.
+#endif
+
+//x axis pins
+ #define X_STEP_PIN 15
+ #define X_DIR_PIN 18
+ #define X_ENABLE_PIN 19
+ #define X_MIN_PIN 20
+ #define X_MAX_PIN -1
+
+ //y axis pins
+ #define Y_STEP_PIN 23
+ #define Y_DIR_PIN 22
+ #define Y_ENABLE_PIN 24
+ #define Y_MIN_PIN 25
+ #define Y_MAX_PIN -1
+
+ //z axis pins
+ #define Z_STEP_PIN 27
+ #define Z_DIR_PIN 28
+ #define Z_ENABLE_PIN 29
+ #define Z_MIN_PIN 30
+ #define Z_MAX_PIN -1
+
+ //extruder pins
+ #define E0_STEP_PIN 4 //Edited @ EJE Electronics 20100715
+ #define E0_DIR_PIN 2 //Edited @ EJE Electronics 20100715
+ #define E0_ENABLE_PIN 3 //Added @ EJE Electronics 20100715
+ #define TEMP_0_PIN 5 //changed @ rkoeppl 20110410
+ #define TEMP_1_PIN -1 //changed @ rkoeppl 20110410
+ #define TEMP_2_PIN -1 //changed @ rkoeppl 20110410
+ #define HEATER_0_PIN 14 //changed @ rkoeppl 20110410
+ #define HEATER_1_PIN -1
+ #define HEATER_2_PIN -1
+ #define HEATER_BED_PIN -1 //changed @ rkoeppl 20110410
+ #define TEMP_BED_PIN -1 //changed @ rkoeppl 20110410
+
+ #define SDPOWER -1
+ #define SDSS 17
+ #define LED_PIN -1 //changed @ rkoeppl 20110410
+ #define FAN_PIN -1 //changed @ rkoeppl 20110410
+ #define PS_ON_PIN -1 //changed @ rkoeppl 20110410
+ //our pin for debugging.
+
+ #define DEBUG_PIN 0
+
+ //our RS485 pins
+ #define TX_ENABLE_PIN 12
+ #define RX_ENABLE_PIN 13
+
+
+#endif
+
+/****************************************************************************************
+* Sanguinololu pin assignment
+*
+****************************************************************************************/
+#if MOTHERBOARD == 62
+#define MOTHERBOARD 6
+#define SANGUINOLOLU_V_1_2
+#endif
+#if MOTHERBOARD == 6
+#define KNOWN_BOARD 1
+#ifndef __AVR_ATmega644P__
+#error Oops! Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu.
+#endif
+
+#define X_STEP_PIN 15
+#define X_DIR_PIN 21
+#define X_MIN_PIN 18
+#define X_MAX_PIN -2
+
+#define Y_STEP_PIN 22
+#define Y_DIR_PIN 23
+#define Y_MIN_PIN 19
+#define Y_MAX_PIN -1
+
+#define Z_STEP_PIN 3
+#define Z_DIR_PIN 2
+#define Z_MIN_PIN 20
+#define Z_MAX_PIN -1
+
+#define E0_STEP_PIN 1
+#define E0_DIR_PIN 0
+
+#define LED_PIN -1
+
+#define FAN_PIN -1
+
+#define PS_ON_PIN -1
+#define KILL_PIN -1
+
+#define HEATER_0_PIN 13 // (extruder)
+#define HEATER_1_PIN -1
+#define HEATER_2_PIN -1
+
+#ifdef SANGUINOLOLU_V_1_2
+
+#define HEATER_BED_PIN 12 // (bed)
+#define X_ENABLE_PIN 14
+#define Y_ENABLE_PIN 14
+#define Z_ENABLE_PIN 26
+#define E0_ENABLE_PIN 14
+
+#else
+
+#define HEATER_BED_PIN 14 // (bed)
+#define X_ENABLE_PIN -1
+#define Y_ENABLE_PIN -1
+#define Z_ENABLE_PIN -1
+#define E0_ENABLE_PIN -1
+
+#endif
+
+#define TEMP_0_PIN 7 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 33 extruder)
+#define TEMP_1_PIN -1
+#define TEMP_2_PIN -1
+#define TEMP_BED_PIN 6 // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 34 bed)
+#define SDPOWER -1
+#define SDSS 31
+
+#endif
+
+
+#if MOTHERBOARD == 7
+#define KNOWN_BOARD
+/*****************************************************************
+* Ultimaker pin assignment
+******************************************************************/
+
+#ifndef __AVR_ATmega1280__
+ #ifndef __AVR_ATmega2560__
+ #error Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu.
+ #endif
+#endif
+
+#define X_STEP_PIN 25
+#define X_DIR_PIN 23
+#define X_MIN_PIN 22
+#define X_MAX_PIN 24
+#define X_ENABLE_PIN 27
+
+#define Y_STEP_PIN 31
+#define Y_DIR_PIN 33
+#define Y_MIN_PIN 26
+#define Y_MAX_PIN 28
+#define Y_ENABLE_PIN 29
+
+#define Z_STEP_PIN 37
+#define Z_DIR_PIN 39
+#define Z_MIN_PIN 30
+#define Z_MAX_PIN 32
+#define Z_ENABLE_PIN 35
+
+#define HEATER_BED_PIN 4
+#define TEMP_BED_PIN 11
+
+#define HEATER_0_PIN 2
+#define TEMP_0_PIN 8
+
+#define EXTRUDER_1_HEATER_PIN 3
+#define EXTRUDER_1_TEMPERATURE_PIN 10
+#define HEATER_1_PIN 51
+#define TEMP_1_PIN 3
+
+#define HEATER_2_PIN -1
+#define TEMP_2_PIN -1
+
+#define E0_STEP_PIN 43
+#define E0_DIR_PIN 45
+#define E0_ENABLE_PIN 41
+
+#define E1_STEP_PIN 49
+#define E1_DIR_PIN 47
+#define E1_ENABLE_PIN 51
+
+#define SDPOWER -1
+#define SDSS 53
+#define LED_PIN 13
+#define FAN_PIN 7
+#define PS_ON_PIN 12
+#define KILL_PIN -1
+
+#ifdef ULTRA_LCD
+
+ #ifdef NEWPANEL
+ //arduino pin witch triggers an piezzo beeper
+ #define BEEPER 18
+
+ #define LCD_PINS_RS 20
+ #define LCD_PINS_ENABLE 17
+ #define LCD_PINS_D4 16
+ #define LCD_PINS_D5 21
+ #define LCD_PINS_D6 5
+ #define LCD_PINS_D7 6
+
+ //buttons are directly attached
+ #define BTN_EN1 40
+ #define BTN_EN2 42
+ #define BTN_ENC 19 //the click
+
+ #define BLEN_C 2
+ #define BLEN_B 1
+ #define BLEN_A 0
+
+ #define SDCARDDETECT 38
+
+ //encoder rotation values
+ #define encrot0 0
+ #define encrot1 2
+ #define encrot2 3
+ #define encrot3 1
+ #else //old style panel with shift register
+ //arduino pin witch triggers an piezzo beeper
+ #define BEEPER 18
+
+ //buttons are attached to a shift register
+ #define SHIFT_CLK 38
+ #define SHIFT_LD 42
+ #define SHIFT_OUT 40
+ #define SHIFT_EN 17
+
+ #define LCD_PINS_RS 16
+ #define LCD_PINS_ENABLE 5
+ #define LCD_PINS_D4 6
+ #define LCD_PINS_D5 21
+ #define LCD_PINS_D6 20
+ #define LCD_PINS_D7 19
+
+ //encoder rotation values
+ #define encrot0 0
+ #define encrot1 2
+ #define encrot2 3
+ #define encrot3 1
+
+
+ //bits in the shift register that carry the buttons for:
+ // left up center down right red
+ #define BL_LE 7
+ #define BL_UP 6
+ #define BL_MI 5
+ #define BL_DW 4
+ #define BL_RI 3
+ #define BL_ST 2
+
+ #define BLEN_B 1
+ #define BLEN_A 0
+ #endif
+#endif //ULTRA_LCD
+
+#endif
+
+/****************************************************************************************
+* Teensylu 0.7 pin assingments (ATMEGA90USB)
+* Requires the Teensyduino software with Teensy2.0++ selected in arduino IDE!
+****************************************************************************************/
+#if MOTHERBOARD == 8
+#define MOTHERBOARD 8
+#define KNOWN_BOARD 1
+
+
+#define X_STEP_PIN 0
+#define X_DIR_PIN 1
+#define X_ENABLE_PIN 39
+#define X_MIN_PIN 13
+#define X_MAX_PIN -1
+
+#define Y_STEP_PIN 2
+#define Y_DIR_PIN 3
+#define Y_ENABLE_PIN 38
+#define Y_MIN_PIN 14
+#define Y_MAX_PIN -1
+
+#define Z_STEP_PIN 4
+#define Z_DIR_PIN 5
+#define Z_ENABLE_PIN 23
+#define Z_MIN_PIN 15
+#define Z_MAX_PIN -1
+
+#define E0_STEP_PIN 6
+#define E0_DIR_PIN 7
+#define E0_ENABLE_PIN 19
+
+
+
+#define HEATER_0_PIN 21 // Extruder
+#define HEATER_1_PIN -1
+#define HEATER_2_PIN -1
+#define HEATER_BED_PIN 20 // Bed
+#define FAN_PIN 22 // Fan
+
+#define TEMP_0_PIN 7 // Extruder
+#define TEMP_1_PIN -1
+#define TEMP_2_PIN -1
+#define TEMP_BED_PIN 6 // Bed
+
+#define SDPOWER -1
+#define SDSS 8
+#define LED_PIN -1
+#define PS_ON_PIN -1
+#define KILL_PIN -1
+#define ALARM_PIN -1
+
+#ifndef SDSUPPORT
+// these pins are defined in the SD library if building with SD support
+ #define SCK_PIN 9
+ #define MISO_PIN 11
+ #define MOSI_PIN 10
+#endif
+#endif
+
+#ifndef KNOWN_BOARD
+#error Unknown MOTHERBOARD value in configuration.h
+#endif
+
+//List of pins which to ignore when asked to change by gcode, 0 and 1 are RX and TX, do not mess with those!
+#define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN
+#if EXTRUDERS == 3
+ #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN
+ #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN
+#elif EXTRUDERS == 2
+ #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN
+ #define _E2_PINS -1
+#elif EXTRUDERS == 1
+ #define _E1_PINS -1
+ #define _E2_PINS -1
+#else
+ #error Unsupported number of extruders
+#endif
+#define SENSITIVE_PINS {0, 1, X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, X_MIN_PIN, X_MAX_PIN, Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, LED_PIN, PS_ON_PIN, \
+ HEATER_0_PIN, HEATER_1_PIN, HEATER_2_PIN, \
+ HEATER_BED_PIN, FAN_PIN, \
+ _E0_PINS, _E1_PINS, _E2_PINS, \
+ TEMP_0_PIN, TEMP_1_PIN, TEMP_2_PIN, TEMP_BED_PIN }
#endif\r
}
#ifdef ADVANCE
- long initial_advance = block->advance*entry_factor*entry_factor;
- long final_advance = block->advance*exit_factor*exit_factor;
+ volatile long initial_advance = block->advance*entry_factor*entry_factor;
+ volatile long final_advance = block->advance*exit_factor*exit_factor;
#endif // ADVANCE
// block->accelerate_until = accelerate_steps;
static long advance_rate, advance, final_advance = 0;
static long old_advance = 0;
#endif
-static long e_steps;
+static long e_steps[3];
static unsigned char busy = false; // TRUE when SIG_OUTPUT_COMPARE1A is being serviced. Used to avoid retriggering that handler.
static long acceleration_time, deceleration_time;
//static unsigned long accelerate_until, decelerate_after, acceleration_rate, initial_rate, final_rate, nominal_rate;
advance = current_block->initial_advance;
final_advance = current_block->final_advance;
// Do E steps + advance steps
- e_steps += ((advance >>8) - old_advance);
+ e_steps[current_block->active_extruder] += ((advance >>8) - old_advance);
old_advance = advance >>8;
#endif
deceleration_time = 0;
counter_z = counter_x;
counter_e = counter_x;
step_events_completed = 0;
- // #ifdef ADVANCE
- e_steps = 0;
+// #ifdef ADVANCE
+// e_steps[current_block->active_extruder] = 0;
// #endif
}
else {
#ifndef ADVANCE
if ((out_bits & (1<<E_AXIS)) != 0) { // -direction
- NORM_E_DIR();
+ REV_E_DIR();
count_direction[E_AXIS]=-1;
}
else { // +direction
- REV_E_DIR();
+ NORM_E_DIR();
count_direction[E_AXIS]=-1;
}
#endif //!ADVANCE
if (counter_e > 0) {
counter_e -= current_block->step_event_count;
if ((out_bits & (1<<E_AXIS)) != 0) { // - direction
- e_steps--;
+ e_steps[current_block->active_extruder]--;
}
else {
- e_steps++;
+ e_steps[current_block->active_extruder]++;
}
}
#endif //ADVANCE
}
//if(advance > current_block->advance) advance = current_block->advance;
// Do E steps + advance steps
- e_steps += ((advance >>8) - old_advance);
+ e_steps[current_block->active_extruder] += ((advance >>8) - old_advance);
old_advance = advance >>8;
#endif
}
if(advance < final_advance) advance = final_advance;
// Do E steps + advance steps
- e_steps += ((advance >>8) - old_advance);
+ e_steps[current_block->active_extruder] += ((advance >>8) - old_advance);
old_advance = advance >>8;
#endif //ADVANCE
}
old_OCR0A += 52; // ~10kHz interrupt (250000 / 26 = 9615kHz)
OCR0A = old_OCR0A;
// Set E direction (Depends on E direction + advance)
- for(unsigned char i=0; i<4;) {
- WRITE_E_STEP(LOW);
- if (e_steps == 0) break;
- i++;
- if (e_steps < 0) {
- WRITE_E_DIR(INVERT_E_DIR);
- e_steps++;
- WRITE_E_STEP(HIGH);
- }
- else if (e_steps > 0) {
- WRITE_E_DIR(!INVERT_E_DIR);
- e_steps--;
- WRITE_E_STEP(HIGH);
+ for(unsigned char i=0; i<4;i++) {
+ if (e_steps[0] != 0) {
+ WRITE(E0_STEP_PIN, LOW);
+ if (e_steps[0] < 0) {
+ WRITE(E0_DIR_PIN, INVERT_E0_DIR);
+ e_steps[0]++;
+ WRITE(E0_STEP_PIN, HIGH);
+ }
+ else if (e_steps[0] > 0) {
+ WRITE(E0_DIR_PIN, !INVERT_E0_DIR);
+ e_steps[0]--;
+ WRITE(E0_STEP_PIN, HIGH);
+ }
+ }
+ #if EXTRUDERS > 1
+ if (e_steps[1] != 0) {
+ WRITE(E1_STEP_PIN, LOW);
+ if (e_steps[1] < 0) {
+ WRITE(E1_DIR_PIN, INVERT_E1_DIR);
+ e_steps[1]++;
+ WRITE(E1_STEP_PIN, HIGH);
+ }
+ else if (e_steps[1] > 0) {
+ WRITE(E1_DIR_PIN, !INVERT_E1_DIR);
+ e_steps[1]--;
+ WRITE(E1_STEP_PIN, HIGH);
+ }
+ }
+ #endif
+ #if EXTRUDERS > 2
+ if (e_steps[2] != 0) {
+ WRITE(E2_STEP_PIN, LOW);
+ if (e_steps[2] < 0) {
+ WRITE(E2_DIR_PIN, INVERT_E2_DIR);
+ e_steps[2]++;
+ WRITE(E2_STEP_PIN, HIGH);
+ }
+ else if (e_steps[2] > 0) {
+ WRITE(E2_DIR_PIN, !INVERT_E2_DIR);
+ e_steps[2]--;
+ WRITE(E2_STEP_PIN, HIGH);
+ }
}
+ #endif
}
}
#endif // ADVANCE
TCCR0A &= ~(1<<WGM01);
TCCR0A &= ~(1<<WGM00);
#endif
- e_steps = 0;
+ e_steps[0] = 0;
+ e_steps[1] = 0;
+ e_steps[2] = 0;
TIMSK0 |= (1<<OCIE0A);
#endif //ADVANCE
#include "planner.h"
+#if EXTRUDERS > 2
+ #define WRITE_E_STEP(v) { if(current_block->active_extruder == 2) { WRITE(E2_STEP_PIN, v); } else { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}}
+ #define NORM_E_DIR() { if(current_block->active_extruder == 2) { WRITE(!E2_DIR_PIN, INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(!E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}}
+ #define REV_E_DIR() { if(current_block->active_extruder == 2) { WRITE(E2_DIR_PIN, INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}}
+#elif EXTRUDERS > 1
+ #define WRITE_E_STEP(v) { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}
+ #define NORM_E_DIR() { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, !INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}
+ #define REV_E_DIR() { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}
+#else
+ #define WRITE_E_STEP(v) WRITE(E0_STEP_PIN, v)
+ #define NORM_E_DIR() WRITE(E0_DIR_PIN, !INVERT_E0_DIR)
+ #define REV_E_DIR() WRITE(E0_DIR_PIN, INVERT_E0_DIR)
+#endif
+
+
// Initialize and start the stepper motor subsystem
void st_init();
It has preliminary support for Matthew Roberts advance algorithm
http://reprap.org/pipermail/reprap-dev/2011-May/003323.html
- This firmware is optimized for gen6 electronics.
*/
#include <avr/pgmspace.h>
// static float pid_output[EXTRUDERS];
static bool pid_reset[EXTRUDERS];
#endif //PIDTEMP
+ static unsigned char soft_pwm[EXTRUDERS];
#ifdef WATCHPERIOD
static int watch_raw[EXTRUDERS] = { -1000 }; // the first value used for all
#endif
}
+int getHeaterPower(int heater) {
+ return soft_pwm[heater];
+}
+
void manage_heater()
{
#ifdef USE_WATCHDOG
}
#endif
- // Check if temperature is within the correct range
- if((current_raw[e] > minttemp[e]) && (current_raw[e] < maxttemp[e]))
- {
- analogWrite(heater_pin_map[e], pid_output);
- }
- else {
- analogWrite(heater_pin_map[e], 0);
- }
-
+ // Check if temperature is within the correct range
+ if((current_raw[e] > minttemp[e]) && (current_raw[e] < maxttemp[e]))
+ {
+ //analogWrite(heater_pin_map[e], pid_output);
+ soft_pwm[e] = (int)pid_output >> 1;
+ }
+ else {
+ //analogWrite(heater_pin_map[e], 0);
+ soft_pwm[e] = 0;
+ }
} // End extruder for loop
if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL)
DIDR0 |= 1 << TEMP_0_PIN;
#else
DIDR2 |= 1<<(TEMP_0_PIN - 8);
- ADCSRB = 1<<MUX5;
#endif
#endif
#if (TEMP_1_PIN > -1)
DIDR0 |= 1<<TEMP_1_PIN;
#else
DIDR2 |= 1<<(TEMP_1_PIN - 8);
- ADCSRB = 1<<MUX5;
#endif
#endif
#if (TEMP_2_PIN > -1)
DIDR0 |= 1 << TEMP_2_PIN;
#else
DIDR2 = 1<<(TEMP_2_PIN - 8);
- ADCSRB = 1<<MUX5;
#endif
#endif
#if (TEMP_BED_PIN > -1)
DIDR0 |= 1<<TEMP_BED_PIN;
#else
DIDR2 |= 1<<(TEMP_BED_PIN - 8);
- ADCSRB = 1<<MUX5;
#endif
#endif
{
#if TEMP_0_PIN > -1
target_raw[0]=0;
+ soft_pwm[0]=0;
#if HEATER_0_PIN > -1
digitalWrite(HEATER_0_PIN,LOW);
#endif
#if TEMP_1_PIN > -1
target_raw[1]=0;
+ soft_pwm[1]=0;
#if HEATER_1_PIN > -1
digitalWrite(HEATER_1_PIN,LOW);
#endif
#if TEMP_2_PIN > -1
target_raw[2]=0;
+ soft_pwm[2]=0;
#if HEATER_2_PIN > -1
digitalWrite(HEATER_2_PIN,LOW);
#endif
#endif
}
+void max_temp_error(uint8_t e) {
+ digitalWrite(heater_pin_map[e], 0);
+ SERIAL_ERROR_START;
+ SERIAL_ERRORLN(e);
+ SERIAL_ERRORLNPGM(": Extruder switched off. MAXTEMP triggered !");
+}
+
+void min_temp_error(uint8_t e) {
+ digitalWrite(heater_pin_map[e], 0);
+ SERIAL_ERROR_START;
+ SERIAL_ERRORLN(e);
+ SERIAL_ERRORLNPGM(": Extruder switched off. MINTEMP triggered !");
+}
+
+void bed_max_temp_error(void) {
+ digitalWrite(HEATER_BED_PIN, 0);
+ SERIAL_ERROR_START;
+ SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!");
+}
+
// Timer 0 is shared with millies
ISR(TIMER0_COMPB_vect)
{
static unsigned long raw_temp_2_value = 0;
static unsigned long raw_temp_bed_value = 0;
static unsigned char temp_state = 0;
+ static unsigned char pwm_count = 1;
+ static unsigned char soft_pwm_0;
+ static unsigned char soft_pwm_1;
+ static unsigned char soft_pwm_2;
+
+ if(pwm_count == 0){
+ soft_pwm_0 = soft_pwm[0];
+ if(soft_pwm_0 > 0) WRITE(HEATER_0_PIN,1);
+ #if EXTRUDERS > 1
+ soft_pwm_1 = soft_pwm[1];
+ if(soft_pwm_1 > 0) WRITE(HEATER_1_PIN,1);
+ #endif
+ #if EXTRUDERS > 2
+ soft_pwm_2 = soft_pwm[2];
+ if(soft_pwm_2 > 0) WRITE(HEATER_2_PIN,1);
+ #endif
+ }
+ if(soft_pwm_0 <= pwm_count) WRITE(HEATER_0_PIN,0);
+ #if EXTRUDERS > 1
+ if(soft_pwm_1 <= pwm_count) WRITE(HEATER_1_PIN,0);
+ #endif
+ #if EXTRUDERS > 2
+ if(soft_pwm_2 <= pwm_count) WRITE(HEATER_2_PIN,0);
+ #endif
+
+ pwm_count++;
+ pwm_count &= 0x7f;
switch(temp_state) {
case 0: // Prepare TEMP_0
temp_state = 0;
temp_count++;
break;
- default:
- SERIAL_ERROR_START;
- SERIAL_ERRORLNPGM("Temp measurement error!");
- break;
+// default:
+// SERIAL_ERROR_START;
+// SERIAL_ERRORLNPGM("Temp measurement error!");
+// break;
}
if(temp_count >= 16) // 8 ms * 16 = 128ms.
raw_temp_2_value = 0;
raw_temp_bed_value = 0;
- for(int e = 0; e < EXTRUDERS; e++) {
+ for(unsigned char e = 0; e < EXTRUDERS; e++) {
if(current_raw[e] >= maxttemp[e]) {
target_raw[e] = 0;
- digitalWrite(heater_pin_map[e], 0);
- SERIAL_ERROR_START;
- SERIAL_ERRORLN((int)e);
- SERIAL_ERRORLNPGM(": Extruder switched off. MAXTEMP triggered !");
- kill();
+ max_temp_error(e);
+ kill();;
}
if(current_raw[e] <= minttemp[e]) {
target_raw[e] = 0;
- digitalWrite(heater_pin_map[e], 0);
- SERIAL_ERROR_START;
- SERIAL_ERRORLN(e);
- SERIAL_ERRORLNPGM(": Extruder switched off. MINTEMP triggered !");
+ min_temp_error(e);
kill();
}
}
#if defined(BED_MAXTEMP) && (HEATER_BED_PIN > -1)
if(current_raw_bed >= bed_maxttemp) {
target_raw_bed = 0;
- digitalWrite(HEATER_BED_PIN, 0);
- SERIAL_ERROR_START;
- SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!");
+ bed_max_temp_error();
kill();
}
#endif
-/*\r
- temperature.h - temperature controller\r
- Part of Marlin\r
-\r
- Copyright (c) 2011 Erik van der Zalm\r
-\r
- Grbl is free software: you can redistribute it and/or modify\r
- it under the terms of the GNU General Public License as published by\r
- the Free Software Foundation, either version 3 of the License, or\r
- (at your option) any later version.\r
-\r
- Grbl is distributed in the hope that it will be useful,\r
- but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- GNU General Public License for more details.\r
-\r
- You should have received a copy of the GNU General Public License\r
- along with Grbl. If not, see <http://www.gnu.org/licenses/>.\r
-*/\r
-\r
-#ifndef temperature_h\r
-#define temperature_h \r
-\r
-#include "Marlin.h"\r
-#include "fastio.h"\r
-#ifdef PID_ADD_EXTRUSION_RATE\r
- #include "stepper.h"\r
-#endif\r
-\r
-// public functions\r
-void tp_init(); //initialise the heating\r
-void manage_heater(); //it is critical that this is called periodically.\r
-\r
-//low leven conversion routines\r
-// do not use this routines and variables outsie of temperature.cpp\r
-int temp2analog(int celsius, uint8_t e);\r
-int temp2analogBed(int celsius);\r
-float analog2temp(int raw, uint8_t e);\r
-float analog2tempBed(int raw);\r
-extern int target_raw[EXTRUDERS]; \r
-extern int heatingtarget_raw[EXTRUDERS]; \r
-extern int current_raw[EXTRUDERS];\r
-extern int target_raw_bed;\r
-extern int current_raw_bed;\r
-extern float Kp,Ki,Kd,Kc;\r
-\r
-#ifdef PIDTEMP\r
- extern float pid_setpoint[EXTRUDERS];\r
-#endif\r
- \r
-#ifdef WATCHPERIOD\r
- extern int watch_raw[EXTRUDERS] ;\r
- extern unsigned long watchmillis;\r
-#endif\r
-\r
-\r
-//high level conversion routines, for use outside of temperature.cpp\r
-//inline so that there is no performance decrease.\r
-//deg=degreeCelsius\r
-\r
-FORCE_INLINE float degHotend(uint8_t extruder) { \r
- return analog2temp(current_raw[extruder], extruder);\r
-};\r
-\r
-FORCE_INLINE float degBed() {\r
- return analog2tempBed(current_raw_bed);\r
-};\r
-\r
-FORCE_INLINE float degTargetHotend(uint8_t extruder) { \r
- return analog2temp(target_raw[extruder], extruder);\r
-};\r
-\r
-FORCE_INLINE float degTargetBed() { \r
- return analog2tempBed(target_raw_bed);\r
-};\r
-\r
-FORCE_INLINE void setTargetHotend(const float &celsius, uint8_t extruder) { \r
- target_raw[extruder] = temp2analog(celsius, extruder);\r
-#ifdef PIDTEMP\r
- pid_setpoint[extruder] = celsius;\r
-#endif //PIDTEMP\r
-};\r
-\r
-FORCE_INLINE void setTargetBed(const float &celsius) { \r
- target_raw_bed = temp2analogBed(celsius);\r
-};\r
-\r
-FORCE_INLINE bool isHeatingHotend(uint8_t extruder){ \r
- return target_raw[extruder] > current_raw[extruder];\r
-};\r
-\r
-FORCE_INLINE bool isHeatingBed() {\r
- return target_raw_bed > current_raw_bed;\r
-};\r
-\r
-FORCE_INLINE bool isCoolingHotend(uint8_t extruder) { \r
- return target_raw[extruder] < current_raw[extruder];\r
-};\r
-\r
-FORCE_INLINE bool isCoolingBed() {\r
- return target_raw_bed < current_raw_bed;\r
-};\r
-\r
-#define degHotend0() degHotend(0)\r
-#define degTargetHotend0() degTargetHotend(0)\r
-#define setTargetHotend0(_celsius) setTargetHotend((_celsius), 0)\r
-#define isHeatingHotend0() isHeatingHotend(0)\r
-#define isCoolingHotend0() isCoolingHotend(0)\r
-#if EXTRUDERS > 1\r
-#define degHotend1() degHotend(1)\r
-#define degTargetHotend1() degTargetHotend(1)\r
-#define setTargetHotend1(_celsius) setTargetHotend((_celsius), 1)\r
-#define isHeatingHotend1() isHeatingHotend(1)\r
-#define isCoolingHotend1() isCoolingHotend(1)\r
-#endif\r
-#if EXTRUDERS > 2\r
-#define degHotend2() degHotend(2)\r
-#define degTargetHotend2() degTargetHotend(2)\r
-#define setTargetHotend2(_celsius) setTargetHotend((_celsius), 2)\r
-#define isHeatingHotend2() isHeatingHotend(2)\r
-#define isCoolingHotend2() isCoolingHotend(2)\r
-#endif\r
-#if EXTRUDERS > 3\r
-#error Invalid number of extruders\r
-#endif\r
-\r
-FORCE_INLINE void autotempShutdown(){\r
- #ifdef AUTOTEMP\r
- if(autotemp_enabled)\r
- {\r
- autotemp_enabled=false;\r
- if(degTargetHotend(ACTIVE_EXTRUDER)>autotemp_min)\r
- setTargetHotend(0,ACTIVE_EXTRUDER);\r
- }\r
- #endif\r
-}\r
-\r
-void disable_heater();\r
-void setWatch();\r
-void updatePID();\r
-\r
-#endif\r
+/*
+ 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"
+#include "fastio.h"
+#ifdef PID_ADD_EXTRUSION_RATE
+ #include "stepper.h"
+#endif
+
+// public functions
+void tp_init(); //initialise the heating
+void manage_heater(); //it is critical that this is called periodically.
+
+//low leven conversion routines
+// do not use this routines and variables outsie of temperature.cpp
+int temp2analog(int celsius, uint8_t e);
+int temp2analogBed(int celsius);
+float analog2temp(int raw, uint8_t e);
+float analog2tempBed(int raw);
+extern int target_raw[EXTRUDERS];
+extern int heatingtarget_raw[EXTRUDERS];
+extern int current_raw[EXTRUDERS];
+extern int target_raw_bed;
+extern int current_raw_bed;
+extern float Kp,Ki,Kd,Kc;
+
+#ifdef PIDTEMP
+ extern float pid_setpoint[EXTRUDERS];
+#endif
+
+#ifdef WATCHPERIOD
+ extern int watch_raw[EXTRUDERS] ;
+ extern unsigned long watchmillis;
+#endif
+
+
+//high level conversion routines, for use outside of temperature.cpp
+//inline so that there is no performance decrease.
+//deg=degreeCelsius
+
+FORCE_INLINE float degHotend(uint8_t extruder) {
+ return analog2temp(current_raw[extruder], extruder);
+};
+
+FORCE_INLINE float degBed() {
+ return analog2tempBed(current_raw_bed);
+};
+
+FORCE_INLINE float degTargetHotend(uint8_t extruder) {
+ return analog2temp(target_raw[extruder], extruder);
+};
+
+FORCE_INLINE float degTargetBed() {
+ return analog2tempBed(target_raw_bed);
+};
+
+FORCE_INLINE void setTargetHotend(const float &celsius, uint8_t extruder) {
+ target_raw[extruder] = temp2analog(celsius, extruder);
+#ifdef PIDTEMP
+ pid_setpoint[extruder] = celsius;
+#endif //PIDTEMP
+};
+
+FORCE_INLINE void setTargetBed(const float &celsius) {
+ target_raw_bed = temp2analogBed(celsius);
+};
+
+FORCE_INLINE bool isHeatingHotend(uint8_t extruder){
+ return target_raw[extruder] > current_raw[extruder];
+};
+
+FORCE_INLINE bool isHeatingBed() {
+ return target_raw_bed > current_raw_bed;
+};
+
+FORCE_INLINE bool isCoolingHotend(uint8_t extruder) {
+ return target_raw[extruder] < current_raw[extruder];
+};
+
+FORCE_INLINE bool isCoolingBed() {
+ return target_raw_bed < current_raw_bed;
+};
+
+#define degHotend0() degHotend(0)
+#define degTargetHotend0() degTargetHotend(0)
+#define setTargetHotend0(_celsius) setTargetHotend((_celsius), 0)
+#define isHeatingHotend0() isHeatingHotend(0)
+#define isCoolingHotend0() isCoolingHotend(0)
+#if EXTRUDERS > 1
+#define degHotend1() degHotend(1)
+#define degTargetHotend1() degTargetHotend(1)
+#define setTargetHotend1(_celsius) setTargetHotend((_celsius), 1)
+#define isHeatingHotend1() isHeatingHotend(1)
+#define isCoolingHotend1() isCoolingHotend(1)
+#endif
+#if EXTRUDERS > 2
+#define degHotend2() degHotend(2)
+#define degTargetHotend2() degTargetHotend(2)
+#define setTargetHotend2(_celsius) setTargetHotend((_celsius), 2)
+#define isHeatingHotend2() isHeatingHotend(2)
+#define isCoolingHotend2() isCoolingHotend(2)
+#endif
+#if EXTRUDERS > 3
+#error Invalid number of extruders
+#endif
+
+FORCE_INLINE void autotempShutdown(){
+ #ifdef AUTOTEMP
+ if(autotemp_enabled)
+ {
+ autotemp_enabled=false;
+ if(degTargetHotend(ACTIVE_EXTRUDER)>autotemp_min)
+ setTargetHotend(0,ACTIVE_EXTRUDER);
+ }
+ #endif
+}
+
+int getHeaterPower(int heater);
+void disable_heater();
+void setWatch();
+void updatePID();
+
+#endif
\r
-#include "ultralcd.h"\r
-#ifdef ULTRA_LCD\r
-\r
-//===========================================================================\r
-//=============================imported variables============================\r
-//===========================================================================\r
-\r
-extern volatile int feedmultiply;\r
-extern volatile bool feedmultiplychanged;\r
-\r
-extern long position[4]; \r
-extern CardReader card;\r
-\r
-//===========================================================================\r
-//=============================public variables============================\r
-//===========================================================================\r
-volatile char buttons=0; //the last checked buttons in a bit array.\r
-int encoderpos=0;\r
-short lastenc=0;\r
-\r
-\r
-//===========================================================================\r
-//=============================private variables============================\r
-//===========================================================================\r
-static char messagetext[LCD_WIDTH]="";\r
-\r
-//return for string conversion routines\r
-static char conv[8];\r
-\r
-#include <LiquidCrystal.h>\r
-LiquidCrystal lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7 \r
-\r
-static unsigned long previous_millis_lcd=0;\r
-static long previous_millis_buttons=0;\r
-\r
-\r
-#ifdef NEWPANEL\r
- static long blocking=0;\r
-#else\r
- static long blocking[8]={0,0,0,0,0,0,0,0};\r
-#endif\r
- \r
-static MainMenu menu;\r
-\r
-#include <avr/pgmspace.h>\r
-\r
-void lcdProgMemprint(const char *str)\r
-{\r
- char ch=pgm_read_byte(str);\r
- while(ch)\r
- {\r
- lcd.print(ch);\r
- ch=pgm_read_byte(++str);\r
- }\r
-}\r
-#define lcdprintPGM(x) lcdProgMemprint(MYPGM(x))\r
-\r
-\r
-//===========================================================================\r
-//=============================functions ============================\r
-//===========================================================================\r
-\r
-FORCE_INLINE int intround(const float &x){return int(0.5+x);}\r
-\r
-void lcd_status(const char* message)\r
-{\r
- strncpy(messagetext,message,LCD_WIDTH);\r
- messagetext[strlen(message)]=0;\r
-}\r
-\r
-void lcd_statuspgm(const char* message)\r
-{\r
- char ch=pgm_read_byte(message);\r
- char *target=messagetext;\r
- uint8_t cnt=0;\r
- while(ch &&cnt<LCD_WIDTH)\r
- {\r
- *target=ch;\r
- target++;\r
- cnt++;\r
- ch=pgm_read_byte(++message);\r
- }\r
- *target=0;\r
-}\r
-\r
-FORCE_INLINE void clear()\r
-{\r
- lcd.clear();\r
-}\r
-\r
-\r
-void lcd_init()\r
-{\r
- //beep();\r
- byte Degree[8] =\r
- {\r
- B01100,\r
- B10010,\r
- B10010,\r
- B01100,\r
- B00000,\r
- B00000,\r
- B00000,\r
- B00000\r
- };\r
- byte Thermometer[8] =\r
- {\r
- B00100,\r
- B01010,\r
- B01010,\r
- B01010,\r
- B01010,\r
- B10001,\r
- B10001,\r
- B01110\r
- };\r
- byte uplevel[8]={0x04, 0x0e, 0x1f, 0x04, 0x1c, 0x00, 0x00, 0x00};//thanks joris\r
- byte refresh[8]={0x00, 0x06, 0x19, 0x18, 0x03, 0x13, 0x0c, 0x00}; //thanks joris\r
- byte folder [8]={0x00, 0x1c, 0x1f, 0x11, 0x11, 0x1f, 0x00, 0x00}; //thanks joris\r
- lcd.begin(LCD_WIDTH, LCD_HEIGHT);\r
- lcd.createChar(1,Degree);\r
- lcd.createChar(2,Thermometer);\r
- lcd.createChar(3,uplevel);\r
- lcd.createChar(4,refresh);\r
- lcd.createChar(5,folder);\r
- LCD_MESSAGEPGM("UltiMarlin ready.");\r
-}\r
-\r
-\r
-void beep()\r
-{\r
- //return;\r
- #ifdef ULTIPANEL\r
- pinMode(BEEPER,OUTPUT);\r
- for(int8_t i=0;i<20;i++){\r
- WRITE(BEEPER,HIGH);\r
- delay(5);\r
- WRITE(BEEPER,LOW);\r
- delay(5);\r
- }\r
- #endif\r
-}\r
-\r
-void beepshort()\r
-{\r
- //return;\r
- #ifdef ULTIPANEL\r
- pinMode(BEEPER,OUTPUT);\r
- for(int8_t i=0;i<10;i++){\r
- WRITE(BEEPER,HIGH);\r
- delay(3);\r
- WRITE(BEEPER,LOW);\r
- delay(3);\r
- }\r
- #endif \r
-}\r
-\r
-void lcd_status()\r
-{\r
- #ifdef ULTIPANEL\r
- static uint8_t oldbuttons=0;\r
- //static long previous_millis_buttons=0;\r
- //static long previous_lcdinit=0;\r
- // buttons_check(); // Done in temperature interrupt\r
- //previous_millis_buttons=millis();\r
- \r
- if((buttons==oldbuttons) && ((millis() - previous_millis_lcd) < LCD_UPDATE_INTERVAL) )\r
- return;\r
- oldbuttons=buttons;\r
- #else\r
- \r
- if(((millis() - previous_millis_lcd) < LCD_UPDATE_INTERVAL) )\r
- return;\r
- #endif\r
- \r
- previous_millis_lcd=millis();\r
- menu.update();\r
-}\r
-#ifdef ULTIPANEL \r
-\r
-\r
-void buttons_init()\r
-{\r
- #ifdef NEWPANEL\r
- pinMode(BTN_EN1,INPUT);\r
- pinMode(BTN_EN2,INPUT); \r
- pinMode(BTN_ENC,INPUT); \r
- pinMode(SDCARDDETECT,INPUT);\r
- WRITE(BTN_EN1,HIGH);\r
- WRITE(BTN_EN2,HIGH);\r
- WRITE(BTN_ENC,HIGH);\r
- WRITE(SDCARDDETECT,HIGH);\r
- #else\r
- pinMode(SHIFT_CLK,OUTPUT);\r
- pinMode(SHIFT_LD,OUTPUT);\r
- pinMode(SHIFT_EN,OUTPUT);\r
- pinMode(SHIFT_OUT,INPUT);\r
- WRITE(SHIFT_OUT,HIGH);\r
- WRITE(SHIFT_LD,HIGH); \r
- WRITE(SHIFT_EN,LOW); \r
- #endif\r
-}\r
-\r
-\r
-void buttons_check()\r
-{\r
- \r
- #ifdef NEWPANEL\r
- uint8_t newbutton=0;\r
- if(READ(BTN_EN1)==0) newbutton|=EN_A;\r
- if(READ(BTN_EN2)==0) newbutton|=EN_B;\r
- if((blocking<millis()) &&(READ(BTN_ENC)==0))\r
- newbutton|=EN_C;\r
- buttons=newbutton;\r
- #else //read it from the shift register\r
- uint8_t newbutton=0;\r
- WRITE(SHIFT_LD,LOW);\r
- WRITE(SHIFT_LD,HIGH);\r
- unsigned char tmp_buttons=0;\r
- for(int8_t i=0;i<8;i++)\r
- { \r
- newbutton = newbutton>>1;\r
- if(READ(SHIFT_OUT))\r
- newbutton|=(1<<7);\r
- WRITE(SHIFT_CLK,HIGH);\r
- WRITE(SHIFT_CLK,LOW);\r
- }\r
- buttons=~newbutton; //invert it, because a pressed switch produces a logical 0\r
- #endif\r
- \r
- //manage encoder rotation\r
- char enc=0;\r
- if(buttons&EN_A)\r
- enc|=(1<<0);\r
- if(buttons&EN_B)\r
- enc|=(1<<1);\r
- if(enc!=lastenc)\r
- {\r
- switch(enc)\r
- {\r
- case encrot0:\r
- if(lastenc==encrot3)\r
- encoderpos++;\r
- else if(lastenc==encrot1)\r
- encoderpos--;\r
- break;\r
- case encrot1:\r
- if(lastenc==encrot0)\r
- encoderpos++;\r
- else if(lastenc==encrot2)\r
- encoderpos--;\r
- break;\r
- case encrot2:\r
- if(lastenc==encrot1)\r
- encoderpos++;\r
- else if(lastenc==encrot3)\r
- encoderpos--;\r
- break;\r
- case encrot3:\r
- if(lastenc==encrot2)\r
- encoderpos++;\r
- else if(lastenc==encrot0)\r
- encoderpos--;\r
- break;\r
- default:\r
- ;\r
- }\r
- }\r
- lastenc=enc;\r
-}\r
-\r
-#endif\r
-\r
-MainMenu::MainMenu()\r
-{\r
- status=Main_Status;\r
- displayStartingRow=0;\r
- activeline=0;\r
- force_lcd_update=true;\r
- #ifdef ULTIPANEL\r
- buttons_init();\r
- #endif\r
- lcd_init();\r
- linechanging=false;\r
- tune=false;\r
-}\r
-\r
-void MainMenu::showStatus()\r
-{ \r
-#if LCD_HEIGHT==4\r
- static int olddegHotEnd0=-1;\r
- static int oldtargetHotEnd0=-1;\r
- //force_lcd_update=true;\r
- if(force_lcd_update||feedmultiplychanged) //initial display of content\r
- {\r
- feedmultiplychanged=false;\r
- encoderpos=feedmultiply;\r
- clear();\r
- lcd.setCursor(0,0);lcdprintPGM("\002123/567\001 ");\r
- #if defined BED_USES_THERMISTOR || defined BED_USES_AD595 \r
- lcd.setCursor(10,0);lcdprintPGM("B123/567\001 ");\r
- #endif\r
- }\r
- \r
- int tHotEnd0=intround(degHotend0());\r
- if((abs(tHotEnd0-olddegHotEnd0)>1)||force_lcd_update) //>1 because otherwise the lcd is refreshed to often.\r
- {\r
- lcd.setCursor(1,0);\r
- lcd.print(ftostr3(tHotEnd0));\r
- olddegHotEnd0=tHotEnd0;\r
- }\r
- int ttHotEnd0=intround(degTargetHotend0());\r
- if((ttHotEnd0!=oldtargetHotEnd0)||force_lcd_update)\r
- {\r
- lcd.setCursor(5,0);\r
- lcd.print(ftostr3(ttHotEnd0));\r
- oldtargetHotEnd0=ttHotEnd0;\r
- }\r
- #if defined BED_USES_THERMISTOR || defined BED_USES_AD595 \r
- static int oldtBed=-1;\r
- static int oldtargetBed=-1; \r
- int tBed=intround(degBed());\r
- if((tBed!=oldtBed)||force_lcd_update)\r
- {\r
- lcd.setCursor(1,0);\r
- lcd.print(ftostr3(tBed));\r
- oldtBed=tBed;\r
- }\r
- int targetBed=intround(degTargetBed());\r
- if((targetBed!=oldtargetBed)||force_lcd_update)\r
- {\r
- lcd.setCursor(5,0);\r
- lcd.print(ftostr3(targetBed));\r
- oldtargetBed=targetBed;\r
- }\r
- #endif\r
- //starttime=2;\r
- static uint16_t oldtime=0;\r
- if(starttime!=0)\r
- {\r
- lcd.setCursor(0,1);\r
- uint16_t time=millis()/60000-starttime/60000;\r
- \r
- if(starttime!=oldtime)\r
- {\r
- lcd.print(itostr2(time/60));lcdprintPGM("h ");lcd.print(itostr2(time%60));lcdprintPGM("m");\r
- oldtime=time;\r
- }\r
- }\r
- static int oldzpos=0;\r
- int currentz=current_position[2]*10;\r
- if((currentz!=oldzpos)||force_lcd_update)\r
- {\r
- lcd.setCursor(10,1);\r
- lcdprintPGM("Z:");lcd.print(itostr31(currentz));\r
- oldzpos=currentz;\r
- }\r
- static int oldfeedmultiply=0;\r
- int curfeedmultiply=feedmultiply;\r
- if(encoderpos!=curfeedmultiply||force_lcd_update)\r
- {\r
- curfeedmultiply=encoderpos;\r
- if(curfeedmultiply<10)\r
- curfeedmultiply=10;\r
- if(curfeedmultiply>999)\r
- curfeedmultiply=999;\r
- feedmultiply=curfeedmultiply;\r
- encoderpos=curfeedmultiply;\r
- }\r
- if((curfeedmultiply!=oldfeedmultiply)||force_lcd_update)\r
- {\r
- oldfeedmultiply=curfeedmultiply;\r
- lcd.setCursor(0,2);\r
- lcd.print(itostr3(curfeedmultiply));lcdprintPGM("% ");\r
- }\r
- if(messagetext[0]!='\0')\r
- {\r
- lcd.setCursor(0,LCD_HEIGHT-1);\r
- lcd.print(messagetext);\r
- uint8_t n=strlen(messagetext);\r
- for(int8_t i=0;i<LCD_WIDTH-n;i++)\r
- lcd.print(" ");\r
- \r
- messagetext[0]='\0';\r
- }\r
- \r
- static uint8_t oldpercent=101;\r
- uint8_t percent=card.percentDone();\r
- if(oldpercent!=percent ||force_lcd_update)\r
- {\r
- lcd.setCursor(7,2);\r
- lcd.print(itostr3((int)percent));\r
- lcdprintPGM("%SD");\r
- \r
- }\r
- \r
-#else //smaller LCDS----------------------------------\r
- static int olddegHotEnd0=-1;\r
- static int oldtargetHotEnd0=-1;\r
- if(force_lcd_update) //initial display of content\r
- {\r
- encoderpos=feedmultiply;\r
- lcd.setCursor(0,0);lcdprintPGM("\002123/567\001 ");\r
- #if defined BED_USES_THERMISTOR || defined BED_USES_AD595 \r
- lcd.setCursor(10,0);lcdprintPGM("B123/567\001 ");\r
- #endif\r
- }\r
- \r
- int tHotEnd0=intround(degHotend0());\r
- int ttHotEnd0=intround(degTargetHotend0());\r
-\r
-\r
- if((abs(tHotEnd0-olddegHotEnd0)>1)||force_lcd_update)\r
- {\r
- lcd.setCursor(1,0);\r
- lcd.print(ftostr3(tHotEnd0));\r
- olddegHotEnd0=tHotEnd0;\r
- }\r
- if((ttHotEnd0!=oldtargetHotEnd0)||force_lcd_update)\r
- {\r
- lcd.setCursor(5,0);\r
- lcd.print(ftostr3(ttHotEnd0));\r
- oldtargetHotEnd0=ttHotEnd0;\r
- }\r
-\r
- if(messagetext[0]!='\0')\r
- {\r
- lcd.setCursor(0,LCD_HEIGHT-1);\r
- lcd.print(messagetext);\r
- uint8_t n=strlen(messagetext);\r
- for(int8_t i=0;i<LCD_WIDTH-n;i++)\r
- lcd.print(" ");\r
- messagetext[0]='\0';\r
- }\r
-\r
-#endif\r
- force_lcd_update=false;\r
-}\r
-\r
-enum {ItemP_exit, ItemP_home, ItemP_origin, ItemP_preheat, ItemP_extrude, ItemP_disstep};\r
-\r
-//any action must not contain a ',' character anywhere, or this breaks:\r
-#define MENUITEM(repaint_action, click_action) \\r
- {\\r
- if(force_lcd_update) { lcd.setCursor(0,line); repaint_action; } \\r
- if((activeline==line) && CLICKED) {click_action} \\r
- }\r
- \r
-void MainMenu::showPrepare()\r
-{\r
- uint8_t line=0;\r
- clearIfNecessary();\r
- for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
- {\r
- //Serial.println((int)(line-lineoffset));\r
- switch(i)\r
- {\r
- case ItemP_exit:\r
- MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;\r
- break;\r
- case ItemP_home:\r
- MENUITEM( lcdprintPGM(" Auto Home") , BLOCK;enquecommand("G28 X-105 Y-105 Z0");beepshort(); ) ;\r
- break;\r
- case ItemP_origin:\r
- MENUITEM( lcdprintPGM(" Set Origin") , BLOCK;enquecommand("G92 X0 Y0 Z0");beepshort(); ) ;\r
- break;\r
- case ItemP_preheat:\r
- MENUITEM( lcdprintPGM(" Preheat") , BLOCK;setTargetHotend0(170);beepshort(); ) ;\r
- break;\r
- case ItemP_extrude:\r
- MENUITEM( lcdprintPGM(" Extrude") , BLOCK;enquecommand("G92 E0");enquecommand("G1 F700 E50");beepshort(); ) ;\r
- break;\r
- case ItemP_disstep:\r
- MENUITEM( lcdprintPGM(" Disable Steppers") , BLOCK;enquecommand("M84");beepshort(); ) ;\r
- break;\r
- default: \r
- break;\r
- }\r
- line++;\r
- }\r
- updateActiveLines(ItemP_disstep,encoderpos);\r
-}\r
-\r
-enum {ItemT_exit,ItemT_speed,ItemT_flow,ItemT_nozzle,ItemT_fan};\r
-\r
-void MainMenu::showTune()\r
-{ \r
- uint8_t line=0;\r
- clearIfNecessary();\r
- for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
- {\r
- //Serial.println((int)(line-lineoffset));\r
- switch(i)\r
- {\r
- case ItemT_exit:\r
- MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;\r
- break;\r
- case ItemT_speed:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Speed:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(feedmultiply));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=feedmultiply;\r
- }\r
- else\r
- {\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<1) encoderpos=1;\r
- if(encoderpos>400) encoderpos=400;\r
- feedmultiply = encoderpos;\r
- feedmultiplychanged=true;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- case ItemT_nozzle:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=intround(degTargetHotend0());\r
- }\r
- else\r
- {\r
- setTargetHotend0(encoderpos);\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>260) encoderpos=260;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- }break;\r
- \r
- case ItemT_fan:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Fan speed:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=fanpwm;\r
- }\r
- else\r
- {\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>255) encoderpos=255;\r
- fanpwm=encoderpos;\r
- analogWrite(FAN_PIN, fanpwm);\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- case ItemT_flow://axis_steps_per_unit[i] = code_value();\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Flow:");\r
- lcd.setCursor(13,line);lcd.print(itostr4(axis_steps_per_unit[3]));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)axis_steps_per_unit[3];\r
- }\r
- else\r
- {\r
- float factor=float(encoderpos)/float(axis_steps_per_unit[3]);\r
- position[E_AXIS]=lround(position[E_AXIS]*factor);\r
- //current_position[3]*=factor;\r
- axis_steps_per_unit[E_AXIS]= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<5) encoderpos=5;\r
- if(encoderpos>9999) encoderpos=9999;\r
- lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));\r
- }\r
- \r
- }break; \r
- default: \r
- break;\r
- }\r
- line++;\r
- }\r
- updateActiveLines(ItemT_fan,encoderpos);\r
-}\r
-\r
-//does not work\r
-// #define MENUCHANGEITEM(repaint_action, enter_action, accept_action, change_action) \\r
-// {\\r
-// if(force_lcd_update) { lcd.setCursor(0,line); repaint_action; } \\r
-// if(activeline==line) \\r
-// { \\r
-// if(CLICKED) \\r
-// { \\r
-// linechanging=!linechanging; \\r
-// if(linechanging) {enter_action;} \\r
-// else {accept_action;} \\r
-// } \\r
-// else \\r
-// if(linechanging) {change_action};}\\r
-// }\r
-// \r
-\r
-enum {\r
- ItemCT_exit,ItemCT_nozzle,\r
-#ifdef AUTOTEMP\r
- ItemCT_autotempactive,\r
- ItemCT_autotempmin,ItemCT_autotempmax,ItemCT_autotempfact,\r
-#endif\r
- ItemCT_fan,\r
- ItemCT_PID_P,ItemCT_PID_I,ItemCT_PID_D,ItemCT_PID_C\r
-};\r
-\r
-void MainMenu::showControlTemp()\r
-{\r
- uint8_t line=0;\r
- clearIfNecessary();\r
- for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
- {\r
- switch(i)\r
- {\r
- case ItemCT_exit:\r
- MENUITEM( lcdprintPGM(" Control \003") , BLOCK;status=Main_Control;beepshort(); ) ;\r
- break;\r
- case ItemCT_nozzle:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=intround(degTargetHotend0());\r
- }\r
- else\r
- {\r
- setTargetHotend0(encoderpos);\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>260) encoderpos=260;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- #ifdef AUTOTEMP\r
- case ItemCT_autotempmin:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" \002 Min:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(autotemp_min));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=intround(autotemp_min);\r
- }\r
- else\r
- {\r
- autotemp_min=encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>260) encoderpos=260;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break; \r
- case ItemCT_autotempmax:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" \002 Max:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(autotemp_max));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=intround(autotemp_max);\r
- }\r
- else\r
- {\r
- autotemp_max=encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>260) encoderpos=260;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break; \r
- case ItemCT_autotempfact:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" \002 Fact:");\r
- lcd.setCursor(13,line);lcd.print(ftostr32(autotemp_factor));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=intround(autotemp_factor*100);\r
- }\r
- else\r
- {\r
- autotemp_max=encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>99) encoderpos=99;\r
- lcd.setCursor(13,line);lcd.print(ftostr32(encoderpos/100.));\r
- }\r
- \r
- }break;\r
- case ItemCT_autotempactive:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Autotemp:");\r
- lcd.setCursor(13,line);\r
- if(autotemp_enabled)\r
- lcdprintPGM("On");\r
- else\r
- lcdprintPGM("Off");\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- autotemp_enabled=!autotemp_enabled;\r
- lcd.setCursor(13,line);\r
- if(autotemp_enabled)\r
- lcdprintPGM("On ");\r
- else\r
- lcdprintPGM("Off");\r
- BLOCK;\r
- }\r
- \r
- }break; \r
- #endif //autotemp\r
- case ItemCT_fan:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Fan speed:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=fanpwm;\r
- }\r
- else\r
- {\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>255) encoderpos=255;\r
- fanpwm=encoderpos;\r
- analogWrite(FAN_PIN, fanpwm);\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- case ItemCT_PID_P: \r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" PID-P: ");\r
- lcd.setCursor(13,line);lcd.print(itostr4(Kp));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)Kp;\r
- }\r
- else\r
- {\r
- Kp= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<1) encoderpos=1;\r
- if(encoderpos>9990) encoderpos=9990;\r
- lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));\r
- }\r
- \r
- }break;\r
- case ItemCT_PID_I: \r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" PID-I: ");\r
- lcd.setCursor(13,line);lcd.print(ftostr51(Ki/PID_dT));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)(Ki*10/PID_dT);\r
- }\r
- else\r
- {\r
- Ki= encoderpos/10.*PID_dT;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>9990) encoderpos=9990;\r
- lcd.setCursor(13,line);lcd.print(ftostr51(encoderpos/10.));\r
- }\r
- \r
- }break;\r
- case ItemCT_PID_D: \r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" PID-D: ");\r
- lcd.setCursor(13,line);lcd.print(itostr4(Kd*PID_dT));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)(Kd/5./PID_dT);\r
- }\r
- else\r
- {\r
- Kd= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>9990) encoderpos=9990;\r
- lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));\r
- }\r
- \r
- }break; \r
- case ItemCT_PID_C: \r
- #ifdef PID_ADD_EXTRUSION_RATE\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" PID-C: ");\r
- lcd.setCursor(13,line);lcd.print(itostr3(Kc));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)Kc;\r
- }\r
- else\r
- {\r
- Kc= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }\r
- #endif\r
- break;\r
- default: \r
- break;\r
- }\r
- line++;\r
- }\r
- #ifdef PID_ADD_EXTRUSION_RATE\r
- updateActiveLines(ItemCT_PID_C,encoderpos);\r
- #else\r
- updateActiveLines(ItemCT_PID_D,encoderpos);\r
- #endif\r
-}\r
-\r
-\r
-enum {\r
- ItemCM_exit, \r
- ItemCM_acc, ItemCM_xyjerk, \r
- ItemCM_vmaxx, ItemCM_vmaxy, ItemCM_vmaxz, ItemCM_vmaxe, \r
- ItemCM_vtravmin,ItemCM_vmin, \r
- ItemCM_amaxx, ItemCM_amaxy, ItemCM_amaxz, ItemCM_amaxe, \r
- ItemCM_aret,ItemCM_esteps\r
-};\r
-\r
-\r
-\r
-void MainMenu::showControlMotion()\r
-{\r
- uint8_t line=0;\r
- clearIfNecessary();\r
- for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
- {\r
- switch(i)\r
- {\r
- case ItemCM_exit:\r
- MENUITEM( lcdprintPGM(" Control \003") , BLOCK;status=Main_Control;beepshort(); ) ;\r
- break;\r
- case ItemCM_acc:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Acc:");\r
- lcd.setCursor(13,line);lcd.print(itostr3(acceleration/100));lcdprintPGM("00");\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)acceleration/100;\r
- }\r
- else\r
- {\r
- acceleration= encoderpos*100;\r
- encoderpos=activeline*lcdslow;\r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<5) encoderpos=5;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");\r
- }\r
- \r
- }break;\r
- case ItemCM_xyjerk: //max_xy_jerk\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Vxy-jerk: ");\r
- lcd.setCursor(13,line);lcd.print(itostr3(max_xy_jerk));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)max_xy_jerk;\r
- }\r
- else\r
- {\r
- max_xy_jerk= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<1) encoderpos=1;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- \r
- case ItemCM_vmaxx:\r
- case ItemCM_vmaxy:\r
- case ItemCM_vmaxz:\r
- case ItemCM_vmaxe:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Vmax ");\r
- if(i==ItemCM_vmaxx)lcdprintPGM("x:");\r
- if(i==ItemCM_vmaxy)lcdprintPGM("y:");\r
- if(i==ItemCM_vmaxz)lcdprintPGM("z:");\r
- if(i==ItemCM_vmaxe)lcdprintPGM("e:");\r
- lcd.setCursor(13,line);lcd.print(itostr3(max_feedrate[i-ItemCM_vmaxx]));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)max_feedrate[i-ItemCM_vmaxx];\r
- }\r
- else\r
- {\r
- max_feedrate[i-ItemCM_vmaxx]= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<1) encoderpos=1;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- \r
- case ItemCM_vmin:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Vmin:");\r
- lcd.setCursor(13,line);lcd.print(itostr3(minimumfeedrate));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)(minimumfeedrate);\r
- }\r
- else\r
- {\r
- minimumfeedrate= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- case ItemCM_vtravmin:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" VTrav min:");\r
- lcd.setCursor(13,line);lcd.print(itostr3(mintravelfeedrate));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)mintravelfeedrate;\r
- }\r
- else\r
- {\r
- mintravelfeedrate= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- \r
- case ItemCM_amaxx: \r
- case ItemCM_amaxy:\r
- case ItemCM_amaxz:\r
- case ItemCM_amaxe:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Amax ");\r
- if(i==ItemCM_amaxx)lcdprintPGM("x:");\r
- if(i==ItemCM_amaxy)lcdprintPGM("y:");\r
- if(i==ItemCM_amaxz)lcdprintPGM("z:");\r
- if(i==ItemCM_amaxe)lcdprintPGM("e:");\r
- lcd.setCursor(13,line);lcd.print(itostr3(max_acceleration_units_per_sq_second[i-ItemCM_amaxx]/100));lcdprintPGM("00");\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)max_acceleration_units_per_sq_second[i-ItemCM_amaxx]/100;\r
- }\r
- else\r
- {\r
- max_acceleration_units_per_sq_second[i-ItemCM_amaxx]= encoderpos*100;\r
- encoderpos=activeline*lcdslow;\r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<1) encoderpos=1;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");\r
- }\r
- \r
- }break;\r
- case ItemCM_aret://float retract_acceleration = 7000;\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" A-retract:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(retract_acceleration/100));lcdprintPGM("00");\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)retract_acceleration/100;\r
- }\r
- else\r
- {\r
- retract_acceleration= encoderpos*100;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<10) encoderpos=10;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");\r
- }\r
- \r
- }break;\r
- case ItemCM_esteps://axis_steps_per_unit[i] = code_value();\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Esteps/mm:");\r
- lcd.setCursor(13,line);lcd.print(itostr4(axis_steps_per_unit[3]));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)axis_steps_per_unit[3];\r
- }\r
- else\r
- {\r
- float factor=float(encoderpos)/float(axis_steps_per_unit[3]);\r
- position[E_AXIS]=lround(position[E_AXIS]*factor);\r
- //current_position[3]*=factor;\r
- axis_steps_per_unit[E_AXIS]= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<5) encoderpos=5;\r
- if(encoderpos>9999) encoderpos=9999;\r
- lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));\r
- }\r
- \r
- }break; \r
- default: \r
- break;\r
- }\r
- line++;\r
- }\r
- updateActiveLines(ItemCM_esteps,encoderpos);\r
-}\r
-\r
-\r
-enum {\r
- ItemC_exit,ItemC_temp,ItemC_move,\r
- ItemC_store, ItemC_load,ItemC_failsafe\r
-};\r
-\r
-void MainMenu::showControl()\r
-{\r
- uint8_t line=0;\r
- clearIfNecessary();\r
- for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
- {\r
- switch(i)\r
- {\r
- case ItemC_exit:\r
- MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;\r
- break;\r
- case ItemC_temp:\r
- MENUITEM( lcdprintPGM(" Temperature \x7E") , BLOCK;status=Sub_TempControl;beepshort(); ) ;\r
- break;\r
- case ItemC_move:\r
- MENUITEM( lcdprintPGM(" Motion \x7E") , BLOCK;status=Sub_MotionControl;beepshort(); ) ;\r
- break;\r
- case ItemC_store:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Store EPROM");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- //enquecommand("M84");\r
- beepshort();\r
- BLOCK;\r
- EEPROM_StoreSettings();\r
- }\r
- }break;\r
- case ItemC_load:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Load EPROM");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- //enquecommand("M84");\r
- beepshort();\r
- BLOCK;\r
- EEPROM_RetrieveSettings();\r
- }\r
- }break;\r
- case ItemC_failsafe:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Restore Failsafe");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- //enquecommand("M84");\r
- beepshort();\r
- BLOCK;\r
- EEPROM_RetrieveSettings(true);\r
- }\r
- }break;\r
- default: \r
- break;\r
- }\r
- line++;\r
- }\r
- updateActiveLines(ItemC_failsafe,encoderpos);\r
-}\r
-\r
-\r
-\r
-\r
-\r
-void MainMenu::showSD()\r
-{\r
-#ifdef SDSUPPORT\r
- uint8_t line=0;\r
-\r
- clearIfNecessary();\r
- static uint8_t nrfiles=0;\r
- if(force_lcd_update)\r
- {\r
- if(card.cardOK)\r
- {\r
- nrfiles=card.getnrfilenames();\r
- }\r
- else\r
- {\r
- nrfiles=0;\r
- lineoffset=0;\r
- }\r
- }\r
- bool enforceupdate=false;\r
- for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
- {\r
- switch(i)\r
- {\r
- case 0:\r
- MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;\r
- break;\r
-// case 1:\r
-// {\r
-// if(force_lcd_update)\r
-// {\r
-// lcd.setCursor(0,line);\r
-// #ifdef CARDINSERTED\r
-// if(CARDINSERTED)\r
-// #else\r
-// if(true)\r
-// #endif\r
-// {\r
-// lcdprintPGM(" \004Refresh");\r
-// }\r
-// else\r
-// {\r
-// lcdprintPGM(" \004Insert Card");\r
-// }\r
-// \r
-// }\r
-// if((activeline==line) && CLICKED)\r
-// {\r
-// BLOCK;\r
-// beepshort();\r
-// card.initsd();\r
-// force_lcd_update=true;\r
-// nrfiles=card.getnrfilenames();\r
-// }\r
-// }break;\r
- case 1:\r
- MENUITEM( lcd.print(" ");card.getWorkDirName();if(card.filename[0]=='/') lcdprintPGM("\004Refresh");else {lcd.print("\005");lcd.print(card.filename);lcd.print("/..");} , BLOCK;card.updir();enforceupdate=true;lineoffset=0;beepshort(); ) ;\r
- \r
- break;\r
- default:\r
- {\r
- #define FIRSTITEM 2\r
- if(i-FIRSTITEM<nrfiles)\r
- {\r
- if(force_lcd_update)\r
- {\r
- card.getfilename(i-FIRSTITEM);\r
- //Serial.print("Filenr:");Serial.println(i-2);\r
- lcd.setCursor(0,line);lcdprintPGM(" ");\r
- if(card.filenameIsDir) lcd.print("\005");\r
- lcd.print(card.filename);\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- BLOCK\r
- card.getfilename(i-FIRSTITEM);\r
- if(card.filenameIsDir)\r
- {\r
- for(int8_t i=0;i<strlen(card.filename);i++)\r
- card.filename[i]=tolower(card.filename[i]);\r
- card.chdir(card.filename);\r
- lineoffset=0;\r
- enforceupdate=true;\r
- }\r
- else\r
- {\r
- char cmd[30];\r
- for(int8_t i=0;i<strlen(card.filename);i++)\r
- card.filename[i]=tolower(card.filename[i]);\r
- sprintf(cmd,"M23 %s",card.filename);\r
- //sprintf(cmd,"M115");\r
- enquecommand(cmd);\r
- enquecommand("M24");\r
- beep(); \r
- status=Main_Status;\r
- lcd_status(card.filename);\r
- }\r
- }\r
- }\r
- \r
- }\r
- break;\r
- }\r
- line++;\r
- }\r
- updateActiveLines(FIRSTITEM+nrfiles-1,encoderpos);\r
- if(enforceupdate)\r
- {\r
- force_lcd_update=true;\r
- enforceupdate=false;\r
- }\r
-#endif\r
-}\r
-\r
-enum {ItemM_watch, ItemM_prepare, ItemM_control, ItemM_file };\r
-void MainMenu::showMainMenu()\r
-{\r
-\r
- #ifndef ULTIPANEL\r
- force_lcd_update=false;\r
- #endif\r
- if(tune)\r
- {\r
- if(!(movesplanned() ||card.sdprinting))\r
- {\r
- force_lcd_update=true;\r
- tune=false;\r
- }\r
- }\r
- else \r
- {\r
- if(movesplanned() ||card.sdprinting)\r
- {\r
- force_lcd_update=true;\r
- tune=true;\r
- }\r
- } \r
- clearIfNecessary();\r
- for(int8_t line=0;line<LCD_HEIGHT;line++)\r
- {\r
- switch(line)\r
- { \r
- case ItemM_watch:\r
- MENUITEM( lcdprintPGM(" Watch \003") , BLOCK;status=Main_Status;beepshort(); ) ;\r
- break;\r
- case ItemM_prepare:\r
- MENUITEM( if(!tune) lcdprintPGM(" Prepare \x7E");else lcdprintPGM(" Tune \x7E"); , BLOCK;status=Main_Prepare;beepshort(); ) ;\r
- break;\r
- \r
- case ItemM_control:\r
- MENUITEM( lcdprintPGM(" Control \x7E") , BLOCK;status=Main_Control;beepshort(); ) ;\r
- break;\r
- #ifdef SDSUPPORT\r
- case ItemM_file: \r
- {\r
- if(force_lcd_update) \r
- {\r
- lcd.setCursor(0,line);\r
- #ifdef CARDINSERTED\r
- if(CARDINSERTED)\r
- #else\r
- if(true)\r
- #endif\r
- {\r
- if(card.sdprinting)\r
- lcdprintPGM(" Stop Print \x7E");\r
- else\r
- lcdprintPGM(" Card Menu \x7E");\r
- }\r
- else\r
- {\r
- lcdprintPGM(" No Card"); \r
- }\r
- }\r
- #ifdef CARDINSERTED\r
- if(CARDINSERTED)\r
- #endif\r
- if((activeline==line)&&CLICKED)\r
- {\r
- card.printingHasFinished();\r
- BLOCK;\r
- status=Main_SD;\r
- beepshort();\r
- }\r
- }break;\r
- #else\r
- case ItemM_file:\r
- break;\r
- #endif\r
- default: \r
- SERIAL_ERROR_START;\r
- SERIAL_ERRORLNPGM("Something is wrong in the MenuStructure.");\r
- break;\r
- }\r
- }\r
- updateActiveLines(3,encoderpos);\r
-}\r
-\r
-void MainMenu::update()\r
-{\r
- static MainStatus oldstatus=Main_Menu; //init automatically causes foce_lcd_update=true\r
- static long timeoutToStatus=0;\r
- static bool oldcardstatus=false;\r
- #ifdef CARDINSERTED\r
- if((CARDINSERTED != oldcardstatus))\r
- {\r
- force_lcd_update=true;\r
- oldcardstatus=CARDINSERTED;\r
- //Serial.println("echo: SD CHANGE");\r
- if(CARDINSERTED)\r
- {\r
- card.initsd();\r
- LCD_MESSAGEPGM("Card inserted");\r
- }\r
- else\r
- {\r
- card.release();\r
- LCD_MESSAGEPGM("Card removed");\r
- }\r
- }\r
- #endif\r
- \r
- if(status!=oldstatus)\r
- {\r
- force_lcd_update=true;\r
- encoderpos=0;\r
- lineoffset=0;\r
- \r
- oldstatus=status;\r
- }\r
- if( (encoderpos!=lastencoderpos) || CLICKED)\r
- timeoutToStatus=millis()+STATUSTIMEOUT;\r
-\r
- switch(status)\r
- { \r
- case Main_Status: \r
- { \r
- showStatus();\r
- if(CLICKED)\r
- {\r
- linechanging=false;\r
- BLOCK\r
- status=Main_Menu;\r
- timeoutToStatus=millis()+STATUSTIMEOUT;\r
- }\r
- }break;\r
- case Main_Menu: \r
- {\r
- showMainMenu();\r
- linechanging=false;\r
- }break;\r
- case Main_Prepare: \r
- {\r
- if(tune)\r
- {\r
- showTune();\r
- }\r
- else\r
- {\r
- showPrepare(); \r
- }\r
- }break;\r
- case Main_Control:\r
- {\r
- showControl(); \r
- }break;\r
- case Sub_MotionControl:\r
- {\r
- showControlMotion(); \r
- }break;\r
- case Sub_TempControl:\r
- {\r
- showControlTemp(); \r
- }break;\r
- case Main_SD: \r
- {\r
- showSD();\r
- }break;\r
- }\r
- \r
- if(timeoutToStatus<millis())\r
- status=Main_Status;\r
- //force_lcd_update=false;\r
- lastencoderpos=encoderpos;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-// convert float to string with +123.4 format\r
-char *ftostr3(const float &x)\r
-{\r
- //sprintf(conv,"%5.1f",x);\r
- int xx=x;\r
- conv[0]=(xx/100)%10+'0';\r
- conv[1]=(xx/10)%10+'0';\r
- conv[2]=(xx)%10+'0';\r
- conv[3]=0;\r
- return conv;\r
-}\r
-\r
-char *itostr2(const uint8_t &x)\r
-{\r
- //sprintf(conv,"%5.1f",x);\r
- int xx=x;\r
- conv[0]=(xx/10)%10+'0';\r
- conv[1]=(xx)%10+'0';\r
- conv[2]=0;\r
- return conv;\r
-}\r
-\r
-// convert float to string with +123.4 format\r
-char *ftostr31(const float &x)\r
-{\r
- int xx=x*10;\r
- conv[0]=(xx>=0)?'+':'-';\r
- xx=abs(xx);\r
- conv[1]=(xx/1000)%10+'0';\r
- conv[2]=(xx/100)%10+'0';\r
- conv[3]=(xx/10)%10+'0';\r
- conv[4]='.';\r
- conv[5]=(xx)%10+'0';\r
- conv[6]=0;\r
- return conv;\r
-}\r
-\r
-char *ftostr32(const float &x)\r
-{\r
- int xx=x*100;\r
- conv[0]=(xx>=0)?'+':'-';\r
- xx=abs(xx);\r
- conv[1]=(xx/100)%10+'0';\r
- conv[2]='.';\r
- conv[3]=(xx/10)%10+'0';\r
- conv[4]=(xx)%10+'0';\r
- conv[6]=0;\r
- return conv;\r
-}\r
-\r
-char *itostr31(const int &xx)\r
-{\r
- conv[0]=(xx>=0)?'+':'-';\r
- conv[1]=(xx/1000)%10+'0';\r
- conv[2]=(xx/100)%10+'0';\r
- conv[3]=(xx/10)%10+'0';\r
- conv[4]='.';\r
- conv[5]=(xx)%10+'0';\r
- conv[6]=0;\r
- return conv;\r
-}\r
-\r
-char *itostr3(const int &xx)\r
-{\r
- conv[0]=(xx/100)%10+'0';\r
- conv[1]=(xx/10)%10+'0';\r
- conv[2]=(xx)%10+'0';\r
- conv[3]=0;\r
- return conv;\r
-}\r
-\r
-char *itostr4(const int &xx)\r
-{\r
- conv[0]=(xx/1000)%10+'0';\r
- conv[1]=(xx/100)%10+'0';\r
- conv[2]=(xx/10)%10+'0';\r
- conv[3]=(xx)%10+'0';\r
- conv[4]=0;\r
- return conv;\r
-}\r
-\r
-// convert float to string with +1234.5 format\r
-char *ftostr51(const float &x)\r
-{\r
- int xx=x*10;\r
- conv[0]=(xx>=0)?'+':'-';\r
- xx=abs(xx);\r
- conv[1]=(xx/10000)%10+'0';\r
- conv[2]=(xx/1000)%10+'0';\r
- conv[3]=(xx/100)%10+'0';\r
- conv[4]=(xx/10)%10+'0';\r
- conv[5]='.';\r
- conv[6]=(xx)%10+'0';\r
- conv[7]=0;\r
- return conv;\r
-}\r
-\r
-\r
-#endif //ULTRA_LCD\r
-\r
+#include "ultralcd.h"
+#ifdef ULTRA_LCD
+
+//===========================================================================
+//=============================imported variables============================
+//===========================================================================
+
+extern volatile int feedmultiply;
+extern volatile bool feedmultiplychanged;
+
+extern long position[4];
+extern CardReader card;
+
+//===========================================================================
+//=============================public variables============================
+//===========================================================================
+volatile char buttons=0; //the last checked buttons in a bit array.
+int encoderpos=0;
+short lastenc=0;
+
+
+//===========================================================================
+//=============================private variables============================
+//===========================================================================
+static char messagetext[LCD_WIDTH]="";
+
+//return for string conversion routines
+static char conv[8];
+
+#include <LiquidCrystal.h>
+LiquidCrystal lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7
+
+static unsigned long previous_millis_lcd=0;
+static long previous_millis_buttons=0;
+
+
+#ifdef NEWPANEL
+ static long blocking=0;
+#else
+ static long blocking[8]={0,0,0,0,0,0,0,0};
+#endif
+
+static MainMenu menu;
+
+#include <avr/pgmspace.h>
+
+void lcdProgMemprint(const char *str)
+{
+ char ch=pgm_read_byte(str);
+ while(ch)
+ {
+ lcd.print(ch);
+ ch=pgm_read_byte(++str);
+ }
+}
+#define lcdprintPGM(x) lcdProgMemprint(MYPGM(x))
+
+
+//===========================================================================
+//=============================functions ============================
+//===========================================================================
+
+FORCE_INLINE int intround(const float &x){return int(0.5+x);}
+
+void lcd_status(const char* message)
+{
+ strncpy(messagetext,message,LCD_WIDTH);
+ messagetext[strlen(message)]=0;
+}
+
+void lcd_statuspgm(const char* message)
+{
+ char ch=pgm_read_byte(message);
+ char *target=messagetext;
+ uint8_t cnt=0;
+ while(ch &&cnt<LCD_WIDTH)
+ {
+ *target=ch;
+ target++;
+ cnt++;
+ ch=pgm_read_byte(++message);
+ }
+ *target=0;
+}
+
+FORCE_INLINE void clear()
+{
+ lcd.clear();
+}
+
+
+void lcd_init()
+{
+ //beep();
+ byte Degree[8] =
+ {
+ B01100,
+ B10010,
+ B10010,
+ B01100,
+ B00000,
+ B00000,
+ B00000,
+ B00000
+ };
+ byte Thermometer[8] =
+ {
+ B00100,
+ B01010,
+ B01010,
+ B01010,
+ B01010,
+ B10001,
+ B10001,
+ B01110
+ };
+ byte uplevel[8]={0x04, 0x0e, 0x1f, 0x04, 0x1c, 0x00, 0x00, 0x00};//thanks joris
+ byte refresh[8]={0x00, 0x06, 0x19, 0x18, 0x03, 0x13, 0x0c, 0x00}; //thanks joris
+ byte folder [8]={0x00, 0x1c, 0x1f, 0x11, 0x11, 0x1f, 0x00, 0x00}; //thanks joris
+ lcd.begin(LCD_WIDTH, LCD_HEIGHT);
+ lcd.createChar(1,Degree);
+ lcd.createChar(2,Thermometer);
+ lcd.createChar(3,uplevel);
+ lcd.createChar(4,refresh);
+ lcd.createChar(5,folder);
+ LCD_MESSAGEPGM("UltiMarlin ready.");
+}
+
+
+void beep()
+{
+ //return;
+ #ifdef ULTIPANEL
+ pinMode(BEEPER,OUTPUT);
+ for(int8_t i=0;i<20;i++){
+ WRITE(BEEPER,HIGH);
+ delay(5);
+ WRITE(BEEPER,LOW);
+ delay(5);
+ }
+ #endif
+}
+
+void beepshort()
+{
+ //return;
+ #ifdef ULTIPANEL
+ pinMode(BEEPER,OUTPUT);
+ for(int8_t i=0;i<10;i++){
+ WRITE(BEEPER,HIGH);
+ delay(3);
+ WRITE(BEEPER,LOW);
+ delay(3);
+ }
+ #endif
+}
+
+void lcd_status()
+{
+ #ifdef ULTIPANEL
+ static uint8_t oldbuttons=0;
+ //static long previous_millis_buttons=0;
+ //static long previous_lcdinit=0;
+ // buttons_check(); // Done in temperature interrupt
+ //previous_millis_buttons=millis();
+ long ms=millis();
+ for(int8_t i=0; i<8; i++) {
+ if((blocking[i]>ms))
+ buttons &= ~(1<<i);
+ }
+ if((buttons==oldbuttons) && ((millis() - previous_millis_lcd) < LCD_UPDATE_INTERVAL) )
+ return;
+ oldbuttons=buttons;
+ #else
+
+ if(((millis() - previous_millis_lcd) < LCD_UPDATE_INTERVAL) )
+ return;
+ #endif
+
+ previous_millis_lcd=millis();
+ menu.update();
+}
+#ifdef ULTIPANEL
+
+
+void buttons_init()
+{
+ #ifdef NEWPANEL
+ pinMode(BTN_EN1,INPUT);
+ pinMode(BTN_EN2,INPUT);
+ pinMode(BTN_ENC,INPUT);
+ pinMode(SDCARDDETECT,INPUT);
+ WRITE(BTN_EN1,HIGH);
+ WRITE(BTN_EN2,HIGH);
+ WRITE(BTN_ENC,HIGH);
+ WRITE(SDCARDDETECT,HIGH);
+ #else
+ pinMode(SHIFT_CLK,OUTPUT);
+ pinMode(SHIFT_LD,OUTPUT);
+ pinMode(SHIFT_EN,OUTPUT);
+ pinMode(SHIFT_OUT,INPUT);
+ WRITE(SHIFT_OUT,HIGH);
+ WRITE(SHIFT_LD,HIGH);
+ WRITE(SHIFT_EN,LOW);
+ #endif
+}
+
+
+void buttons_check()
+{
+
+ #ifdef NEWPANEL
+ uint8_t newbutton=0;
+ if(READ(BTN_EN1)==0) newbutton|=EN_A;
+ if(READ(BTN_EN2)==0) newbutton|=EN_B;
+ if((blocking<millis()) &&(READ(BTN_ENC)==0))
+ newbutton|=EN_C;
+ buttons=newbutton;
+ #else //read it from the shift register
+ uint8_t newbutton=0;
+ WRITE(SHIFT_LD,LOW);
+ WRITE(SHIFT_LD,HIGH);
+ unsigned char tmp_buttons=0;
+ for(int8_t i=0;i<8;i++)
+ {
+ newbutton = newbutton>>1;
+ if(READ(SHIFT_OUT))
+ newbutton|=(1<<7);
+ WRITE(SHIFT_CLK,HIGH);
+ WRITE(SHIFT_CLK,LOW);
+ }
+ buttons=~newbutton; //invert it, because a pressed switch produces a logical 0
+ #endif
+
+ //manage encoder rotation
+ char enc=0;
+ if(buttons&EN_A)
+ enc|=(1<<0);
+ if(buttons&EN_B)
+ enc|=(1<<1);
+ if(enc!=lastenc)
+ {
+ switch(enc)
+ {
+ case encrot0:
+ if(lastenc==encrot3)
+ encoderpos++;
+ else if(lastenc==encrot1)
+ encoderpos--;
+ break;
+ case encrot1:
+ if(lastenc==encrot0)
+ encoderpos++;
+ else if(lastenc==encrot2)
+ encoderpos--;
+ break;
+ case encrot2:
+ if(lastenc==encrot1)
+ encoderpos++;
+ else if(lastenc==encrot3)
+ encoderpos--;
+ break;
+ case encrot3:
+ if(lastenc==encrot2)
+ encoderpos++;
+ else if(lastenc==encrot0)
+ encoderpos--;
+ break;
+ default:
+ ;
+ }
+ }
+ lastenc=enc;
+}
+
+#endif
+
+MainMenu::MainMenu()
+{
+ status=Main_Status;
+ displayStartingRow=0;
+ activeline=0;
+ force_lcd_update=true;
+ #ifdef ULTIPANEL
+ buttons_init();
+ #endif
+ lcd_init();
+ linechanging=false;
+ tune=false;
+}
+
+void MainMenu::showStatus()
+{
+#if LCD_HEIGHT==4
+ static int olddegHotEnd0=-1;
+ static int oldtargetHotEnd0=-1;
+ //force_lcd_update=true;
+ if(force_lcd_update||feedmultiplychanged) //initial display of content
+ {
+ feedmultiplychanged=false;
+ encoderpos=feedmultiply;
+ clear();
+ lcd.setCursor(0,0);lcdprintPGM("\002123/567\001 ");
+ #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
+ lcd.setCursor(10,0);lcdprintPGM("B123/567\001 ");
+ #endif
+ }
+
+ int tHotEnd0=intround(degHotend0());
+ if((abs(tHotEnd0-olddegHotEnd0)>1)||force_lcd_update) //>1 because otherwise the lcd is refreshed to often.
+ {
+ lcd.setCursor(1,0);
+ lcd.print(ftostr3(tHotEnd0));
+ olddegHotEnd0=tHotEnd0;
+ }
+ int ttHotEnd0=intround(degTargetHotend0());
+ if((ttHotEnd0!=oldtargetHotEnd0)||force_lcd_update)
+ {
+ lcd.setCursor(5,0);
+ lcd.print(ftostr3(ttHotEnd0));
+ oldtargetHotEnd0=ttHotEnd0;
+ }
+ #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
+ static int oldtBed=-1;
+ static int oldtargetBed=-1;
+ int tBed=intround(degBed());
+ if((tBed!=oldtBed)||force_lcd_update)
+ {
+ lcd.setCursor(1,0);
+ lcd.print(ftostr3(tBed));
+ oldtBed=tBed;
+ }
+ int targetBed=intround(degTargetBed());
+ if((targetBed!=oldtargetBed)||force_lcd_update)
+ {
+ lcd.setCursor(5,0);
+ lcd.print(ftostr3(targetBed));
+ oldtargetBed=targetBed;
+ }
+ #endif
+ //starttime=2;
+ static uint16_t oldtime=0;
+ if(starttime!=0)
+ {
+ lcd.setCursor(0,1);
+ uint16_t time=millis()/60000-starttime/60000;
+
+ if(starttime!=oldtime)
+ {
+ lcd.print(itostr2(time/60));lcdprintPGM("h ");lcd.print(itostr2(time%60));lcdprintPGM("m");
+ oldtime=time;
+ }
+ }
+ static int oldzpos=0;
+ int currentz=current_position[2]*10;
+ if((currentz!=oldzpos)||force_lcd_update)
+ {
+ lcd.setCursor(10,1);
+ lcdprintPGM("Z:");lcd.print(itostr31(currentz));
+ oldzpos=currentz;
+ }
+ static int oldfeedmultiply=0;
+ int curfeedmultiply=feedmultiply;
+ if(encoderpos!=curfeedmultiply||force_lcd_update)
+ {
+ curfeedmultiply=encoderpos;
+ if(curfeedmultiply<10)
+ curfeedmultiply=10;
+ if(curfeedmultiply>999)
+ curfeedmultiply=999;
+ feedmultiply=curfeedmultiply;
+ encoderpos=curfeedmultiply;
+ }
+ if((curfeedmultiply!=oldfeedmultiply)||force_lcd_update)
+ {
+ oldfeedmultiply=curfeedmultiply;
+ lcd.setCursor(0,2);
+ lcd.print(itostr3(curfeedmultiply));lcdprintPGM("% ");
+ }
+ if(messagetext[0]!='\0')
+ {
+ lcd.setCursor(0,LCD_HEIGHT-1);
+ lcd.print(messagetext);
+ uint8_t n=strlen(messagetext);
+ for(int8_t i=0;i<LCD_WIDTH-n;i++)
+ lcd.print(" ");
+
+ messagetext[0]='\0';
+ }
+
+ static uint8_t oldpercent=101;
+ uint8_t percent=card.percentDone();
+ if(oldpercent!=percent ||force_lcd_update)
+ {
+ lcd.setCursor(7,2);
+ lcd.print(itostr3((int)percent));
+ lcdprintPGM("%SD");
+
+ }
+
+#else //smaller LCDS----------------------------------
+ static int olddegHotEnd0=-1;
+ static int oldtargetHotEnd0=-1;
+ if(force_lcd_update) //initial display of content
+ {
+ encoderpos=feedmultiply;
+ lcd.setCursor(0,0);lcdprintPGM("\002123/567\001 ");
+ #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
+ lcd.setCursor(10,0);lcdprintPGM("B123/567\001 ");
+ #endif
+ }
+
+ int tHotEnd0=intround(degHotend0());
+ int ttHotEnd0=intround(degTargetHotend0());
+
+
+ if((abs(tHotEnd0-olddegHotEnd0)>1)||force_lcd_update)
+ {
+ lcd.setCursor(1,0);
+ lcd.print(ftostr3(tHotEnd0));
+ olddegHotEnd0=tHotEnd0;
+ }
+ if((ttHotEnd0!=oldtargetHotEnd0)||force_lcd_update)
+ {
+ lcd.setCursor(5,0);
+ lcd.print(ftostr3(ttHotEnd0));
+ oldtargetHotEnd0=ttHotEnd0;
+ }
+
+ if(messagetext[0]!='\0')
+ {
+ lcd.setCursor(0,LCD_HEIGHT-1);
+ lcd.print(messagetext);
+ uint8_t n=strlen(messagetext);
+ for(int8_t i=0;i<LCD_WIDTH-n;i++)
+ lcd.print(" ");
+ messagetext[0]='\0';
+ }
+
+#endif
+ force_lcd_update=false;
+}
+
+enum {ItemP_exit, ItemP_home, ItemP_origin, ItemP_preheat, ItemP_extrude, ItemP_disstep};
+
+//any action must not contain a ',' character anywhere, or this breaks:
+#define MENUITEM(repaint_action, click_action) \
+ {\
+ if(force_lcd_update) { lcd.setCursor(0,line); repaint_action; } \
+ if((activeline==line) && CLICKED) {click_action} \
+ }
+
+void MainMenu::showPrepare()
+{
+ uint8_t line=0;
+ clearIfNecessary();
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ //Serial.println((int)(line-lineoffset));
+ switch(i)
+ {
+ case ItemP_exit:
+ MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;
+ break;
+ case ItemP_home:
+ MENUITEM( lcdprintPGM(" Auto Home") , BLOCK;enquecommand("G28 X-105 Y-105 Z0");beepshort(); ) ;
+ break;
+ case ItemP_origin:
+ MENUITEM( lcdprintPGM(" Set Origin") , BLOCK;enquecommand("G92 X0 Y0 Z0");beepshort(); ) ;
+ break;
+ case ItemP_preheat:
+ MENUITEM( lcdprintPGM(" Preheat") , BLOCK;setTargetHotend0(170);beepshort(); ) ;
+ break;
+ case ItemP_extrude:
+ MENUITEM( lcdprintPGM(" Extrude") , BLOCK;enquecommand("G92 E0");enquecommand("G1 F700 E50");beepshort(); ) ;
+ break;
+ case ItemP_disstep:
+ MENUITEM( lcdprintPGM(" Disable Steppers") , BLOCK;enquecommand("M84");beepshort(); ) ;
+ break;
+ default:
+ break;
+ }
+ line++;
+ }
+ updateActiveLines(ItemP_disstep,encoderpos);
+}
+
+enum {ItemT_exit,ItemT_speed,ItemT_flow,ItemT_nozzle,ItemT_fan};
+
+void MainMenu::showTune()
+{
+ uint8_t line=0;
+ clearIfNecessary();
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ //Serial.println((int)(line-lineoffset));
+ switch(i)
+ {
+ case ItemT_exit:
+ MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;
+ break;
+ case ItemT_speed:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Speed:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(feedmultiply));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=feedmultiply;
+ }
+ else
+ {
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<1) encoderpos=1;
+ if(encoderpos>400) encoderpos=400;
+ feedmultiply = encoderpos;
+ feedmultiplychanged=true;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemT_nozzle:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=intround(degTargetHotend0());
+ }
+ else
+ {
+ setTargetHotend0(encoderpos);
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>260) encoderpos=260;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+ }break;
+
+ case ItemT_fan:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Fan speed:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=fanpwm;
+ }
+ else
+ {
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>255) encoderpos=255;
+ fanpwm=encoderpos;
+ analogWrite(FAN_PIN, fanpwm);
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemT_flow://axis_steps_per_unit[i] = code_value();
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Flow:");
+ lcd.setCursor(13,line);lcd.print(itostr4(axis_steps_per_unit[3]));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)axis_steps_per_unit[3];
+ }
+ else
+ {
+ float factor=float(encoderpos)/float(axis_steps_per_unit[3]);
+ position[E_AXIS]=lround(position[E_AXIS]*factor);
+ //current_position[3]*=factor;
+ axis_steps_per_unit[E_AXIS]= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<5) encoderpos=5;
+ if(encoderpos>9999) encoderpos=9999;
+ lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));
+ }
+
+ }break;
+ default:
+ break;
+ }
+ line++;
+ }
+ updateActiveLines(ItemT_fan,encoderpos);
+}
+
+//does not work
+// #define MENUCHANGEITEM(repaint_action, enter_action, accept_action, change_action) \
+// {\
+// if(force_lcd_update) { lcd.setCursor(0,line); repaint_action; } \
+// if(activeline==line) \
+// { \
+// if(CLICKED) \
+// { \
+// linechanging=!linechanging; \
+// if(linechanging) {enter_action;} \
+// else {accept_action;} \
+// } \
+// else \
+// if(linechanging) {change_action};}\
+// }
+//
+
+enum {
+ ItemCT_exit,ItemCT_nozzle,
+#ifdef AUTOTEMP
+ ItemCT_autotempactive,
+ ItemCT_autotempmin,ItemCT_autotempmax,ItemCT_autotempfact,
+#endif
+ ItemCT_fan,
+ ItemCT_PID_P,ItemCT_PID_I,ItemCT_PID_D,ItemCT_PID_C
+};
+
+void MainMenu::showControlTemp()
+{
+ uint8_t line=0;
+ clearIfNecessary();
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ switch(i)
+ {
+ case ItemCT_exit:
+ MENUITEM( lcdprintPGM(" Control \003") , BLOCK;status=Main_Control;beepshort(); ) ;
+ break;
+ case ItemCT_nozzle:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=intround(degTargetHotend0());
+ }
+ else
+ {
+ setTargetHotend0(encoderpos);
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>260) encoderpos=260;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ #ifdef AUTOTEMP
+ case ItemCT_autotempmin:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" \002 Min:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(autotemp_min));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=intround(autotemp_min);
+ }
+ else
+ {
+ autotemp_min=encoderpos;
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>260) encoderpos=260;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemCT_autotempmax:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" \002 Max:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(autotemp_max));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=intround(autotemp_max);
+ }
+ else
+ {
+ autotemp_max=encoderpos;
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>260) encoderpos=260;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemCT_autotempfact:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" \002 Fact:");
+ lcd.setCursor(13,line);lcd.print(ftostr32(autotemp_factor));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=intround(autotemp_factor*100);
+ }
+ else
+ {
+ autotemp_max=encoderpos;
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>99) encoderpos=99;
+ lcd.setCursor(13,line);lcd.print(ftostr32(encoderpos/100.));
+ }
+
+ }break;
+ case ItemCT_autotempactive:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Autotemp:");
+ lcd.setCursor(13,line);
+ if(autotemp_enabled)
+ lcdprintPGM("On");
+ else
+ lcdprintPGM("Off");
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ autotemp_enabled=!autotemp_enabled;
+ lcd.setCursor(13,line);
+ if(autotemp_enabled)
+ lcdprintPGM("On ");
+ else
+ lcdprintPGM("Off");
+ BLOCK;
+ }
+
+ }break;
+ #endif //autotemp
+ case ItemCT_fan:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Fan speed:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=fanpwm;
+ }
+ else
+ {
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>255) encoderpos=255;
+ fanpwm=encoderpos;
+ analogWrite(FAN_PIN, fanpwm);
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemCT_PID_P:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" PID-P: ");
+ lcd.setCursor(13,line);lcd.print(itostr4(Kp));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)Kp;
+ }
+ else
+ {
+ Kp= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<1) encoderpos=1;
+ if(encoderpos>9990) encoderpos=9990;
+ lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));
+ }
+
+ }break;
+ case ItemCT_PID_I:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" PID-I: ");
+ lcd.setCursor(13,line);lcd.print(ftostr51(Ki/PID_dT));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)(Ki*10/PID_dT);
+ }
+ else
+ {
+ Ki= encoderpos/10.*PID_dT;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>9990) encoderpos=9990;
+ lcd.setCursor(13,line);lcd.print(ftostr51(encoderpos/10.));
+ }
+
+ }break;
+ case ItemCT_PID_D:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" PID-D: ");
+ lcd.setCursor(13,line);lcd.print(itostr4(Kd*PID_dT));
+ }
+
+ if((activeline!=line) )
+ break;
+
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)(Kd/5./PID_dT);
+ }
+ else
+ {
+ Kd= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>9990) encoderpos=9990;
+ lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));
+ }
+
+ }break;
+ case ItemCT_PID_C:
+ #ifdef PID_ADD_EXTRUSION_RATE
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" PID-C: ");
+ lcd.setCursor(13,line);lcd.print(itostr3(Kc));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)Kc;
+ }
+ else
+ {
+ Kc= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }
+ #endif
+ break;
+ default:
+ break;
+ }
+ line++;
+ }
+ #ifdef PID_ADD_EXTRUSION_RATE
+ updateActiveLines(ItemCT_PID_C,encoderpos);
+ #else
+ updateActiveLines(ItemCT_PID_D,encoderpos);
+ #endif
+}
+
+
+enum {
+ ItemCM_exit,
+ ItemCM_acc, ItemCM_xyjerk,
+ ItemCM_vmaxx, ItemCM_vmaxy, ItemCM_vmaxz, ItemCM_vmaxe,
+ ItemCM_vtravmin,ItemCM_vmin,
+ ItemCM_amaxx, ItemCM_amaxy, ItemCM_amaxz, ItemCM_amaxe,
+ ItemCM_aret,ItemCM_esteps
+};
+
+
+
+void MainMenu::showControlMotion()
+{
+ uint8_t line=0;
+ clearIfNecessary();
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ switch(i)
+ {
+ case ItemCM_exit:
+ MENUITEM( lcdprintPGM(" Control \003") , BLOCK;status=Main_Control;beepshort(); ) ;
+ break;
+ case ItemCM_acc:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Acc:");
+ lcd.setCursor(13,line);lcd.print(itostr3(acceleration/100));lcdprintPGM("00");
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)acceleration/100;
+ }
+ else
+ {
+ acceleration= encoderpos*100;
+ encoderpos=activeline*lcdslow;
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<5) encoderpos=5;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
+ }
+
+ }break;
+ case ItemCM_xyjerk: //max_xy_jerk
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Vxy-jerk: ");
+ lcd.setCursor(13,line);lcd.print(itostr3(max_xy_jerk));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)max_xy_jerk;
+ }
+ else
+ {
+ max_xy_jerk= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<1) encoderpos=1;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+
+ case ItemCM_vmaxx:
+ case ItemCM_vmaxy:
+ case ItemCM_vmaxz:
+ case ItemCM_vmaxe:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Vmax ");
+ if(i==ItemCM_vmaxx)lcdprintPGM("x:");
+ if(i==ItemCM_vmaxy)lcdprintPGM("y:");
+ if(i==ItemCM_vmaxz)lcdprintPGM("z:");
+ if(i==ItemCM_vmaxe)lcdprintPGM("e:");
+ lcd.setCursor(13,line);lcd.print(itostr3(max_feedrate[i-ItemCM_vmaxx]));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)max_feedrate[i-ItemCM_vmaxx];
+ }
+ else
+ {
+ max_feedrate[i-ItemCM_vmaxx]= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<1) encoderpos=1;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+
+ case ItemCM_vmin:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Vmin:");
+ lcd.setCursor(13,line);lcd.print(itostr3(minimumfeedrate));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)(minimumfeedrate);
+ }
+ else
+ {
+ minimumfeedrate= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemCM_vtravmin:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" VTrav min:");
+ lcd.setCursor(13,line);lcd.print(itostr3(mintravelfeedrate));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)mintravelfeedrate;
+ }
+ else
+ {
+ mintravelfeedrate= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+
+ case ItemCM_amaxx:
+ case ItemCM_amaxy:
+ case ItemCM_amaxz:
+ case ItemCM_amaxe:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Amax ");
+ if(i==ItemCM_amaxx)lcdprintPGM("x:");
+ if(i==ItemCM_amaxy)lcdprintPGM("y:");
+ if(i==ItemCM_amaxz)lcdprintPGM("z:");
+ if(i==ItemCM_amaxe)lcdprintPGM("e:");
+ lcd.setCursor(13,line);lcd.print(itostr3(max_acceleration_units_per_sq_second[i-ItemCM_amaxx]/100));lcdprintPGM("00");
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)max_acceleration_units_per_sq_second[i-ItemCM_amaxx]/100;
+ }
+ else
+ {
+ max_acceleration_units_per_sq_second[i-ItemCM_amaxx]= encoderpos*100;
+ encoderpos=activeline*lcdslow;
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<1) encoderpos=1;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
+ }
+
+ }break;
+ case ItemCM_aret://float retract_acceleration = 7000;
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" A-retract:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(retract_acceleration/100));lcdprintPGM("00");
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)retract_acceleration/100;
+ }
+ else
+ {
+ retract_acceleration= encoderpos*100;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<10) encoderpos=10;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
+ }
+
+ }break;
+ case ItemCM_esteps://axis_steps_per_unit[i] = code_value();
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Esteps/mm:");
+ lcd.setCursor(13,line);lcd.print(itostr4(axis_steps_per_unit[3]));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)axis_steps_per_unit[3];
+ }
+ else
+ {
+ float factor=float(encoderpos)/float(axis_steps_per_unit[3]);
+ position[E_AXIS]=lround(position[E_AXIS]*factor);
+ //current_position[3]*=factor;
+ axis_steps_per_unit[E_AXIS]= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<5) encoderpos=5;
+ if(encoderpos>9999) encoderpos=9999;
+ lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));
+ }
+
+ }break;
+ default:
+ break;
+ }
+ line++;
+ }
+ updateActiveLines(ItemCM_esteps,encoderpos);
+}
+
+
+enum {
+ ItemC_exit,ItemC_temp,ItemC_move,
+ ItemC_store, ItemC_load,ItemC_failsafe
+};
+
+void MainMenu::showControl()
+{
+ uint8_t line=0;
+ clearIfNecessary();
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ switch(i)
+ {
+ case ItemC_exit:
+ MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;
+ break;
+ case ItemC_temp:
+ MENUITEM( lcdprintPGM(" Temperature \x7E") , BLOCK;status=Sub_TempControl;beepshort(); ) ;
+ break;
+ case ItemC_move:
+ MENUITEM( lcdprintPGM(" Motion \x7E") , BLOCK;status=Sub_MotionControl;beepshort(); ) ;
+ break;
+ case ItemC_store:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Store EPROM");
+ }
+ if((activeline==line) && CLICKED)
+ {
+ //enquecommand("M84");
+ beepshort();
+ BLOCK;
+ EEPROM_StoreSettings();
+ }
+ }break;
+ case ItemC_load:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Load EPROM");
+ }
+ if((activeline==line) && CLICKED)
+ {
+ //enquecommand("M84");
+ beepshort();
+ BLOCK;
+ EEPROM_RetrieveSettings();
+ }
+ }break;
+ case ItemC_failsafe:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Restore Failsafe");
+ }
+ if((activeline==line) && CLICKED)
+ {
+ //enquecommand("M84");
+ beepshort();
+ BLOCK;
+ EEPROM_RetrieveSettings(true);
+ }
+ }break;
+ default:
+ break;
+ }
+ line++;
+ }
+ updateActiveLines(ItemC_failsafe,encoderpos);
+}
+
+
+
+
+
+void MainMenu::showSD()
+{
+#ifdef SDSUPPORT
+ uint8_t line=0;
+
+ clearIfNecessary();
+ static uint8_t nrfiles=0;
+ if(force_lcd_update)
+ {
+ if(card.cardOK)
+ {
+ nrfiles=card.getnrfilenames();
+ }
+ else
+ {
+ nrfiles=0;
+ lineoffset=0;
+ }
+ }
+ bool enforceupdate=false;
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ switch(i)
+ {
+ case 0:
+ MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;
+ break;
+// case 1:
+// {
+// if(force_lcd_update)
+// {
+// lcd.setCursor(0,line);
+// #ifdef CARDINSERTED
+// if(CARDINSERTED)
+// #else
+// if(true)
+// #endif
+// {
+// lcdprintPGM(" \004Refresh");
+// }
+// else
+// {
+// lcdprintPGM(" \004Insert Card");
+// }
+//
+// }
+// if((activeline==line) && CLICKED)
+// {
+// BLOCK;
+// beepshort();
+// card.initsd();
+// force_lcd_update=true;
+// nrfiles=card.getnrfilenames();
+// }
+// }break;
+ case 1:
+ MENUITEM( lcd.print(" ");card.getWorkDirName();if(card.filename[0]=='/') lcdprintPGM("\004Refresh");else {lcd.print("\005");lcd.print(card.filename);lcd.print("/..");} , BLOCK;card.updir();enforceupdate=true;lineoffset=0;beepshort(); ) ;
+
+ break;
+ default:
+ {
+ #define FIRSTITEM 2
+ if(i-FIRSTITEM<nrfiles)
+ {
+ if(force_lcd_update)
+ {
+ card.getfilename(i-FIRSTITEM);
+ //Serial.print("Filenr:");Serial.println(i-2);
+ lcd.setCursor(0,line);lcdprintPGM(" ");
+ if(card.filenameIsDir) lcd.print("\005");
+ lcd.print(card.filename);
+ }
+ if((activeline==line) && CLICKED)
+ {
+ BLOCK
+ card.getfilename(i-FIRSTITEM);
+ if(card.filenameIsDir)
+ {
+ for(int8_t i=0;i<strlen(card.filename);i++)
+ card.filename[i]=tolower(card.filename[i]);
+ card.chdir(card.filename);
+ lineoffset=0;
+ enforceupdate=true;
+ }
+ else
+ {
+ char cmd[30];
+ for(int8_t i=0;i<strlen(card.filename);i++)
+ card.filename[i]=tolower(card.filename[i]);
+ sprintf(cmd,"M23 %s",card.filename);
+ //sprintf(cmd,"M115");
+ enquecommand(cmd);
+ enquecommand("M24");
+ beep();
+ status=Main_Status;
+ lcd_status(card.filename);
+ }
+ }
+ }
+
+ }
+ break;
+ }
+ line++;
+ }
+ updateActiveLines(FIRSTITEM+nrfiles-1,encoderpos);
+ if(enforceupdate)
+ {
+ force_lcd_update=true;
+ enforceupdate=false;
+ }
+#endif
+}
+
+enum {ItemM_watch, ItemM_prepare, ItemM_control, ItemM_file };
+void MainMenu::showMainMenu()
+{
+
+ #ifndef ULTIPANEL
+ force_lcd_update=false;
+ #endif
+ if(tune)
+ {
+ if(!(movesplanned() ||card.sdprinting))
+ {
+ force_lcd_update=true;
+ tune=false;
+ }
+ }
+ else
+ {
+ if(movesplanned() ||card.sdprinting)
+ {
+ force_lcd_update=true;
+ tune=true;
+ }
+ }
+ clearIfNecessary();
+ for(int8_t line=0;line<LCD_HEIGHT;line++)
+ {
+ switch(line)
+ {
+ case ItemM_watch:
+ MENUITEM( lcdprintPGM(" Watch \003") , BLOCK;status=Main_Status;beepshort(); ) ;
+ break;
+ case ItemM_prepare:
+ MENUITEM( if(!tune) lcdprintPGM(" Prepare \x7E");else lcdprintPGM(" Tune \x7E"); , BLOCK;status=Main_Prepare;beepshort(); ) ;
+ break;
+
+ case ItemM_control:
+ MENUITEM( lcdprintPGM(" Control \x7E") , BLOCK;status=Main_Control;beepshort(); ) ;
+ break;
+ #ifdef SDSUPPORT
+ case ItemM_file:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);
+ #ifdef CARDINSERTED
+ if(CARDINSERTED)
+ #else
+ if(true)
+ #endif
+ {
+ if(card.sdprinting)
+ lcdprintPGM(" Stop Print \x7E");
+ else
+ lcdprintPGM(" Card Menu \x7E");
+ }
+ else
+ {
+ lcdprintPGM(" No Card");
+ }
+ }
+ #ifdef CARDINSERTED
+ if(CARDINSERTED)
+ #endif
+ if((activeline==line)&&CLICKED)
+ {
+ card.printingHasFinished();
+ BLOCK;
+ status=Main_SD;
+ beepshort();
+ }
+ }break;
+ #else
+ case ItemM_file:
+ break;
+ #endif
+ default:
+ SERIAL_ERROR_START;
+ SERIAL_ERRORLNPGM("Something is wrong in the MenuStructure.");
+ break;
+ }
+ }
+ updateActiveLines(3,encoderpos);
+}
+
+void MainMenu::update()
+{
+ static MainStatus oldstatus=Main_Menu; //init automatically causes foce_lcd_update=true
+ static long timeoutToStatus=0;
+ static bool oldcardstatus=false;
+ #ifdef CARDINSERTED
+ if((CARDINSERTED != oldcardstatus))
+ {
+ force_lcd_update=true;
+ oldcardstatus=CARDINSERTED;
+ //Serial.println("echo: SD CHANGE");
+ if(CARDINSERTED)
+ {
+ card.initsd();
+ LCD_MESSAGEPGM("Card inserted");
+ }
+ else
+ {
+ card.release();
+ LCD_MESSAGEPGM("Card removed");
+ }
+ }
+ #endif
+
+ if(status!=oldstatus)
+ {
+ force_lcd_update=true;
+ encoderpos=0;
+ lineoffset=0;
+
+ oldstatus=status;
+ }
+ if( (encoderpos!=lastencoderpos) || CLICKED)
+ timeoutToStatus=millis()+STATUSTIMEOUT;
+
+ switch(status)
+ {
+ case Main_Status:
+ {
+ showStatus();
+ if(CLICKED)
+ {
+ linechanging=false;
+ BLOCK
+ status=Main_Menu;
+ timeoutToStatus=millis()+STATUSTIMEOUT;
+ }
+ }break;
+ case Main_Menu:
+ {
+ showMainMenu();
+ linechanging=false;
+ }break;
+ case Main_Prepare:
+ {
+ if(tune)
+ {
+ showTune();
+ }
+ else
+ {
+ showPrepare();
+ }
+ }break;
+ case Main_Control:
+ {
+ showControl();
+ }break;
+ case Sub_MotionControl:
+ {
+ showControlMotion();
+ }break;
+ case Sub_TempControl:
+ {
+ showControlTemp();
+ }break;
+ case Main_SD:
+ {
+ showSD();
+ }break;
+ }
+
+ if(timeoutToStatus<millis())
+ status=Main_Status;
+ //force_lcd_update=false;
+ lastencoderpos=encoderpos;
+}
+
+
+
+
+
+
+// convert float to string with +123.4 format
+char *ftostr3(const float &x)
+{
+ //sprintf(conv,"%5.1f",x);
+ int xx=x;
+ conv[0]=(xx/100)%10+'0';
+ conv[1]=(xx/10)%10+'0';
+ conv[2]=(xx)%10+'0';
+ conv[3]=0;
+ return conv;
+}
+
+char *itostr2(const uint8_t &x)
+{
+ //sprintf(conv,"%5.1f",x);
+ int xx=x;
+ conv[0]=(xx/10)%10+'0';
+ conv[1]=(xx)%10+'0';
+ conv[2]=0;
+ return conv;
+}
+
+// convert float to string with +123.4 format
+char *ftostr31(const float &x)
+{
+ int xx=x*10;
+ conv[0]=(xx>=0)?'+':'-';
+ xx=abs(xx);
+ conv[1]=(xx/1000)%10+'0';
+ conv[2]=(xx/100)%10+'0';
+ conv[3]=(xx/10)%10+'0';
+ conv[4]='.';
+ conv[5]=(xx)%10+'0';
+ conv[6]=0;
+ return conv;
+}
+
+char *ftostr32(const float &x)
+{
+ int xx=x*100;
+ conv[0]=(xx>=0)?'+':'-';
+ xx=abs(xx);
+ conv[1]=(xx/100)%10+'0';
+ conv[2]='.';
+ conv[3]=(xx/10)%10+'0';
+ conv[4]=(xx)%10+'0';
+ conv[6]=0;
+ return conv;
+}
+
+char *itostr31(const int &xx)
+{
+ conv[0]=(xx>=0)?'+':'-';
+ conv[1]=(xx/1000)%10+'0';
+ conv[2]=(xx/100)%10+'0';
+ conv[3]=(xx/10)%10+'0';
+ conv[4]='.';
+ conv[5]=(xx)%10+'0';
+ conv[6]=0;
+ return conv;
+}
+
+char *itostr3(const int &xx)
+{
+ conv[0]=(xx/100)%10+'0';
+ conv[1]=(xx/10)%10+'0';
+ conv[2]=(xx)%10+'0';
+ conv[3]=0;
+ return conv;
+}
+
+char *itostr4(const int &xx)
+{
+ conv[0]=(xx/1000)%10+'0';
+ conv[1]=(xx/100)%10+'0';
+ conv[2]=(xx/10)%10+'0';
+ conv[3]=(xx)%10+'0';
+ conv[4]=0;
+ return conv;
+}
+
+// convert float to string with +1234.5 format
+char *ftostr51(const float &x)
+{
+ int xx=x*10;
+ conv[0]=(xx>=0)?'+':'-';
+ xx=abs(xx);
+ conv[1]=(xx/10000)%10+'0';
+ conv[2]=(xx/1000)%10+'0';
+ conv[3]=(xx/100)%10+'0';
+ conv[4]=(xx/10)%10+'0';
+ conv[5]='.';
+ conv[6]=(xx)%10+'0';
+ conv[7]=0;
+ return conv;
+}
+
+
+#endif //ULTRA_LCD
+
\r