time to save again, added delay_ms, implemented cooling fan, tons of updates in gcode interpreter
This commit is contained in:
parent
ef09d62c00
commit
f27e79aaf2
|
|
@ -7,6 +7,7 @@
|
|||
#include "serial.h"
|
||||
#include "sermsg.h"
|
||||
#include "temp.h"
|
||||
#include "timer.h"
|
||||
|
||||
uint8_t option_bitfield;
|
||||
|
||||
|
|
@ -94,7 +95,7 @@ void scan_char(uint8_t c) {
|
|||
c &= ~32;
|
||||
|
||||
// process field
|
||||
if (indexof(c, "GMXYZEFS\n") >= 0) {
|
||||
if (indexof(c, "GMXYZEFSP\n") >= 0) {
|
||||
if (last_field) {
|
||||
switch (last_field) {
|
||||
case 'G':
|
||||
|
|
@ -120,7 +121,20 @@ void scan_char(uint8_t c) {
|
|||
next_target.target.F = read_digit.mantissa;
|
||||
break;
|
||||
case 'S':
|
||||
next_target.S = decfloat_to_int(&read_digit, 1, 1);
|
||||
// if this is temperature, multiply by 4 to convert to quarter-degree units
|
||||
// cosmetically this should be done in the temperature section,
|
||||
// but it takes less code, less memory and loses no precision if we do it here instead
|
||||
if (next_target.M == 104)
|
||||
next_target.S = decfloat_to_int(&read_digit, 4, 1);
|
||||
else
|
||||
next_target.S = decfloat_to_int(&read_digit, 1, 1);
|
||||
break;
|
||||
case 'P':
|
||||
// if this is dwell, multiply by 1 million to convert seconds to milliseconds
|
||||
if (next_target.G == 4)
|
||||
next_target.P = decfloat_to_int(&read_digit, 1000, 1);
|
||||
else
|
||||
next_target.P = decfloat_to_int(&read_digit, 1, 1);
|
||||
break;
|
||||
}
|
||||
read_digit.sign = 0;
|
||||
|
|
@ -152,6 +166,10 @@ void scan_char(uint8_t c) {
|
|||
break;
|
||||
case 'S':
|
||||
next_target.seen |= SEEN_S;
|
||||
break;
|
||||
case 'P':
|
||||
next_target.seen |= SEEN_P;
|
||||
break;
|
||||
case '\n':
|
||||
// process
|
||||
process_gcode_command(&next_target);
|
||||
|
|
@ -161,9 +179,7 @@ void scan_char(uint8_t c) {
|
|||
|
||||
// reset variables
|
||||
last_field = 0;
|
||||
// memset(&next_target, 0, sizeof(GCODE_COMMAND));
|
||||
next_target.seen = 0;
|
||||
// next_target.option = option_bitfield;
|
||||
|
||||
serial_writeblock((uint8_t *) "OK\n", 3);
|
||||
break;
|
||||
|
|
@ -189,40 +205,44 @@ void process_gcode_command(GCODE_COMMAND *gcmd) {
|
|||
gcmd->target.Z += startpoint.Z;
|
||||
gcmd->target.E += startpoint.E;
|
||||
}
|
||||
// if ((gcmd->seen & SEEN_X) == 0)
|
||||
// gcmd->target.X = startpoint.X;
|
||||
// if ((gcmd->seen & SEEN_Y) == 0)
|
||||
// gcmd->target.X = startpoint.Y;
|
||||
// if ((gcmd->seen & SEEN_Z) == 0)
|
||||
// gcmd->target.X = startpoint.Z;
|
||||
// if ((gcmd->seen & SEEN_E) == 0)
|
||||
// gcmd->target.X = startpoint.E;
|
||||
|
||||
if (gcmd->seen & SEEN_G) {
|
||||
switch (gcmd->G) {
|
||||
// G0 - rapid, unsynchronised motion
|
||||
// since it would be a major hassle to force the dda to not synchronise, just provide a fast feedrate and hope it's close enough to what host expects
|
||||
case 0:
|
||||
gcmd->target.F = FEEDRATE_FAST_XY;
|
||||
enqueue(&gcmd->target);
|
||||
break;
|
||||
|
||||
// G1 - synchronised motion
|
||||
case 1:
|
||||
enqueue(&gcmd->target);
|
||||
break;
|
||||
|
||||
// G2 - Arc Clockwise
|
||||
|
||||
// G3 - Arc Counter-clockwise
|
||||
|
||||
// G4 - Dwell
|
||||
case 4:
|
||||
delay_ms(gcmd->P);
|
||||
break;
|
||||
|
||||
// G20 - inches as units
|
||||
case 20:
|
||||
gcmd->option |= OPTION_UNIT_INCHES;
|
||||
break;
|
||||
|
||||
// G21 - mm as units
|
||||
case 21:
|
||||
gcmd->option &= ~OPTION_UNIT_INCHES;
|
||||
break;
|
||||
|
||||
// G30 - go home via point
|
||||
case 30:
|
||||
enqueue(&gcmd->target);
|
||||
// no break here, G30 is move and then go home
|
||||
// G28 - go home
|
||||
case 28:
|
||||
/*
|
||||
|
|
@ -269,18 +289,22 @@ void process_gcode_command(GCODE_COMMAND *gcmd) {
|
|||
startpoint.E = current_position.E = 0;
|
||||
|
||||
break;
|
||||
|
||||
// G90 - absolute positioning
|
||||
case 90:
|
||||
gcmd->option &= ~OPTION_RELATIVE;
|
||||
break;
|
||||
|
||||
// G91 - relative positioning
|
||||
case 91:
|
||||
gcmd->option |= OPTION_RELATIVE;
|
||||
break;
|
||||
|
||||
// G92 - set home
|
||||
case 92:
|
||||
startpoint.X = startpoint.Y = startpoint.Z = 0;
|
||||
break;
|
||||
|
||||
// TODO: spit an error
|
||||
default:
|
||||
serial_writeblock((uint8_t *) "E: Bad G-code ", 14);
|
||||
|
|
@ -294,20 +318,53 @@ void process_gcode_command(GCODE_COMMAND *gcmd) {
|
|||
case 101:
|
||||
SpecialMoveE(E_STARTSTOP_STEPS, FEEDRATE_FAST_E);
|
||||
break;
|
||||
|
||||
// M102- extruder reverse
|
||||
|
||||
// M103- extruder off
|
||||
case 103:
|
||||
SpecialMoveE(-E_STARTSTOP_STEPS, FEEDRATE_FAST_E);
|
||||
break;
|
||||
|
||||
// M104- set temperature
|
||||
case 104:
|
||||
temp_set(gcmd->S);
|
||||
break;
|
||||
|
||||
// M105- get temperature
|
||||
case 105:
|
||||
serial_writeblock((uint8_t *) "T: ", 3);
|
||||
serwrite_uint16(temp_get());
|
||||
serial_writechar('\n');
|
||||
// do .. while block here to provide local scope for temp
|
||||
do {
|
||||
uint16_t t = temp_get();
|
||||
serial_writeblock((uint8_t *) "T: ", 3);
|
||||
serwrite_uint16(t >> 2);
|
||||
serial_writechar('.');
|
||||
if (t & 3) {
|
||||
if ((t & 3) == 1)
|
||||
serial_writechar('2');
|
||||
else if ((t & 3) == 3)
|
||||
serial_writechar('7');
|
||||
serial_writechar('5');
|
||||
}
|
||||
else {
|
||||
serial_writechar('0');
|
||||
}
|
||||
serial_writechar('\n');
|
||||
} while (0);
|
||||
break;
|
||||
|
||||
// M106- fan on
|
||||
#ifdef FAN_PIN
|
||||
case 106:
|
||||
WRITE(FAN_PIN, 1);
|
||||
break;
|
||||
|
||||
// M107- fan off
|
||||
case 107:
|
||||
WRITE(FAN_PIN, 0);
|
||||
break;
|
||||
#endif
|
||||
|
||||
// TODO: spit an error
|
||||
default:
|
||||
serial_writeblock((uint8_t *) "E: Bad M-code ", 14);
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ typedef struct {
|
|||
} decfloat;
|
||||
|
||||
typedef struct {
|
||||
uint8_t seen;
|
||||
uint16_t seen;
|
||||
#define SEEN_G 1
|
||||
#define SEEN_M 2
|
||||
#define SEEN_X 4
|
||||
|
|
@ -27,6 +27,7 @@ typedef struct {
|
|||
#define SEEN_E 32
|
||||
#define SEEN_F 64
|
||||
#define SEEN_S 128
|
||||
#define SEEN_P 256
|
||||
|
||||
uint8_t option;
|
||||
#define OPTION_RELATIVE 1
|
||||
|
|
@ -38,6 +39,7 @@ typedef struct {
|
|||
TARGET target;
|
||||
|
||||
uint16_t S;
|
||||
uint16_t P;
|
||||
} GCODE_COMMAND;
|
||||
|
||||
int8_t indexof(uint8_t c, char *string);
|
||||
|
|
|
|||
|
|
@ -37,6 +37,10 @@ int main (void)
|
|||
|
||||
WRITE(HEATER_PIN, 0); SET_OUTPUT(HEATER_PIN);
|
||||
|
||||
#ifdef FAN_PIN
|
||||
WRITE(FAN_PIN, 0); SET_OUTPUT(FAN_PIN);
|
||||
#endif
|
||||
|
||||
WRITE(SCK, 0); SET_OUTPUT(SCK);
|
||||
WRITE(MISO, 1); SET_INPUT(MISO);
|
||||
WRITE(SS, 0); SET_OUTPUT(SS);
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@
|
|||
#define Y_MIN_PIN AIO5
|
||||
|
||||
#define Z_STEP_PIN DIO5
|
||||
#define Z_DIR_PIN DIO6
|
||||
#define Z_MIN_PIN DIO7
|
||||
#define Z_DIR_PIN DIO7
|
||||
#define Z_MIN_PIN DIO8
|
||||
|
||||
#define E_STEP_PIN DIO2
|
||||
#define E_DIR_PIN DIO3
|
||||
|
|
@ -41,6 +41,8 @@
|
|||
#define HEATER_PIN DIO6
|
||||
#define HEATER_PIN_PWM OC0A
|
||||
|
||||
#define FAN_PIN DIO9
|
||||
|
||||
#define SCK DIO13
|
||||
#define MISO DIO12
|
||||
#define MOSI DIO11
|
||||
|
|
|
|||
|
|
@ -1,7 +1,17 @@
|
|||
/*
|
||||
temp.c
|
||||
|
||||
This file currently reads temp from a MAX6675 on the SPI bus
|
||||
This file currently reads temp from a MAX6675 on the SPI bus.
|
||||
|
||||
ALL VALUES are in units of 0.25 degrees celsius, so temp_set(500) will set the temperature to 125 celsius, and temp_get() = 600 is reporting a temperature of 150 celsius.
|
||||
|
||||
the conversion to/from this unit is done in gcode.c, near:
|
||||
if (next_target.M == 104)
|
||||
next_target.S = decfloat_to_int(&read_digit, 4, 1);
|
||||
and
|
||||
// M105- get temperature
|
||||
case 105:
|
||||
uint16_t t = temp_get();
|
||||
*/
|
||||
|
||||
#include "temp.h"
|
||||
|
|
|
|||
|
|
@ -135,12 +135,20 @@ void setTimer(uint32_t delay)
|
|||
|
||||
void delay(uint32_t delay) {
|
||||
while (delay > 65535) {
|
||||
delayMicrosecondsInterruptible(delay);
|
||||
delayMicrosecondsInterruptible(65534);
|
||||
delay -= 65535;
|
||||
}
|
||||
delayMicrosecondsInterruptible(delay & 0xFFFF);
|
||||
}
|
||||
|
||||
void delay_ms(uint32_t delay) {
|
||||
while (delay > 65) {
|
||||
delayMicrosecondsInterruptible(64999);
|
||||
delay -= 65;
|
||||
}
|
||||
delayMicrosecondsInterruptible(delay * 1000);
|
||||
}
|
||||
|
||||
// from reprap project 5D firmware
|
||||
void delayMicrosecondsInterruptible(uint16_t us)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -19,6 +19,10 @@ uint16_t getTimerCeiling(const uint32_t delay);
|
|||
void setTimer(uint32_t delay);
|
||||
|
||||
void delay(uint32_t delay);
|
||||
|
||||
void delay_ms(uint32_t delay);
|
||||
|
||||
#define delay_us(d) delayMicrosecondsInterruptible(d)
|
||||
void delayMicrosecondsInterruptible(unsigned int us);
|
||||
|
||||
inline void enableTimerInterrupt(void)
|
||||
|
|
|
|||
Loading…
Reference in New Issue