chiark / gitweb /
Merged multiple extruder support.
authorErik van der Zalm <erik@vdzalm.eu>
Mon, 12 Dec 2011 18:34:37 +0000 (19:34 +0100)
committerErik van der Zalm <erik@vdzalm.eu>
Mon, 12 Dec 2011 18:34:37 +0000 (19:34 +0100)
Soft PWM. (Sanguinololu can also have PID temperature control)
Interrupt save WRITE for addresses > 0x0FF

Marlin/Configuration.h
Marlin/Marlin.h
Marlin/Marlin.pde
Marlin/fastio.h
Marlin/pins.h
Marlin/planner.cpp
Marlin/stepper.cpp
Marlin/stepper.h
Marlin/temperature.cpp
Marlin/temperature.h
Marlin/ultralcd.pde

index 346db503fd189b455a5b1a7eb632d05e4a1b9361..d4e23bd1628904ab544234b429ef1b19aed8821e 100644 (file)
@@ -4,11 +4,11 @@
 
 
 // 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
@@ -32,7 +32,7 @@
 // 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
@@ -73,7 +78,8 @@
 //// 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.
@@ -81,7 +87,8 @@
 // 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
@@ -186,7 +189,7 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
 // 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
@@ -195,11 +198,11 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
 //#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:
@@ -208,15 +211,15 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
 #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 
@@ -230,9 +233,9 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
 
 // 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.
 
@@ -283,10 +286,10 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
 // 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
@@ -298,10 +301,10 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
 
 //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
index 626f61b6c84042ed7df977c345f843428cf0fe21..d4654a38627fe018e037c2575ae64157f7a6c34e 100644 (file)
@@ -57,8 +57,6 @@ const prog_char echomagic[] PROGMEM ="echo:";
 
 #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))
index 9b765ebd05cf8f2e19616396b9526f4f6aff1249..183002fe256e9cc45377d3c8016cc5431845a287 100644 (file)
@@ -465,16 +465,16 @@ FORCE_INLINE bool code_seen(char code)
     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]);\
@@ -541,6 +541,7 @@ FORCE_INLINE void process_commands()
       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; 
@@ -723,7 +724,7 @@ FORCE_INLINE void process_commands()
       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) {
@@ -743,6 +744,10 @@ FORCE_INLINE void process_commands()
       #else
         SERIAL_ERROR_START;
         SERIAL_ERRORLNPGM("No thermistors - no temp");
+      #endif
+      #ifdef PIDTEMP
+        SERIAL_PROTOCOLPGM(" @:");
+        SERIAL_PROTOCOL(getHeaterPower(tmp_extruder));  
       #endif
         SERIAL_PROTOCOLLN("");
       return;
@@ -788,24 +793,26 @@ FORCE_INLINE void process_commands()
         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();
@@ -834,11 +841,11 @@ FORCE_INLINE void process_commands()
         {
           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(); 
@@ -1191,6 +1198,7 @@ void manage_inactivity(byte debug)
 
 void kill()
 {
+  cli(); // Stop interrupts
   disable_heater();
 
   disable_x();
@@ -1207,4 +1215,4 @@ void kill()
   while(1); // Wait for reset
 }
 
-
+\r
index 634571e3a1041c175e4205d2fdadc917a3876355..5188a0681a2fd3beeeecb30f5abc1cf1badd8a27 100644 (file)
-/*\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
index 2c2bc91445ad3d019c96448cb82fa52ad9cbcfe8..4ec22793ecd2c5c4f045bcfc848de20dd136ed44 100644 (file)
-#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
index d2179301f20ecd32c26c91256003fd380a33663e..afe2f3e83e0bbefcd62a11279dfa53cedc5af125 100644 (file)
@@ -191,8 +191,8 @@ void calculate_trapezoid_for_block(block_t *block, float entry_factor, float exi
   }
 
   #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;
index 465ab89ddf4b2ca73ef5ea41a2fdc43a88bf5b21..586ea7c95adf72ff0065d1ec8acdec39df1f1ae1 100644 (file)
@@ -57,7 +57,7 @@ volatile static unsigned long step_events_completed; // The number of step event
   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;
@@ -266,7 +266,7 @@ FORCE_INLINE void trapezoid_generator_reset() {
     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;
@@ -303,8 +303,8 @@ ISR(TIMER1_COMPA_vect)
       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 {
@@ -418,11 +418,11 @@ ISR(TIMER1_COMPA_vect)
 
     #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
@@ -437,10 +437,10 @@ ISR(TIMER1_COMPA_vect)
       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
@@ -503,7 +503,7 @@ ISR(TIMER1_COMPA_vect)
         }
         //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
@@ -532,7 +532,7 @@ ISR(TIMER1_COMPA_vect)
         }
         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
     }
@@ -557,20 +557,50 @@ ISR(TIMER1_COMPA_vect)
     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
@@ -712,7 +742,9 @@ void st_init()
     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
   
index fd388ca68bd5b338a9928cb2682dfd482ae7e8fe..faf825cf4bc76753c5a57291bd200e73bc44f5d5 100644 (file)
 
 #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();
 
index 72b89597916d9a05ff06a845adbf556a75005d21..761e136a32f497cac844f023e4f843cd5c9df6b8 100644 (file)
@@ -26,7 +26,6 @@
  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>
 
@@ -82,6 +81,7 @@ static unsigned long  previous_millis_bed_heater;
   // 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
@@ -140,6 +140,10 @@ void updatePID()
 #endif
 }
   
+int getHeaterPower(int heater) {
+  return soft_pwm[heater];
+}
+
 void manage_heater()
 {
   #ifdef USE_WATCHDOG
@@ -198,15 +202,16 @@ void manage_heater()
     }
   #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)
@@ -418,7 +423,6 @@ void tp_init()
        DIDR0 |= 1 << TEMP_0_PIN; 
     #else
        DIDR2 |= 1<<(TEMP_0_PIN - 8); 
-       ADCSRB = 1<<MUX5;
     #endif
   #endif
   #if (TEMP_1_PIN > -1)
@@ -426,7 +430,6 @@ void tp_init()
        DIDR0 |= 1<<TEMP_1_PIN; 
     #else
        DIDR2 |= 1<<(TEMP_1_PIN - 8); 
-       ADCSRB = 1<<MUX5;
     #endif
   #endif
   #if (TEMP_2_PIN > -1)
@@ -434,7 +437,6 @@ void tp_init()
        DIDR0 |= 1 << TEMP_2_PIN; 
     #else
        DIDR2 = 1<<(TEMP_2_PIN - 8); 
-       ADCSRB = 1<<MUX5;
     #endif
   #endif
   #if (TEMP_BED_PIN > -1)
@@ -442,7 +444,6 @@ void tp_init()
        DIDR0 |= 1<<TEMP_BED_PIN; 
     #else
        DIDR2 |= 1<<(TEMP_BED_PIN - 8); 
-       ADCSRB = 1<<MUX5;
     #endif
   #endif
   
@@ -506,6 +507,7 @@ void disable_heater()
 {
   #if TEMP_0_PIN > -1
   target_raw[0]=0;
+  soft_pwm[0]=0;
    #if HEATER_0_PIN > -1  
      digitalWrite(HEATER_0_PIN,LOW);
    #endif
@@ -513,6 +515,7 @@ void disable_heater()
      
   #if TEMP_1_PIN > -1
     target_raw[1]=0;
+    soft_pwm[1]=0;
     #if HEATER_1_PIN > -1 
       digitalWrite(HEATER_1_PIN,LOW);
     #endif
@@ -520,6 +523,7 @@ void disable_heater()
       
   #if TEMP_2_PIN > -1
     target_raw[2]=0;
+    soft_pwm[2]=0;
     #if HEATER_2_PIN > -1  
       digitalWrite(HEATER_2_PIN,LOW);
     #endif
@@ -533,6 +537,26 @@ void disable_heater()
   #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)
 {
@@ -543,6 +567,33 @@ 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
@@ -628,10 +679,10 @@ ISR(TIMER0_COMPB_vect)
       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.
@@ -671,21 +722,15 @@ ISR(TIMER0_COMPB_vect)
     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();
        }
     }
@@ -693,9 +738,7 @@ ISR(TIMER0_COMPB_vect)
 #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
index 15bc8a8352d97e7c46d560ac53b2158af96f90e4..aa0d6c4f591c08ee6d1af7a90cd1211266e7a433 100644 (file)
-/*\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
index 88f8f32fb31c36358c6d862a299c2c36fd06d428..d5772750d235ebe4aa8cab6ce2f8c423f29c6212 100644 (file)
-#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