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.
|
||||
|
||||
# symbolic targets:
|
||||
all: main.hex
|
||||
all: grbl.hex
|
||||
|
||||
.c.o:
|
||||
$(COMPILE) -c $< -o $@
|
||||
@ -55,7 +55,7 @@ all: main.hex
|
||||
$(COMPILE) -S $< -o $@
|
||||
|
||||
flash: all
|
||||
$(AVRDUDE) -U flash:w:main.hex:i
|
||||
$(AVRDUDE) -U flash:w:grbl.hex:i
|
||||
|
||||
fuse:
|
||||
$(AVRDUDE) $(FUSES)
|
||||
@ -65,19 +65,19 @@ install: flash fuse
|
||||
|
||||
# if you use a bootloader, change the command below appropriately:
|
||||
load: all
|
||||
bootloadHID main.hex
|
||||
bootloadHID grbl.hex
|
||||
|
||||
clean:
|
||||
rm -f main.hex main.elf $(OBJECTS)
|
||||
rm -f grbl.hex main.elf $(OBJECTS)
|
||||
|
||||
# file targets:
|
||||
main.elf: $(OBJECTS)
|
||||
$(COMPILE) -o main.elf $(OBJECTS) -lm
|
||||
|
||||
main.hex: main.elf
|
||||
rm -f main.hex
|
||||
avr-objcopy -j .text -j .data -O ihex main.elf main.hex
|
||||
avr-size main.hex *.o
|
||||
grbl.hex: main.elf
|
||||
rm -f grbl.hex
|
||||
avr-objcopy -j .text -j .data -O ihex main.elf grbl.hex
|
||||
avr-size grbl.hex *.o
|
||||
# If you have an EEPROM section, you must also create a hex file for the
|
||||
# EEPROM and add it to the "flash" target.
|
||||
|
||||
|
4
gcode.c
4
gcode.c
@ -30,12 +30,12 @@
|
||||
- Variables
|
||||
- Multiple home locations
|
||||
- Probing
|
||||
- Spindle direction
|
||||
- Override control
|
||||
*/
|
||||
|
||||
/*
|
||||
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 5 = {G93, G94} feed rate mode
|
||||
@ -126,7 +126,7 @@ uint8_t gc_execute_line(char *line) {
|
||||
double unit_converted_value;
|
||||
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 */
|
||||
|
||||
double target[3], offset[3];
|
||||
|
@ -18,7 +18,13 @@
|
||||
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 "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
|
||||
|
||||
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
|
||||
* Basic serial protocol complete
|
||||
* As of yet completely untested in a real environemnt. Still waiting for my micRo kit from Lumenlab.com
|
||||
|
@ -40,15 +40,14 @@ void print_result() {
|
||||
int inches_mode;
|
||||
uint8_t status_code;
|
||||
uint32_t line_number;
|
||||
int i; // loop variable
|
||||
gc_get_status(position, &status_code, &inches_mode, &line_number);
|
||||
printByte('[');
|
||||
printInteger(trunc(position[X_AXIS]*100));
|
||||
printByte(',');
|
||||
printInteger(trunc(position[Y_AXIS]*100));
|
||||
printByte(',');
|
||||
printInteger(trunc(position[Z_AXIS]*100));
|
||||
printByte(']');
|
||||
printString("[ ");
|
||||
for(i=X_AXIS; i<=Z_AXIS; i++) {
|
||||
printInteger(trunc(position[i]*100));
|
||||
printByte(' ');
|
||||
}
|
||||
printByte(']');
|
||||
printByte('@');
|
||||
printInteger(line_number);
|
||||
printByte(':');
|
||||
|
33
stepper.c
33
stepper.c
@ -18,6 +18,9 @@
|
||||
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 "config.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_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
|
||||
// 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
|
||||
TCCR2A = 0; // Normal operation
|
||||
TCCT2B = 1<<CS20; // Full speed, no prescaler
|
||||
TCCR2B = 1<<CS20; // Full speed, no prescaler
|
||||
TIMSK2 = 0; // All interrupts disabled
|
||||
|
||||
// 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
|
||||
void st_synchronize()
|
||||
{
|
||||
if (state == STEPPER_MODE_RUNNING) {
|
||||
if (stepper_mode == STEPPER_MODE_RUNNING) {
|
||||
while(step_buffer_tail != step_buffer_head) { sleep_mode(); }
|
||||
} else {
|
||||
st_flush();
|
||||
@ -119,7 +122,7 @@ void st_start()
|
||||
// Enable timer interrupt
|
||||
TIMSK1 |= (1<<OCIE1A);
|
||||
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
|
||||
@ -128,7 +131,7 @@ inline void st_stop()
|
||||
st_synchronize();
|
||||
TIMSK1 &= ~(1<<OCIE1A);
|
||||
STEPPERS_ENABLE_PORT &= ~(1<<STEPPERS_ENABLE_BIT);
|
||||
state = STEPPER_STATE_STOPPED;
|
||||
stepper_mode = STEPPER_MODE_STOPPED;
|
||||
}
|
||||
|
||||
void st_set_pace(uint32_t microseconds)
|
||||
@ -181,25 +184,25 @@ int check_limit_switch(int axis)
|
||||
// void perform_go_home()
|
||||
// {
|
||||
// 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
|
||||
// // Check all limit switches:
|
||||
// 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.
|
||||
// if(state.home.away[Z_AXIS]) {
|
||||
// if(stepper_mode.home.away[Z_AXIS]) {
|
||||
// step_axis(Z_AXIS);
|
||||
// } else {
|
||||
// // 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
|
||||
// memset(state.home.direction, 1, sizeof(state.home.direction)); // direction = [1,1,1]
|
||||
// set_direction_bits(state.home.direction);
|
||||
// state.home.phase == PHASE_HOME_NUDGE;
|
||||
// memset(stepper_mode.home.direction, 1, sizeof(stepper_mode.home.direction)); // direction = [1,1,1]
|
||||
// set_direction_bits(stepper_mode.home.direction);
|
||||
// stepper_mode.home.phase == PHASE_HOME_NUDGE;
|
||||
// return;
|
||||
// }
|
||||
// step_steppers(state.home.away);
|
||||
// step_steppers(stepper_mode.home.away);
|
||||
// }
|
||||
// } else {
|
||||
// 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:
|
||||
// clear_vector(state.position); // By definition this is location [0, 0, 0]
|
||||
// state.mode = MODE_AT_REST;
|
||||
// clear_vector(stepper_mode.position); // By definition this is location [0, 0, 0]
|
||||
// stepper_mode.mode = MODE_AT_REST;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
@ -24,10 +24,10 @@
|
||||
#include <avr/io.h>
|
||||
#include <avr/sleep.h>
|
||||
|
||||
#define STEPPER_STATE_STOPPED 0
|
||||
#define STEPPER_STATE_RUNNING 1
|
||||
#define STEPPER_STATE_LIMIT_OVERRUN 2
|
||||
#define STEPPER_STATE_HOMING 3
|
||||
#define STEPPER_MODE_STOPPED 0
|
||||
#define STEPPER_MODE_RUNNING 1
|
||||
#define STEPPER_MODE_LIMIT_OVERRUN 2
|
||||
#define STEPPER_MODE_HOMING 3
|
||||
|
||||
// Initialize and start the stepper motor subsystem
|
||||
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…
|
||||
* Use timer interrupts to drive steppers
|
||||
* Tool table
|
||||
|
@ -128,21 +128,21 @@ SIGNAL(SIG_UART_RECV)
|
||||
}
|
||||
}
|
||||
|
||||
void printMode(int mode)
|
||||
{
|
||||
// do nothing, we only support serial printing, not lcd.
|
||||
}
|
||||
// void printMode(int mode)
|
||||
// {
|
||||
// // do nothing, we only support serial printing, not lcd.
|
||||
// }
|
||||
|
||||
void printByte(unsigned char c)
|
||||
{
|
||||
serialWrite(c);
|
||||
}
|
||||
|
||||
void printNewline()
|
||||
{
|
||||
printByte('\n');
|
||||
}
|
||||
|
||||
// void printNewline()
|
||||
// {
|
||||
// printByte('\n');
|
||||
// }
|
||||
//
|
||||
void printString(const char *s)
|
||||
{
|
||||
while (*s)
|
||||
@ -180,20 +180,20 @@ void printInteger(long n)
|
||||
printIntegerInBase(n, 10);
|
||||
}
|
||||
|
||||
void printHex(unsigned long n)
|
||||
{
|
||||
printIntegerInBase(n, 16);
|
||||
}
|
||||
|
||||
void printOctal(unsigned long n)
|
||||
{
|
||||
printIntegerInBase(n, 8);
|
||||
}
|
||||
|
||||
void printBinary(unsigned long n)
|
||||
{
|
||||
printIntegerInBase(n, 2);
|
||||
}
|
||||
// void printHex(unsigned long n)
|
||||
// {
|
||||
// printIntegerInBase(n, 16);
|
||||
// }
|
||||
//
|
||||
// void printOctal(unsigned long n)
|
||||
// {
|
||||
// printIntegerInBase(n, 8);
|
||||
// }
|
||||
//
|
||||
// void printBinary(unsigned long n)
|
||||
// {
|
||||
// printIntegerInBase(n, 2);
|
||||
// }
|
||||
|
||||
/* Including print() adds approximately 1500 bytes to the binary size,
|
||||
* so we replace it with the smaller and less-confusing printString(),
|
||||
|
Loading…
Reference in New Issue
Block a user