Lots of minor tweaks during some test runs, most notable is that tail of dda_step routing is now interruptible

This commit is contained in:
Michael Moon 2010-02-08 15:53:05 +11:00
parent fe9938bcef
commit f8eee368c4
8 changed files with 69 additions and 59 deletions

View File

@ -36,7 +36,7 @@ CC = $(ARCH)gcc
OBJDUMP = $(ARCH)objdump OBJDUMP = $(ARCH)objdump
OBJCOPY = $(ARCH)objcopy OBJCOPY = $(ARCH)objcopy
OPTIMIZE = -Os -ffunction-sections -finline-functions-called-once -DDEBUG=1 OPTIMIZE = -Os -ffunction-sections -finline-functions-called-once -DDEBUG=0
# OPTIMIZE = -O0 # OPTIMIZE = -O0
CFLAGS = -g -Wall -Wstrict-prototypes $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(F_CPU) $(DEFS) -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -save-temps CFLAGS = -g -Wall -Wstrict-prototypes $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(F_CPU) $(DEFS) -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -save-temps
LDFLAGS = -Wl,--as-needed -Wl,--gc-sections LDFLAGS = -Wl,--as-needed -Wl,--gc-sections
@ -66,7 +66,7 @@ program: $(PROGRAM).hex
@sleep 0.1 @sleep 0.1
@stty $(PROGBAUD) raw ignbrk hup < $(PROGPORT) @stty $(PROGBAUD) raw ignbrk hup < $(PROGPORT)
$(AVRDUDE) -cstk500v1 -b$(PROGBAUD) -p$(MCU_TARGET) -P$(PROGPORT) -C/etc/avrdude.conf -U flash:w:$^ $(AVRDUDE) -cstk500v1 -b$(PROGBAUD) -p$(MCU_TARGET) -P$(PROGPORT) -C/etc/avrdude.conf -U flash:w:$^
stty 115200 raw ignbrk -hup -echo ixon < $(PROGPORT) stty 38400 raw ignbrk -hup -echo ixon < $(PROGPORT)
clean: clean:
rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex *.al *.i *.s *~ rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex *.al *.i *.s *~

View File

@ -1,6 +1,7 @@
#include "dda.h" #include "dda.h"
#include <string.h> #include <string.h>
#include <avr/interrupt.h>
#include "timer.h" #include "timer.h"
#include "serial.h" #include "serial.h"
@ -375,6 +376,10 @@ void dda_step(DDA *dda) {
} }
} }
// this interrupt can now be interruptible
disableTimerInterrupt();
sei();
// this generates too much debug output for all but the slowest step rates // this generates too much debug output for all but the slowest step rates
if (0 && DEBUG) { if (0 && DEBUG) {
serial_writechar('['); serial_writechar('[');
@ -413,4 +418,8 @@ void dda_step(DDA *dda) {
// turn off step outputs, hopefully they've been on long enough by now to register with the drivers // turn off step outputs, hopefully they've been on long enough by now to register with the drivers
// if not, too bad. or insert a (very!) small delay here, or fire up a spare timer or something // if not, too bad. or insert a (very!) small delay here, or fire up a spare timer or something
unstep(); unstep();
// reset interruptible so we can return in the same state we started
cli();
enableTimerInterrupt();
} }

View File

@ -109,12 +109,12 @@ void scan_char(uint8_t c) {
switch (last_field) { switch (last_field) {
case 'G': case 'G':
next_target.G = read_digit.mantissa; next_target.G = read_digit.mantissa;
if (DEBUG) // if (DEBUG)
serwrite_uint8(next_target.G); serwrite_uint8(next_target.G);
break; break;
case 'M': case 'M':
next_target.M = read_digit.mantissa; next_target.M = read_digit.mantissa;
if (DEBUG) // if (DEBUG)
serwrite_uint8(next_target.M); serwrite_uint8(next_target.M);
break; break;
case 'X': case 'X':
@ -122,7 +122,7 @@ void scan_char(uint8_t c) {
next_target.target.X = decfloat_to_int(&read_digit, STEPS_PER_IN_X, 1); next_target.target.X = decfloat_to_int(&read_digit, STEPS_PER_IN_X, 1);
else else
next_target.target.X = decfloat_to_int(&read_digit, STEPS_PER_MM_X, 1); next_target.target.X = decfloat_to_int(&read_digit, STEPS_PER_MM_X, 1);
if (DEBUG) // if (DEBUG)
serwrite_int32(next_target.target.X); serwrite_int32(next_target.target.X);
break; break;
case 'Y': case 'Y':
@ -130,7 +130,7 @@ void scan_char(uint8_t c) {
next_target.target.Y = decfloat_to_int(&read_digit, STEPS_PER_IN_Y, 1); next_target.target.Y = decfloat_to_int(&read_digit, STEPS_PER_IN_Y, 1);
else else
next_target.target.Y = decfloat_to_int(&read_digit, STEPS_PER_MM_Y, 1); next_target.target.Y = decfloat_to_int(&read_digit, STEPS_PER_MM_Y, 1);
if (DEBUG) // if (DEBUG)
serwrite_int32(next_target.target.Y); serwrite_int32(next_target.target.Y);
break; break;
case 'Z': case 'Z':
@ -138,7 +138,7 @@ void scan_char(uint8_t c) {
next_target.target.Z = decfloat_to_int(&read_digit, STEPS_PER_IN_Z, 1); next_target.target.Z = decfloat_to_int(&read_digit, STEPS_PER_IN_Z, 1);
else else
next_target.target.Z = decfloat_to_int(&read_digit, STEPS_PER_MM_Z, 1); next_target.target.Z = decfloat_to_int(&read_digit, STEPS_PER_MM_Z, 1);
if (DEBUG) // if (DEBUG)
serwrite_int32(next_target.target.Z); serwrite_int32(next_target.target.Z);
break; break;
case 'E': case 'E':
@ -146,7 +146,7 @@ void scan_char(uint8_t c) {
next_target.target.E = decfloat_to_int(&read_digit, STEPS_PER_IN_E, 1); next_target.target.E = decfloat_to_int(&read_digit, STEPS_PER_IN_E, 1);
else else
next_target.target.E = decfloat_to_int(&read_digit, STEPS_PER_MM_E, 1); next_target.target.E = decfloat_to_int(&read_digit, STEPS_PER_MM_E, 1);
if (DEBUG) // if (DEBUG)
serwrite_uint32(next_target.target.E); serwrite_uint32(next_target.target.E);
break; break;
case 'F': case 'F':
@ -155,7 +155,7 @@ void scan_char(uint8_t c) {
next_target.target.F = decfloat_to_int(&read_digit, 254, 10); next_target.target.F = decfloat_to_int(&read_digit, 254, 10);
else else
next_target.target.F = decfloat_to_int(&read_digit, 1, 1); next_target.target.F = decfloat_to_int(&read_digit, 1, 1);
if (DEBUG) // if (DEBUG)
serwrite_uint32(next_target.target.F); serwrite_uint32(next_target.target.F);
break; break;
case 'S': case 'S':
@ -169,7 +169,7 @@ void scan_char(uint8_t c) {
next_target.S = decfloat_to_int(&read_digit, PID_SCALE, 1); next_target.S = decfloat_to_int(&read_digit, PID_SCALE, 1);
else else
next_target.S = decfloat_to_int(&read_digit, 1, 1); next_target.S = decfloat_to_int(&read_digit, 1, 1);
if (DEBUG) // if (DEBUG)
serwrite_uint16(next_target.S); serwrite_uint16(next_target.S);
break; break;
case 'P': case 'P':
@ -178,7 +178,7 @@ void scan_char(uint8_t c) {
next_target.P = decfloat_to_int(&read_digit, 1000, 1); next_target.P = decfloat_to_int(&read_digit, 1000, 1);
else else
next_target.P = decfloat_to_int(&read_digit, 1, 1); next_target.P = decfloat_to_int(&read_digit, 1, 1);
if (DEBUG) // if (DEBUG)
serwrite_uint16(next_target.P); serwrite_uint16(next_target.P);
break; break;
} }
@ -195,7 +195,7 @@ void scan_char(uint8_t c) {
// new field? // new field?
if (indexof(c, alphabet) >= 0) { if (indexof(c, alphabet) >= 0) {
last_field = c; last_field = c;
if (DEBUG) // if (DEBUG)
serial_writechar(c); serial_writechar(c);
} }
@ -264,21 +264,24 @@ void scan_char(uint8_t c) {
// end of line // end of line
if ((c == 10) || (c == 13)) { if ((c == 10) || (c == 13)) {
serial_writechar(c); // if (DEBUG)
serial_writechar(c);
// process // process
process_gcode_command(&next_target); // if (next_target.seen_G || next_target.seen_M) {
process_gcode_command(&next_target);
// reset 'seen comment' // reset 'seen comment'
option_bitfield &= ~OPTION_COMMENT; option_bitfield &= ~OPTION_COMMENT;
// reset variables // reset variables
next_target.seen_X = next_target.seen_Y = next_target.seen_Z = next_target.seen_E = next_target.seen_F = next_target.seen_S = next_target.seen_P = 0; next_target.seen_X = next_target.seen_Y = next_target.seen_Z = next_target.seen_E = next_target.seen_F = next_target.seen_S = next_target.seen_P = 0;
last_field = 0; last_field = 0;
read_digit.sign = 0; read_digit.sign = 0;
read_digit.mantissa = 0; read_digit.mantissa = 0;
read_digit.exponent = 0; read_digit.exponent = 0;
serial_writestr_P(PSTR("OK\n")); serial_writestr_P(PSTR("OK\n"));
// }
} }
} }
@ -423,6 +426,7 @@ void process_gcode_command(GCODE_COMMAND *gcmd) {
switch (gcmd->M) { switch (gcmd->M) {
// M101- extruder on // M101- extruder on
case 101: case 101:
serial_writestr_P(PSTR("Waiting for extruder to reach target temperature\n"));
// here we wait until target temperature is reached, and emulate main loop so the temperature can actually be updated // here we wait until target temperature is reached, and emulate main loop so the temperature can actually be updated
while (!temp_achieved()) { while (!temp_achieved()) {
ifclock(CLOCK_FLAG_250MS) { ifclock(CLOCK_FLAG_250MS) {

View File

@ -47,7 +47,7 @@
#define E_STARTSTOP_STEPS 20 #define E_STARTSTOP_STEPS 20
// extruder settings // extruder settings
#define TEMP_HYSTERESIS 2 #define TEMP_HYSTERESIS 20
/* /*
calculated values - you shouldn't need to touch these calculated values - you shouldn't need to touch these

View File

@ -40,10 +40,10 @@ inline void io_init(void) {
WRITE(HEATER_PIN, 0); SET_OUTPUT(HEATER_PIN); WRITE(HEATER_PIN, 0); SET_OUTPUT(HEATER_PIN);
#ifdef HEATER_PWM #ifdef HEATER_PWM
// setup PWM timer: fast PWM, no prescaler // setup PWM timer: fast PWM, no prescaler
OCR0A = 0; TCCR0A = MASK(WGM01) | MASK(WGM00);
TCCR0A = MASK(COM0A1) | MASK(WGM01) | MASK(WGM00);
TCCR0B = MASK(CS00); TCCR0B = MASK(CS00);
TIMSK0 = 0; TIMSK0 = 0;
OCR0A = 0;
#endif #endif
#endif #endif
@ -55,7 +55,9 @@ inline void io_init(void) {
disable_steppers(); disable_steppers();
#endif #endif
// setup SPI
WRITE(SCK, 0); SET_OUTPUT(SCK); WRITE(SCK, 0); SET_OUTPUT(SCK);
WRITE(MOSI, 1); SET_OUTPUT(MOSI);
WRITE(MISO, 1); SET_INPUT(MISO); WRITE(MISO, 1); SET_INPUT(MISO);
WRITE(SS, 1); SET_OUTPUT(SS); WRITE(SS, 1); SET_OUTPUT(SS);
} }
@ -135,9 +137,9 @@ void clock_250ms() {
// Queue // Queue
print_queue(); print_queue();
} }
// temperature // temperature
temp_print(); if (temp_get_target())
temp_print();
} }
} }

View File

@ -14,6 +14,10 @@
#define RESERVED_RXD DIO0 #define RESERVED_RXD DIO0
#define RESERVED_TXD DIO1 #define RESERVED_TXD DIO1
#define RESERVED_SCK DIO13
#define RESERVED_MISO DIO12
#define RESERVED_MOSI DIO11
#define RESERVED_SS DIO10
/* /*
user defined pins user defined pins
@ -108,8 +112,8 @@
*/ */
#ifdef HEATER_PWM #ifdef HEATER_PWM
#define enable_heater() do { OCR0A = 255; } while (0) #define enable_heater() do { TCCR0A |= MASK(COM0A1); } while (0)
#define disable_heater() do { OCR0A = 0; } while (0) #define disable_heater() do { TCCR0A &= ~MASK(COM0A1); } while (0)
#else #else
#define enable_heater() WRITE(HEATER_PIN, 1) #define enable_heater() WRITE(HEATER_PIN, 1)
#define disable_heater() WRITE(HEATER_PIN, 0) #define disable_heater() WRITE(HEATER_PIN, 0)

View File

@ -4,7 +4,7 @@
#include "arduino.h" #include "arduino.h"
#define BUFSIZE 64 + sizeof(ringbuffer) #define BUFSIZE 64 + sizeof(ringbuffer)
#define BAUD 115200 #define BAUD 38400
#define ASCII_XOFF 19 #define ASCII_XOFF 19
#define ASCII_XON 17 #define ASCII_XON 17

View File

@ -43,37 +43,28 @@ uint8_t temp_flags = 0;
uint16_t temp_read() { uint16_t temp_read() {
uint16_t temp; uint16_t temp;
/* if (DEBUG) SPCR = MASK(MSTR) | MASK(SPE) | MASK(SPR0);
serial_writestr_P(PSTR("T["));*/
// very slow for debugging
SPCR = MASK(MSTR) | MASK(SPE) | MASK(SPR1) | MASK(SPR0);
// enable MAX6675
WRITE(SS, 0); WRITE(SS, 0);
// ensure 100ns delay - a bit extra is fine
delay(1); delay(1);
// read MSB
SPDR = 0; SPDR = 0;
for (;(SPSR & MASK(SPIF)) == 0;); for (;(SPSR & MASK(SPIF)) == 0;);
temp = SPDR; temp = SPDR;
// if (DEBUG)
// serwrite_hex8(temp & 0xFF);
temp <<= 8; temp <<= 8;
// read LSB
SPDR = 0; SPDR = 0;
for (;(SPSR & MASK(SPIF)) == 0;); for (;(SPSR & MASK(SPIF)) == 0;);
temp |= SPDR; temp |= SPDR;
// if (DEBUG) // disable MAX6675
// serwrite_hex8(temp & 0xFF);
WRITE(SS, 1); WRITE(SS, 1);
// turn off SPI system
// SPCR = 0;
temp_flags = 0; temp_flags = 0;
if ((temp & 0x8002) == 0) { if ((temp & 0x8002) == 0) {
// got "device id" // got "device id"
@ -134,7 +125,7 @@ void temp_print() {
else { else {
serial_writechar('0'); serial_writechar('0');
} }
serial_writestr_P(PSTR("°C")); // serial_writestr_P(PSTR("°C"));
} }
serial_writechar('\n'); serial_writechar('\n');
} }
@ -143,15 +134,15 @@ void temp_tick() {
uint16_t last_temp = current_temp; uint16_t last_temp = current_temp;
temp_read(); temp_read();
if (DEBUG) // if (DEBUG)
serial_writestr_P(PSTR("T{")); // serial_writestr_P(PSTR("T{"));
int16_t t_error = target_temp - current_temp; int16_t t_error = target_temp - current_temp;
if (DEBUG) { // if (DEBUG) {
serial_writestr_P(PSTR("E:")); // serial_writestr_P(PSTR("E:"));
serwrite_int16(t_error); // serwrite_int16(t_error);
} // }
// PID stuff // PID stuff
// proportional // proportional
@ -187,10 +178,10 @@ void temp_tick() {
else else
pid_output = (pid_output_intermed + 128); pid_output = (pid_output_intermed + 128);
if (DEBUG) { // if (DEBUG) {
serial_writestr_P(PSTR("O:")); // serial_writestr_P(PSTR(",O:"));
serwrite_uint8(pid_output); // serwrite_uint8(pid_output);
} // }
#ifdef HEATER_PWM #ifdef HEATER_PWM
HEATER_PWM = pid_output; HEATER_PWM = pid_output;
@ -203,6 +194,6 @@ void temp_tick() {
} }
#endif #endif
if (DEBUG) // if (DEBUG)
serial_writechar('}'); // serial_writechar('}');
} }