--- /dev/null
+#
+# 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
--- /dev/null
+#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
--- /dev/null
+#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_
+
--- /dev/null
+/*
+ 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();
+}
--- /dev/null
+/*
+ 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 )
+{
+
+}
--- /dev/null
+/*
+ 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___ */