tweaks and bugfixes
This commit is contained in:
parent
ac2e26fda9
commit
a9d41c6c64
16
Makefile
16
Makefile
@ -39,7 +39,7 @@ AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE) -B 10
|
|||||||
COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE) -I.
|
COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE) -I.
|
||||||
|
|
||||||
# symbolic targets:
|
# symbolic targets:
|
||||||
all: main.hex
|
all: grbl.hex
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(COMPILE) -c $< -o $@
|
$(COMPILE) -c $< -o $@
|
||||||
@ -55,7 +55,7 @@ all: main.hex
|
|||||||
$(COMPILE) -S $< -o $@
|
$(COMPILE) -S $< -o $@
|
||||||
|
|
||||||
flash: all
|
flash: all
|
||||||
$(AVRDUDE) -U flash:w:main.hex:i
|
$(AVRDUDE) -U flash:w:grbl.hex:i
|
||||||
|
|
||||||
fuse:
|
fuse:
|
||||||
$(AVRDUDE) $(FUSES)
|
$(AVRDUDE) $(FUSES)
|
||||||
@ -65,19 +65,19 @@ install: flash fuse
|
|||||||
|
|
||||||
# if you use a bootloader, change the command below appropriately:
|
# if you use a bootloader, change the command below appropriately:
|
||||||
load: all
|
load: all
|
||||||
bootloadHID main.hex
|
bootloadHID grbl.hex
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f main.hex main.elf $(OBJECTS)
|
rm -f grbl.hex main.elf $(OBJECTS)
|
||||||
|
|
||||||
# file targets:
|
# file targets:
|
||||||
main.elf: $(OBJECTS)
|
main.elf: $(OBJECTS)
|
||||||
$(COMPILE) -o main.elf $(OBJECTS) -lm
|
$(COMPILE) -o main.elf $(OBJECTS) -lm
|
||||||
|
|
||||||
main.hex: main.elf
|
grbl.hex: main.elf
|
||||||
rm -f main.hex
|
rm -f grbl.hex
|
||||||
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
|
avr-objcopy -j .text -j .data -O ihex main.elf grbl.hex
|
||||||
avr-size main.hex *.o
|
avr-size grbl.hex *.o
|
||||||
# If you have an EEPROM section, you must also create a hex file for the
|
# If you have an EEPROM section, you must also create a hex file for the
|
||||||
# EEPROM and add it to the "flash" target.
|
# EEPROM and add it to the "flash" target.
|
||||||
|
|
||||||
|
4
gcode.c
4
gcode.c
@ -30,12 +30,12 @@
|
|||||||
- Variables
|
- Variables
|
||||||
- Multiple home locations
|
- Multiple home locations
|
||||||
- Probing
|
- Probing
|
||||||
- Spindle direction
|
|
||||||
- Override control
|
- Override control
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Omitted for the time being:
|
Omitted for the time being:
|
||||||
|
- Spindle direction
|
||||||
|
|
||||||
group 0 = {G10, G28, G30, G53, G92, G92.1, G92.2, G92.3} (Non modal G-codes)
|
group 0 = {G10, G28, G30, G53, G92, G92.1, G92.2, G92.3} (Non modal G-codes)
|
||||||
group 5 = {G93, G94} feed rate mode
|
group 5 = {G93, G94} feed rate mode
|
||||||
@ -126,7 +126,7 @@ uint8_t gc_execute_line(char *line) {
|
|||||||
double unit_converted_value;
|
double unit_converted_value;
|
||||||
double inverse_feed_rate;
|
double inverse_feed_rate;
|
||||||
|
|
||||||
uint8_t absolute_mode = 0; /* 0 = relative motion, 1 = absolute motion {G90, G91} */
|
uint8_t absolute_mode; /* 0 = relative motion, 1 = absolute motion {G90, G91} */
|
||||||
uint8_t next_action = NEXT_ACTION_DEFAULT; /* One of the NEXT_ACTION_-constants */
|
uint8_t next_action = NEXT_ACTION_DEFAULT; /* One of the NEXT_ACTION_-constants */
|
||||||
|
|
||||||
double target[3], offset[3];
|
double target[3], offset[3];
|
||||||
|
@ -18,7 +18,13 @@
|
|||||||
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
|
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* This code was inspired by the Arduino GCode_Interpreter by Mike Ellery. */
|
/* The structure of this module was inspired by the Arduino GCode_Interpreter by Mike Ellery. The arc
|
||||||
|
interpolator written from the information provided in the Wikipedia article 'Midpoint circle algorithm'
|
||||||
|
and the lecture 'Circle Drawing Algorithms' by Leonard McMillan.
|
||||||
|
|
||||||
|
http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
|
||||||
|
http://www.cs.unc.edu/~mcmillan/comp136/Lecture7/circle.html
|
||||||
|
*/
|
||||||
|
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -2,7 +2,9 @@ Grbl - An embedded rs274/ngc (g-code) interpreter, CNC controller, readout and e
|
|||||||
Inspired by the Arduino GCode Interpreter by Mike Ellery
|
Inspired by the Arduino GCode Interpreter by Mike Ellery
|
||||||
|
|
||||||
Status:
|
Status:
|
||||||
* Linear interpolation machine control complete (No arcs yet)
|
* Linear interpolation machine control complete (Arc support in embryonic state)
|
||||||
|
* Buffered, non blocking, asynchronous stepping so the rest of the system is free to generate new steps and parse
|
||||||
|
g-code while the steppers are still steppin'
|
||||||
* GCode interpreter complete
|
* GCode interpreter complete
|
||||||
* Basic serial protocol complete
|
* Basic serial protocol complete
|
||||||
* As of yet completely untested in a real environemnt. Still waiting for my micRo kit from Lumenlab.com
|
* As of yet completely untested in a real environemnt. Still waiting for my micRo kit from Lumenlab.com
|
||||||
@ -18,7 +20,7 @@ Goals:
|
|||||||
|
|
||||||
Limitations:
|
Limitations:
|
||||||
* Limited GCode-support. Focus on the kind of GCode produced by CAM tools. Leave human GCoders frustrated.
|
* Limited GCode-support. Focus on the kind of GCode produced by CAM tools. Leave human GCoders frustrated.
|
||||||
* No rotation axes, only x,y and z.
|
* No rotation axes, only x, y and z.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,15 +40,14 @@ void print_result() {
|
|||||||
int inches_mode;
|
int inches_mode;
|
||||||
uint8_t status_code;
|
uint8_t status_code;
|
||||||
uint32_t line_number;
|
uint32_t line_number;
|
||||||
|
int i; // loop variable
|
||||||
gc_get_status(position, &status_code, &inches_mode, &line_number);
|
gc_get_status(position, &status_code, &inches_mode, &line_number);
|
||||||
printByte('[');
|
printString("[ ");
|
||||||
printInteger(trunc(position[X_AXIS]*100));
|
for(i=X_AXIS; i<=Z_AXIS; i++) {
|
||||||
printByte(',');
|
printInteger(trunc(position[i]*100));
|
||||||
printInteger(trunc(position[Y_AXIS]*100));
|
printByte(' ');
|
||||||
printByte(',');
|
}
|
||||||
printInteger(trunc(position[Z_AXIS]*100));
|
|
||||||
printByte(']');
|
printByte(']');
|
||||||
printByte(' ');
|
|
||||||
printByte('@');
|
printByte('@');
|
||||||
printInteger(line_number);
|
printInteger(line_number);
|
||||||
printByte(':');
|
printByte(':');
|
||||||
|
33
stepper.c
33
stepper.c
@ -18,6 +18,9 @@
|
|||||||
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
|
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* The timer calculations of this module informed by the 'RepRap cartesian firmware' by Zack Smith
|
||||||
|
and Philipp Tiefenbacher. The circle buffer implementation by the wiring_serial library by David A. Mellis */
|
||||||
|
|
||||||
#include "stepper.h"
|
#include "stepper.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "nuts_bolts.h"
|
#include "nuts_bolts.h"
|
||||||
@ -30,7 +33,7 @@ volatile uint8_t step_buffer[STEP_BUFFER_SIZE]; // A buffer for step instruction
|
|||||||
volatile int step_buffer_head = 0;
|
volatile int step_buffer_head = 0;
|
||||||
volatile int step_buffer_tail = 0;
|
volatile int step_buffer_tail = 0;
|
||||||
|
|
||||||
uint8_t state = STEPPER_STATE_STOPPED;
|
uint8_t stepper_mode = STEPPER_MODE_STOPPED;
|
||||||
|
|
||||||
// This timer interrupt is executed at the pace set with set_pace. It pops one instruction from
|
// This timer interrupt is executed at the pace set with set_pace. It pops one instruction from
|
||||||
// the step_buffer, executes it. Then it starts timer2 in order to reset the motor port after
|
// the step_buffer, executes it. Then it starts timer2 in order to reset the motor port after
|
||||||
@ -77,7 +80,7 @@ void st_init()
|
|||||||
|
|
||||||
// Configure Timer 2
|
// Configure Timer 2
|
||||||
TCCR2A = 0; // Normal operation
|
TCCR2A = 0; // Normal operation
|
||||||
TCCT2B = 1<<CS20; // Full speed, no prescaler
|
TCCR2B = 1<<CS20; // Full speed, no prescaler
|
||||||
TIMSK2 = 0; // All interrupts disabled
|
TIMSK2 = 0; // All interrupts disabled
|
||||||
|
|
||||||
// start off with a slow pace
|
// start off with a slow pace
|
||||||
@ -100,7 +103,7 @@ void st_buffer_step(uint8_t motor_port_bits)
|
|||||||
// Block until all buffered steps are executed
|
// Block until all buffered steps are executed
|
||||||
void st_synchronize()
|
void st_synchronize()
|
||||||
{
|
{
|
||||||
if (state == STEPPER_MODE_RUNNING) {
|
if (stepper_mode == STEPPER_MODE_RUNNING) {
|
||||||
while(step_buffer_tail != step_buffer_head) { sleep_mode(); }
|
while(step_buffer_tail != step_buffer_head) { sleep_mode(); }
|
||||||
} else {
|
} else {
|
||||||
st_flush();
|
st_flush();
|
||||||
@ -119,7 +122,7 @@ void st_start()
|
|||||||
// Enable timer interrupt
|
// Enable timer interrupt
|
||||||
TIMSK1 |= (1<<OCIE1A);
|
TIMSK1 |= (1<<OCIE1A);
|
||||||
STEPPERS_ENABLE_PORT |= 1<<STEPPERS_ENABLE_BIT;
|
STEPPERS_ENABLE_PORT |= 1<<STEPPERS_ENABLE_BIT;
|
||||||
state = STEPPER_STATE_RUNNING;
|
stepper_mode = STEPPER_MODE_RUNNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute all buffered steps, then stop the stepper subsystem
|
// Execute all buffered steps, then stop the stepper subsystem
|
||||||
@ -128,7 +131,7 @@ inline void st_stop()
|
|||||||
st_synchronize();
|
st_synchronize();
|
||||||
TIMSK1 &= ~(1<<OCIE1A);
|
TIMSK1 &= ~(1<<OCIE1A);
|
||||||
STEPPERS_ENABLE_PORT &= ~(1<<STEPPERS_ENABLE_BIT);
|
STEPPERS_ENABLE_PORT &= ~(1<<STEPPERS_ENABLE_BIT);
|
||||||
state = STEPPER_STATE_STOPPED;
|
stepper_mode = STEPPER_MODE_STOPPED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void st_set_pace(uint32_t microseconds)
|
void st_set_pace(uint32_t microseconds)
|
||||||
@ -181,25 +184,25 @@ int check_limit_switch(int axis)
|
|||||||
// void perform_go_home()
|
// void perform_go_home()
|
||||||
// {
|
// {
|
||||||
// int axis;
|
// int axis;
|
||||||
// if(state.home.phase == PHASE_HOME_RETURN) {
|
// if(stepper_mode.home.phase == PHASE_HOME_RETURN) {
|
||||||
// // We are running all axes in reverse until all limit switches are tripped
|
// // We are running all axes in reverse until all limit switches are tripped
|
||||||
// // Check all limit switches:
|
// // Check all limit switches:
|
||||||
// for(axis=X_AXIS; axis <= Z_AXIS; axis++) {
|
// for(axis=X_AXIS; axis <= Z_AXIS; axis++) {
|
||||||
// state.home.away[axis] |= check_limit_switch(axis);
|
// stepper_mode.home.away[axis] |= check_limit_switch(axis);
|
||||||
// }
|
// }
|
||||||
// // Step steppers. First retract along Z-axis. Then X and Y.
|
// // Step steppers. First retract along Z-axis. Then X and Y.
|
||||||
// if(state.home.away[Z_AXIS]) {
|
// if(stepper_mode.home.away[Z_AXIS]) {
|
||||||
// step_axis(Z_AXIS);
|
// step_axis(Z_AXIS);
|
||||||
// } else {
|
// } else {
|
||||||
// // Check if all axes are home
|
// // Check if all axes are home
|
||||||
// if(!(state.home.away[X_AXIS] || state.home.away[Y_AXIS])) {
|
// if(!(stepper_mode.home.away[X_AXIS] || stepper_mode.home.away[Y_AXIS])) {
|
||||||
// // All axes are home, prepare next phase: to nudge the tool carefully out of the limit switches
|
// // All axes are home, prepare next phase: to nudge the tool carefully out of the limit switches
|
||||||
// memset(state.home.direction, 1, sizeof(state.home.direction)); // direction = [1,1,1]
|
// memset(stepper_mode.home.direction, 1, sizeof(stepper_mode.home.direction)); // direction = [1,1,1]
|
||||||
// set_direction_bits(state.home.direction);
|
// set_direction_bits(stepper_mode.home.direction);
|
||||||
// state.home.phase == PHASE_HOME_NUDGE;
|
// stepper_mode.home.phase == PHASE_HOME_NUDGE;
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
// step_steppers(state.home.away);
|
// step_steppers(stepper_mode.home.away);
|
||||||
// }
|
// }
|
||||||
// } else {
|
// } else {
|
||||||
// for(axis=X_AXIS; axis <= Z_AXIS; axis++) {
|
// for(axis=X_AXIS; axis <= Z_AXIS; axis++) {
|
||||||
@ -209,8 +212,8 @@ int check_limit_switch(int axis)
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// // When this code is reached it means all axes are free of their limit-switches. Complete the cycle and rest:
|
// // When this code is reached it means all axes are free of their limit-switches. Complete the cycle and rest:
|
||||||
// clear_vector(state.position); // By definition this is location [0, 0, 0]
|
// clear_vector(stepper_mode.position); // By definition this is location [0, 0, 0]
|
||||||
// state.mode = MODE_AT_REST;
|
// stepper_mode.mode = MODE_AT_REST;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
@ -24,10 +24,10 @@
|
|||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/sleep.h>
|
#include <avr/sleep.h>
|
||||||
|
|
||||||
#define STEPPER_STATE_STOPPED 0
|
#define STEPPER_MODE_STOPPED 0
|
||||||
#define STEPPER_STATE_RUNNING 1
|
#define STEPPER_MODE_RUNNING 1
|
||||||
#define STEPPER_STATE_LIMIT_OVERRUN 2
|
#define STEPPER_MODE_LIMIT_OVERRUN 2
|
||||||
#define STEPPER_STATE_HOMING 3
|
#define STEPPER_MODE_HOMING 3
|
||||||
|
|
||||||
// Initialize and start the stepper motor subsystem
|
// Initialize and start the stepper motor subsystem
|
||||||
void st_init();
|
void st_init();
|
||||||
|
3
todo.txt
3
todo.txt
@ -1,3 +1,6 @@
|
|||||||
|
* Implement homing cycle in stepper.c
|
||||||
|
* Implement limit switch support in stepper.c (use port-triggered interrupts?)
|
||||||
|
* How to implement st_set_pace? Consider synchronizing when pace is changed
|
||||||
* Eliminate need for circle_x and circle_y in step_arc_along…
|
* Eliminate need for circle_x and circle_y in step_arc_along…
|
||||||
* Use timer interrupts to drive steppers
|
* Use timer interrupts to drive steppers
|
||||||
* Tool table
|
* Tool table
|
||||||
|
@ -128,21 +128,21 @@ SIGNAL(SIG_UART_RECV)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void printMode(int mode)
|
// void printMode(int mode)
|
||||||
{
|
// {
|
||||||
// do nothing, we only support serial printing, not lcd.
|
// // do nothing, we only support serial printing, not lcd.
|
||||||
}
|
// }
|
||||||
|
|
||||||
void printByte(unsigned char c)
|
void printByte(unsigned char c)
|
||||||
{
|
{
|
||||||
serialWrite(c);
|
serialWrite(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
void printNewline()
|
// void printNewline()
|
||||||
{
|
// {
|
||||||
printByte('\n');
|
// printByte('\n');
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
void printString(const char *s)
|
void printString(const char *s)
|
||||||
{
|
{
|
||||||
while (*s)
|
while (*s)
|
||||||
@ -180,20 +180,20 @@ void printInteger(long n)
|
|||||||
printIntegerInBase(n, 10);
|
printIntegerInBase(n, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
void printHex(unsigned long n)
|
// void printHex(unsigned long n)
|
||||||
{
|
// {
|
||||||
printIntegerInBase(n, 16);
|
// printIntegerInBase(n, 16);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
void printOctal(unsigned long n)
|
// void printOctal(unsigned long n)
|
||||||
{
|
// {
|
||||||
printIntegerInBase(n, 8);
|
// printIntegerInBase(n, 8);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
void printBinary(unsigned long n)
|
// void printBinary(unsigned long n)
|
||||||
{
|
// {
|
||||||
printIntegerInBase(n, 2);
|
// printIntegerInBase(n, 2);
|
||||||
}
|
// }
|
||||||
|
|
||||||
/* Including print() adds approximately 1500 bytes to the binary size,
|
/* Including print() adds approximately 1500 bytes to the binary size,
|
||||||
* so we replace it with the smaller and less-confusing printString(),
|
* so we replace it with the smaller and less-confusing printString(),
|
||||||
|
Loading…
Reference in New Issue
Block a user