merge gen3 stuff
This commit is contained in:
parent
c7ac215c59
commit
4bdb97c3b7
12
Makefile
12
Makefile
|
|
@ -31,7 +31,7 @@
|
||||||
|
|
||||||
PROGRAM = mendel
|
PROGRAM = mendel
|
||||||
|
|
||||||
SOURCES = $(PROGRAM).c serial.c dda.c gcode_parse.c gcode_process.c timer.c temp.c sermsg.c dda_queue.c watchdog.c debug.c sersendf.c heater.c analog.c delay.c
|
SOURCES = $(PROGRAM).c serial.c dda.c gcode_parse.c gcode_process.c timer.c temp.c sermsg.c dda_queue.c watchdog.c debug.c sersendf.c heater.c analog.c delay.c intercom.c
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# #
|
# #
|
||||||
|
|
@ -68,10 +68,12 @@ OBJCOPY = $(ARCH)objcopy
|
||||||
# enables reprap-style acceleration #
|
# enables reprap-style acceleration #
|
||||||
# ACCELERATION_RAMPING #
|
# ACCELERATION_RAMPING #
|
||||||
# enables start/stop ramping #
|
# enables start/stop ramping #
|
||||||
|
# GEN3 #
|
||||||
|
# build for standard reprap electronics instead of your custom rig #
|
||||||
# #
|
# #
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
DEFS = -DF_CPU=$(F_CPU)
|
DEFS = -DF_CPU=$(F_CPU) -DHOST -DGEN3
|
||||||
# DEFS += "-DDEBUG=1"
|
# DEFS += "-DDEBUG=1"
|
||||||
|
|
||||||
OPTIMIZE = -Os -ffunction-sections -finline-functions-called-once
|
OPTIMIZE = -Os -ffunction-sections -finline-functions-called-once
|
||||||
|
|
@ -115,9 +117,9 @@ clean:
|
||||||
|
|
||||||
size: $(PROGRAM).elf
|
size: $(PROGRAM).elf
|
||||||
@echo " SIZE Atmega168 Atmega328p Atmega644"
|
@echo " SIZE Atmega168 Atmega328p Atmega644"
|
||||||
@$(OBJDUMP) -h $^ | perl -ne '/.(text)\s+([0-9a-f]+)/ && do { $$a += eval "0x$$2" }; END { printf " FLASH : %5d bytes (%2d%% of %2dkb) (%2d%% of %2dkb) (%2d%% of %2dkb)\n", $$a, $$a * 100 / (14 * 1024), 14, $$a * 100 / (30 * 1024), 30, $$a * 100 / (63 * 1024), 63 }'
|
@$(OBJDUMP) -h $^ | perl -MPOSIX -ne '/.(text)\s+([0-9a-f]+)/ && do { $$a += eval "0x$$2" }; END { printf " FLASH : %5d bytes (%2d%% of %2dkb) (%2d%% of %2dkb) (%2d%% of %2dkb)\n", $$a, ceil($$a * 100 / (14 * 1024)), 14, ceil($$a * 100 / (30 * 1024)), 30, ceil($$a * 100 / (63 * 1024)), 63 }'
|
||||||
@$(OBJDUMP) -h $^ | perl -ne '/.(data|bss)\s+([0-9a-f]+)/ && do { $$a += eval "0x$$2" }; END { printf " RAM : %5d bytes (%2d%% of %2dkb) (%2d%% of %2dkb) (%2d%% of %2dkb)\n", $$a, $$a * 100 / (1 * 1024), 1, $$a * 100 / (2 * 1024), 2, $$a * 100 / (4 * 1024), 4 }'
|
@$(OBJDUMP) -h $^ | perl -MPOSIX -ne '/.(data|bss)\s+([0-9a-f]+)/ && do { $$a += eval "0x$$2" }; END { printf " RAM : %5d bytes (%2d%% of %2dkb) (%2d%% of %2dkb) (%2d%% of %2dkb)\n", $$a, ceil($$a * 100 / (1 * 1024)), 1, ceil($$a * 100 / (2 * 1024)), 2, ceil($$a * 100 / (4 * 1024)), 4 }'
|
||||||
@$(OBJDUMP) -h $^ | perl -ne '/.(eeprom)\s+([0-9a-f]+)/ && do { $$a += eval "0x$$2" }; END { printf " EEPROM: %5d bytes (%2d%% of %2dkb) (%2d%% of %2dkb) (%2d%% of %2dkb)\n", $$a, $$a * 100 / (1 * 1024), 1, $$a * 100 / (2 * 1024), 2, $$a * 100 / (2 * 1024), 2 }'
|
@$(OBJDUMP) -h $^ | perl -MPOSIX -ne '/.(eeprom)\s+([0-9a-f]+)/ && do { $$a += eval "0x$$2" }; END { printf " EEPROM: %5d bytes (%2d%% of %2dkb) (%2d%% of %2dkb) (%2d%% of %2dkb)\n", $$a, ceil($$a * 100 / (1 * 1024)), 1, ceil($$a * 100 / (2 * 1024)), 2, ceil($$a * 100 / (2 * 1024)), 2 }'
|
||||||
|
|
||||||
config.h: config.h.dist
|
config.h: config.h.dist
|
||||||
@echo "Please review config.h, as config.h.dist is more recent."
|
@echo "Please review config.h, as config.h.dist is more recent."
|
||||||
|
|
|
||||||
|
|
@ -46,14 +46,14 @@
|
||||||
Each movement starts at the speed of the previous command and accelerates or decelerates linearly to reach target speed at the end of the movement.
|
Each movement starts at the speed of the previous command and accelerates or decelerates linearly to reach target speed at the end of the movement.
|
||||||
Can also be set in Makefile
|
Can also be set in Makefile
|
||||||
*/
|
*/
|
||||||
#define ACCELERATION_REPRAP
|
// #define ACCELERATION_REPRAP
|
||||||
|
|
||||||
/*
|
/*
|
||||||
acceleration and deceleration ramping.
|
acceleration and deceleration ramping.
|
||||||
Each movement starts at (almost) no speed, linearly accelerates to target speed and decelerates just in time to smoothly stop at the target. alternative to ACCELERATION_REPRAP
|
Each movement starts at (almost) no speed, linearly accelerates to target speed and decelerates just in time to smoothly stop at the target. alternative to ACCELERATION_REPRAP
|
||||||
Can also be set in Makefile
|
Can also be set in Makefile
|
||||||
*/
|
*/
|
||||||
//#define ACCELERATION_RAMPING
|
#define ACCELERATION_RAMPING
|
||||||
|
|
||||||
// how fast to accelerate when using ACCELERATION_RAMPING
|
// how fast to accelerate when using ACCELERATION_RAMPING
|
||||||
// smaller values give quicker acceleration
|
// smaller values give quicker acceleration
|
||||||
|
|
@ -68,7 +68,7 @@
|
||||||
|
|
||||||
// which temperature sensor are you using?
|
// which temperature sensor are you using?
|
||||||
// #define TEMP_MAX6675
|
// #define TEMP_MAX6675
|
||||||
#define TEMP_THERMISTOR
|
// #define TEMP_THERMISTOR
|
||||||
// #define TEMP_AD595
|
// #define TEMP_AD595
|
||||||
|
|
||||||
#define NUM_TEMP_SENSORS 1
|
#define NUM_TEMP_SENSORS 1
|
||||||
|
|
@ -80,6 +80,9 @@
|
||||||
* If your temperature sensor has no associated heater, enter '255' as the *
|
* If your temperature sensor has no associated heater, enter '255' as the *
|
||||||
* heater index. *
|
* heater index. *
|
||||||
* *
|
* *
|
||||||
|
* for GEN3 set temp_type to TT_INTERCOM, temp_pin to 0 and heater index to *
|
||||||
|
* 255 *
|
||||||
|
* *
|
||||||
\***************************************************************************/
|
\***************************************************************************/
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
|
@ -90,14 +93,14 @@ struct {
|
||||||
} temp_sensors[NUM_TEMP_SENSORS] =
|
} temp_sensors[NUM_TEMP_SENSORS] =
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
TT_MAX6675,
|
TT_INTERCOM,
|
||||||
0,
|
0,
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define NUM_HEATERS 1
|
#define NUM_HEATERS 0
|
||||||
#ifdef HEATER_C
|
#ifdef HEATER_C
|
||||||
/***************************************************************************\
|
/***************************************************************************\
|
||||||
* *
|
* *
|
||||||
|
|
@ -119,7 +122,7 @@ struct {
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
&PORTD,
|
&PORTD,
|
||||||
PIND0,
|
PIND6,
|
||||||
&OCR0A
|
&OCR0A
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -238,6 +241,12 @@ struct {
|
||||||
|
|
||||||
#define STEPPER_ENABLE_PIN DIO9
|
#define STEPPER_ENABLE_PIN DIO9
|
||||||
|
|
||||||
|
#ifdef GEN3
|
||||||
|
#define TX_ENABLE_PIN AIO2
|
||||||
|
#define RX_ENABLE_PIN DIO4
|
||||||
|
#define DEBUG_LED DIO13
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* list of PWM-able pins and corresponding timers
|
* list of PWM-able pins and corresponding timers
|
||||||
* timer1 is used for step timing so don't use OC1A/OC1B
|
* timer1 is used for step timing so don't use OC1A/OC1B
|
||||||
|
|
@ -273,14 +282,7 @@ struct {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// this is the scaling of internally stored PID values. 1024L is a good value
|
||||||
// comment out the ones you don't have
|
|
||||||
#define HEATER_PIN DIO6
|
|
||||||
#define HEATER_PWM OCR0A
|
|
||||||
|
|
||||||
#define FAN_PIN DIO5
|
|
||||||
#define FAN_PWM OCR0B
|
|
||||||
|
|
||||||
#define PID_SCALE 1024L
|
#define PID_SCALE 1024L
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,142 @@
|
||||||
|
##############################################################################
|
||||||
|
# #
|
||||||
|
# FiveD on Arduino - alternative firmware for repraps #
|
||||||
|
# #
|
||||||
|
# by Triffid Hunter, Traumflug, jakepoz #
|
||||||
|
# #
|
||||||
|
# #
|
||||||
|
# This firmware is Copyright (C) 2009-2010 Michael Moon aka Triffid_Hunter #
|
||||||
|
# #
|
||||||
|
# This program 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 2 of the License, or #
|
||||||
|
# (at your option) any later version. #
|
||||||
|
# #
|
||||||
|
# This program 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 this program; if not, write to the Free Software #
|
||||||
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #
|
||||||
|
# #
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# #
|
||||||
|
# Change these to suit your application #
|
||||||
|
# #
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
PROGRAM = extruder
|
||||||
|
|
||||||
|
SOURCES = $(PROGRAM).c intercom.c delay.c analog.c watchdog.c
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# #
|
||||||
|
# Change these to suit your hardware #
|
||||||
|
# #
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
MCU_TARGET = atmega168
|
||||||
|
F_CPU = 16000000L
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# #
|
||||||
|
# These defaults should be ok, change if you need to #
|
||||||
|
# #
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
ARCH = avr-
|
||||||
|
CC = $(ARCH)gcc
|
||||||
|
OBJDUMP = $(ARCH)objdump
|
||||||
|
OBJCOPY = $(ARCH)objcopy
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# #
|
||||||
|
# Available Defines: #
|
||||||
|
# #
|
||||||
|
# DEBUG #
|
||||||
|
# enables tons of debugging output. may cause host-side talkers to choke #
|
||||||
|
# XONXOFF #
|
||||||
|
# enables XON/XOFF flow control for stupid or crude talkers #
|
||||||
|
# ACCELERATION_REPRAP #
|
||||||
|
# enables reprap-style acceleration #
|
||||||
|
# ACCELERATION_RAMPING #
|
||||||
|
# enables start/stop ramping #
|
||||||
|
# #
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
DEFS = -DF_CPU=$(F_CPU) -DEXTRUDER -DGEN3
|
||||||
|
# DEFS += "-DDEBUG=1"
|
||||||
|
|
||||||
|
OPTIMIZE = -Os -ffunction-sections -finline-functions-called-once
|
||||||
|
# OPTIMIZE = -O0
|
||||||
|
CFLAGS = -g -Wall -Wstrict-prototypes $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS) -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -save-temps
|
||||||
|
LDFLAGS = -Wl,--as-needed -Wl,--gc-sections
|
||||||
|
|
||||||
|
AVRDUDE = avrdude
|
||||||
|
AVRDUDECONF = /etc/avrdude.conf
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# #
|
||||||
|
# udev rule for /dev/arduino (insert into /etc/udev/rules.d/99-local.rules) #
|
||||||
|
# SUBSYSTEMS=="usb", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", #
|
||||||
|
# NAME="%k", SYMLINK+="arduino", SYMLINK+="arduino_$attr{serial}", #
|
||||||
|
# MODE="0660" #
|
||||||
|
# #
|
||||||
|
##############################################################################
|
||||||
|
PROGPORT = /dev/arduino
|
||||||
|
PROGBAUD = 57600
|
||||||
|
|
||||||
|
OBJ = $(patsubst %.c,%.o,${SOURCES})
|
||||||
|
|
||||||
|
.PHONY: all program clean size
|
||||||
|
.PRECIOUS: %.o %.elf
|
||||||
|
|
||||||
|
all: config.h $(PROGRAM).hex $(PROGRAM).lst $(PROGRAM).sym size
|
||||||
|
|
||||||
|
program: $(PROGRAM).hex config.h
|
||||||
|
stty $(PROGBAUD) raw ignbrk hup < $(PROGPORT)
|
||||||
|
@sleep 0.1
|
||||||
|
@stty $(PROGBAUD) raw ignbrk hup < $(PROGPORT)
|
||||||
|
$(AVRDUDE) -cstk500v1 -b$(PROGBAUD) -p$(MCU_TARGET) -P$(PROGPORT) -C$(AVRDUDECONF) -U flash:w:$^
|
||||||
|
stty 115200 raw ignbrk -hup -echo ixoff < $(PROGPORT)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex *.al *.i *.s *~
|
||||||
|
|
||||||
|
size: $(PROGRAM).elf
|
||||||
|
@echo " SIZE Atmega168 Atmega328p Atmega644"
|
||||||
|
@$(OBJDUMP) -h $^ | perl -ne '/.(text)\s+([0-9a-f]+)/ && do { $$a += eval "0x$$2" }; END { printf " FLASH : %5d bytes (%2d%% of %2dkb) (%2d%% of %2dkb) (%2d%% of %2dkb)\n", $$a, $$a * 100 / (14 * 1024), 14, $$a * 100 / (30 * 1024), 30, $$a * 100 / (63 * 1024), 63 }'
|
||||||
|
@$(OBJDUMP) -h $^ | perl -ne '/.(data|bss)\s+([0-9a-f]+)/ && do { $$a += eval "0x$$2" }; END { printf " RAM : %5d bytes (%2d%% of %2dkb) (%2d%% of %2dkb) (%2d%% of %2dkb)\n", $$a, $$a * 100 / (1 * 1024), 1, $$a * 100 / (2 * 1024), 2, $$a * 100 / (4 * 1024), 4 }'
|
||||||
|
@$(OBJDUMP) -h $^ | perl -ne '/.(eeprom)\s+([0-9a-f]+)/ && do { $$a += eval "0x$$2" }; END { printf " EEPROM: %5d bytes (%2d%% of %2dkb) (%2d%% of %2dkb) (%2d%% of %2dkb)\n", $$a, $$a * 100 / (1 * 1024), 1, $$a * 100 / (2 * 1024), 2, $$a * 100 / (2 * 1024), 2 }'
|
||||||
|
|
||||||
|
config.h: config.h.dist
|
||||||
|
@echo "Please review config.h, as config.h.dist is more recent."
|
||||||
|
@false
|
||||||
|
|
||||||
|
%.o: %.c config.h
|
||||||
|
@echo " CC $@"
|
||||||
|
@$(CC) -c $(CFLAGS) -Wa,-adhlns=$(<:.c=.al) -o $@ $(subst .o,.c,$@)
|
||||||
|
|
||||||
|
%.elf: $(OBJ)
|
||||||
|
@echo " LINK $@"
|
||||||
|
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
|
||||||
|
|
||||||
|
%.lst: %.elf
|
||||||
|
@echo " OBJDUMP $@"
|
||||||
|
@$(OBJDUMP) -h -S $< > $@
|
||||||
|
|
||||||
|
%.hex: %.elf
|
||||||
|
@echo " OBJCOPY $@"
|
||||||
|
@$(OBJCOPY) -j .text -j .data -O ihex $< $@
|
||||||
|
|
||||||
|
%.bin: %.elf
|
||||||
|
@echo " OBJCOPY $@"
|
||||||
|
@$(OBJCOPY) -j .text -j .data -O binary $< $@
|
||||||
|
|
||||||
|
%.sym: %.elf
|
||||||
|
@echo " SYM $@"
|
||||||
|
@$(OBJDUMP) -t $< | perl -ne 'BEGIN { printf " ADDR NAME SIZE\n"; } /([0-9a-f]+)\s+(\w+)\s+O\s+\.(bss|data)\s+([0-9a-f]+)\s+(\w+)/ && printf "0x%04x %-20s +%d\n", eval("0x$$1") & 0xFFFF, $$5, eval("0x$$4")' | sort -k1 > $@
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
Reprap Gen3 extruder controller support for Triffid_Hunter's FiveD_on_Arduino firmware
|
||||||
|
by jakepoz
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../analog.c
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../analog.h
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../arduino.h
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../arduino_168_328p.h
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
#ifndef _CONFIG_H
|
||||||
|
#define _CONFIG_H
|
||||||
|
|
||||||
|
#include "arduino.h"
|
||||||
|
|
||||||
|
//RS485 Interface pins
|
||||||
|
#define RX_ENABLE_PIN DIO4
|
||||||
|
#define TX_ENABLE_PIN AIO2
|
||||||
|
|
||||||
|
// Control pins for the A3949 chips
|
||||||
|
#define H1D DIO7
|
||||||
|
#define H1E DIO5
|
||||||
|
#define H2D DIO8
|
||||||
|
#define H2E DIO6
|
||||||
|
|
||||||
|
// PWM versions of the enable_pins
|
||||||
|
#define H1E_PWM OCR0B
|
||||||
|
#define H2E_PWM OCR0A
|
||||||
|
|
||||||
|
//Step/Dir Pins from motherboard to extruder
|
||||||
|
//IMPORTANT: Assumes that the step pin is on PCIE0
|
||||||
|
#define E_STEP_PIN DIO10
|
||||||
|
#define E_DIR_PIN DIO9
|
||||||
|
|
||||||
|
//Trimpot is on AIO0, pin 23
|
||||||
|
#define TRIM_POT AIO0
|
||||||
|
#define TRIM_POT_CHANNEL 0
|
||||||
|
|
||||||
|
//Debug LED will blink on RS485 transmission
|
||||||
|
#define DEBUG_LED DIO13
|
||||||
|
|
||||||
|
//Read analog voltage from thermistor
|
||||||
|
#define TEMP_PIN AIO3
|
||||||
|
#define TEMP_PIN_CHANNEL 3
|
||||||
|
|
||||||
|
#define REFERENCE REFERENCE_AVCC
|
||||||
|
|
||||||
|
// list of PWM-able pins and corresponding timers
|
||||||
|
// timer1 is used for step timing so don't use OC1A/OC1B (DIO9/DIO10)
|
||||||
|
// OC0A DIO6
|
||||||
|
// OC0B DIO5
|
||||||
|
// OC1A DIO9
|
||||||
|
// OC1B DIO10
|
||||||
|
// OC2A DIO11
|
||||||
|
// OC2B DIO3
|
||||||
|
|
||||||
|
#define HEATER_PIN DIO11
|
||||||
|
#define HEATER_PWM OCR2A
|
||||||
|
|
||||||
|
#define BED_PIN DIO12
|
||||||
|
|
||||||
|
#define ANALOG_MASK (MASK(TRIM_POT_CHANNEL) | MASK(TEMP_PIN_CHANNEL))
|
||||||
|
|
||||||
|
/*
|
||||||
|
Intercom
|
||||||
|
*/
|
||||||
|
#define enable_transmit() do { WRITE(TX_ENABLE_PIN,1); WRITE(RX_ENABLE_PIN,0); } while(0)
|
||||||
|
#define disable_transmit() do { WRITE(TX_ENABLE_PIN,0); WRITE(RX_ENABLE_PIN,0); } while(0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
Motors
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define enable_motors() do { TCCR0A |= MASK(COM0A1) | MASK(COM0B1); } while (0)
|
||||||
|
#define disable_motors() do { TCCR0A &= ~MASK(COM0A1) & ~MASK(COM0B1); } while (0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
Heater
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HEATER_PWM
|
||||||
|
#define enable_heater() do { TCCR2A |= MASK(COM2A1); } while (0)
|
||||||
|
#define disable_heater() do { TCCR2A &= ~MASK(COM2A1); } while (0)
|
||||||
|
#else
|
||||||
|
#define enable_heater() WRITE(HEATER_PIN, 1)
|
||||||
|
#define disable_heater() WRITE(HEATER_PIN, 0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _CONFIG_H */
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../delay.c
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../delay.h
|
||||||
|
|
@ -0,0 +1,229 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
#include "intercom.h"
|
||||||
|
#include "analog.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include "watchdog.h"
|
||||||
|
|
||||||
|
static uint8_t motor_pwm;
|
||||||
|
|
||||||
|
#define NUMTEMPS 20
|
||||||
|
short temptable[NUMTEMPS][2] = {
|
||||||
|
{1, 841},
|
||||||
|
{54, 255},
|
||||||
|
{107, 209},
|
||||||
|
{160, 184},
|
||||||
|
{213, 166},
|
||||||
|
{266, 153},
|
||||||
|
{319, 142},
|
||||||
|
{372, 132},
|
||||||
|
{425, 124},
|
||||||
|
{478, 116},
|
||||||
|
{531, 108},
|
||||||
|
{584, 101},
|
||||||
|
{637, 93},
|
||||||
|
{690, 86},
|
||||||
|
{743, 78},
|
||||||
|
{796, 70},
|
||||||
|
{849, 61},
|
||||||
|
{902, 50},
|
||||||
|
{955, 34},
|
||||||
|
{1008, 3}
|
||||||
|
};
|
||||||
|
|
||||||
|
void io_init(void) {
|
||||||
|
// setup I/O pins
|
||||||
|
WRITE(DEBUG_LED, 0); SET_OUTPUT(DEBUG_LED);
|
||||||
|
WRITE(H1D,0); SET_OUTPUT(H1D);
|
||||||
|
WRITE(H1E,0); SET_OUTPUT(H1E);
|
||||||
|
WRITE(H2D,0); SET_OUTPUT(H2D);
|
||||||
|
WRITE(H2E,0); SET_OUTPUT(H2E);
|
||||||
|
|
||||||
|
SET_INPUT(TRIM_POT);
|
||||||
|
SET_INPUT(TEMP_PIN);
|
||||||
|
SET_INPUT(E_STEP_PIN);
|
||||||
|
SET_INPUT(E_DIR_PIN);
|
||||||
|
|
||||||
|
//Enable the RS485 transceiver
|
||||||
|
SET_OUTPUT(RX_ENABLE_PIN);
|
||||||
|
SET_OUTPUT(TX_ENABLE_PIN);
|
||||||
|
disable_transmit();
|
||||||
|
|
||||||
|
#ifdef HEATER_PIN
|
||||||
|
WRITE(HEATER_PIN, 0); SET_OUTPUT(HEATER_PIN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BED_PIN
|
||||||
|
WRITE(BED_PIN, 0); SET_OUTPUT(BED_PIN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(HEATER_PWM) || defined(FAN_PWM) || defined(BED_PWM)
|
||||||
|
// setup PWM timer: fast PWM, no prescaler
|
||||||
|
TCCR2A = MASK(WGM21) | MASK(WGM20);
|
||||||
|
TCCR2B = MASK(CS22);
|
||||||
|
TIMSK2 = 0;
|
||||||
|
OCR2A = 0;
|
||||||
|
OCR2B = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(H1E_PWM) && defined(H2E_PWM)
|
||||||
|
TCCR0A = MASK(WGM01) | MASK(WGM00);
|
||||||
|
TCCR0B = MASK(CS20);
|
||||||
|
TIMSK0 = 0;
|
||||||
|
OCR0A = 0;
|
||||||
|
OCR0B = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void motor_init(void) {
|
||||||
|
//Enable an interrupt to be triggered when the step pin changes
|
||||||
|
//This will be PCIE0
|
||||||
|
PCICR = MASK(PCIE0);
|
||||||
|
PCMSK0 = MASK(PCINT2);
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(PCINT0_vect) {
|
||||||
|
static uint8_t coil_pos, pwm, flag;
|
||||||
|
|
||||||
|
if (flag == 1) flag = 0;
|
||||||
|
else flag = 1;
|
||||||
|
|
||||||
|
//if the step pin is high, we advance the motor
|
||||||
|
if (flag) {
|
||||||
|
|
||||||
|
//Turn on motors only on first tick to save power I guess
|
||||||
|
enable_motors();
|
||||||
|
|
||||||
|
//Advance the coil position
|
||||||
|
if (READ(E_DIR_PIN))
|
||||||
|
coil_pos++;
|
||||||
|
else
|
||||||
|
coil_pos--;
|
||||||
|
|
||||||
|
coil_pos &= 31;
|
||||||
|
|
||||||
|
//Grab the latest motor power to use
|
||||||
|
pwm = motor_pwm;
|
||||||
|
|
||||||
|
switch(coil_pos >> 2) {
|
||||||
|
case 0:
|
||||||
|
WRITE(H1D, 0);
|
||||||
|
WRITE(H2D, 0);
|
||||||
|
H1E_PWM = 0;
|
||||||
|
H2E_PWM = pwm;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
WRITE(H1D, 1);
|
||||||
|
WRITE(H2D, 0);
|
||||||
|
H1E_PWM = pwm;
|
||||||
|
H2E_PWM = pwm;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
WRITE(H1D, 1);
|
||||||
|
WRITE(H2D, 0);
|
||||||
|
H1E_PWM = pwm;
|
||||||
|
H2E_PWM = 0;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
WRITE(H1D, 1);
|
||||||
|
WRITE(H2D, 1);
|
||||||
|
H1E_PWM = pwm;
|
||||||
|
H2E_PWM = pwm;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
WRITE(H1D, 1);
|
||||||
|
WRITE(H2D, 1);
|
||||||
|
H1E_PWM = 0;
|
||||||
|
H2E_PWM = pwm;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
WRITE(H1D, 0);
|
||||||
|
WRITE(H2D, 1);
|
||||||
|
H1E_PWM = pwm;
|
||||||
|
H2E_PWM = pwm;
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
WRITE(H1D, 0);
|
||||||
|
WRITE(H2D, 1);
|
||||||
|
H1E_PWM = pwm;
|
||||||
|
H2E_PWM = 0;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
WRITE(H1D, 0);
|
||||||
|
WRITE(H2D, 0);
|
||||||
|
H1E_PWM = pwm;
|
||||||
|
H2E_PWM = pwm;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void init(void) {
|
||||||
|
// set up watchdog
|
||||||
|
wd_init();
|
||||||
|
|
||||||
|
// setup analog reading
|
||||||
|
analog_init();
|
||||||
|
|
||||||
|
// set up serial
|
||||||
|
intercom_init();
|
||||||
|
|
||||||
|
// set up inputs and outputs
|
||||||
|
io_init();
|
||||||
|
|
||||||
|
// set up extruder motor driver
|
||||||
|
motor_init();
|
||||||
|
|
||||||
|
// enable interrupts
|
||||||
|
sei();
|
||||||
|
|
||||||
|
// reset watchdog
|
||||||
|
wd_reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
{
|
||||||
|
static uint8_t i;
|
||||||
|
static uint16_t raw_temp;
|
||||||
|
|
||||||
|
init();
|
||||||
|
|
||||||
|
enable_heater();
|
||||||
|
|
||||||
|
start_send();
|
||||||
|
|
||||||
|
// main loop
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
wd_reset();
|
||||||
|
|
||||||
|
//Read motor PWM
|
||||||
|
motor_pwm = analog_read(TRIM_POT_CHANNEL) >> 2;
|
||||||
|
|
||||||
|
//Read current temperature
|
||||||
|
raw_temp = analog_read(TEMP_PIN_CHANNEL);
|
||||||
|
|
||||||
|
//Calculate real temperature based on lookup table
|
||||||
|
for (i = 1; i < NUMTEMPS; i++) {
|
||||||
|
if (temptable[i][0] > raw_temp) {
|
||||||
|
raw_temp = temptable[i][1] +
|
||||||
|
(temptable[i][0] - raw_temp) * (temptable[i-1][1] - temptable[i][1]) / (temptable[i][0] - temptable[i-1][0]);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Clamp for overflows
|
||||||
|
if (i == NUMTEMPS) raw_temp = temptable[NUMTEMPS-1][1];
|
||||||
|
if (raw_temp > 255) raw_temp = 255;
|
||||||
|
|
||||||
|
//Update the intercom values
|
||||||
|
update_send_cmd(raw_temp);
|
||||||
|
|
||||||
|
HEATER_PWM = get_read_cmd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,220 @@
|
||||||
|
#ifdef GEN3
|
||||||
|
|
||||||
|
#include "intercom.h"
|
||||||
|
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "delay.h"
|
||||||
|
|
||||||
|
#define INTERCOM_BAUD 57600
|
||||||
|
|
||||||
|
#define enable_transmit() do { WRITE(TX_ENABLE_PIN,1); WRITE(RX_ENABLE_PIN,0); } while(0)
|
||||||
|
#define disable_transmit() do { WRITE(TX_ENABLE_PIN,0); WRITE(RX_ENABLE_PIN,0); } while(0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
Defines a super simple intercom interface using the RS485 modules
|
||||||
|
|
||||||
|
Host will say: START1 START2 PWM_CMD PWM_CHK
|
||||||
|
Extruder will reply: START1 START2 TMP_CMD TMP_CHK
|
||||||
|
|
||||||
|
CHK = 255-CMD, if they match do the work, if not, ignore this packet
|
||||||
|
|
||||||
|
in a loop
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define START1 0xAA
|
||||||
|
#define START2 0x55
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SEND_START1,
|
||||||
|
SEND_START2,
|
||||||
|
SEND_CMD,
|
||||||
|
SEND_CHK,
|
||||||
|
SEND_DONE,
|
||||||
|
|
||||||
|
READ_START1,
|
||||||
|
READ_START2,
|
||||||
|
READ_CMD,
|
||||||
|
READ_CHK,
|
||||||
|
} intercom_state_e;
|
||||||
|
|
||||||
|
|
||||||
|
intercom_state_e state = READ_START1;
|
||||||
|
uint8_t cmd, chk, send_cmd, read_cmd;
|
||||||
|
|
||||||
|
void intercom_init(void)
|
||||||
|
{
|
||||||
|
#ifdef HOST
|
||||||
|
#if INTERCOM_BAUD > 38401
|
||||||
|
UCSR1A = MASK(U2X1);
|
||||||
|
UBRR1 = (((F_CPU / 8) / INTERCOM_BAUD) - 0.5);
|
||||||
|
#else
|
||||||
|
UCSR1A = 0;
|
||||||
|
UBRR1 = (((F_CPU / 16) / INTERCOM_BAUD) - 0.5);
|
||||||
|
#endif
|
||||||
|
UCSR1B = MASK(RXEN1) | MASK(TXEN1);
|
||||||
|
UCSR1C = MASK(UCSZ11) | MASK(UCSZ10);
|
||||||
|
|
||||||
|
UCSR1B |= MASK(RXCIE1) | MASK(TXCIE1);
|
||||||
|
#else
|
||||||
|
#if INTERCOM_BAUD > 38401
|
||||||
|
UCSR0A = MASK(U2X0);
|
||||||
|
UBRR0 = (((F_CPU / 8) / INTERCOM_BAUD) - 0.5);
|
||||||
|
#else
|
||||||
|
UCSR0A = 0;
|
||||||
|
UBRR0 = (((F_CPU / 16) / INTERCOM_BAUD) - 0.5);
|
||||||
|
#endif
|
||||||
|
UCSR0B = MASK(RXEN0) | MASK(TXEN0);
|
||||||
|
UCSR0C = MASK(UCSZ01) | MASK(UCSZ00);
|
||||||
|
|
||||||
|
UCSR0B |= MASK(RXCIE0) | MASK(TXCIE0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_send_cmd(uint8_t new_send_cmd) {
|
||||||
|
send_cmd = new_send_cmd;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t get_read_cmd(void) {
|
||||||
|
return read_cmd;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void write_byte(uint8_t val) {
|
||||||
|
#ifdef HOST
|
||||||
|
UDR1 = val;
|
||||||
|
#else
|
||||||
|
UDR0 = val;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void start_send(void) {
|
||||||
|
state = SEND_START1;
|
||||||
|
enable_transmit();
|
||||||
|
delay_us(15);
|
||||||
|
//Enable interrupts so we can send next characters
|
||||||
|
#ifdef HOST
|
||||||
|
UCSR1B |= MASK(UDRIE1);
|
||||||
|
#else
|
||||||
|
UCSR0B |= MASK(UDRIE0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void finish_send(void) {
|
||||||
|
state = READ_START1;
|
||||||
|
disable_transmit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Interrupts, UART 0 for mendel
|
||||||
|
*/
|
||||||
|
#ifdef HOST
|
||||||
|
ISR(USART1_RX_vect)
|
||||||
|
#else
|
||||||
|
ISR(USART_RX_vect)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
static uint8_t c;
|
||||||
|
|
||||||
|
#ifdef HOST
|
||||||
|
c = UDR1;
|
||||||
|
UCSR1A &= ~MASK(FE1) & ~MASK(DOR1) & ~MASK(UPE1);
|
||||||
|
#else
|
||||||
|
c = UDR0;
|
||||||
|
UCSR0A &= ~MASK(FE0) & ~MASK(DOR0) & ~MASK(UPE0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (state >= READ_START1) {
|
||||||
|
|
||||||
|
switch(state) {
|
||||||
|
case READ_START1:
|
||||||
|
if (c == START1) state = READ_START2;
|
||||||
|
break;
|
||||||
|
case READ_START2:
|
||||||
|
if (c == START2) state = READ_CMD;
|
||||||
|
else state = READ_START1;
|
||||||
|
break;
|
||||||
|
case READ_CMD:
|
||||||
|
cmd = c;
|
||||||
|
state = READ_CHK;
|
||||||
|
break;
|
||||||
|
case READ_CHK:
|
||||||
|
chk = c;
|
||||||
|
|
||||||
|
if (chk == 255 - cmd) {
|
||||||
|
//Values are correct, do something useful
|
||||||
|
WRITE(DEBUG_LED,1);
|
||||||
|
read_cmd = cmd;
|
||||||
|
#ifdef EXTRUDER
|
||||||
|
start_send();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
state = READ_START1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HOST
|
||||||
|
ISR(USART1_TX_vect)
|
||||||
|
#else
|
||||||
|
ISR(USART_TX_vect)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
if (state == SEND_DONE) {
|
||||||
|
finish_send();
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HOST
|
||||||
|
UCSR1B &= ~MASK(TXCIE1);
|
||||||
|
#else
|
||||||
|
UCSR0B &= ~MASK(TXCIE0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HOST
|
||||||
|
ISR(USART1_UDRE_vect)
|
||||||
|
#else
|
||||||
|
ISR(USART_UDRE_vect)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
switch(state) {
|
||||||
|
case SEND_START1:
|
||||||
|
write_byte(START1);
|
||||||
|
state = SEND_START2;
|
||||||
|
break;
|
||||||
|
case SEND_START2:
|
||||||
|
write_byte(START2);
|
||||||
|
state = SEND_CMD;
|
||||||
|
break;
|
||||||
|
case SEND_CMD:
|
||||||
|
write_byte(send_cmd);
|
||||||
|
state = SEND_CHK;
|
||||||
|
break;
|
||||||
|
case SEND_CHK:
|
||||||
|
write_byte(255 - send_cmd);
|
||||||
|
state = SEND_DONE;
|
||||||
|
#ifdef HOST
|
||||||
|
UCSR1B &= ~MASK(UDRIE1);
|
||||||
|
UCSR1B |= MASK(TXCIE1);
|
||||||
|
#else
|
||||||
|
UCSR0B &= ~MASK(UDRIE0);
|
||||||
|
UCSR0B |= MASK(TXCIE0);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* GEN3 */
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef _INTERCOM_H
|
||||||
|
#define _INTERCOM_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
// initialise serial subsystem
|
||||||
|
void intercom_init(void);
|
||||||
|
|
||||||
|
//Update the message we are sending over intercom
|
||||||
|
void update_send_cmd(uint8_t new_send_cmd);
|
||||||
|
|
||||||
|
void start_send(void);
|
||||||
|
|
||||||
|
//Read the message we are receiving over intercom
|
||||||
|
uint8_t get_read_cmd(void);
|
||||||
|
|
||||||
|
#endif /* _INTERCOM_H */
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../watchdog.c
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
../watchdog.h
|
||||||
|
|
@ -192,11 +192,9 @@ void gcode_parse_char(uint8_t c) {
|
||||||
// but it takes less code, less memory and loses no precision if we do it here instead
|
// but it takes less code, less memory and loses no precision if we do it here instead
|
||||||
if ((next_target.M == 104) || (next_target.M == 109))
|
if ((next_target.M == 104) || (next_target.M == 109))
|
||||||
next_target.S = decfloat_to_int(&read_digit, 4, 1);
|
next_target.S = decfloat_to_int(&read_digit, 4, 1);
|
||||||
#ifdef HEATER_PIN
|
|
||||||
// if this is heater PID stuff, multiply by PID_SCALE because we divide by PID_SCALE later on
|
// if this is heater PID stuff, multiply by PID_SCALE because we divide by PID_SCALE later on
|
||||||
else if ((next_target.M >= 130) && (next_target.M <= 132))
|
else if ((next_target.M >= 130) && (next_target.M <= 132))
|
||||||
next_target.S = decfloat_to_int(&read_digit, PID_SCALE, 1);
|
next_target.S = decfloat_to_int(&read_digit, PID_SCALE, 1);
|
||||||
#endif
|
|
||||||
else
|
else
|
||||||
next_target.S = decfloat_to_int(&read_digit, 1, 1);
|
next_target.S = decfloat_to_int(&read_digit, 1, 1);
|
||||||
if (debug_flags & DEBUG_ECHO)
|
if (debug_flags & DEBUG_ECHO)
|
||||||
|
|
|
||||||
|
|
@ -199,7 +199,6 @@ void process_gcode_command() {
|
||||||
case 104:
|
case 104:
|
||||||
temp_set(next_target.P, next_target.S);
|
temp_set(next_target.P, next_target.S);
|
||||||
if (next_target.S) {
|
if (next_target.S) {
|
||||||
enable_heater();
|
|
||||||
power_on();
|
power_on();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -213,15 +212,15 @@ void process_gcode_command() {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// M106- fan on
|
// M106- fan on
|
||||||
#ifdef FAN_PIN
|
#if NUM_HEATERS > 1
|
||||||
case 106:
|
case 106:
|
||||||
enable_fan();
|
heater_set(1, 255);
|
||||||
break;
|
break;
|
||||||
// M107- fan off
|
// M107- fan off
|
||||||
case 107:
|
case 107:
|
||||||
disable_fan();
|
heater_set(1, 0);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// M109- set temp and wait
|
// M109- set temp and wait
|
||||||
case 109:
|
case 109:
|
||||||
|
|
@ -262,7 +261,7 @@ void process_gcode_command() {
|
||||||
serial_writestr_P(PSTR("FIRMWARE_NAME:FiveD_on_Arduino FIRMWARE_URL:http%3A//github.com/triffid/FiveD_on_Arduino/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:1 HEATER_COUNT:1\n"));
|
serial_writestr_P(PSTR("FIRMWARE_NAME:FiveD_on_Arduino FIRMWARE_URL:http%3A//github.com/triffid/FiveD_on_Arduino/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:1 HEATER_COUNT:1\n"));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef HEATER_PIN
|
#if NUM_HEATERS > 0
|
||||||
// M130- heater P factor
|
// M130- heater P factor
|
||||||
case 130:
|
case 130:
|
||||||
if (next_target.seen_S)
|
if (next_target.seen_S)
|
||||||
|
|
@ -291,7 +290,7 @@ void process_gcode_command() {
|
||||||
case 134:
|
case 134:
|
||||||
heater_save_settings();
|
heater_save_settings();
|
||||||
break;
|
break;
|
||||||
#endif /* HEATER_PIN */
|
#endif /* NUM_HEATERS > 0 */
|
||||||
|
|
||||||
// M190- power on
|
// M190- power on
|
||||||
case 190:
|
case 190:
|
||||||
|
|
|
||||||
15
heater.c
15
heater.c
|
|
@ -47,8 +47,18 @@ typedef struct {
|
||||||
EE_factor EEMEM EE_factors[NUM_HEATERS];
|
EE_factor EEMEM EE_factors[NUM_HEATERS];
|
||||||
|
|
||||||
void heater_init() {
|
void heater_init() {
|
||||||
// read factors from eeprom
|
#if NUM_HEATERS > 0
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
|
// setup pins
|
||||||
|
for (i = 0; i < NUM_HEATERS; i++) {
|
||||||
|
*(heaters[i].heater_port) &= ~heaters[i].heater_pin;
|
||||||
|
// DDR is always 1 address below PORT. ugly code but saves ram and an extra field in heaters[] which will never be used anywhere but here
|
||||||
|
*((volatile uint8_t *) (heaters[i].heater_port - 1)) |= heaters[i].heater_pin;
|
||||||
|
if (heaters[i].heater_pwm)
|
||||||
|
*heaters[i].heater_pwm = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// read factors from eeprom
|
||||||
for (i = 0; i < NUM_HEATERS; i++) {
|
for (i = 0; i < NUM_HEATERS; i++) {
|
||||||
heaters_pid[i].p_factor = eeprom_read_dword((uint32_t *) &EE_factors[i].EE_p_factor);
|
heaters_pid[i].p_factor = eeprom_read_dword((uint32_t *) &EE_factors[i].EE_p_factor);
|
||||||
heaters_pid[i].i_factor = eeprom_read_dword((uint32_t *) &EE_factors[i].EE_i_factor);
|
heaters_pid[i].i_factor = eeprom_read_dword((uint32_t *) &EE_factors[i].EE_i_factor);
|
||||||
|
|
@ -62,6 +72,7 @@ void heater_init() {
|
||||||
heaters_pid[i].i_limit = DEFAULT_I_LIMIT;
|
heaters_pid[i].i_limit = DEFAULT_I_LIMIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void heater_save_settings() {
|
void heater_save_settings() {
|
||||||
|
|
@ -121,6 +132,7 @@ void heater_tick(uint8_t h, uint16_t current_temp, uint16_t target_temp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void heater_set(uint8_t index, uint8_t value) {
|
void heater_set(uint8_t index, uint8_t value) {
|
||||||
|
#if NUM_HEATERS > 0
|
||||||
if (heaters[index].heater_pwm) {
|
if (heaters[index].heater_pwm) {
|
||||||
*heaters[index].heater_pwm = value;
|
*heaters[index].heater_pwm = value;
|
||||||
}
|
}
|
||||||
|
|
@ -130,6 +142,7 @@ void heater_set(uint8_t index, uint8_t value) {
|
||||||
else
|
else
|
||||||
*heaters[index].heater_port &= ~MASK(heaters[index].heater_pin);
|
*heaters[index].heater_port &= ~MASK(heaters[index].heater_pin);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void pid_set_p(uint8_t index, int32_t p) {
|
void pid_set_p(uint8_t index, int32_t p) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
extruder/intercom.c
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
extruder/intercom.h
|
||||||
43
mendel.c
43
mendel.c
|
|
@ -46,28 +46,18 @@ void io_init(void) {
|
||||||
WRITE(E_STEP_PIN, 0); SET_OUTPUT(E_STEP_PIN);
|
WRITE(E_STEP_PIN, 0); SET_OUTPUT(E_STEP_PIN);
|
||||||
WRITE(E_DIR_PIN, 0); SET_OUTPUT(E_DIR_PIN);
|
WRITE(E_DIR_PIN, 0); SET_OUTPUT(E_DIR_PIN);
|
||||||
|
|
||||||
#ifdef HEATER_PIN
|
// setup PWM timer: fast PWM, no prescaler
|
||||||
WRITE(HEATER_PIN, 0); SET_OUTPUT(HEATER_PIN);
|
TCCR0A = MASK(WGM01) | MASK(WGM00);
|
||||||
#endif
|
TCCR0B = MASK(CS00);
|
||||||
|
TIMSK0 = 0;
|
||||||
|
OCR0A = 0;
|
||||||
|
OCR0B = 255;
|
||||||
|
|
||||||
#ifdef FAN_PIN
|
TCCR2A = MASK(WGM21) | MASK(WGM20);
|
||||||
WRITE(FAN_PIN, 0); SET_OUTPUT(FAN_PIN);
|
TCCR2B = MASK(CS20);
|
||||||
#endif
|
TIMSK2 = 0;
|
||||||
|
OCR2A = 0;
|
||||||
#if defined(HEATER_PWM) || defined(FAN_PWM)
|
OCR2B = 0;
|
||||||
// setup PWM timer: fast PWM, no prescaler
|
|
||||||
TCCR0A = MASK(WGM01) | MASK(WGM00);
|
|
||||||
TCCR0B = MASK(CS00);
|
|
||||||
TIMSK0 = 0;
|
|
||||||
OCR0A = 0;
|
|
||||||
OCR0B = 255;
|
|
||||||
|
|
||||||
TCCR2A = MASK(WGM21) | MASK(WGM20);
|
|
||||||
TCCR2B = MASK(CS20);
|
|
||||||
TIMSK2 = 0;
|
|
||||||
OCR2A = 0;
|
|
||||||
OCR2B = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef STEPPER_ENABLE_PIN
|
#ifdef STEPPER_ENABLE_PIN
|
||||||
power_off();
|
power_off();
|
||||||
|
|
@ -103,6 +93,9 @@ void init(void) {
|
||||||
// start up analog read interrupt loop, if anything uses analog as determined by ANALOG_MASK in your config.h
|
// start up analog read interrupt loop, if anything uses analog as determined by ANALOG_MASK in your config.h
|
||||||
analog_init();
|
analog_init();
|
||||||
|
|
||||||
|
// set up temperature inputs
|
||||||
|
temp_init();
|
||||||
|
|
||||||
// enable interrupts
|
// enable interrupts
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
|
|
@ -114,12 +107,14 @@ void init(void) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void clock_250ms(void) {
|
void clock_10ms(void) {
|
||||||
// reset watchdog
|
// reset watchdog
|
||||||
wd_reset();
|
wd_reset();
|
||||||
|
|
||||||
temp_tick();
|
temp_tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
void clock_250ms(void) {
|
||||||
if (steptimeout > (30 * 4)) {
|
if (steptimeout > (30 * 4)) {
|
||||||
power_off();
|
power_off();
|
||||||
}
|
}
|
||||||
|
|
@ -156,6 +151,10 @@ int main (void)
|
||||||
gcode_parse_char(c);
|
gcode_parse_char(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ifclock(CLOCK_FLAG_10MS) {
|
||||||
|
clock_10ms();
|
||||||
|
}
|
||||||
|
|
||||||
ifclock(CLOCK_FLAG_250MS) {
|
ifclock(CLOCK_FLAG_250MS) {
|
||||||
clock_250ms();
|
clock_250ms();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
63
temp.c
63
temp.c
|
|
@ -9,11 +9,17 @@
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "sersendf.h"
|
#include "sersendf.h"
|
||||||
#include "heater.h"
|
#include "heater.h"
|
||||||
|
#ifdef GEN3
|
||||||
|
#include "intercom.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TT_THERMISTOR,
|
TT_THERMISTOR,
|
||||||
TT_MAX6675,
|
TT_MAX6675,
|
||||||
TT_AD595
|
TT_AD595
|
||||||
|
#ifdef GEN3
|
||||||
|
, TT_INTERCOM
|
||||||
|
#endif
|
||||||
} temp_types;
|
} temp_types;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
@ -71,6 +77,38 @@ uint16_t temptable[NUMTEMPS][2] PROGMEM = {
|
||||||
#include "analog.h"
|
#include "analog.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void temp_init() {
|
||||||
|
uint8_t i;
|
||||||
|
for (i = 0; i < NUM_TEMP_SENSORS; i++) {
|
||||||
|
switch(temp_sensors[i].temp_type) {
|
||||||
|
#ifdef TEMP_MAX6675
|
||||||
|
// initialised when read
|
||||||
|
/* case TT_MAX6675:
|
||||||
|
break;*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TEMP_THERMISTOR
|
||||||
|
// handled by analog_init()
|
||||||
|
/* case TT_THERMISTOR:
|
||||||
|
break;*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TEMP_AD595
|
||||||
|
// handled by analog_init()
|
||||||
|
/* case TT_AD595:
|
||||||
|
break;*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GEN3
|
||||||
|
case TT_INTERCOM:
|
||||||
|
intercom_init();
|
||||||
|
update_send_cmd(0);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void temp_sensor_tick() {
|
void temp_sensor_tick() {
|
||||||
uint8_t i = 0, all_within_range = 1;
|
uint8_t i = 0, all_within_range = 1;
|
||||||
for (; i < NUM_TEMP_SENSORS; i++) {
|
for (; i < NUM_TEMP_SENSORS; i++) {
|
||||||
|
|
@ -87,9 +125,9 @@ void temp_sensor_tick() {
|
||||||
#ifdef TEMP_MAX6675
|
#ifdef TEMP_MAX6675
|
||||||
case TT_MAX6675:
|
case TT_MAX6675:
|
||||||
#ifdef PRR
|
#ifdef PRR
|
||||||
PRR &= ~MASK(PRSPI);
|
PRR &= ~MASK(PRSPI);
|
||||||
#elif defined PRR0
|
#elif defined PRR0
|
||||||
PRR0 &= ~MASK(PRSPI);
|
PRR0 &= ~MASK(PRSPI);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SPCR = MASK(MSTR) | MASK(SPE) | MASK(SPR0);
|
SPCR = MASK(MSTR) | MASK(SPE) | MASK(SPR0);
|
||||||
|
|
@ -127,7 +165,7 @@ void temp_sensor_tick() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: placeholder number
|
// this number depends on how frequently temp_sensor_tick is called. the MAX6675 can give a reading every 0.22s, so set this to about 250ms
|
||||||
temp_sensors_runtime[i].next_read_time = 25;
|
temp_sensors_runtime[i].next_read_time = 25;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
@ -152,7 +190,6 @@ void temp_sensor_tick() {
|
||||||
if (j == NUMTEMPS)
|
if (j == NUMTEMPS)
|
||||||
temp = temptable[NUMTEMPS-1][1];
|
temp = temptable[NUMTEMPS-1][1];
|
||||||
|
|
||||||
// FIXME: placeholder number
|
|
||||||
temp_sensors_runtime[i].next_read_time = 0;
|
temp_sensors_runtime[i].next_read_time = 0;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
@ -166,11 +203,21 @@ void temp_sensor_tick() {
|
||||||
// >>8 instead of >>10 because internal temp is stored as 14.2 fixed point
|
// >>8 instead of >>10 because internal temp is stored as 14.2 fixed point
|
||||||
temp = (temp * 500L) >> 8;
|
temp = (temp * 500L) >> 8;
|
||||||
|
|
||||||
// FIXME: placeholder number
|
temp_sensors_runtime[i].next_read_time = 0;
|
||||||
temp_sensors[i].next_read_time = 0;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
#endif /* TEMP_AD595 */
|
#endif /* TEMP_AD595 */
|
||||||
|
|
||||||
|
#ifdef GEN3
|
||||||
|
case TT_INTERCOM:
|
||||||
|
temp = get_read_cmd() << 2;
|
||||||
|
|
||||||
|
start_send();
|
||||||
|
|
||||||
|
temp_sensors_runtime[i].next_read_time = 0;
|
||||||
|
|
||||||
|
break;
|
||||||
|
#endif /* GEN3 */
|
||||||
}
|
}
|
||||||
temp_sensors_runtime[i].last_read_temp = temp;
|
temp_sensors_runtime[i].last_read_temp = temp;
|
||||||
|
|
||||||
|
|
@ -202,6 +249,10 @@ uint8_t temp_achieved() {
|
||||||
void temp_set(uint8_t index, uint16_t temperature) {
|
void temp_set(uint8_t index, uint16_t temperature) {
|
||||||
temp_sensors_runtime[index].target_temp = temperature;
|
temp_sensors_runtime[index].target_temp = temperature;
|
||||||
temp_sensors_runtime[index].temp_residency = 0;
|
temp_sensors_runtime[index].temp_residency = 0;
|
||||||
|
#ifdef GEN3
|
||||||
|
if (temp_sensors[index].temp_type == TT_INTERCOM)
|
||||||
|
update_send_cmd(temperature >> 2);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void temp_print(uint8_t index) {
|
void temp_print(uint8_t index) {
|
||||||
|
|
|
||||||
2
temp.h
2
temp.h
|
|
@ -13,6 +13,8 @@ we still need to specify which analog pins we use in machine.h for the analog se
|
||||||
|
|
||||||
#define temp_tick temp_sensor_tick
|
#define temp_tick temp_sensor_tick
|
||||||
|
|
||||||
|
void temp_init(void);
|
||||||
|
|
||||||
void temp_sensor_tick(void);
|
void temp_sensor_tick(void);
|
||||||
|
|
||||||
uint8_t temp_achieved(void);
|
uint8_t temp_achieved(void);
|
||||||
|
|
|
||||||
24
timer.c
24
timer.c
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
volatile uint32_t next_step_time;
|
volatile uint32_t next_step_time;
|
||||||
|
|
||||||
|
uint8_t clock_counter_10ms = 0;
|
||||||
uint8_t clock_counter_250ms = 0;
|
uint8_t clock_counter_250ms = 0;
|
||||||
uint8_t clock_counter_1s = 0;
|
uint8_t clock_counter_1s = 0;
|
||||||
volatile uint8_t clock_flag = 0;
|
volatile uint8_t clock_flag = 0;
|
||||||
|
|
@ -30,14 +31,21 @@ ISR(TIMER1_CAPT_vect) {
|
||||||
/*
|
/*
|
||||||
clock stuff
|
clock stuff
|
||||||
*/
|
*/
|
||||||
clock_counter_250ms += (TICK_TIME / (F_CPU / 1000));
|
clock_counter_10ms += (TICK_TIME / (F_CPU / 1000));
|
||||||
if (clock_counter_250ms >= 250) {
|
if (clock_counter_10ms >= 10) {
|
||||||
clock_counter_250ms -= 250;
|
clock_counter_10ms -= 10;
|
||||||
clock_flag |= CLOCK_FLAG_250MS;
|
clock_flag |= CLOCK_FLAG_10MS;
|
||||||
clock_counter_1s += 1;
|
|
||||||
if (clock_counter_1s >= 4) {
|
clock_counter_250ms += 10;
|
||||||
clock_counter_1s -= 4;
|
if (clock_counter_250ms >= 250) {
|
||||||
clock_flag |= CLOCK_FLAG_1S;
|
clock_counter_250ms -= 250;
|
||||||
|
clock_flag |= CLOCK_FLAG_250MS;
|
||||||
|
|
||||||
|
clock_counter_1s += 1;
|
||||||
|
if (clock_counter_1s >= 4) {
|
||||||
|
clock_counter_1s -= 4;
|
||||||
|
clock_flag |= CLOCK_FLAG_1S;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
5
timer.h
5
timer.h
|
|
@ -13,8 +13,9 @@ clock stuff
|
||||||
*/
|
*/
|
||||||
extern volatile uint8_t clock_flag;
|
extern volatile uint8_t clock_flag;
|
||||||
|
|
||||||
#define CLOCK_FLAG_250MS 1
|
#define CLOCK_FLAG_10MS 1
|
||||||
#define CLOCK_FLAG_1S 2
|
#define CLOCK_FLAG_250MS 2
|
||||||
|
#define CLOCK_FLAG_1S 4
|
||||||
#define ifclock(F) for (;clock_flag & (F);clock_flag &= ~(F))
|
#define ifclock(F) for (;clock_flag & (F);clock_flag &= ~(F))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue