Commit 50c4758a22b354ffc6d7a6bebf3d0c6ea29c6b19
authorMichel Pollet <buserror@gmail.com>
Thu, 5 Apr 2012 14:29:40 +0000 (15:29 +0100)
committerMichel Pollet <buserror@gmail.com>
Thu, 5 Apr 2012 14:29:40 +0000 (15:29 +0100)
Proto shell for a reprap emulator. Currently can run Marlin, up to a point
There are lots of stuff to add, but with a bit of luck we could use the
"pins.h" of the firmware itseld to configure the simavr board, and
have it "adapt" to various hardware boards.

Currently the fake thermistor has been moderately tested, and seems to work.
It needs more work, like linear extrapolation, target temps etc.

6 files changed:
examples/board_reprap/Makefile [new file with mode: 0644]
examples/board_reprap/marlin/pins.h [new file with mode: 0644]
examples/board_reprap/marlin/thermistortables.h [new file with mode: 0644]
examples/board_reprap/reprap.c [new file with mode: 0644]
examples/board_reprap/thermistor.c [new file with mode: 0644]
examples/board_reprap/thermistor.h [new file with mode: 0644]

diff --git a/examples/board_reprap/Makefile b/examples/board_reprap/Makefile
new file mode 100644 (file)
index 0000000..f44a3a0
--- /dev/null
@@ -0,0 +1,59 @@
+# 
+#      Copyright 2008, 2009 Michel Pollet <buserror@gmail.com>
+#
+#      This file is part of simavr.
+#
+#      simavr 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.
+#
+#      simavr 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 simavr.  If not, see <http://www.gnu.org/licenses/>.
+
+target=        reprap
+firm_src = ${wildcard atmega*.c}
+firmware = ${firm_src:.c=.hex}
+simavr = ../../
+
+SHELL   = /bin/bash
+
+IPATH = .
+IPATH += ../parts
+IPATH += ${simavr}/include
+IPATH += ${simavr}/simavr/sim
+
+VPATH = .
+VPATH += ../parts
+
+# for the Open Motion Controller board
+CFLAGS += -DMOTHERBOARD=91
+
+LDFLAGS += -lpthread -lutil
+ifneq (${shell uname}, Darwin)
+LDFLAGS += -lGL -lglut
+else
+LDFLAGS += -framework GLUT -framework OpenGL 
+endif
+
+all: obj ${firmware} ${target}
+
+include ${simavr}/Makefile.common
+
+board = ${OBJ}/${target}.elf
+
+${board} : ${OBJ}/button.o
+${board} : ${OBJ}/uart_pty.o
+${board} : ${OBJ}/thermistor.o
+${board} : ${OBJ}/${target}.o
+
+${target}: ${board}
+       @echo $@ done
+
+clean: clean-${OBJ}
+       rm -rf *.a *.axf ${target} *.vcd
diff --git a/examples/board_reprap/marlin/pins.h b/examples/board_reprap/marlin/pins.h
new file mode 100644 (file)
index 0000000..126ef34
--- /dev/null
@@ -0,0 +1,1122 @@
+#ifndef PINS_H
+#define PINS_H
+
+#if MOTHERBOARD == 99
+#define        KNOWN_BOARD 1
+
+#define X_STEP_PIN          2
+#define X_DIR_PIN           3
+#define X_ENABLE_PIN        -1
+#define X_MIN_PIN           -1
+#define X_MAX_PIN           16
+
+#define Y_STEP_PIN          5
+#define Y_DIR_PIN           6
+#define Y_ENABLE_PIN       -1
+#define Y_MIN_PIN           67
+#define Y_MAX_PIN          -1
+
+#define Z_STEP_PIN          62
+#define Z_DIR_PIN           63
+#define Z_ENABLE_PIN       -1
+#define Z_MIN_PIN           59
+#define Z_MAX_PIN          -1
+
+#define E0_STEP_PIN         65
+#define E0_DIR_PIN          66
+#define E0_ENABLE_PIN      -1
+
+#define SDPOWER            -1
+#define SDSS               53
+#define LED_PIN            -1
+#define FAN_PIN            -1
+#define PS_ON_PIN           9
+#define KILL_PIN           -1
+
+#define HEATER_0_PIN        13
+#define HEATER_1_PIN       -1
+#define HEATER_2_PIN       -1
+#define TEMP_0_PIN          6   // 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      4
+#define TEMP_BED_PIN       10
+
+#endif /* 99 */
+
+/****************************************************************************************
+* Gen7 v1.1, v1.2, v1.3, v1.4 pin assignment
+*
+****************************************************************************************/
+
+
+#if MOTHERBOARD == 13
+#define MOTHERBOARD 11
+#define GEN7_VERSION 14 // v1.4
+#endif
+
+#if MOTHERBOARD == 12
+#define MOTHERBOARD 11
+#define GEN7_VERSION 13 // v1.3
+#endif
+
+#if MOTHERBOARD == 11
+#define KNOWN_BOARD
+
+#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) && !defined(__AVR_ATmega1284P__)
+#error Oops! Make sure you have 'Gen7' selected from the 'Tools -> Boards' menu.
+
+#endif
+
+#ifndef GEN7_VERSION
+#define GEN7_VERSION 12 // v1.x
+#endif
+
+//x axis pins
+#define X_STEP_PIN 19
+#define X_DIR_PIN 18
+#define X_ENABLE_PIN 24
+#define X_MIN_PIN 7
+#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 5
+#define Y_MAX_PIN -1
+
+//z axis pins
+#define Z_STEP_PIN 26
+#define Z_DIR_PIN 25
+#define Z_ENABLE_PIN 24
+#define Z_MIN_PIN 1
+#define Z_MAX_PIN 0
+
+//extruder pins
+#define E0_STEP_PIN 28
+#define E0_DIR_PIN 27
+#define E0_ENABLE_PIN 24
+
+#define TEMP_0_PIN 1
+#define TEMP_1_PIN -1
+#define TEMP_2_PIN -1
+#define TEMP_BED_PIN 2
+
+#define HEATER_0_PIN 4
+#define HEATER_1_PIN -1
+#define HEATER_2_PIN -1
+#define HEATER_BED_PIN 3
+
+
+#define SDPOWER -1
+#define SDSS -1 // SCL pin of I2C header
+#define LED_PIN -1
+
+#if (GEN7_VERSION >= 13)
+// Gen7 v1.3 removed the fan pin
+#define FAN_PIN -1
+#else
+#define FAN_PIN 31
+#endif
+#define PS_ON_PIN 15
+
+#if (GEN7_VERSION < 14)
+// Gen 1.3 and earlier supplied thermistor power via PS_ON
+// Need to ignore the bad thermistor readings on those units
+#define BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE
+#endif
+
+//our pin for debugging.
+#define DEBUG_PIN 0
+
+//our RS485 pins
+#define TX_ENABLE_PIN 12
+#define RX_ENABLE_PIN 13
+
+#endif
+
+/*******************************************************************************
+*********
+* Gen7 Alfons3  pin assignment
+*
+********************************************************************************
+********/
+/* These Pins are assigned for the modified GEN7 Board from Alfons3 Please review the pins and adjust it for your needs*/
+
+#if MOTHERBOARD == 10
+#define KNOWN_BOARD
+
+#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) && !defined(__AVR_ATmega1284P__)
+    #error Oops!  Make sure you have 'Gen7' selected from the 'Tools -> Boards' menu.
+
+#endif
+
+//x axis pins
+    #define X_STEP_PIN      21                  //different from stanard GEN7
+    #define X_DIR_PIN       20                             //different from stanard GEN7
+    #define X_ENABLE_PIN    24
+    #define X_MIN_PIN       0
+    #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       1
+    #define Y_MAX_PIN       -1
+
+    //z axis pins
+    #define Z_STEP_PIN      26
+    #define Z_DIR_PIN       25
+    #define Z_ENABLE_PIN    24
+    #define Z_MIN_PIN       2
+    #define Z_MAX_PIN       -1
+
+    //extruder pins
+    #define E0_STEP_PIN      28
+    #define E0_DIR_PIN       27
+    #define E0_ENABLE_PIN    24
+    
+    #define TEMP_0_PIN      2
+    #define TEMP_1_PIN      -1
+    #define TEMP_2_PIN      -1
+    #define TEMP_BED_PIN        1   // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 34 bed)
+     
+    #define HEATER_0_PIN    4
+    #define HEATER_1_PIN    -1   
+    #define HEATER_2_PIN    -1
+    #define HEATER_BED_PIN      3  // (bed)
+
+    #define SDPOWER         -1
+    #define SDSS            31                  // SCL pin of I2C header || CS Pin for SD Card support
+    #define LED_PIN         -1
+
+    #define FAN_PIN         -1
+    #define PS_ON_PIN       19
+    //our pin for debugging.
+
+    #define DEBUG_PIN        -1
+
+    //our RS485 pins
+    //#define TX_ENABLE_PIN       12
+    //#define RX_ENABLE_PIN       13
+    
+    #define BEEPER -1  
+       #define SDCARDDETECT -1                 
+    #define SUICIDE_PIN -1                                             //has to be defined; otherwise Power_off doesn't work
+       
+       //Pins for 4bit LCD Support 
+    #define LCD_PINS_RS 18 
+    #define LCD_PINS_ENABLE 17
+    #define LCD_PINS_D4 16
+    #define LCD_PINS_D5 15 
+    #define LCD_PINS_D6 13
+    #define LCD_PINS_D7 14
+    
+     //buttons are directly attached
+    #define BTN_EN1 11
+    #define BTN_EN2 10
+    #define BTN_ENC 12  //the click
+    
+    #define BLEN_C 2
+    #define BLEN_B 1
+    #define BLEN_A 0
+
+    #define encrot0 0
+    #define encrot1 2
+    #define encrot2 3
+    #define encrot3 1
+#endif
+
+/****************************************************************************************
+* Arduino Mega pin assignment
+*
+****************************************************************************************/
+#if MOTHERBOARD == 3 || MOTHERBOARD == 33 || MOTHERBOARD == 34
+#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
+
+#if MOTHERBOARD == 33 || MOTHERBOARD == 34
+
+#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
+
+#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
+
+#if MOTHERBOARD == 33
+#define FAN_PIN            9 // (Sprinter config)
+#else
+#define FAN_PIN            4 // IO pin. Buffer needed
+#endif
+#define PS_ON_PIN          12
+#define KILL_PIN           -1
+
+#define HEATER_0_PIN       10   // EXTRUDER 1
+#if MOTHERBOARD == 33
+#define HEATER_1_PIN       -1
+#else
+#define HEATER_1_PIN       9    // EXTRUDER 2 (FAN On Sprinter)
+#endif
+#define HEATER_2_PIN       -1   
+#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
+
+#ifdef ULTRA_LCD
+
+  #ifdef NEWPANEL
+  //arduino pin which triggers an piezzo beeper
+    #define BEEPER 33                  // Beeper on AUX-4
+
+    #define LCD_PINS_RS 16 
+    #define LCD_PINS_ENABLE 17
+    #define LCD_PINS_D4 23
+    #define LCD_PINS_D5 25 
+    #define LCD_PINS_D6 27
+    #define LCD_PINS_D7 29
+    
+    //buttons are directly attached using AUX-2
+    #define BTN_EN1 37
+    #define BTN_EN2 35
+    #define BTN_ENC 31  //the click
+    
+    #define BLEN_C 2
+    #define BLEN_B 1
+    #define BLEN_A 0
+    
+    #define SDCARDDETECT -1            // Ramps does not use this port
+    
+      //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 33          No Beeper added
+
+    //buttons are attached to a shift register
+       // Not wired this yet
+    //#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 17
+    #define LCD_PINS_D4 23
+    #define LCD_PINS_D5 25 
+    #define LCD_PINS_D6 27
+    #define LCD_PINS_D7 29
+    
+    //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
+
+#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 MAX_SCK_PIN          52
+  #define MAX_MISO_PIN         50
+  #define MAX_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 || MOTHERBOARD == 51
+#define KNOWN_BOARD 1
+
+#ifndef __AVR_ATmega644P__
+#ifndef __AVR_ATmega1284P__
+#error Oops!  Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu.
+#endif
+#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
+    #if MOTHERBOARD == 5
+    #define HEATER_BED_PIN  -1    //changed @ rkoeppl 20110410
+    #define TEMP_BED_PIN    -1    //changed @ rkoeppl 20110410
+    #else
+    #define HEATER_BED_PIN   1    //changed @ rkoeppl 20110410
+    #define TEMP_BED_PIN     0    //changed @ rkoeppl 20110410
+    #endif
+    #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
+#undef MOTHERBOARD
+#define MOTHERBOARD 6
+#define SANGUINOLOLU_V_1_2 
+#endif
+#if MOTHERBOARD == 6
+#define KNOWN_BOARD 1
+#ifndef __AVR_ATmega644P__
+#ifndef __AVR_ATmega1284P__
+#error Oops!  Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu.
+#endif
+#endif
+
+#define X_STEP_PIN         15
+#define X_DIR_PIN          21
+#define X_MIN_PIN          18
+#define X_MAX_PIN           -1
+
+#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 10  
+
+#define HEATER_0_PIN  2
+#define TEMP_0_PIN 8   
+
+#define HEATER_1_PIN 3
+#define TEMP_1_PIN 9
+
+#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
+#define SUICIDE_PIN        54  //PIN that has to be turned on right after start, to keep power flowing.
+
+#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
+
+    #define SDCARDDETECT -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
+
+#if MOTHERBOARD == 71
+#define KNOWN_BOARD
+/*****************************************************************
+* Ultimaker pin assignment (Old electronics)
+******************************************************************/
+
+#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 15
+#define X_MAX_PIN 14
+#define X_ENABLE_PIN 27
+
+#define Y_STEP_PIN 31
+#define Y_DIR_PIN 33
+#define Y_MIN_PIN 17
+#define Y_MAX_PIN 16
+#define Y_ENABLE_PIN 29
+
+#define Z_STEP_PIN 37 
+#define Z_DIR_PIN 39
+#define Z_MIN_PIN 19
+#define Z_MAX_PIN 18
+#define Z_ENABLE_PIN 35
+
+#define HEATER_BED_PIN -1 
+#define TEMP_BED_PIN -1  
+
+#define HEATER_0_PIN  2
+#define TEMP_0_PIN 8   
+
+#define HEATER_1_PIN 1
+#define TEMP_1_PIN 1
+
+#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         -1
+#define E1_DIR_PIN          -1
+#define E1_ENABLE_PIN       -1
+
+#define SDPOWER            -1
+#define SDSS               -1
+#define LED_PIN            -1
+#define FAN_PIN            -1
+#define PS_ON_PIN          -1
+#define KILL_PIN           -1
+#define SUICIDE_PIN        -1  //PIN that has to be turned on right after start, to keep power flowing.
+
+#define LCD_PINS_RS 24 
+#define LCD_PINS_ENABLE 22
+#define LCD_PINS_D4 36
+#define LCD_PINS_D5 34 
+#define LCD_PINS_D6 32
+#define LCD_PINS_D7 30
+
+#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
+
+/****************************************************************************************
+* Gen3+ pin assignment
+*
+****************************************************************************************/
+#if MOTHERBOARD == 9
+#define MOTHERBOARD 6
+#define KNOWN_BOARD 1
+#ifndef __AVR_ATmega644P__
+#ifndef __AVR_ATmega1284P__
+#error Oops!  Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu.
+#endif
+#endif
+
+#define X_STEP_PIN         15
+#define X_DIR_PIN          18
+#define X_MIN_PIN          20
+#define X_MAX_PIN           -1
+
+#define Y_STEP_PIN         23
+#define Y_DIR_PIN          22
+#define Y_MIN_PIN          25
+#define Y_MAX_PIN          -1
+
+#define Z_STEP_PIN         27
+#define Z_DIR_PIN          28
+#define Z_MIN_PIN          30
+#define Z_MAX_PIN          -1
+
+#define E_STEP_PIN         17
+#define E_DIR_PIN          21
+
+#define LED_PIN            -1
+
+#define FAN_PIN            -1 
+
+#define PS_ON_PIN         14
+#define KILL_PIN           -1
+
+#define HEATER_0_PIN       12 // (extruder)
+
+#define HEATER_1_PIN       16 // (bed)
+#define X_ENABLE_PIN       19
+#define Y_ENABLE_PIN       24
+#define Z_ENABLE_PIN       29
+#define E_ENABLE_PIN       13
+
+#define TEMP_0_PIN          0   // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 33 extruder)
+#define TEMP_1_PIN          5   // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!! (pin 34 bed)
+#define TEMP_2_PIN         -1
+#define SDPOWER            -1
+#define SDSS               4
+#define HEATER_2_PIN       -1
+
+#endif
+
+
+
+/****************************************************************************************
+* Open Motion controller with enable based extruders
+*
+*                        ATMega644
+*
+*                        +---\/---+
+*            (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 == 90 //Alpha OMCA board
+#define KNOWN_BOARD 1
+
+#ifndef __AVR_ATmega644__
+#error Oops!  Make sure you have 'SanguinoA' selected from the 'Tools -> Boards' menu.
+#endif
+
+#define X_STEP_PIN         21
+#define X_DIR_PIN          20
+#define X_ENABLE_PIN       24
+#define X_MIN_PIN          0
+#define X_MAX_PIN          -1
+
+#define Y_STEP_PIN         23
+#define Y_DIR_PIN          22
+#define Y_ENABLE_PIN       24
+#define Y_MIN_PIN          1
+#define Y_MAX_PIN          -1
+
+#define Z_STEP_PIN         26
+#define Z_DIR_PIN          25
+#define Z_ENABLE_PIN       24
+#define Z_MIN_PIN          2
+#define Z_MAX_PIN          -1
+
+#define E0_STEP_PIN         28
+#define E0_DIR_PIN          27
+#define E0_ENABLE_PIN       24
+
+#define E1_STEP_PIN         -1 // 19
+#define E1_DIR_PIN          -1 // 18
+#define E1_ENABLE_PIN       24
+
+#define E2_STEP_PIN         -1 // 17
+#define E2_DIR_PIN          -1 // 16
+#define E2_ENABLE_PIN       24
+
+#define SDPOWER            -1
+#define SDSS               11
+#define SDCARDDETECT       -1 // 10 optional also used as mode pin
+#define LED_PIN            -1
+#define FAN_PIN            3
+#define PS_ON_PIN          -1
+#define KILL_PIN           -1
+
+#define HEATER_0_PIN       4
+#define HEATER_1_PIN       -1 // 12 
+#define HEATER_2_PIN       -1 // 13
+#define TEMP_0_PIN          0 //D27   // MUST USE ANALOG INPUT NUMBERING NOT DIGITAL OUTPUT NUMBERING!!!!!!!!!
+#define TEMP_1_PIN         -1 // 1
+#define TEMP_2_PIN         -1 // 2
+#define HEATER_BED_PIN     -1 // 14/15
+#define TEMP_BED_PIN       -1 // 1,2 or I2C
+/*  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
+
+#if MOTHERBOARD == 91  // Final OMCA board -- REF http://sanguino.cc/hardware
+#define KNOWN_BOARD 1
+
+#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__)
+#error Oops!  Make sure you have 'Sanguino' selected from the 'Tools -> Boards' menu. (Final OMCA board)
+#endif
+
+#define X_STEP_PIN         26
+#define X_DIR_PIN          25
+#define X_ENABLE_PIN       10
+#define X_MIN_PIN          0
+#define X_MAX_PIN          -1
+
+#define Y_STEP_PIN         28
+#define Y_DIR_PIN          27
+#define Y_ENABLE_PIN       10
+#define Y_MIN_PIN          1
+#define Y_MAX_PIN          -1
+
+#define Z_STEP_PIN         23
+#define Z_DIR_PIN          22
+#define Z_ENABLE_PIN       10
+#define Z_MIN_PIN          2
+#define Z_MAX_PIN          -1
+
+#define E0_STEP_PIN         24
+#define E0_DIR_PIN          21
+#define E0_ENABLE_PIN       10
+
+/* future proofing */
+#define __FS   20
+#define __FD   19
+#define __GS   18
+#define __GD   13
+
+#define UNUSED_PWM           14        /* PWM on LEFT connector */
+
+#define E1_STEP_PIN         -1 // 21
+#define E1_DIR_PIN          -1 // 20
+#define E1_ENABLE_PIN       -1 // 19
+
+#define E2_STEP_PIN         -1 // 21
+#define E2_DIR_PIN          -1 // 20
+#define E2_ENABLE_PIN       -1 // 18
+
+#define SDPOWER            -1
+#define SDSS               11
+#define SDCARDDETECT       -1 // 10 optional also used as mode pin
+#define LED_PIN            -1
+#define FAN_PIN            14 /* PWM on MIDDLE connector */
+#define PS_ON_PIN          -1
+#define KILL_PIN           -1
+
+#define HEATER_0_PIN        3 /*DONE PWM on RIGHT connector */
+#define HEATER_1_PIN       -1 
+#define HEATER_2_PIN       -1
+#define HEATER_1_PIN       -1 
+#define HEATER_2_PIN       -1
+#define TEMP_0_PIN          0 // ANALOG INPUT NUMBERING 
+#define TEMP_1_PIN          1 // ANALOG
+#define TEMP_2_PIN             2 // ANALOG -- used for Case fan
+#define HEATER_BED_PIN      4
+#define TEMP_BED_PIN        2 // 1,2 or I2C
+
+#define CONTROLLERFAN_SENSE_PIN                15
+
+#define I2C_SCL                                16
+#define I2C_SDA                                17
+
+#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, HEATER_0_PIN, 
+#if EXTRUDERS > 1
+  #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, HEATER_1_PIN,
+#else
+  #define _E1_PINS
+#endif
+#if EXTRUDERS > 2
+  #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, HEATER_2_PIN,
+#else
+  #define _E2_PINS
+#endif
+
+#ifdef DISABLE_MAX_ENDSTOPS
+#define X_MAX_PIN          -1
+#define Y_MAX_PIN          -1
+#define Z_MAX_PIN          -1
+#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_BED_PIN, FAN_PIN,                  \
+                        _E0_PINS _E1_PINS _E2_PINS             \
+                        TEMP_0_PIN, TEMP_1_PIN, TEMP_2_PIN, TEMP_BED_PIN }
+#endif
diff --git a/examples/board_reprap/marlin/thermistortables.h b/examples/board_reprap/marlin/thermistortables.h
new file mode 100644 (file)
index 0000000..2723d86
--- /dev/null
@@ -0,0 +1,373 @@
+#ifndef THERMISTORTABLES_H_
+#define THERMISTORTABLES_H_
+
+//#include "Marlin.h"
+
+#define OVERSAMPLENR 16
+
+#if (THERMISTORHEATER_0 == 1) || (THERMISTORHEATER_1 == 1)  || (THERMISTORHEATER_2 == 1) || (THERMISTORBED == 1) //100k bed thermistor
+
+const short temptable_1[][2] PROGMEM = {
+{       23*OVERSAMPLENR ,       300     },
+{       25*OVERSAMPLENR ,       295     },
+{       27*OVERSAMPLENR ,       290     },
+{       28*OVERSAMPLENR ,       285     },
+{       31*OVERSAMPLENR ,       280     },
+{       33*OVERSAMPLENR ,       275     },
+{       35*OVERSAMPLENR ,       270     },
+{       38*OVERSAMPLENR ,       265     },
+{       41*OVERSAMPLENR ,       260     },
+{       44*OVERSAMPLENR ,       255     },
+{       48*OVERSAMPLENR ,       250     },
+{       52*OVERSAMPLENR ,       245     },
+{       56*OVERSAMPLENR ,       240     },
+{       61*OVERSAMPLENR ,       235     },
+{       66*OVERSAMPLENR ,       230     },
+{       71*OVERSAMPLENR ,       225     },
+{       78*OVERSAMPLENR ,       220     },
+{       84*OVERSAMPLENR ,       215     },
+{       92*OVERSAMPLENR ,       210     },
+{       100*OVERSAMPLENR        ,       205     },
+{       109*OVERSAMPLENR        ,       200     },
+{       120*OVERSAMPLENR        ,       195     },
+{       131*OVERSAMPLENR        ,       190     },
+{       143*OVERSAMPLENR        ,       185     },
+{       156*OVERSAMPLENR        ,       180     },
+{       171*OVERSAMPLENR        ,       175     },
+{       187*OVERSAMPLENR        ,       170     },
+{       205*OVERSAMPLENR        ,       165     },
+{       224*OVERSAMPLENR        ,       160     },
+{       245*OVERSAMPLENR        ,       155     },
+{       268*OVERSAMPLENR        ,       150     },
+{       293*OVERSAMPLENR        ,       145     },
+{       320*OVERSAMPLENR        ,       140     },
+{       348*OVERSAMPLENR        ,       135     },
+{       379*OVERSAMPLENR        ,       130     },
+{       411*OVERSAMPLENR        ,       125     },
+{       445*OVERSAMPLENR        ,       120     },
+{       480*OVERSAMPLENR        ,       115     },
+{       516*OVERSAMPLENR        ,       110     },
+{       553*OVERSAMPLENR        ,       105     },
+{       591*OVERSAMPLENR        ,       100     },
+{       628*OVERSAMPLENR        ,       95      },
+{       665*OVERSAMPLENR        ,       90      },
+{       702*OVERSAMPLENR        ,       85      },
+{       737*OVERSAMPLENR        ,       80      },
+{       770*OVERSAMPLENR        ,       75      },
+{       801*OVERSAMPLENR        ,       70      },
+{       830*OVERSAMPLENR        ,       65      },
+{       857*OVERSAMPLENR        ,       60      },
+{       881*OVERSAMPLENR        ,       55      },
+{       903*OVERSAMPLENR        ,       50      },
+{       922*OVERSAMPLENR        ,       45      },
+{       939*OVERSAMPLENR        ,       40      },
+{       954*OVERSAMPLENR        ,       35      },
+{       966*OVERSAMPLENR        ,       30      },
+{       977*OVERSAMPLENR        ,       25      },
+{       985*OVERSAMPLENR        ,       20      },
+{       993*OVERSAMPLENR        ,       15      },
+{       999*OVERSAMPLENR        ,       10      },
+{       1004*OVERSAMPLENR       ,       5       },
+{       1008*OVERSAMPLENR       ,       0       } //safety
+};
+#endif
+#if (THERMISTORHEATER_0 == 2) || (THERMISTORHEATER_1 == 2) || (THERMISTORHEATER_2 == 2) || (THERMISTORBED == 2) //200k bed thermistor
+const short temptable_2[][2] PROGMEM = {
+   {1*OVERSAMPLENR, 848},
+   {54*OVERSAMPLENR, 275},
+   {107*OVERSAMPLENR, 228},
+   {160*OVERSAMPLENR, 202},
+   {213*OVERSAMPLENR, 185},
+   {266*OVERSAMPLENR, 171},
+   {319*OVERSAMPLENR, 160},
+   {372*OVERSAMPLENR, 150},
+   {425*OVERSAMPLENR, 141},
+   {478*OVERSAMPLENR, 133},
+   {531*OVERSAMPLENR, 125},
+   {584*OVERSAMPLENR, 118},
+   {637*OVERSAMPLENR, 110},
+   {690*OVERSAMPLENR, 103},
+   {743*OVERSAMPLENR, 95},
+   {796*OVERSAMPLENR, 86},
+   {849*OVERSAMPLENR, 77},
+   {902*OVERSAMPLENR, 65},
+   {955*OVERSAMPLENR, 49},
+   {1008*OVERSAMPLENR, 17},
+   {1020*OVERSAMPLENR, 0} //safety
+};
+
+#endif
+#if (THERMISTORHEATER_0 == 3) || (THERMISTORHEATER_1 == 3) || (THERMISTORHEATER_2 == 3) || (THERMISTORBED == 3) //mendel-parts
+const short temptable_3[][2] PROGMEM = {
+                {1*OVERSAMPLENR,864},
+                {21*OVERSAMPLENR,300},
+                {25*OVERSAMPLENR,290},
+                {29*OVERSAMPLENR,280},
+                {33*OVERSAMPLENR,270},
+                {39*OVERSAMPLENR,260},
+                {46*OVERSAMPLENR,250},
+                {54*OVERSAMPLENR,240},
+                {64*OVERSAMPLENR,230},
+                {75*OVERSAMPLENR,220},
+                {90*OVERSAMPLENR,210},
+                {107*OVERSAMPLENR,200},
+                {128*OVERSAMPLENR,190},
+                {154*OVERSAMPLENR,180},
+                {184*OVERSAMPLENR,170},
+                {221*OVERSAMPLENR,160},
+                {265*OVERSAMPLENR,150},
+                {316*OVERSAMPLENR,140},
+                {375*OVERSAMPLENR,130},
+                {441*OVERSAMPLENR,120},
+                {513*OVERSAMPLENR,110},
+                {588*OVERSAMPLENR,100},
+                {734*OVERSAMPLENR,80},
+                {856*OVERSAMPLENR,60},
+                {938*OVERSAMPLENR,40},
+                {986*OVERSAMPLENR,20},
+                {1008*OVERSAMPLENR,0},
+                {1018*OVERSAMPLENR,-20}
+        };
+
+#endif
+#if (THERMISTORHEATER_0 == 4) || (THERMISTORHEATER_1 == 4) || (THERMISTORHEATER_2 == 4) || (THERMISTORBED == 4) //10k thermistor
+const short temptable_4[][2] PROGMEM = {
+   {1*OVERSAMPLENR, 430},
+   {54*OVERSAMPLENR, 137},
+   {107*OVERSAMPLENR, 107},
+   {160*OVERSAMPLENR, 91},
+   {213*OVERSAMPLENR, 80},
+   {266*OVERSAMPLENR, 71},
+   {319*OVERSAMPLENR, 64},
+   {372*OVERSAMPLENR, 57},
+   {425*OVERSAMPLENR, 51},
+   {478*OVERSAMPLENR, 46},
+   {531*OVERSAMPLENR, 41},
+   {584*OVERSAMPLENR, 35},
+   {637*OVERSAMPLENR, 30},
+   {690*OVERSAMPLENR, 25},
+   {743*OVERSAMPLENR, 20},
+   {796*OVERSAMPLENR, 14},
+   {849*OVERSAMPLENR, 7},
+   {902*OVERSAMPLENR, 0},
+   {955*OVERSAMPLENR, -11},
+   {1008*OVERSAMPLENR, -35}
+};
+#endif
+
+#if (THERMISTORHEATER_0 == 5) || (THERMISTORHEATER_1 == 5) || (THERMISTORHEATER_2 == 5) || (THERMISTORBED == 5) //100k ParCan thermistor (104GT-2)
+const short temptable_5[][2] PROGMEM = {
+{1*OVERSAMPLENR, 713},
+{18*OVERSAMPLENR, 316},
+{35*OVERSAMPLENR, 266},
+{52*OVERSAMPLENR, 239},
+{69*OVERSAMPLENR, 221},
+{86*OVERSAMPLENR, 208},
+{103*OVERSAMPLENR, 197},
+{120*OVERSAMPLENR, 188},
+{137*OVERSAMPLENR, 181},
+{154*OVERSAMPLENR, 174},
+{171*OVERSAMPLENR, 169},
+{188*OVERSAMPLENR, 163},
+{205*OVERSAMPLENR, 159},
+{222*OVERSAMPLENR, 154},
+{239*OVERSAMPLENR, 150},
+{256*OVERSAMPLENR, 147},
+{273*OVERSAMPLENR, 143},
+{290*OVERSAMPLENR, 140},
+{307*OVERSAMPLENR, 136},
+{324*OVERSAMPLENR, 133},
+{341*OVERSAMPLENR, 130},
+{358*OVERSAMPLENR, 128},
+{375*OVERSAMPLENR, 125},
+{392*OVERSAMPLENR, 122},
+{409*OVERSAMPLENR, 120},
+{426*OVERSAMPLENR, 117},
+{443*OVERSAMPLENR, 115},
+{460*OVERSAMPLENR, 112},
+{477*OVERSAMPLENR, 110},
+{494*OVERSAMPLENR, 108},
+{511*OVERSAMPLENR, 106},
+{528*OVERSAMPLENR, 103},
+{545*OVERSAMPLENR, 101},
+{562*OVERSAMPLENR, 99},
+{579*OVERSAMPLENR, 97},
+{596*OVERSAMPLENR, 95},
+{613*OVERSAMPLENR, 92},
+{630*OVERSAMPLENR, 90},
+{647*OVERSAMPLENR, 88},
+{664*OVERSAMPLENR, 86},
+{681*OVERSAMPLENR, 84},
+{698*OVERSAMPLENR, 81},
+{715*OVERSAMPLENR, 79},
+{732*OVERSAMPLENR, 77},
+{749*OVERSAMPLENR, 75},
+{766*OVERSAMPLENR, 72},
+{783*OVERSAMPLENR, 70},
+{800*OVERSAMPLENR, 67},
+{817*OVERSAMPLENR, 64},
+{834*OVERSAMPLENR, 61},
+{851*OVERSAMPLENR, 58},
+{868*OVERSAMPLENR, 55},
+{885*OVERSAMPLENR, 52},
+{902*OVERSAMPLENR, 48},
+{919*OVERSAMPLENR, 44},
+{936*OVERSAMPLENR, 40},
+{953*OVERSAMPLENR, 34},
+{970*OVERSAMPLENR, 28},
+{987*OVERSAMPLENR, 20},
+{1004*OVERSAMPLENR, 8},
+{1021*OVERSAMPLENR, 0}
+};
+#endif
+
+#if (THERMISTORHEATER_0 == 6) || (THERMISTORHEATER_1 == 6) || (THERMISTORHEATER_2 == 6) || (THERMISTORBED == 6) // 100k Epcos thermistor
+const short temptable_6[][2] PROGMEM = {
+   {28*OVERSAMPLENR, 250},
+   {31*OVERSAMPLENR, 245},
+   {35*OVERSAMPLENR, 240},
+   {39*OVERSAMPLENR, 235},
+   {42*OVERSAMPLENR, 230},
+   {44*OVERSAMPLENR, 225},
+   {49*OVERSAMPLENR, 220},
+   {53*OVERSAMPLENR, 215},
+   {62*OVERSAMPLENR, 210},
+   {73*OVERSAMPLENR, 205},
+   {72*OVERSAMPLENR, 200},
+   {94*OVERSAMPLENR, 190},
+   {102*OVERSAMPLENR, 185},
+   {116*OVERSAMPLENR, 170},
+   {143*OVERSAMPLENR, 160},
+   {183*OVERSAMPLENR, 150},
+   {223*OVERSAMPLENR, 140},
+   {270*OVERSAMPLENR, 130},
+   {318*OVERSAMPLENR, 120},
+   {383*OVERSAMPLENR, 110},
+   {413*OVERSAMPLENR, 105},
+   {439*OVERSAMPLENR, 100},
+   {484*OVERSAMPLENR, 95},
+   {513*OVERSAMPLENR, 90},
+   {607*OVERSAMPLENR, 80},
+   {664*OVERSAMPLENR, 70},
+   {781*OVERSAMPLENR, 60},
+   {810*OVERSAMPLENR, 55},
+   {849*OVERSAMPLENR, 50},
+   {914*OVERSAMPLENR, 45},
+   {914*OVERSAMPLENR, 40},
+   {935*OVERSAMPLENR, 35},
+   {954*OVERSAMPLENR, 30},
+   {970*OVERSAMPLENR, 25},
+   {978*OVERSAMPLENR, 22},
+   {1008*OVERSAMPLENR, 3}
+};
+#endif
+
+#if (THERMISTORHEATER_0 == 7) || (THERMISTORHEATER_1 == 7) || (THERMISTORHEATER_2 == 7) || (THERMISTORBED == 7) // 100k Honeywell 135-104LAG-J01
+const short temptable_7[][2] PROGMEM = {
+   {46*OVERSAMPLENR, 270},
+   {50*OVERSAMPLENR, 265},
+   {54*OVERSAMPLENR, 260},
+   {58*OVERSAMPLENR, 255},
+   {62*OVERSAMPLENR, 250},
+   {67*OVERSAMPLENR, 245},
+   {72*OVERSAMPLENR, 240},
+   {79*OVERSAMPLENR, 235},
+   {85*OVERSAMPLENR, 230},
+   {91*OVERSAMPLENR, 225},
+   {99*OVERSAMPLENR, 220},
+   {107*OVERSAMPLENR, 215},
+   {116*OVERSAMPLENR, 210},
+   {126*OVERSAMPLENR, 205},
+   {136*OVERSAMPLENR, 200},
+   {149*OVERSAMPLENR, 195},
+   {160*OVERSAMPLENR, 190},
+   {175*OVERSAMPLENR, 185},
+   {191*OVERSAMPLENR, 180},
+   {209*OVERSAMPLENR, 175},
+   {224*OVERSAMPLENR, 170},
+   {246*OVERSAMPLENR, 165},
+   {267*OVERSAMPLENR, 160},
+   {293*OVERSAMPLENR, 155},
+   {316*OVERSAMPLENR, 150},
+   {340*OVERSAMPLENR, 145},
+   {364*OVERSAMPLENR, 140},
+   {396*OVERSAMPLENR, 135},
+   {425*OVERSAMPLENR, 130},
+   {460*OVERSAMPLENR, 125},
+   {489*OVERSAMPLENR, 120},
+   {526*OVERSAMPLENR, 115},
+   {558*OVERSAMPLENR, 110},
+   {591*OVERSAMPLENR, 105},
+   {628*OVERSAMPLENR, 100},
+   {660*OVERSAMPLENR, 95},
+   {696*OVERSAMPLENR, 90},
+   {733*OVERSAMPLENR, 85},
+   {761*OVERSAMPLENR, 80},
+   {794*OVERSAMPLENR, 75},
+   {819*OVERSAMPLENR, 70},
+   {847*OVERSAMPLENR, 65},
+   {870*OVERSAMPLENR, 60},
+   {892*OVERSAMPLENR, 55},
+   {911*OVERSAMPLENR, 50},
+   {929*OVERSAMPLENR, 45},
+   {944*OVERSAMPLENR, 40},
+   {959*OVERSAMPLENR, 35},
+   {971*OVERSAMPLENR, 30},
+   {981*OVERSAMPLENR, 25},
+   {989*OVERSAMPLENR, 20},
+   {994*OVERSAMPLENR, 15},
+   {1001*OVERSAMPLENR, 10},
+   {1005*OVERSAMPLENR, 5}
+};
+#endif
+
+#define _TT_NAME(_N) temptable_ ## _N
+#define TT_NAME(_N) _TT_NAME(_N)
+
+#ifdef THERMISTORHEATER_0
+  #define heater_0_temptable TT_NAME(THERMISTORHEATER_0)
+  #define heater_0_temptable_len (sizeof(heater_0_temptable)/sizeof(*heater_0_temptable))
+#else
+#ifdef HEATER_0_USES_THERMISTOR
+  #error No heater 0 thermistor table specified
+#else  // HEATER_0_USES_THERMISTOR
+  #define heater_0_temptable 0
+  #define heater_0_temptable_len 0
+#endif // HEATER_0_USES_THERMISTOR
+#endif
+
+#ifdef THERMISTORHEATER_1
+  #define heater_1_temptable TT_NAME(THERMISTORHEATER_1)
+  #define heater_1_temptable_len (sizeof(heater_1_temptable)/sizeof(*heater_1_temptable))
+#else
+#ifdef HEATER_1_USES_THERMISTOR
+  #error No heater 1 thermistor table specified
+#else  // HEATER_1_USES_THERMISTOR
+  #define heater_1_temptable 0
+  #define heater_1_temptable_len 0
+#endif // HEATER_1_USES_THERMISTOR
+#endif
+
+#ifdef THERMISTORHEATER_2
+  #define heater_2_temptable TT_NAME(THERMISTORHEATER_2)
+  #define heater_2_temptable_len (sizeof(heater_2_temptable)/sizeof(*heater_2_temptable))
+#else
+#ifdef HEATER_2_USES_THERMISTOR
+  #error No heater 2 thermistor table specified
+#else  // HEATER_2_USES_THERMISTOR
+  #define heater_2_temptable 0
+  #define heater_2_temptable_len 0
+#endif // HEATER_2_USES_THERMISTOR
+#endif
+
+#ifdef THERMISTORBED
+  #define bedtemptable TT_NAME(THERMISTORBED)
+  #define bedtemptable_len (sizeof(bedtemptable)/sizeof(*bedtemptable))
+#else
+#ifdef BED_USES_THERMISTOR
+  #error No bed thermistor table specified
+#endif // BED_USES_THERMISTOR
+#endif
+
+#endif //THERMISTORTABLES_H_
+
diff --git a/examples/board_reprap/reprap.c b/examples/board_reprap/reprap.c
new file mode 100644 (file)
index 0000000..5bdc93b
--- /dev/null
@@ -0,0 +1,286 @@
+/*
+       simduino.c
+
+       Copyright 2008, 2009 Michel Pollet <buserror@gmail.com>
+
+       This file is part of simavr.
+
+       simavr 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.
+
+       simavr 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 simavr.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <libgen.h>
+
+#if __APPLE__
+#include <GLUT/glut.h>
+#else
+#include <GL/glut.h>
+#endif
+#include <pthread.h>
+
+#include "sim_avr.h"
+#include "avr_ioport.h"
+#include "sim_elf.h"
+#include "sim_hex.h"
+#include "sim_gdb.h"
+#include "sim_vcd_file.h"
+
+#include "button.h"
+#include "thermistor.h"
+#include "uart_pty.h"
+
+#define __AVR_ATmega644__
+#include "marlin/pins.h"
+
+#define PROGMEM
+#define THERMISTORHEATER_0 5
+#include "marlin/thermistortables.h"
+
+thermistor_t   therm_hotend;
+thermistor_t   therm_hotbed;
+button_t button;
+uart_pty_t uart_pty;
+int do_button_press = 0;
+avr_t * avr = NULL;
+avr_vcd_t vcd_file;
+uint8_t        pin_state = 0;  // current port B
+
+float pixsize = 64;
+int window;
+
+/*
+ * called when the AVR change any of the pins on port B
+ * so lets update our buffer
+ */
+void pin_changed_hook(struct avr_irq_t * irq, uint32_t value, void * param)
+{
+//     pin_state = (pin_state & ~(1 << irq->irq)) | (value << irq->irq);
+}
+
+void displayCB(void)           /* function called whenever redisplay needed */
+{
+       // OpenGL rendering goes here...
+       glClear(GL_COLOR_BUFFER_BIT);
+
+       // Set up modelview matrix
+       glMatrixMode(GL_MODELVIEW); // Select modelview matrix
+       glLoadIdentity(); // Start with an identity matrix
+
+       //float grid = pixsize;
+       //float size = grid * 0.8;
+    glBegin(GL_QUADS);
+       glColor3f(1,0,0);
+
+#if 0
+       for (int di = 0; di < 8; di++) {
+               char on = (pin_state & (1 << di)) != 0;
+               if (on) {
+                       float x = (di) * grid;
+                       float y = 0; //(si * grid * 8) + (di * grid);
+                       glVertex2f(x + size, y + size);
+                       glVertex2f(x, y + size);
+                       glVertex2f(x, y);
+                       glVertex2f(x + size, y);
+               }
+       }
+#endif
+    glEnd();
+    glutSwapBuffers();
+    //glFlush();                               /* Complete any pending operations */
+}
+
+void keyCB(unsigned char key, int x, int y)    /* called on key press */
+{
+       if (key == 'q')
+               exit(0);
+       //static uint8_t buf[64];
+       switch (key) {
+               case 'q':
+               case 0x1f: // escape
+                       exit(0);
+                       break;
+               case ' ':
+                       do_button_press++; // pass the message to the AVR thread
+                       break;
+               case 'r':
+                       printf("Starting VCD trace\n");
+                       avr_vcd_start(&vcd_file);
+                       break;
+               case 's':
+                       printf("Stopping VCD trace\n");
+                       avr_vcd_stop(&vcd_file);
+                       break;
+       }
+}
+
+// gl timer. if the pin have changed states, refresh display
+void timerCB(int i)
+{
+       //static uint8_t oldstate = 0xff;
+       // restart timer
+       glutTimerFunc(1000/64, timerCB, 0);
+#if 0
+       if (oldstate != pin_state) {
+               oldstate = pin_state;
+               glutPostRedisplay();
+       }
+#endif
+}
+
+static void * avr_run_thread(void * oaram)
+{
+//     int b_press = do_button_press;
+
+       while (1) {
+               int state = avr_run(avr);
+               if ( state == cpu_Done || state == cpu_Crashed)
+                       break;
+       }
+       return NULL;
+}
+
+
+char avr_flash_path[1024];
+int avr_flash_fd = 0;
+
+// avr special flash initalization
+// here: open and map a file to enable a persistent storage for the flash memory
+void avr_special_init( avr_t * avr)
+{
+       // open the file
+       avr_flash_fd = open(avr_flash_path, O_RDWR|O_CREAT, 0644);
+       if (avr_flash_fd < 0) {
+               perror(avr_flash_path);
+               exit(1);
+       }
+       // resize and map the file the file
+       (void)ftruncate(avr_flash_fd, avr->flashend + 1);
+       ssize_t r = read(avr_flash_fd, avr->flash, avr->flashend + 1);
+       if (r != avr->flashend + 1) {
+               fprintf(stderr, "unable to load flash memory\n");
+               perror(avr_flash_path);
+               exit(1);
+       }
+}
+
+// avr special flash deinitalization
+// here: cleanup the persistent storage
+void avr_special_deinit( avr_t* avr)
+{
+       puts(__func__);
+       lseek(avr_flash_fd, SEEK_SET, 0);
+       ssize_t r = write(avr_flash_fd, avr->flash, avr->flashend + 1);
+       if (r != avr->flashend + 1) {
+               fprintf(stderr, "unable to load flash memory\n");
+               perror(avr_flash_path);
+       }
+       close(avr_flash_fd);
+       uart_pty_stop(&uart_pty);
+}
+
+int main(int argc, char *argv[])
+{
+       int debug = 0;
+
+       for (int i = 1; i < argc; i++)
+               if (!strcmp(argv[i], "-d"))
+                       debug++;
+       avr = avr_make_mcu_by_name("atmega644");
+       if (!avr) {
+               fprintf(stderr, "%s: Error creating the AVR core\n", argv[0]);
+               exit(1);
+       }
+//     snprintf(avr_flash_path, sizeof(avr_flash_path), "%s/%s", pwd, "simduino_flash.bin");
+       strcpy(avr_flash_path,  "reprap_flash.bin");
+       // register our own functions
+       avr->special_init = avr_special_init;
+       avr->special_deinit = avr_special_deinit;
+       avr_init(avr);
+       avr->frequency = 20000000;
+       avr->aref = avr->avcc = avr->vcc = 5 * 1000;    // needed for ADC
+
+       if (1) {
+               elf_firmware_t f;
+               const char * fname = "/opt/reprap/tvrrug/Marlin.base/Marlin/applet/Marlin.elf";
+               elf_read_firmware(fname, &f);
+
+               printf("firmware %s f=%d mmcu=%s\n", fname, (int)f.frequency, f.mmcu);
+               avr_load_firmware(avr, &f);
+       } else {
+               char path[1024];
+               uint32_t base, size;
+//             snprintf(path, sizeof(path), "%s/%s", pwd, "ATmegaBOOT_168_atmega328.ihex");
+               strcpy(path, "marlin/Marlin.hex");
+               //strcpy(path, "marlin/bootloader-644-20MHz.hex");
+               uint8_t * boot = read_ihex_file(path, &size, &base);
+               if (!boot) {
+                       fprintf(stderr, "%s: Unable to load %s\n", argv[0], path);
+                       exit(1);
+               }
+               printf("Firmware %04x: %d\n", base, size);
+               memcpy(avr->flash + base, boot, size);
+               free(boot);
+               avr->pc = base;
+               avr->codeend = avr->flashend;
+       }
+       //avr->trace = 1;
+
+       // even if not setup at startup, activate gdb if crashing
+       avr->gdb_port = 1234;
+       if (debug) {
+               printf("AVR is stopped, waiting on gdb on port %d. Use 'target remote :%d' in avr-gdb\n",
+                               avr->gdb_port, avr->gdb_port);
+               avr->state = cpu_Stopped;
+               avr_gdb_init(avr);
+       }
+
+       uart_pty_init(avr, &uart_pty);
+       uart_pty_connect(&uart_pty, '0');
+
+       thermistor_init(avr, &therm_hotend, TEMP_0_PIN,
+                       (short*)temptable_5, sizeof(temptable_5) / sizeof(short) / 2, OVERSAMPLENR, 22.5f);
+       thermistor_init(avr, &therm_hotbed, TEMP_BED_PIN,
+                       (short*)temptable_5, sizeof(temptable_5) / sizeof(short) / 2, OVERSAMPLENR, 22.0f);
+
+       /*
+        * OpenGL init, can be ignored
+        */
+       glutInit(&argc, argv);          /* initialize GLUT system */
+
+       glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+       glutInitWindowSize(8 * pixsize, 1 * pixsize);           /* width=400pixels height=500pixels */
+       window = glutCreateWindow("Glut");      /* create window */
+
+       // Set up projection matrix
+       glMatrixMode(GL_PROJECTION); // Select projection matrix
+       glLoadIdentity(); // Start with an identity matrix
+       glOrtho(0, 8 * pixsize, 0, 1 * pixsize, 0, 10);
+       glScalef(1,-1,1);
+       glTranslatef(0, -1 * pixsize, 0);
+
+       glutDisplayFunc(displayCB);             /* set window's display callback */
+       glutKeyboardFunc(keyCB);                /* set window's key callback */
+       glutTimerFunc(1000 / 24, timerCB, 0);
+
+       // the AVR run on it's own thread. it even allows for debugging!
+       pthread_t run;
+       pthread_create(&run, NULL, avr_run_thread, NULL);
+
+       glutMainLoop();
+}
diff --git a/examples/board_reprap/thermistor.c b/examples/board_reprap/thermistor.c
new file mode 100644 (file)
index 0000000..8c2ddd8
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+       thermistor.c
+
+       Copyright 2008-2012 Michel Pollet <buserror@gmail.com>
+
+       This file is part of simavr.
+
+       simavr 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.
+
+       simavr 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 simavr.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <pthread.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include "avr_adc.h"
+
+#include "thermistor.h"
+
+/*
+ * called when a byte is send via the uart on the AVR
+ */
+static void thermistor_in_hook(struct avr_irq_t * irq, uint32_t value, void * param)
+{
+       thermistor_p p = (thermistor_p)param;
+       avr_adc_mux_t v = *((avr_adc_mux_t*)&value);
+
+//     printf("%s(%2d/%2d)\n", __func__, p->adc_mux_number, v.src);
+
+       if (v.src != p->adc_mux_number)
+               return;
+
+       short *t = p->table;
+       for (int ei = 0; ei < p->table_entries; ei++, t += 2) {
+               if (t[1] < p->current) {
+                       printf("%s(%2d) %.2f matches %3dC is %d adc\n", __func__, v.src,
+                                       p->current, t[1], t[0] / p->oversampling);
+                       avr_raise_irq(p->irq + IRQ_TERM_ADC_VALUE_OUT, t[0] / p->oversampling);
+                       return;
+               }
+       }
+       printf("%s(%d) temperature out of range (%.2f), we're screwed\n",
+                       __func__, p->adc_mux_number, p->current);
+}
+
+static const char * irq_names[IRQ_TERM_COUNT] = {
+       [IRQ_TERM_ADC_TRIGGER_IN] = "8<thermistor.trigger",
+       [IRQ_TERM_TEMP_VALUE_OUT] = "16>thermistor.out",
+};
+
+void
+thermistor_init(
+               struct avr_t * avr,
+               thermistor_p p,
+               int adc_mux_number,
+               short * table,
+               int     table_entries,
+               int oversampling,
+               float start_temp )
+{
+       p->avr = avr;
+       p->irq = avr_alloc_irq(&avr->irq_pool, 0, IRQ_TERM_COUNT, irq_names);
+       avr_irq_register_notify(p->irq + IRQ_TERM_ADC_TRIGGER_IN, thermistor_in_hook, p);
+
+       p->oversampling = oversampling;
+       p->table = table;
+       p->table_entries = table_entries;
+       p->adc_mux_number = adc_mux_number;
+       p->current = p->target = start_temp;
+
+       avr_irq_t * src = avr_io_getirq(p->avr, AVR_IOCTL_ADC_GETIRQ, ADC_IRQ_OUT_TRIGGER);
+       avr_irq_t * dst = avr_io_getirq(p->avr, AVR_IOCTL_ADC_GETIRQ, adc_mux_number);
+       if (src && dst) {
+               avr_connect_irq(src, p->irq + IRQ_TERM_ADC_TRIGGER_IN);
+               avr_connect_irq(p->irq + IRQ_TERM_ADC_VALUE_OUT, dst);
+       }
+       printf("%s on ADC %d start %.2f\n", __func__, adc_mux_number, p->current);
+}
+
+void
+thermistor_set_temp(
+               thermistor_p t,
+               float temp )
+{
+
+}
diff --git a/examples/board_reprap/thermistor.h b/examples/board_reprap/thermistor.h
new file mode 100644 (file)
index 0000000..8e6623f
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+       thermistor.h
+
+       Copyright 2008-2012 Michel Pollet <buserror@gmail.com>
+
+       This file is part of simavr.
+
+       simavr 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.
+
+       simavr 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 simavr.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __THERMISTOR_H___
+#define __THERMISTOR_H___
+
+#include "sim_irq.h"
+
+enum {
+       IRQ_TERM_ADC_TRIGGER_IN = 0,
+       IRQ_TERM_ADC_VALUE_OUT,
+       IRQ_TERM_TEMP_VALUE_OUT,
+       IRQ_TERM_COUNT
+};
+
+typedef struct thermistor_t {
+       avr_irq_t *     irq;            // irq list
+       struct avr_t *avr;              // keep it around so we can pause it
+       uint8_t         adc_mux_number;
+
+       short *         table;
+       int                     table_entries;
+       int             oversampling;
+
+       float   current;
+       float   target;
+
+} thermistor_t, *thermistor_p;
+
+void
+thermistor_init(
+               struct avr_t * avr,
+               thermistor_p t,
+               int adc_mux_number,
+               short * table,
+               int     table_entries,
+               int oversampling,
+               float start_temp );
+
+void
+thermistor_set_temp(
+               thermistor_p t,
+               float temp );
+
+
+#endif /* __THERMISTOR_H___ */