merge from the branch bkubicek/Marlin/zalmmerge

This commit is contained in:
Bernhard Kubicek 2011-11-05 14:13:20 +01:00
parent d7c4f0780b
commit 00674af3a8
20 changed files with 4030 additions and 3832 deletions

View file

@ -54,16 +54,20 @@ const bool ENDSTOPS_INVERTING = true; // set to true to invert the logic of the
// Comment out (using // at the start of the line) to disable SD support: // Comment out (using // at the start of the line) to disable SD support:
// #define ULTRA_LCD //any lcd // #define ULTRA_LCD //any lcd
#define LCD_WIDTH 16
#define LCD_HEIGHT 2
//#define ULTIPANEL
#define ULTIPANEL
#ifdef ULTIPANEL #ifdef ULTIPANEL
//#define NEWPANEL //enable this if you have a click-encoder panel //#define NEWPANEL //enable this if you have a click-encoder panel
#define SDSUPPORT #define SDSUPPORT
#define ULTRA_LCD #define ULTRA_LCD
#define LCD_WIDTH 20 #define LCD_WIDTH 20
#define LCD_HEIGHT 4 #define LCD_HEIGHT 4
#else //no panel but just lcd
#ifdef ULTRA_LCD
#define LCD_WIDTH 16
#define LCD_HEIGHT 2
#endif
#endif #endif
@ -167,25 +171,46 @@ const int dropsegments=5; //everything with this number of steps will be ignore
#define MAXTEMP 275 #define MAXTEMP 275
#define BED_MAXTEMP 150 #define BED_MAXTEMP 150
/// PID settings:
// Uncomment the following line to enable PID support.
//#define SMOOTHING
//#define SMOOTHFACTOR 5.0
//float current_raw_average=0;
#define PIDTEMP #define PIDTEMP
#ifdef PIDTEMP #ifdef PIDTEMP
//#define PID_DEBUG // Sends debug data to the serial port. /// PID settings:
//#define PID_OPENLOOP 1 // Puts PID in open loop. M104 sets the output power in % // Uncomment the following line to enable PID support.
#define PID_MAX 255 // limits current to nozzle //#define SMOOTHING
#define PID_INTEGRAL_DRIVE_MAX 255 //#define SMOOTHFACTOR 5.0
#define PID_dT 0.10 // 100ms sample time //float current_raw_average=0;
#define DEFAULT_Kp 20.0 #define K1 0.95 //smoothing of the PID
#define DEFAULT_Ki 1.5*PID_dT //#define PID_DEBUG // Sends debug data to the serial port.
#define DEFAULT_Kd 80/PID_dT //#define PID_OPENLOOP 1 // Puts PID in open loop. M104 sets the output power in %
#define DEFAULT_Kc 0 #define PID_MAX 255 // limits current to nozzle
#endif // PIDTEMP #define PID_INTEGRAL_DRIVE_MAX 255
#define PID_dT 0.1
//machine with red silicon: 1950:45 second ; with fan fully blowin 3000:47
#define PID_CRITIAL_GAIN 3000
#define PID_SWING_AT_CRITIAL 45 //seconds
#define PIDIADD 5
/*
//PID according to Ziegler-Nichols method
float Kp = 0.6*PID_CRITIAL_GAIN;
float Ki =PIDIADD+2*Kp/PID_SWING_AT_CRITIAL*PID_dT;
float Kd = Kp*PID_SWING_AT_CRITIAL/8./PID_dT;
*/
//PI according to Ziegler-Nichols method
#define DEFAULT_Kp (PID_CRITIAL_GAIN/2.2)
#define DEFAULT_Ki (1.2*Kp/PID_SWING_AT_CRITIAL*PID_dT)
#define DEFAULT_Kd (0)
#define PID_ADD_EXTRUSION_RATE
#ifdef PID_ADD_EXTRUSION_RATE
#define DEFAULT_Kc (5) //heatingpower=Kc*(e_speed)
#endif
#endif // PIDTEMP
// extruder advance constant (s2/mm3) // extruder advance constant (s2/mm3)
// //
@ -206,6 +231,7 @@ const int dropsegments=5; //everything with this number of steps will be ignore
#endif // ADVANCE #endif // ADVANCE
// THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2, e.g. 8,16,32
#if defined SDSUPPORT #if defined SDSUPPORT
// The number of linear motions that can be in the plan at any give time. // The number of linear motions that can be in the plan at any give time.
#define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller #define BLOCK_BUFFER_SIZE 16 // SD,LCD,Buttons take more memory, block buffer needs to be smaller
@ -213,8 +239,5 @@ const int dropsegments=5; //everything with this number of steps will be ignore
#define BLOCK_BUFFER_SIZE 16 // maximize block buffer #define BLOCK_BUFFER_SIZE 16 // maximize block buffer
#endif #endif
#ifdef SIMPLE_LCD
#define BLOCK_BUFFER_SIZE 16 // A little less buffer for just a simple LCD
#endif
#endif #endif

View file

@ -1,13 +1,17 @@
#ifndef __EEPROMH
#define __EEPROMH
#include "planner.h" #include "planner.h"
#include "temperature.h" #include "temperature.h"
#include <EEPROM.h>
#include "Marlin.h"
#include "streaming.h"
//====================================================================================== //======================================================================================
template <class T> int EEPROM_writeAnything(int &ee, const T& value) template <class T> int EEPROM_writeAnything(int &ee, const T& value)
{ {
const byte* p = (const byte*)(const void*)&value; const byte* p = (const byte*)(const void*)&value;
int i; int i;
for (i = 0; i < sizeof(value); i++) for (i = 0; i < (int)sizeof(value); i++)
EEPROM.write(ee++, *p++); EEPROM.write(ee++, *p++);
return i; return i;
} }
@ -16,7 +20,7 @@ template <class T> int EEPROM_readAnything(int &ee, T& value)
{ {
byte* p = (byte*)(void*)&value; byte* p = (byte*)(void*)&value;
int i; int i;
for (i = 0; i < sizeof(value); i++) for (i = 0; i < (int)sizeof(value); i++)
*p++ = EEPROM.read(ee++); *p++ = EEPROM.read(ee++);
return i; return i;
} }
@ -120,4 +124,6 @@ void RetrieveSettings(bool def=false){ // if def=true, the default values will
} }
#endif

View file

@ -1,274 +1,320 @@
TARGET = $(notdir $(CURDIR))
# CHANGE BELOW:
#~ INSTALL_DIR = /Applications/Arduino.app/Contents/Resources/Java
INSTALL_DIR = /home/bkubicek/software/arduino-0022
#~ PORT = /dev/cu.usbserial*
PORT = /dev/ttyACM0
# Get these values from:
# $(INSTALL_DIR)/hardware/boards.txt
# (arduino-0022/hardware/arduino/boards.txt)
# The values below are for the "Arduino Duemilanove or Nano w/ ATmega328"
# now for "Arduino Mega 2560"
UPLOAD_SPEED = 115200
UPLOAD_PROTOCOL = stk500v2
BUILD_MCU = atmega2560
BUILD_F_CPU = 16000000L
# getting undefined reference to `__cxa_pure_virtual'
#~ [http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1254180518 Arduino Forum - Makefile]
#~ http://www.arduino.cc/playground/OpenBSD/CLI
#~ [http://arduino.cc/forum/index.php?topic=52041.0 A "simple" makefile for Arduino]
#~ [http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1275488191 Arduino Forum - Configuring avr-gcc options in arduino IDE]
# found in /usr/lib/gcc/avr/4.3.5/cc1plus; fixed with -Wl,--gc-section
############################################################################
# Below here nothing should be changed...
ARDUINO = $(INSTALL_DIR)/hardware/arduino/cores/arduino
# #
# Arduino 0022 Makefile #~ AVR_TOOLS_PATH = $(INSTALL_DIR)/hardware/tools/avr/bin
# Uno with DOGS102 Shield # in Ubuntu, avr-gcc is installed separate;
# # only avrdude comes with the IDE
# written by olikraus@gmail.com AVR_TOOLS_PATH = /usr/bin
# AVR_DUDE_PATH = $(INSTALL_DIR)/hardware/tools
# Features:
# - boards.txt is used to derive parameters
# - All intermediate files are put into a separate directory (TMPDIRNAME)
# - Simple use: Copy Makefile into the same directory of the .pde file
#
# Limitations:
# - requires UNIX environment
# - TMPDIRNAME must be subdirectory of the current directory.
#
# Targets
# all build everything
# upload build and upload to arduino
# clean remove all temporary files (includes final hex file)
#
# History
# 001 28 Apr 2010 first release
# 002 05 Oct 2010 added 'uno'
# #
SRC = $(ARDUINO)/pins_arduino.c $(ARDUINO)/wiring.c \
$(ARDUINO)/wiring_analog.c $(ARDUINO)/wiring_digital.c \
$(ARDUINO)/wiring_pulse.c \
$(ARDUINO)/wiring_shift.c $(ARDUINO)/WInterrupts.c
# added applet/$(TARGET).cpp as in IDE 0022
CXXSRC = $(ARDUINO)/HardwareSerial.cpp $(ARDUINO)/WMath.cpp \
$(ARDUINO)/Print.cpp \
$(ARDUINO)/main.cpp
# applet/$(TARGET).cpp # no need, having a rule now for applet/$(TARGET).cpp.o
# added main.cpp, as in 0022
FORMAT = ihex
#=== user configuration === # Name of this Makefile (used for "make depend").
# All ...PATH variables must have a '/' at the end MAKEFILE = Makefile
# Board (and prozessor) information: see $(ARDUINO_PATH)hardware/arduino/boards.txt # Debugging format.
# Some examples: # Native formats for AVR-GCC's -g are stabs [default], or dwarf-2.
# BOARD DESCRIPTION # AVR (extended) COFF requires stabs, plus an avr-objcopy run.
# uno Arduino Uno DEBUG = stabs
# atmega328 Arduino Duemilanove or Nano w/ ATmega328
# diecimila Arduino Diecimila, Duemilanove, or Nano w/ ATmega168
# mega Arduino Mega
# mini Arduino Mini
# lilypad328 LilyPad Arduino w/ ATmega328
BOARD:=mega
# additional (comma separated) defines OPT = 2
# -DDOGM128_HW board is connected to DOGM128 display
# -DDOGM132_HW board is connected to DOGM132 display
# -DDOGS102_HW board is connected to DOGS102 display
# -DDOG_REVERSE 180 degree rotation
# -DDOG_SPI_SW_ARDUINO force SW shiftOut
DEFS=-DDOGS102_HW -DDOG_DOUBLE_MEMORY -DDOG_SPI_SW_ARDUINO
# The location where the avr tools (e.g. avr-gcc) are located. Requires a '/' at the end. # Place -D or -U options here
# Can be empty if all tools are accessable through the search path #~ CDEFS = -DBUILD_F_CPU=$(BUILD_F_CPU)
AVR_TOOLS_PATH:=/usr/bin/ #~ CXXDEFS = -DBUILD_F_CPU=$(BUILD_F_CPU)
# now called DF_CPU
CDEFS = -DF_CPU=$(BUILD_F_CPU) -DARDUINO=22
CXXDEFS = -DF_CPU=$(BUILD_F_CPU) -DARDUINO=22
# Install path of the arduino software. Requires a '/' at the end. # Place -I options here
ARDUINO_PATH:=/home/bkubicek/software/arduino-0022/ CINCS = -I$(ARDUINO) -I$(INSTALL_DIR)/libraries/LiquidCrystal/ -I$(INSTALL_DIR)/libraries/EEPROM/
CXXINCS = -I$(ARDUINO)
# Install path for avrdude. Requires a '/' at the end. Can be empty if avrdude is in the search path. # Compiler flag to set the C Standard level.
AVRDUDE_PATH:= # c89 - "ANSI" C
# gnu89 - c89 plus GCC extensions
# c99 - ISO C99 standard (not yet fully implemented)
# gnu99 - c99 plus GCC extensions
CSTANDARD = -std=gnu99
CDEBUG = -g$(DEBUG)
# note that typically, IDE 0022 uses -w to suppress warnings (both in cpp and c)!
CWARN = -Wall
#~ CWARN = -w
# "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++:
CCWARN = -Wstrict-prototypes
CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
#CEXTRA = -Wa,-adhlns=$(<:.c=.lst)
# The unix device where we can reach the arduino board # to eliminate pins_ardiuno warnings:
# Uno: /dev/ttyACM0 # http://arduino.cc/pipermail/developers_arduino.cc/2010-December/004005.html
# Duemilanove: /dev/ttyUSB0
AVRDUDE_PORT:=/dev/ttyACM0
# List of all libaries which should be included. # [http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1254180518 Arduino Forum - Makefile]
#EXTRA_DIRS=$(ARDUINO_PATH)libraries/LiquidCrystal/ #~ For building the objects files "-ffunction-sections -fdata-sections" was missing
#EXTRA_DIRS+=$(ARDUINO_PATH)libraries/Dogm/ #~ and the final avr-gcc call needs "-Wl,--gc-section".
#EXTRA_DIRS+=/home/kraus/src/arduino/dogm128/hg/libraries/Dogm/ CXSECTF = -fno-exceptions -ffunction-sections -fdata-sections
CFINALF = -Wl,--gc-section
#=== fetch parameter from boards.txt processor parameter === CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) -O$(OPT) $(CWARN) $(CCWARN) $(CSTANDARD) $(CEXTRA)
# the basic idea is to get most of the information from boards.txt # added CWARN also to .cpp
CXXFLAGS = $(CDEFS) $(CINCS) -O$(OPT) $(CWARN) $(CXSECTF)
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
LDFLAGS = -lm
BOARDS_TXT:=$(ARDUINO_PATH)hardware/arduino/boards.txt # Programming support using avrdude. Settings and variables.
AVRDUDE_PORT = $(PORT)
AVRDUDE_WRITE_FLASH = -U flash:w:applet/$(TARGET).hex
AVRDUDE_FLAGS = -V -F \
-p $(BUILD_MCU) -P $(AVRDUDE_PORT) -c $(UPLOAD_PROTOCOL) \
-b $(UPLOAD_SPEED) -C $(INSTALL_DIR)/hardware/tools/avrdude.conf
# -b $(UPLOAD_SPEED) -C $(INSTALL_DIR)/hardware/tools/avr/etc/avrdude.conf
# get the MCU value from the $(BOARD).build.mcu variable. For the atmega328 board this is atmega328p # Program settings
MCU:=$(shell sed -n -e "s/$(BOARD).build.mcu=\(.*\)/\1/p" $(BOARDS_TXT)) CC = $(AVR_TOOLS_PATH)/avr-gcc
# get the F_CPU value from the $(BOARD).build.f_cpu variable. For the atmega328 board this is 16000000 CXX = $(AVR_TOOLS_PATH)/avr-g++
F_CPU:=$(shell sed -n -e "s/$(BOARD).build.f_cpu=\(.*\)/\1/p" $(BOARDS_TXT)) OBJCOPY = $(AVR_TOOLS_PATH)/avr-objcopy
OBJDUMP = $(AVR_TOOLS_PATH)/avr-objdump
AR = $(AVR_TOOLS_PATH)/avr-ar
SIZE = $(AVR_TOOLS_PATH)/avr-size
NM = $(AVR_TOOLS_PATH)/avr-nm
#~ AVRDUDE = $(AVR_TOOLS_PATH)/avrdude
AVRDUDE = $(AVR_DUDE_PATH)/avrdude
REMOVE = rm -f
MV = mv -f
# avrdude # Define all object files.
# get the AVRDUDE_UPLOAD_RATE value from the $(BOARD).upload.speed variable. For the atmega328 board this is 57600 # NOTE: obj files will be created in respective src directories (libraries or $(INSTALL_DIR));
AVRDUDE_UPLOAD_RATE:=$(shell sed -n -e "s/$(BOARD).upload.speed=\(.*\)/\1/p" $(BOARDS_TXT)) # make clean deletes them fine
# get the AVRDUDE_PROGRAMMER value from the $(BOARD).upload.protocol variable. For the atmega328 board this is stk500 # note that srcs are in libraries or other directories;
# AVRDUDE_PROGRAMMER:=$(shell sed -n -e "s/$(BOARD).upload.protocol=\(.*\)/\1/p" $(BOARDS_TXT)) # $(CXXSRC:.cpp=.o) will cause obj files to be in same loc as src files
# use stk500v1, because stk500 will default to stk500v2 #~ OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o)
AVRDUDE_PROGRAMMER:=stk500v1 # to change the output directory for object files;
# must change the obj list here!
# and then, match to corresponding rule somehow?
# or leave this - and parse in rule (auth automatic variable $(@F))?
# "Suffix Replacement"
OBJ = $(SRC:.c=.o) $(CXXSRC:.cpp=.o) $(ASRC:.S=.o)
#=== identify user files === # added - OBJ list, transformed into applet/
PDESRC:=$(shell ls *.pde) OBJT = $(addprefix applet/,$(notdir $(OBJ)))
TARGETNAME=$(basename $(PDESRC)) ALLSRC = $(SRC) $(CXXSRC) $(ASRC)
CDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) # Define all listing files.
CDIRS:=*.c utility/*.c $(addsuffix *.c,$(CDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.c LST = $(ASRC:.S=.lst) $(CXXSRC:.cpp=.lst) $(SRC:.c=.lst)
CSRC:=$(shell ls $(CDIRS) 2>/dev/null)
CCSRC:=$(shell ls *.cc 2>/dev/null) # Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(BUILD_MCU) -I. $(CFLAGS)
ALL_CXXFLAGS = -mmcu=$(BUILD_MCU) -I. $(CXXFLAGS)
ALL_ASFLAGS = -mmcu=$(BUILD_MCU) -I. -x assembler-with-cpp $(ASFLAGS)
CPPDIRS:=$(EXTRA_DIRS) $(addsuffix utility/,$(EXTRA_DIRS)) # depended libraries of .pde need to be added from
CPPDIRS:=*.cpp utility/*.cpp $(addsuffix *.cpp,$(CPPDIRS)) $(ARDUINO_PATH)hardware/arduino/cores/arduino/*.cpp # $(INSTALL_DIR)/libraries (TODO: and/or ~/sketchbook/libraries)
CPPSRC:=$(shell ls $(CPPDIRS) 2>/dev/null) # grep for 'include', test if exists, add...
# note: prefix "a real tab character" http://www.delorie.com/djgpp/doc/ug/larger/makefiles.html
# $$ to escape $ for shell;
# note: must NOT put comments # inside bash execution;
# those would get removed by make; making shell see "EOF in backquote substitution"
# echo $$ix ; \
# 'shell' twice - for each subprocess! Backtick doesn't get expanded?
GREPRES:=$(shell for ix in $(shell grep include $(TARGET).pde | sed 's/.*[<"]\(.*\).h[>"].*/\1/'); do \
if [ -d $(INSTALL_DIR)/libraries/$$ix ] ; then \
LINCS="$$LINCS -I$(INSTALL_DIR)/libraries/$$ix" ;\
fi; \
done; \
echo $$LINCS)
# append includes:
CINCS += $(GREPRES)
CXXINCS += $(GREPRES)
# append library source .cpp files too (CXXSRC)
GREPRESB:=$(shell for ix in $(shell grep include $(TARGET).pde | sed 's/.*[<"]\(.*\).h[>"].*/\1/'); do \
if [ -d $(INSTALL_DIR)/libraries/$$ix ] ; then \
CPPSRCS="$$CPPSRCS $(INSTALL_DIR)/libraries/$$ix/*.cpp" ;\
fi; \
done; \
echo $$CPPSRCS)
CXXSRC += $(GREPRESB)
# added - only CXX obj from libraries:
CXXLIBOBJ = $(GREPRESB:.cpp=.o)
#=== build internal variables === # Default target.
all: applet_files build sizeafter
# the name of the subdirectory where everything is stored build: elf hex
TMPDIRNAME:=tmp
TMPDIRPATH:=$(TMPDIRNAME)/
AVRTOOLSPATH:=$(AVR_TOOLS_PATH) applet_files: $(TARGET).pde
# Here is the "preprocessing".
OBJCOPY:=$(AVRTOOLSPATH)avr-objcopy # It creates a .cpp file based with the same name as the .pde file.
OBJDUMP:=$(AVRTOOLSPATH)avr-objdump # On top of the new .cpp file comes the WProgram.h header.
SIZE:=$(AVRTOOLSPATH)avr-size # At the end there is a generic main() function attached.
# Then the .cpp file will be compiled. Errors during compile will
CPPSRC:=$(addprefix $(TMPDIRPATH),$(PDESRC:.pde=.cpp)) $(CPPSRC) # refer to this new, automatically generated, file.
# Not the original .pde file you actually edit...
COBJ:=$(CSRC:.c=.o) test -d applet || mkdir applet
CCOBJ:=$(CCSRC:.cc=.o) # @ supresses printout of the cmdline itself; so only the out of echo is printed
CPPOBJ:=$(CPPSRC:.cpp=.o) @echo ALL OBJT: $(OBJT)
@echo ALL CXXLIBOBJ: $(CXXLIBOBJ)
OBJFILES:=$(COBJ) $(CCOBJ) $(CPPOBJ) # echo '#include "WProgram.h"' > applet/$(TARGET).cpp
DIRS:= $(dir $(OBJFILES)) @echo "#include \"WProgram.h\"\nvoid setup();\nvoid loop();\n" > applet/$(TARGET).cpp
cat $(TARGET).pde >> applet/$(TARGET).cpp
DEPFILES:=$(OBJFILES:.o=.d) # no more need to cat main.cpp (v0022) - now it is compiled in
# assembler files from avr-gcc -S # cat $(ARDUINO)/main.cpp >> applet/$(TARGET).cpp
ASSFILES:=$(OBJFILES:.o=.s)
# disassembled object files with avr-objdump -S
DISFILES:=$(OBJFILES:.o=.dis)
LIBNAME:=$(TMPDIRPATH)$(TARGETNAME).a elf: applet/$(TARGET).elf
ELFNAME:=$(TMPDIRPATH)$(TARGETNAME).elf hex: applet/$(TARGET).hex
HEXNAME:=$(TMPDIRPATH)$(TARGETNAME).hex eep: applet/$(TARGET).eep
lss: applet/$(TARGET).lss
AVRDUDE_FLAGS = -V -F sym: applet/$(TARGET).sym
AVRDUDE_FLAGS += -C $(ARDUINO_PATH)/hardware/tools/avrdude.conf
AVRDUDE_FLAGS += -p $(MCU)
AVRDUDE_FLAGS += -P $(AVRDUDE_PORT)
AVRDUDE_FLAGS += -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += -b $(AVRDUDE_UPLOAD_RATE)
AVRDUDE_FLAGS += -U flash:w:$(HEXNAME)
AVRDUDE = avrdude
#=== predefined variable override ===
# use "make -p -f/dev/null" to see the default rules and definitions
# Build C and C++ flags. Include path information must be placed here
COMMON_FLAGS = -DF_CPU=$(F_CPU) -mmcu=$(MCU) $(DEFS)
# COMMON_FLAGS += -gdwarf-2
COMMON_FLAGS += -Os
COMMON_FLAGS += -Wall -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
COMMON_FLAGS += -I.
COMMON_FLAGS += -I$(ARDUINO_PATH)hardware/arduino/cores/arduino
COMMON_FLAGS += $(addprefix -I,$(EXTRA_DIRS))
COMMON_FLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections
COMMON_FLAGS += -Wl,--relax
COMMON_FLAGS += -mcall-prologues
CFLAGS = $(COMMON_FLAGS) -std=gnu99 -Wstrict-prototypes
CXXFLAGS = $(COMMON_FLAGS)
# Replace standard build tools by avr tools
CC = $(AVRTOOLSPATH)avr-gcc
CXX = $(AVRTOOLSPATH)avr-g++
AR = @$(AVRTOOLSPATH)avr-ar
# "rm" must be able to delete a directory tree
RM = rm -rf
#=== rules ===
# add rules for the C/C++ files where the .o file is placed in the TMPDIRPATH
# reuse existing variables as far as possible
$(TMPDIRPATH)%.o: %.c
@echo compile $<
@$(COMPILE.c) $(OUTPUT_OPTION) $<
$(TMPDIRPATH)%.o: %.cc
@echo compile $<
@$(COMPILE.cc) $(OUTPUT_OPTION) $<
$(TMPDIRPATH)%.o: %.cpp
@echo compile $<
@$(COMPILE.cpp) $(OUTPUT_OPTION) $<
$(TMPDIRPATH)%.s: %.c
@$(COMPILE.c) $(OUTPUT_OPTION) -S $<
$(TMPDIRPATH)%.s: %.cc
@$(COMPILE.cc) $(OUTPUT_OPTION) -S $<
$(TMPDIRPATH)%.s: %.cpp
@$(COMPILE.cpp) $(OUTPUT_OPTION) -S $<
$(TMPDIRPATH)%.dis: $(TMPDIRPATH)%.o
@$(OBJDUMP) -S $< > $@
.SUFFIXES: .elf .hex .pde
.elf.hex:
@$(OBJCOPY) -O ihex -R .eeprom $< $@
$(TMPDIRPATH)%.cpp: %.pde
@cat $(ARDUINO_PATH)hardware/arduino/cores/arduino/main.cpp > $@
@cat $< >> $@
@echo >> $@
@echo 'extern "C" void __cxa_pure_virtual() { while (1); }' >> $@
.PHONY: all
all: tmpdir $(HEXNAME) assemblersource showsize
ls -al $(HEXNAME) $(ELFNAME)
$(ELFNAME): $(LIBNAME)($(addprefix $(TMPDIRPATH),$(OBJFILES)))
$(LINK.o) $(COMMON_FLAGS) $(LIBNAME) $(LOADLIBES) $(LDLIBS) -o $@
$(LIBNAME)(): $(addprefix $(TMPDIRPATH),$(OBJFILES))
#=== create temp directory ===
# not really required, because it will be also created during the dependency handling
.PHONY: tmpdir
tmpdir:
@test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH)
#=== create assembler files for each C/C++ file ===
.PHONY: assemblersource
assemblersource: $(addprefix $(TMPDIRPATH),$(ASSFILES)) $(addprefix $(TMPDIRPATH),$(DISFILES))
#=== show the section sizes of the ELF file ===
.PHONY: showsize
showsize: $(ELFNAME)
$(SIZE) $<
#=== clean up target ===
# this is simple: the TMPDIRPATH is removed
.PHONY: clean
clean:
$(RM) $(TMPDIRPATH)
# Program the device. # Program the device.
# step 1: reset the arduino board with the stty command upload: applet/$(TARGET).hex
# step 2: user avrdude to upload the software $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH)
.PHONY: upload
upload: $(HEXNAME)
stty -F $(AVRDUDE_PORT) hupcl
$(AVRDUDE) $(AVRDUDE_FLAGS)
# Display size of file.
HEXSIZE = $(SIZE) --target=$(FORMAT) applet/$(TARGET).hex
ELFSIZE = $(SIZE) applet/$(TARGET).elf
sizebefore:
@if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(HEXSIZE); echo; fi
# === dependency handling === sizeafter:
# From the gnu make manual (section 4.14, Generating Prerequisites Automatically) @if [ -f applet/$(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(HEXSIZE); echo; fi
# Additionally (because this will be the first executed rule) TMPDIRPATH is created here.
# Instead of "sed" the "echo" command is used
# cd $(TMPDIRPATH); mkdir -p $(DIRS) 2> /dev/null; cd ..
DEPACTION=test -d $(TMPDIRPATH) || mkdir $(TMPDIRPATH);\
mkdir -p $(addprefix $(TMPDIRPATH),$(DIRS));\
set -e; echo -n $@ $(dir $@) > $@; $(CC) -MM $(COMMON_FLAGS) $< >> $@
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000
$(TMPDIRPATH)%.d: %.c coff: applet/$(TARGET).elf
@$(DEPACTION) $(COFFCONVERT) -O coff-avr applet/$(TARGET).elf $(TARGET).cof
$(TMPDIRPATH)%.d: %.cc extcoff: $(TARGET).elf
@$(DEPACTION) $(COFFCONVERT) -O coff-ext-avr applet/$(TARGET).elf $(TARGET).cof
.SUFFIXES: .elf .hex .eep .lss .sym
$(TMPDIRPATH)%.d: %.cpp .elf.hex:
@$(DEPACTION) $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
# Include dependency files. If a .d file is missing, a warning is created and the .d file is created .elf.eep:
# This warning is not a problem (gnu make manual, section 3.3 Including Other Makefiles) -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
-include $(addprefix $(TMPDIRPATH),$(DEPFILES)) --change-section-lma .eeprom=0 -O $(FORMAT) $< $@
# Create extended listing file from ELF output file.
.elf.lss:
$(OBJDUMP) -h -S $< > $@
# Create a symbol table from ELF output file.
.elf.sym:
$(NM) -n $< > $@
# Link: create ELF output file from library.
# NOTE: applet/$(TARGET).cpp.o MUST BE BEFORE applet/core.a
# in the dependency list, so its rule runs first!
applet/$(TARGET).elf: $(TARGET).pde applet/$(TARGET).cpp.o applet/core.a
# $(CC) $(ALL_CFLAGS) -o $@ applet/$(TARGET).cpp -L. applet/core.a $(LDFLAGS)
# changed as in IDE v0022: link cpp obj files
@echo $$(tput bold)$$(tput setaf 2) $(CC) $$(tput sgr0) $(ALL_CFLAGS) $(CFINALF) -o $@ applet/$(TARGET).cpp.o $(CXXOBJ) -L. applet/core.a $(LDFLAGS)
@$(CC) $(ALL_CFLAGS) $(CFINALF) -o $@ applet/$(TARGET).cpp.o $(CXXOBJ) -L. applet/core.a $(LDFLAGS)
# added: cpp.o depends on cpp (and .pde which generates it)
# $< "first item in the dependencies list"; $@ "left side of the :"; $^ "right side of the :"
# http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/
applet/$(TARGET).cpp.o: applet/$(TARGET).cpp
@echo $$(tput bold) $(CXX) $$(tput sgr0) -c $(ALL_CXXFLAGS) $< -o $@
@$(CXX) -c $(ALL_CXXFLAGS) $< -o $@
#~ applet/core.a: $(OBJ)
#~ @for i in $(OBJ); do echo $(AR) rcs applet/core.a $$i; $(AR) rcs applet/core.a $$i; done
applet/core.a: $(OBJT)
@for i in $(OBJT); do echo $(AR) rcs applet/core.a $$i; $(AR) rcs applet/core.a $$i; done
# iterate through OBJ to find the original location; then build depending on source extension
# TODO: add handling of assembler files
applet/%.o:
@for iob in $(OBJ); do \
if [ "`basename $$iob`" = "`basename $@`" ]; then \
for ios in $(ALLSRC); do \
if [ "$${iob%%.*}" = "$${ios%%.*}" ]; then \
case $${ios##*.} in \
"cpp") \
echo "$$(tput bold)$$(tput setaf 1) $(CXX) $$(tput sgr0) -c $(ALL_CXXFLAGS) $$ios -o $@"; \
$(CXX) -c $(ALL_CXXFLAGS) $$ios -o $@;; \
"c") \
echo "$$(tput bold)$$(tput setaf 1) $(CC) $$(tput sgr0) -c $(ALL_CFLAGS) $$ios -o $@"; \
$(CC) -c $(ALL_CFLAGS) $$ios -o $@;; \
esac; \
fi; \
done; \
fi; \
done;
#~ # Compile: create object files from C++ source files.
#~ .cpp.o:
#~ $(CXX) -c $(ALL_CXXFLAGS) $< -o $@
#~ # Compile: create object files from C source files.
#~ .c.o:
#~ $(CC) -c $(ALL_CFLAGS) $< -o $@
#~ # Compile: create assembler files from C source files.
#~ .c.s:
#~ $(CC) -S $(ALL_CFLAGS) $< -o $@
#~ # Assemble: create object files from assembler source files.
#~ .S.o:
#~ $(CC) -c $(ALL_ASFLAGS) $< -o $@
#~ # Automatic dependencies
#~ %.d: %.c
#~ $(CC) -M $(ALL_CFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@
#~ %.d: %.cpp
#~ $(CXX) -M $(ALL_CXXFLAGS) $< | sed "s;$(notdir $*).o:;$*.o $*.d:;" > $@
# Target: clean project.
clean:
$(REMOVE) applet/$(TARGET).hex applet/$(TARGET).eep applet/$(TARGET).cof applet/$(TARGET).elf \
applet/$(TARGET).map applet/$(TARGET).sym applet/$(TARGET).lss applet/core.a \
$(OBJT) applet/$(TARGET).cpp.o \
$(OBJ) $(LST) $(SRC:.c=.s) $(SRC:.c=.d) $(CXXSRC:.cpp=.s) $(CXXSRC:.cpp=.d)
.PHONY: all build elf hex eep lss sym program coff extcoff clean applet_files sizebefore sizeafter

View file

@ -57,7 +57,7 @@ void ClearToSend();
void get_coordinates(); void get_coordinates();
void prepare_move(); void prepare_move();
void kill(byte debug); void kill();
//void check_axes_activity(); //void check_axes_activity();
//void plan_init(); //void plan_init();
@ -68,7 +68,7 @@ void kill(byte debug);
//void st_wake_up(); //void st_wake_up();
//void st_synchronize(); //void st_synchronize();
void enquecommand(const char *cmd); void enquecommand(const char *cmd);
void wd_reset();
#ifndef CRITICAL_SECTION_START #ifndef CRITICAL_SECTION_START
#define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli(); #define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli();
@ -78,6 +78,5 @@ void wd_reset();
extern float homing_feedrate[]; extern float homing_feedrate[];
extern bool axis_relative_modes[]; extern bool axis_relative_modes[];
void manage_inactivity(byte debug); void wd_reset() ;
#endif #endif

View file

@ -25,7 +25,7 @@
http://reprap.org/pipermail/reprap-dev/2011-May/003323.html http://reprap.org/pipermail/reprap-dev/2011-May/003323.html
*/ */
#include <EEPROM.h> #include "EEPROMwrite.h"
#include "fastio.h" #include "fastio.h"
#include "Configuration.h" #include "Configuration.h"
#include "pins.h" #include "pins.h"
@ -169,7 +169,7 @@ bool sdmode = false;
bool sdactive = false; bool sdactive = false;
bool savetosd = false; bool savetosd = false;
int16_t n; int16_t n;
long autostart_atmillis=0; unsigned long autostart_atmillis=0;
void initsd(){ void initsd(){
sdactive = false; sdactive = false;
@ -288,24 +288,24 @@ void checkautostart(bool force)
if(!sdactive) //fail if(!sdactive) //fail
return; return;
} }
static int lastnr=0; static int lastnr=0;
char autoname[30]; char autoname[30];
sprintf(autoname,"auto%i.g",lastnr); sprintf(autoname,"auto%i.g",lastnr);
for(int i=0;i<strlen(autoname);i++) for(int i=0;i<(int)strlen(autoname);i++)
autoname[i]=tolower(autoname[i]); autoname[i]=tolower(autoname[i]);
dir_t p; dir_t p;
root.rewind(); root.rewind();
char filename[11]; //char filename[11];
int cnt=0; //int cnt=0;
bool found=false; bool found=false;
while (root.readDir(p) > 0) while (root.readDir(p) > 0)
{ {
for(int i=0;i<strlen((char*)p.name);i++) for(int i=0;i<(int)strlen((char*)p.name);i++)
p.name[i]=tolower(p.name[i]); p.name[i]=tolower(p.name[i]);
//Serial.print((char*)p.name); //Serial.print((char*)p.name);
//Serial.print(" "); //Serial.print(" ");
//Serial.println(autoname); //Serial.println(autoname);
if(p.name[9]!='~') //skip safety copies if(p.name[9]!='~') //skip safety copies
if(strncmp((char*)p.name,autoname,5)==0) if(strncmp((char*)p.name,autoname,5)==0)
@ -772,8 +772,8 @@ inline void process_commands()
sprintf(time,"%i min, %i sec",min,sec); sprintf(time,"%i min, %i sec",min,sec);
Serial.println(time); Serial.println(time);
LCD_MESSAGE(time); LCD_MESSAGE(time);
} }
break; break;
#endif //SDSUPPORT #endif //SDSUPPORT
case 42: //M42 -Change pin status via gcode case 42: //M42 -Change pin status via gcode
if (code_seen('S')) if (code_seen('S'))
@ -782,7 +782,7 @@ inline void process_commands()
if (code_seen('P') && pin_status >= 0 && pin_status <= 255) if (code_seen('P') && pin_status >= 0 && pin_status <= 255)
{ {
int pin_number = code_value(); int pin_number = code_value();
for(int i = 0; i < sizeof(sensitive_pins); i++) for(int i = 0; i < (int)sizeof(sensitive_pins); i++)
{ {
if (sensitive_pins[i] == pin_number) if (sensitive_pins[i] == pin_number)
{ {
@ -801,28 +801,28 @@ inline void process_commands()
} }
break; break;
case 104: // M104 case 104: // M104
if (code_seen('S')) target_raw[0] = temp2analog(code_value()); if (code_seen('S')) target_raw[TEMPSENSOR_HOTEND] = temp2analog(code_value());
#ifdef PIDTEMP #ifdef PIDTEMP
pid_setpoint = code_value(); pid_setpoint = code_value();
#endif //PIDTEM #endif //PIDTEM
#ifdef WATCHPERIOD #ifdef WATCHPERIOD
if(target_raw[0] > current_raw[0]){ if(target_raw[TEMPSENSOR_HOTEND] > current_raw[TEMPSENSOR_HOTEND]){
watchmillis = max(1,millis()); watchmillis = max(1,millis());
watch_raw = current_raw[0]; watch_raw[TEMPSENSOR_HOTEND] = current_raw[TEMPSENSOR_HOTEND];
}else{ }else{
watchmillis = 0; watchmillis = 0;
} }
#endif #endif
break; break;
case 140: // M140 set bed temp case 140: // M140 set bed temp
if (code_seen('S')) target_raw[1] = temp2analogBed(code_value()); if (code_seen('S')) target_raw[TEMPSENSOR_BED] = temp2analogBed(code_value());
break; break;
case 105: // M105 case 105: // M105
#if (TEMP_0_PIN > -1) || defined (HEATER_USES_AD595) #if (TEMP_0_PIN > -1) || defined (HEATER_USES_AD595)
tt = analog2temp(current_raw[0]); tt = analog2temp(current_raw[TEMPSENSOR_HOTEND]);
#endif #endif
#if TEMP_1_PIN > -1 #if TEMP_1_PIN > -1
bt = analog2tempBed(current_raw[1]); bt = analog2tempBed(current_raw[TEMPSENSOR_BED]);
#endif #endif
#if (TEMP_0_PIN > -1) || defined (HEATER_USES_AD595) #if (TEMP_0_PIN > -1) || defined (HEATER_USES_AD595)
Serial.print("ok T:"); Serial.print("ok T:");
@ -850,14 +850,14 @@ inline void process_commands()
//break; //break;
case 109: {// M109 - Wait for extruder heater to reach target. case 109: {// M109 - Wait for extruder heater to reach target.
LCD_MESSAGE("Heating..."); LCD_MESSAGE("Heating...");
if (code_seen('S')) target_raw[0] = temp2analog(code_value()); if (code_seen('S')) target_raw[TEMPSENSOR_HOTEND] = temp2analog(code_value());
#ifdef PIDTEMP #ifdef PIDTEMP
pid_setpoint = code_value(); pid_setpoint = code_value();
#endif //PIDTEM #endif //PIDTEM
#ifdef WATCHPERIOD #ifdef WATCHPERIOD
if(target_raw[0]>current_raw[0]) { if(target_raw[TEMPSENSOR_HOTEND]>current_raw[TEMPSENSOR_HOTEND]){
watchmillis = max(1,millis()); watchmillis = max(1,millis());
watch_raw = current_raw[0]; watch_raw[TEMPSENSOR_HOTEND] = current_raw[TEMPSENSOR_HOTEND];
} else { } else {
watchmillis = 0; watchmillis = 0;
} }
@ -879,7 +879,7 @@ inline void process_commands()
#endif //TEMP_RESIDENCY_TIME #endif //TEMP_RESIDENCY_TIME
if( (millis() - codenum) > 1000 ) { //Print Temp Reading every 1 second while heating up/cooling down if( (millis() - codenum) > 1000 ) { //Print Temp Reading every 1 second while heating up/cooling down
Serial.print("T:"); Serial.print("T:");
Serial.println( analog2temp(current_raw[0]) ); Serial.println( analog2temp(current_raw[TEMPSENSOR_HOTEND]) );
codenum = millis(); codenum = millis();
} }
manage_heater(); manage_heater();
@ -893,25 +893,25 @@ inline void process_commands()
residencyStart = millis(); residencyStart = millis();
} }
#endif //TEMP_RESIDENCY_TIME #endif //TEMP_RESIDENCY_TIME
} }
LCD_MESSAGE("Marlin ready."); LCD_MESSAGE("Marlin ready.");
} }
break; break;
case 190: // M190 - Wait bed for heater to reach target. case 190: // M190 - Wait bed for heater to reach target.
#if TEMP_1_PIN > -1 #if TEMP_1_PIN > -1
if (code_seen('S')) target_raw[1] = temp2analog(code_value()); if (code_seen('S')) target_raw[TEMPSENSOR_BED] = temp2analog(code_value());
codenum = millis(); codenum = millis();
while(current_raw[1] < target_raw[1]) while(current_raw[TEMPSENSOR_BED] < target_raw[TEMPSENSOR_BED])
{ {
if( (millis()-codenum) > 1000 ) //Print Temp Reading every 1 second while heating up. if( (millis()-codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
{ {
float tt=analog2temp(current_raw[0]); float tt=analog2temp(current_raw[TEMPSENSOR_HOTEND]);
Serial.print("T:"); Serial.print("T:");
Serial.println( tt ); Serial.println( tt );
Serial.print("ok T:"); Serial.print("ok T:");
Serial.print( tt ); Serial.print( tt );
Serial.print(" B:"); Serial.print(" B:");
Serial.println( analog2temp(current_raw[1]) ); Serial.println( analog2temp(current_raw[TEMPSENSOR_BED]) );
codenum = millis(); codenum = millis();
} }
manage_heater(); manage_heater();

View file

@ -24,12 +24,12 @@
*/ */
/// Read a pin /// Read a pin
#define _READ(IO) ((bool)(DIO ## IO ## _RPORT & MASK(DIO ## IO ## _PIN))) #define _READ(IO) ((bool)(DIO ## IO ## _RPORT & MASK(DIO ## IO ## _PIN)))
/// write to a pin /// write to a pin
#define _WRITE(IO, v) do { if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); }; } while (0) #define _WRITE(IO, v) do { if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); }; } while (0)
//#define _WRITE(IO, v) do { #if (DIO ## IO ## _WPORT >= 0x100) CRITICAL_SECTION_START; if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); };#if (DIO ## IO ## _WPORT >= 0x100) CRITICAL_SECTION_END; } while (0) //#define _WRITE(IO, v) do { #if (DIO ## IO ## _WPORT >= 0x100) CRITICAL_SECTION_START; if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); };#if (DIO ## IO ## _WPORT >= 0x100) CRITICAL_SECTION_END; } while (0)
/// toggle a pin /// toggle a pin
#define _TOGGLE(IO) do {DIO ## IO ## _RPORT = MASK(DIO ## IO ## _PIN); } while (0) #define _TOGGLE(IO) do {DIO ## IO ## _RPORT = MASK(DIO ## IO ## _PIN); } while (0)
/// set pin as input /// set pin as input
#define _SET_INPUT(IO) do {DIO ## IO ## _DDR &= ~MASK(DIO ## IO ## _PIN); } while (0) #define _SET_INPUT(IO) do {DIO ## IO ## _DDR &= ~MASK(DIO ## IO ## _PIN); } while (0)

View file

@ -1,10 +0,0 @@
#ifndef __LCDH
#define __LCDH
#endif

View file

@ -1 +0,0 @@

View file

@ -381,13 +381,6 @@ void check_axes_activity() {
// calculation the caller must also provide the physical length of the line in millimeters. // calculation the caller must also provide the physical length of the line in millimeters.
void plan_buffer_line(float x, float y, float z, float e, float feed_rate) { void plan_buffer_line(float x, float y, float z, float e, float feed_rate) {
// The target position of the tool in absolute steps
// Calculate target position in absolute steps
long target[4];
target[X_AXIS] = lround(x*axis_steps_per_unit[X_AXIS]);
target[Y_AXIS] = lround(y*axis_steps_per_unit[Y_AXIS]);
target[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]);
target[E_AXIS] = lround(e*axis_steps_per_unit[E_AXIS]);
// Calculate the buffer head after we push this byte // Calculate the buffer head after we push this byte
int next_buffer_head = (block_buffer_head + 1) & (BLOCK_BUFFER_SIZE - 1); int next_buffer_head = (block_buffer_head + 1) & (BLOCK_BUFFER_SIZE - 1);
@ -400,6 +393,15 @@ void plan_buffer_line(float x, float y, float z, float e, float feed_rate) {
LCD_STATUS; LCD_STATUS;
} }
// The target position of the tool in absolute steps
// Calculate target position in absolute steps
//this should be done after the wait, because otherwise a M92 code within the gcode disrupts this calculation somehow
long target[4];
target[X_AXIS] = lround(x*axis_steps_per_unit[X_AXIS]);
target[Y_AXIS] = lround(y*axis_steps_per_unit[Y_AXIS]);
target[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]);
target[E_AXIS] = lround(e*axis_steps_per_unit[E_AXIS]);
// Prepare to set up new block // Prepare to set up new block
block_t *block = &block_buffer[block_buffer_head]; block_t *block = &block_buffer[block_buffer_head];
@ -433,7 +435,7 @@ void plan_buffer_line(float x, float y, float z, float e, float feed_rate) {
unsigned long microseconds; unsigned long microseconds;
if (block->steps_e == 0) { if (block->steps_e == 0) {
if(feed_rate<mintravelfeedrate) feed_rate=mintravelfeedrate; if(feed_rate<mintravelfeedrate) feed_rate=mintravelfeedrate;
} }
else { else {
if(feed_rate<minimumfeedrate) feed_rate=minimumfeedrate; if(feed_rate<minimumfeedrate) feed_rate=minimumfeedrate;

View file

@ -24,6 +24,8 @@
#ifndef planner_h #ifndef planner_h
#define planner_h #define planner_h
#include "Configuration.h"
// This struct is used when buffering the setup for each linear movement "nominal" values are as specified in // This struct is used when buffering the setup for each linear movement "nominal" values are as specified in
// the source g-code and may never actually be reached if acceleration management is active. // the source g-code and may never actually be reached if acceleration management is active.
typedef struct { typedef struct {

View file

@ -115,7 +115,7 @@ asm volatile ( \
#define ENABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 |= (1<<OCIE1A) #define ENABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 |= (1<<OCIE1A)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 &= ~(1<<OCIE1A) #define DISABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 &= ~(1<<OCIE1A)
static block_t *current_block; // A pointer to the block currently being traced block_t *current_block; // A pointer to the block currently being traced
// Variables used by The Stepper Driver Interrupt // Variables used by The Stepper Driver Interrupt
static unsigned char out_bits; // The next stepping-bits to be output static unsigned char out_bits; // The next stepping-bits to be output

View file

@ -20,6 +20,9 @@
#ifndef stepper_h #ifndef stepper_h
#define stepper_h #define stepper_h
#include "planner.h"
// Initialize and start the stepper motor subsystem // Initialize and start the stepper motor subsystem
void st_init(); void st_init();
@ -37,4 +40,5 @@ extern volatile long count_position[NUM_AXIS];
extern volatile int count_direction[NUM_AXIS]; extern volatile int count_direction[NUM_AXIS];
#endif #endif
extern block_t *current_block; // A pointer to the block currently being traced
#endif #endif

View file

@ -90,14 +90,15 @@ void manage_heater()
float pid_input; float pid_input;
float pid_output; float pid_output;
if(temp_meas_ready == true) { if(temp_meas_ready != true) //better readability
return;
CRITICAL_SECTION_START; CRITICAL_SECTION_START;
temp_meas_ready = false; temp_meas_ready = false;
CRITICAL_SECTION_END; CRITICAL_SECTION_END;
#ifdef PIDTEMP #ifdef PIDTEMP
pid_input = analog2temp(current_raw[0]); pid_input = analog2temp(current_raw[TEMPSENSOR_HOTEND]);
#ifndef PID_OPENLOOP #ifndef PID_OPENLOOP
pid_error = pid_setpoint - pid_input; pid_error = pid_setpoint - pid_input;
@ -118,10 +119,13 @@ CRITICAL_SECTION_END;
temp_iState += pid_error; temp_iState += pid_error;
temp_iState = constrain(temp_iState, temp_iState_min, temp_iState_max); temp_iState = constrain(temp_iState, temp_iState_min, temp_iState_max);
iTerm = Ki * temp_iState; iTerm = Ki * temp_iState;
#define K1 0.95 //K1 defined in Configuration.h in the PID settings
#define K2 (1.0-K1) #define K2 (1.0-K1)
dTerm = (Kd * (pid_input - temp_dState))*K2 + (K1 * dTerm); dTerm = (Kd * (pid_input - temp_dState))*K2 + (K1 * dTerm);
temp_dState = pid_input; temp_dState = pid_input;
#ifdef PID_ADD_EXTRUSION_RATE
pTerm+=Kc*current_block->speed_e; //additional heating if extrusion speed is high
#endif
pid_output = constrain(pTerm + iTerm - dTerm, 0, PID_MAX); pid_output = constrain(pTerm + iTerm - dTerm, 0, PID_MAX);
} }
#endif //PID_OPENLOOP #endif //PID_OPENLOOP
@ -157,7 +161,7 @@ CRITICAL_SECTION_END;
previous_millis_bed_heater = millis(); previous_millis_bed_heater = millis();
#if TEMP_1_PIN > -1 #if TEMP_1_PIN > -1
if(current_raw[1] >= target_raw[1]) if(current_raw[TEMPSENSOR_BED] >= target_raw[TEMPSENSOR_BED])
{ {
WRITE(HEATER_1_PIN,LOW); WRITE(HEATER_1_PIN,LOW);
} }
@ -167,7 +171,6 @@ CRITICAL_SECTION_END;
} }
#endif #endif
} }
}
// Takes hot end temperature value as input and returns corresponding raw value. // Takes hot end temperature value as input and returns corresponding raw value.
// For a thermistor, it uses the RepRap thermistor temp table. // For a thermistor, it uses the RepRap thermistor temp table.
@ -428,15 +431,15 @@ ISR(TIMER0_COMPB_vect)
raw_temp_2_value = 0; raw_temp_2_value = 0;
#ifdef MAXTEMP #ifdef MAXTEMP
#if (HEATER_0_PIN > -1) #if (HEATER_0_PIN > -1)
if(current_raw[0] >= maxttemp) { if(current_raw[TEMPSENSOR_HOTEND] >= maxttemp) {
target_raw[0] = 0; target_raw[TEMPSENSOR_HOTEND] = 0;
analogWrite(HEATER_0_PIN, 0); analogWrite(HEATER_0_PIN, 0);
Serial.println("!! Temperature extruder 0 switched off. MAXTEMP triggered !!"); Serial.println("!! Temperature extruder 0 switched off. MAXTEMP triggered !!");
} }
#endif #endif
#if (HEATER_2_PIN > -1) #if (HEATER_2_PIN > -1)
if(current_raw[2] >= maxttemp) { if(current_raw[TEMPSENSOR_AUX] >= maxttemp) {
target_raw[2] = 0; target_raw[TEMPSENSOR_AUX] = 0;
analogWrite(HEATER_2_PIN, 0); analogWrite(HEATER_2_PIN, 0);
Serial.println("!! Temperature extruder 1 switched off. MAXTEMP triggered !!"); Serial.println("!! Temperature extruder 1 switched off. MAXTEMP triggered !!");
} }
@ -444,15 +447,15 @@ ISR(TIMER0_COMPB_vect)
#endif //MAXTEMP #endif //MAXTEMP
#ifdef MINTEMP #ifdef MINTEMP
#if (HEATER_0_PIN > -1) #if (HEATER_0_PIN > -1)
if(current_raw[0] <= minttemp) { if(current_raw[TEMPSENSOR_HOTEND] <= minttemp) {
target_raw[0] = 0; target_raw[TEMPSENSOR_HOTEND] = 0;
analogWrite(HEATER_0_PIN, 0); analogWrite(HEATER_0_PIN, 0);
Serial.println("!! Temperature extruder 0 switched off. MINTEMP triggered !!"); Serial.println("!! Temperature extruder 0 switched off. MINTEMP triggered !!");
} }
#endif #endif
#if (HEATER_2_PIN > -1) #if (HEATER_2_PIN > -1)
if(current_raw[2] <= minttemp) { if(current_raw[TEMPSENSOR_AUX] <= minttemp) {
target_raw[2] = 0; target_raw[TEMPSENSOR_AUX] = 0;
analogWrite(HEATER_2_PIN, 0); analogWrite(HEATER_2_PIN, 0);
Serial.println("!! Temperature extruder 1 switched off. MINTEMP triggered !!"); Serial.println("!! Temperature extruder 1 switched off. MINTEMP triggered !!");
} }

View file

@ -21,8 +21,10 @@
#ifndef temperature_h #ifndef temperature_h
#define temperature_h #define temperature_h
void manage_inactivity(byte debug); #include "Marlin.h"
#ifdef PID_ADD_EXTRUSION_RATE
#include "stepper.h"
#endif
void tp_init(); void tp_init();
void manage_heater(); void manage_heater();
//int temp2analogu(int celsius, const short table[][2], int numtemps); //int temp2analogu(int celsius, const short table[][2], int numtemps);
@ -48,6 +50,7 @@ extern float Ki;
extern float Kd; extern float Kd;
extern float Kc; extern float Kc;
enum {TEMPSENSOR_HOTEND=0,TEMPSENSOR_BED=1, TEMPSENSOR_AUX=2};
extern int target_raw[3]; extern int target_raw[3];
extern int current_raw[3]; extern int current_raw[3];
extern double pid_setpoint; extern double pid_setpoint;

View file

@ -7,67 +7,67 @@
#define NUMTEMPS_1 61 #define NUMTEMPS_1 61
const short temptable_1[NUMTEMPS_1][2] = { const short temptable_1[NUMTEMPS_1][2] = {
{ 23*OVERSAMPLENR , 300 }, { 23*OVERSAMPLENR , 300 },
{ 25*OVERSAMPLENR , 295 }, { 25*OVERSAMPLENR , 295 },
{ 27*OVERSAMPLENR , 290 }, { 27*OVERSAMPLENR , 290 },
{ 28*OVERSAMPLENR , 285 }, { 28*OVERSAMPLENR , 285 },
{ 31*OVERSAMPLENR , 280 }, { 31*OVERSAMPLENR , 280 },
{ 33*OVERSAMPLENR , 275 }, { 33*OVERSAMPLENR , 275 },
{ 35*OVERSAMPLENR , 270 }, { 35*OVERSAMPLENR , 270 },
{ 38*OVERSAMPLENR , 265 }, { 38*OVERSAMPLENR , 265 },
{ 41*OVERSAMPLENR , 260 }, { 41*OVERSAMPLENR , 260 },
{ 44*OVERSAMPLENR , 255 }, { 44*OVERSAMPLENR , 255 },
{ 48*OVERSAMPLENR , 250 }, { 48*OVERSAMPLENR , 250 },
{ 52*OVERSAMPLENR , 245 }, { 52*OVERSAMPLENR , 245 },
{ 56*OVERSAMPLENR , 240 }, { 56*OVERSAMPLENR , 240 },
{ 61*OVERSAMPLENR , 235 }, { 61*OVERSAMPLENR , 235 },
{ 66*OVERSAMPLENR , 230 }, { 66*OVERSAMPLENR , 230 },
{ 71*OVERSAMPLENR , 225 }, { 71*OVERSAMPLENR , 225 },
{ 78*OVERSAMPLENR , 220 }, { 78*OVERSAMPLENR , 220 },
{ 84*OVERSAMPLENR , 215 }, { 84*OVERSAMPLENR , 215 },
{ 92*OVERSAMPLENR , 210 }, { 92*OVERSAMPLENR , 210 },
{ 100*OVERSAMPLENR , 205 }, { 100*OVERSAMPLENR , 205 },
{ 109*OVERSAMPLENR , 200 }, { 109*OVERSAMPLENR , 200 },
{ 120*OVERSAMPLENR , 195 }, { 120*OVERSAMPLENR , 195 },
{ 131*OVERSAMPLENR , 190 }, { 131*OVERSAMPLENR , 190 },
{ 143*OVERSAMPLENR , 185 }, { 143*OVERSAMPLENR , 185 },
{ 156*OVERSAMPLENR , 180 }, { 156*OVERSAMPLENR , 180 },
{ 171*OVERSAMPLENR , 175 }, { 171*OVERSAMPLENR , 175 },
{ 187*OVERSAMPLENR , 170 }, { 187*OVERSAMPLENR , 170 },
{ 205*OVERSAMPLENR , 165 }, { 205*OVERSAMPLENR , 165 },
{ 224*OVERSAMPLENR , 160 }, { 224*OVERSAMPLENR , 160 },
{ 245*OVERSAMPLENR , 155 }, { 245*OVERSAMPLENR , 155 },
{ 268*OVERSAMPLENR , 150 }, { 268*OVERSAMPLENR , 150 },
{ 293*OVERSAMPLENR , 145 }, { 293*OVERSAMPLENR , 145 },
{ 320*OVERSAMPLENR , 140 }, { 320*OVERSAMPLENR , 140 },
{ 348*OVERSAMPLENR , 135 }, { 348*OVERSAMPLENR , 135 },
{ 379*OVERSAMPLENR , 130 }, { 379*OVERSAMPLENR , 130 },
{ 411*OVERSAMPLENR , 125 }, { 411*OVERSAMPLENR , 125 },
{ 445*OVERSAMPLENR , 120 }, { 445*OVERSAMPLENR , 120 },
{ 480*OVERSAMPLENR , 115 }, { 480*OVERSAMPLENR , 115 },
{ 516*OVERSAMPLENR , 110 }, { 516*OVERSAMPLENR , 110 },
{ 553*OVERSAMPLENR , 105 }, { 553*OVERSAMPLENR , 105 },
{ 591*OVERSAMPLENR , 100 }, { 591*OVERSAMPLENR , 100 },
{ 628*OVERSAMPLENR , 95 }, { 628*OVERSAMPLENR , 95 },
{ 665*OVERSAMPLENR , 90 }, { 665*OVERSAMPLENR , 90 },
{ 702*OVERSAMPLENR , 85 }, { 702*OVERSAMPLENR , 85 },
{ 737*OVERSAMPLENR , 80 }, { 737*OVERSAMPLENR , 80 },
{ 770*OVERSAMPLENR , 75 }, { 770*OVERSAMPLENR , 75 },
{ 801*OVERSAMPLENR , 70 }, { 801*OVERSAMPLENR , 70 },
{ 830*OVERSAMPLENR , 65 }, { 830*OVERSAMPLENR , 65 },
{ 857*OVERSAMPLENR , 60 }, { 857*OVERSAMPLENR , 60 },
{ 881*OVERSAMPLENR , 55 }, { 881*OVERSAMPLENR , 55 },
{ 903*OVERSAMPLENR , 50 }, { 903*OVERSAMPLENR , 50 },
{ 922*OVERSAMPLENR , 45 }, { 922*OVERSAMPLENR , 45 },
{ 939*OVERSAMPLENR , 40 }, { 939*OVERSAMPLENR , 40 },
{ 954*OVERSAMPLENR , 35 }, { 954*OVERSAMPLENR , 35 },
{ 966*OVERSAMPLENR , 30 }, { 966*OVERSAMPLENR , 30 },
{ 977*OVERSAMPLENR , 25 }, { 977*OVERSAMPLENR , 25 },
{ 985*OVERSAMPLENR , 20 }, { 985*OVERSAMPLENR , 20 },
{ 993*OVERSAMPLENR , 15 }, { 993*OVERSAMPLENR , 15 },
{ 999*OVERSAMPLENR , 10 }, { 999*OVERSAMPLENR , 10 },
{ 1004*OVERSAMPLENR , 5 }, { 1004*OVERSAMPLENR , 5 },
{ 1008*OVERSAMPLENR , 0 } //safety { 1008*OVERSAMPLENR , 0 } //safety
}; };
#endif #endif
#if (THERMISTORHEATER_1 == 2) || (THERMISTORHEATER_2 == 2) || (THERMISTORBED == 2) //200k bed thermistor #if (THERMISTORHEATER_1 == 2) || (THERMISTORHEATER_2 == 2) || (THERMISTORBED == 2) //200k bed thermistor
@ -100,35 +100,35 @@ const short temptable_2[NUMTEMPS_2][2] = {
#if (THERMISTORHEATER_1 == 3) || (THERMISTORHEATER_2 == 3) || (THERMISTORBED == 3) //mendel-parts #if (THERMISTORHEATER_1 == 3) || (THERMISTORHEATER_2 == 3) || (THERMISTORBED == 3) //mendel-parts
#define NUMTEMPS_3 28 #define NUMTEMPS_3 28
const short temptable_3[NUMTEMPS_3][2] = { const short temptable_3[NUMTEMPS_3][2] = {
{1*OVERSAMPLENR,864}, {1*OVERSAMPLENR,864},
{21*OVERSAMPLENR,300}, {21*OVERSAMPLENR,300},
{25*OVERSAMPLENR,290}, {25*OVERSAMPLENR,290},
{29*OVERSAMPLENR,280}, {29*OVERSAMPLENR,280},
{33*OVERSAMPLENR,270}, {33*OVERSAMPLENR,270},
{39*OVERSAMPLENR,260}, {39*OVERSAMPLENR,260},
{46*OVERSAMPLENR,250}, {46*OVERSAMPLENR,250},
{54*OVERSAMPLENR,240}, {54*OVERSAMPLENR,240},
{64*OVERSAMPLENR,230}, {64*OVERSAMPLENR,230},
{75*OVERSAMPLENR,220}, {75*OVERSAMPLENR,220},
{90*OVERSAMPLENR,210}, {90*OVERSAMPLENR,210},
{107*OVERSAMPLENR,200}, {107*OVERSAMPLENR,200},
{128*OVERSAMPLENR,190}, {128*OVERSAMPLENR,190},
{154*OVERSAMPLENR,180}, {154*OVERSAMPLENR,180},
{184*OVERSAMPLENR,170}, {184*OVERSAMPLENR,170},
{221*OVERSAMPLENR,160}, {221*OVERSAMPLENR,160},
{265*OVERSAMPLENR,150}, {265*OVERSAMPLENR,150},
{316*OVERSAMPLENR,140}, {316*OVERSAMPLENR,140},
{375*OVERSAMPLENR,130}, {375*OVERSAMPLENR,130},
{441*OVERSAMPLENR,120}, {441*OVERSAMPLENR,120},
{513*OVERSAMPLENR,110}, {513*OVERSAMPLENR,110},
{588*OVERSAMPLENR,100}, {588*OVERSAMPLENR,100},
{734*OVERSAMPLENR,80}, {734*OVERSAMPLENR,80},
{856*OVERSAMPLENR,60}, {856*OVERSAMPLENR,60},
{938*OVERSAMPLENR,40}, {938*OVERSAMPLENR,40},
{986*OVERSAMPLENR,20}, {986*OVERSAMPLENR,20},
{1008*OVERSAMPLENR,0}, {1008*OVERSAMPLENR,0},
{1018*OVERSAMPLENR,-20} {1018*OVERSAMPLENR,-20}
}; };
#endif #endif
#if (THERMISTORHEATER_1 == 4) || (THERMISTORHEATER_2 == 4) || (THERMISTORBED == 4) //10k thermistor #if (THERMISTORHEATER_1 == 4) || (THERMISTORHEATER_2 == 4) || (THERMISTORBED == 4) //10k thermistor

View file

@ -253,17 +253,17 @@ void MainMenu::showStatus()
} }
if((abs(current_raw[0]-oldcurrentraw)>3)||force_lcd_update) if((abs(current_raw[TEMPSENSOR_HOTEND]-oldcurrentraw)>3)||force_lcd_update)
{ {
lcd.setCursor(1,0); lcd.setCursor(1,0);
lcd.print(ftostr3(analog2temp(current_raw[0]))); lcd.print(ftostr3(analog2temp(current_raw[TEMPSENSOR_HOTEND])));
oldcurrentraw=current_raw[0]; oldcurrentraw=current_raw[TEMPSENSOR_HOTEND];
} }
if((target_raw[0]!=oldtargetraw)||force_lcd_update) if((target_raw[TEMPSENSOR_HOTEND]!=oldtargetraw)||force_lcd_update)
{ {
lcd.setCursor(5,0); lcd.setCursor(5,0);
lcd.print(ftostr3(analog2temp(target_raw[0]))); lcd.print(ftostr3(analog2temp(target_raw[TEMPSENSOR_HOTEND])));
oldtargetraw=target_raw[0]; oldtargetraw=target_raw[TEMPSENSOR_HOTEND];
} }
#if defined BED_USES_THERMISTOR || defined BED_USES_AD595 #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
static int oldcurrentbedraw=-1; static int oldcurrentbedraw=-1;
@ -272,7 +272,7 @@ void MainMenu::showStatus()
{ {
lcd.setCursor(1,0); lcd.setCursor(1,0);
lcd.print(ftostr3(analog2temp(current_bed_raw))); lcd.print(ftostr3(analog2temp(current_bed_raw)));
oldcurrentraw=current_raw[1]; oldcurrentraw=current_raw[TEMPSENSOR_BED];
} }
if((target_bed_raw!=oldtargebedtraw)||force_lcd_update) if((target_bed_raw!=oldtargebedtraw)||force_lcd_update)
{ {
@ -339,17 +339,17 @@ void MainMenu::showStatus()
} }
if((abs(current_raw[0]-oldcurrentraw)>3)||force_lcd_update) if((abs(current_raw[TEMPSENSOR_HOTEND]-oldcurrentraw)>3)||force_lcd_update)
{ {
lcd.setCursor(1,0); lcd.setCursor(1,0);
lcd.print(ftostr3(analog2temp(current_raw[0]))); lcd.print(ftostr3(analog2temp(current_raw[TEMPSENSOR_HOTEND])));
oldcurrentraw=current_raw[0]; oldcurrentraw=current_raw[TEMPSENSOR_HOTEND];
} }
if((target_raw[0]!=oldtargetraw)||force_lcd_update) if((target_raw[TEMPSENSOR_HOTEND]!=oldtargetraw)||force_lcd_update)
{ {
lcd.setCursor(5,0); lcd.setCursor(5,0);
lcd.print(ftostr3(analog2temp(target_raw[0]))); lcd.print(ftostr3(analog2temp(target_raw[TEMPSENSOR_HOTEND])));
oldtargetraw=target_raw[0]; oldtargetraw=target_raw[TEMPSENSOR_HOTEND];
} }
if(messagetext[0]!='\0') if(messagetext[0]!='\0')
@ -426,7 +426,7 @@ void MainMenu::showPrepare()
if((activeline==line) && CLICKED) if((activeline==line) && CLICKED)
{ {
BLOCK BLOCK
target_raw[0] = temp2analog(170); target_raw[TEMPSENSOR_HOTEND] = temp2analog(170);
beepshort(); beepshort();
} }
}break; }break;
@ -531,7 +531,7 @@ void MainMenu::showControl()
if(force_lcd_update) if(force_lcd_update)
{ {
lcd.setCursor(0,line);lcd.print(" \002Nozzle:"); lcd.setCursor(0,line);lcd.print(" \002Nozzle:");
lcd.setCursor(13,line);lcd.print(ftostr3(analog2temp(target_raw[0]))); lcd.setCursor(13,line);lcd.print(ftostr3(analog2temp(target_raw[TEMPSENSOR_HOTEND])));
} }
if((activeline==line) ) if((activeline==line) )
@ -541,11 +541,11 @@ void MainMenu::showControl()
linechanging=!linechanging; linechanging=!linechanging;
if(linechanging) if(linechanging)
{ {
encoderpos=(int)analog2temp(target_raw[0]); encoderpos=(int)analog2temp(target_raw[TEMPSENSOR_HOTEND]);
} }
else else
{ {
target_raw[0] = temp2analog(encoderpos); target_raw[TEMPSENSOR_HOTEND] = temp2analog(encoderpos);
encoderpos=activeline*lcdslow; encoderpos=activeline*lcdslow;
beepshort(); beepshort();
} }

64
README
View file

@ -1,7 +1,14 @@
This firmware is a mashup between Sprinter, grbl and many original parts. This RepRap firmware is a mashup between Sprinter, grbl and many original parts.
(https://github.com/kliment/Sprinter) (https://github.com/kliment/Sprinter)
(https://github.com/simen/grbl/tree) (https://github.com/simen/grbl/tree)
Derived from Sprinter and Grbl by Erik van der Zalm.
Sprinters lead developers are Kliment and caru.
Grbls lead developer is Simen Svale Skogsrud.
It has been adapted to the Ultimaker Printer by:
Bernhard Kubicek, Matthijs Keuper, Bradley Feldman, and others...
Features: Features:
- Interrupt based movement with real linear acceleration - Interrupt based movement with real linear acceleration
- High steprate - High steprate
@ -9,62 +16,49 @@ Features:
- Interrupt based temperature protection - Interrupt based temperature protection
- preliminary support for Matthew Roberts advance algorithm - preliminary support for Matthew Roberts advance algorithm
For more info see: http://reprap.org/pipermail/reprap-dev/2011-May/003323.html For more info see: http://reprap.org/pipermail/reprap-dev/2011-May/003323.html
- Full endstop support
- Simple LCD support (16x2)
- SD Card support
- Provisions for Bernhard Kubicek's new hardware control console and 20x4 lcd
This firmware is optimized for gen6 electronics. This firmware is optimized for Ultimaker's gen6 electronics (including the Ultimaker 1.5.x daughterboard and Arduino Mega 2560).
The default baudrate is 115200.
The default baudrate is 250000.
This gives less communication errors then regular baudrates.
======================================================================================== ========================================================================================
Configuring and compilation Configuring and compilation
Install the arduino software version 0018 Install the latest arduino software IDE/toolset (currently 0022)
http://www.arduino.cc/en/Main/Software http://www.arduino.cc/en/Main/Software
Install the sanguino software, version 0018 Install Ultimaker's RepG 25 build
http://sanguino.cc/useit http://software.ultimaker.com
(or alternatively install Kliment's printrun/pronterface https://github.com/kliment/Printrun_)
Install pronterface Copy the Ultimaker Marlin firmware
https://github.com/kliment/Printrun https:/github.com/bkubicek/Marlin
Copy the Marlin firmware
https:/github.com/ErikZalm/Marlin
(Use the download button) (Use the download button)
Start the arduino IDE. Start the arduino IDE.
Select Tools -> Board -> Sanguino Select Tools -> Board -> Arduino Mega 2560
Select the correct serial port in Tools ->Serial Port Select the correct serial port in Tools ->Serial Port
Open Marlin.pde Open Marlin.pde
Change the printer specific setting in Configuration.h to the correct values. Click the Verify/Compile button
The following values are the most important:
- float axis_steps_per_unit[].... // Set the correct steps / mm in the corresponding field
- const bool ENDSTOPS_INVERTING = false; // Change if only positive moves are executed
- #define INVERT_x_DIR true // Change if the motor direction is wrong
Click the Upload button Click the Upload button
If all goes well the firmware is uploading If all goes well the firmware is uploading
Start pronterface Start Ultimaker's Custom RepG 25
Make sure Show Experimental Profiles is enabled in Preferences
Select the correct Serial Port. Type 250000 in the baudrate field. Select Sprinter as the Driver
Press the Connect button
===============================================================================================
Known issues
On some systems we get compilation errors.
This is caused by the "wiring_serial.c" and "wiring.c".
The simple fix is to delete these files but this may have a performance impact.
The best workaround is to move these files to sanguino directory.
(".../arduino-0018/hardware/Sanguino/cores/arduino/" on windows systems)
Press the Connect button.
KNOWN ISSUES: RepG will display: Unknown: marlin x.y.z
That's ok. Enjoy Silky Smooth Printing.

69
README.md Normal file
View file

@ -0,0 +1,69 @@
WARNING: THIS IN A PROCESS OF HEAVY OVERWORKING.
DO NOT USE THIS ON YOUR MACHINE UNTIL FURTHER NOTICE!!!
===========================================
This RepRap firmware is a mashup between <a href="https://github.com/kliment/Sprinter">Sprinter</a>, <a href="https://github.com/simen/grbl/tree">grbl</a> and many original parts.
Derived from Sprinter and Grbl by Erik van der Zalm.
Sprinters lead developers are Kliment and caru.
Grbls lead developer is Simen Svale Skogsrud.
Some features have been added by and configuration has been added by:
Bernhard Kubicek, Matthijs Keuper, Bradley Feldman, and others...
Features:
- Interrupt based movement with real linear acceleration
- High steprate
- Look ahead (Keep the speed high when possible. High cornering speed)
- Interrupt based temperature protection
- preliminary support for Matthew Roberts advance algorithm
For more info see: http://reprap.org/pipermail/reprap-dev/2011-May/003323.html
- Full endstop support
- Simple LCD support (16x2)
- SD Card support
- Provisions for Bernhard Kubicek's new hardware control console and 20x4 lcd
This firmware is optimized for Ultimaker's gen6 electronics (including the Ultimaker 1.5.x daughterboard and Arduino Mega 2560).
The default baudrate is 115200.
========================================================================================
Configuring and compilation
Install the latest arduino software IDE/toolset (currently 0022)
http://www.arduino.cc/en/Main/Software
Install Ultimaker's RepG 25 build
http://software.ultimaker.com
(or alternatively install Kliment's printrun/pronterface https://github.com/kliment/Printrun_)
Copy the Ultimaker Marlin firmware
https:/github.com/bkubicek/Marlin
(Use the download button)
Start the arduino IDE.
Select Tools -> Board -> Arduino Mega 2560
Select the correct serial port in Tools ->Serial Port
Open Marlin.pde
Click the Verify/Compile button
Click the Upload button
If all goes well the firmware is uploading
Start Ultimaker's Custom RepG 25
Make sure Show Experimental Profiles is enabled in Preferences
Select Sprinter as the Driver
Press the Connect button.
KNOWN ISSUES: RepG will display: Unknown: marlin x.y.z
That's ok. Enjoy Silky Smooth Printing.

58
merging still needs.txt Normal file
View file

@ -0,0 +1,58 @@
files to compare manually:
planner.cpp
stepper.cpp
temperature.cpp
---
things that changed:
* planner.cpp
estimate_acc_distance now works with floats.
in calculate_trapezoid:for_block
long acceleration_rate=(long)((float)acceleration*8.388608) is gone
so is block_>acceleration_rate
void planner_reverse_pass:
some stuff I don't understand right now changed
in planner_forward_pass:
done: BLOCK_BUFFER_SIZE is now necessarily power of 2 (aka 8 16, 32). Inportant to document this somewhere.
no more inline in void plan_discard_current_block()
no more inline in plan_get_current_block()
in plan_buffer_line(...)
the long target[4]; and calculations of thoose should go after the while(block_buffer_tail==..). if the axis_steps_per_unit are changed from the gcode (M92) the calculation for the currently planned buffer move will be corrupt, because Target is calculated with one value, and the stuff afterwards with another. At least this solved the problem I had with the M92 E* changes in the code. Very sure about this, I took me 20min to find this as the solution for the bug I was hunting.
around if(feed_rate<minimumfeedrate) this only should be done if it is not a pure extrusion. I think there is a bug right now.
~line 447 blockcount=
not sure if this also works if the difference is negative, as it would happen if the ringbuffer runs over the end and start at 0.
~line 507 tmp_aceleration. not sure whats going on, but a lot changed.
* stepper.cpp
~214: if (busy) should be a echoln, maybe
~331: great, The Z_M_PIN checks are in :)
*temperature.cpp
done: enum for heater, bed,
manage_heater() is seriously different.
done: if tem_meas_ready ==true->!true+return?
done #define K1 0.95 maybe in the configuration.h?
semi-done: PID-C checking needed. Untested but added.
----
still needed to finish the merge, before testin!
manage_heater
ISR
movement planner
TODO:
remove traveling at maxpseed
remove Simplelcd
remove DEBUG_STEPS?
block_t
pid_dt ->0.1 whats the changes to the PID, checking needed
----
second merge saturday morning:
done: PID_dt->0.1