time to save
This commit is contained in:
parent
7d644b934c
commit
73898a186e
153
mendel/mendel.c
153
mendel/mendel.c
|
|
@ -1,5 +1,5 @@
|
|||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
// #include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <avr/io.h>
|
||||
|
|
@ -7,47 +7,140 @@
|
|||
|
||||
#include "serial.h"
|
||||
|
||||
int serial_putc_fdev(char c, FILE *stream)
|
||||
{
|
||||
serial_writechar((uint8_t) c);
|
||||
return 0;
|
||||
/*
|
||||
machine variables
|
||||
*/
|
||||
#define AXIS_COUNT 5
|
||||
|
||||
// steps per rev * mm per tooth * teeth per rev
|
||||
#define STEPS_PER_MM (3200 * 4.77 * 16)
|
||||
|
||||
#define MAX_MM_PER_SEC 40
|
||||
#define MAX_IMMED_MM_PER_SEC 20
|
||||
#define ACCEL 10
|
||||
|
||||
|
||||
/*
|
||||
state machine variables
|
||||
*/
|
||||
|
||||
uint8_t linebuffer[64];
|
||||
|
||||
uint8_t state = 0;
|
||||
#define STATE_WAIT_FOR_COMMAND 0
|
||||
#define STATE_WAIT_FOR_COMMAND_DIGIT 1
|
||||
#define STATE_WAIT_FOR_DATA 2
|
||||
#define STATE_WAIT_FOR_DATA_DIGIT 3
|
||||
uint8_t command;
|
||||
uint8_t command_digit;
|
||||
uint8_t axis;
|
||||
|
||||
// volatile uint32_t xpos = 0;
|
||||
// volatile uint32_t ypos = 0;
|
||||
// volatile uint32_t zpos = 0;
|
||||
// volatile uint32_t edelta = 0;
|
||||
//
|
||||
// uint32_t xtarget = 0;
|
||||
// uint32_t ytarget = 0;
|
||||
// uint32_t ztarget = 0;
|
||||
//
|
||||
// uint16_t xspeed = 0;
|
||||
// uint16_t yspeed = 0;
|
||||
// uint16_t zspeed = 0;
|
||||
|
||||
struct axis {
|
||||
volatile uint32_t pos;
|
||||
int32_t target;
|
||||
uint32_t newtarget_mantissa;
|
||||
uint8_t newtarget_exp;
|
||||
uint8_t newtarget_sign;
|
||||
uint16_t speed;
|
||||
} axes[AXIS_COUNT];
|
||||
|
||||
uint8_t axis_char_to_id(uint8_t c) {
|
||||
if (c >= 'X')
|
||||
return c - 'X';
|
||||
if (c == 'E')
|
||||
return 3;
|
||||
if (c == 'T')
|
||||
return 4;
|
||||
return 255;
|
||||
}
|
||||
|
||||
int serial_getc_fdev(FILE *stream)
|
||||
{
|
||||
for (;serial_rxchars() == 0;);
|
||||
return (int) serial_popchar();
|
||||
}
|
||||
|
||||
static FILE serio = FDEV_SETUP_STREAM(serial_putc_fdev, serial_getc_fdev, _FDEV_SETUP_RW);
|
||||
|
||||
volatile uint32_t xpos;
|
||||
volatile uint32_t ypos;
|
||||
volatile uint32_t zpos;
|
||||
volatile uint32_t edelta;
|
||||
|
||||
uint32_t xtarget;
|
||||
uint32_t ytarget;
|
||||
uint32_t ztarget;
|
||||
|
||||
uint16_t xspeed;
|
||||
uint16_t yspeed;
|
||||
uint16_t zspeed;
|
||||
|
||||
int main (void)
|
||||
{
|
||||
// set up STDIN/OUT/ERR
|
||||
stdin = &serio;
|
||||
stdout = &serio;
|
||||
stderr = &serio;
|
||||
// stdin = &serio;
|
||||
// stdout = &serio;
|
||||
// stderr = &serio;
|
||||
|
||||
// set up serial
|
||||
serial_init();
|
||||
|
||||
// enable interrupts
|
||||
sei();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
|
||||
for (;serial_rxchars() == 0;);
|
||||
uint8_t c = serial_popchar();
|
||||
if (c >= 'a' && c <= 'z')
|
||||
c &= ~32;
|
||||
// preprocess
|
||||
switch (state) {
|
||||
case STATE_WAIT_FOR_COMMAND_DIGIT:
|
||||
if (c == 'G' || c == 'M')
|
||||
state = STATE_WAIT_FOR_COMMAND;
|
||||
break;
|
||||
case STATE_WAIT_FOR_DATA_DIGIT:
|
||||
if (axis_char_to_id(c) < 255)
|
||||
state = STATE_WAIT_FOR_DATA;
|
||||
break;
|
||||
}
|
||||
// actuate
|
||||
switch (state) {
|
||||
case STATE_WAIT_FOR_COMMAND:
|
||||
if (c == 'G' || c == 'M') {
|
||||
command = c;
|
||||
command_digit = 0;
|
||||
state = STATE_WAIT_FOR_COMMAND_DIGIT;
|
||||
}
|
||||
break;
|
||||
case STATE_WAIT_FOR_COMMAND_DIGIT:
|
||||
if (c >= '0' && c <= '9') {
|
||||
command_digit = (command_digit * 10) + (c - '0');
|
||||
}
|
||||
else {
|
||||
state = STATE_WAIT_FOR_DATA;
|
||||
}
|
||||
break;
|
||||
case STATE_WAIT_FOR_DATA:
|
||||
if (axis_char_to_id(c) < 255) {
|
||||
axis = axis_char_to_id(c);
|
||||
axes[axis].newtarget_mantissa = 0;
|
||||
axes[axis].newtarget_exp = 0;
|
||||
state = STATE_WAIT_FOR_DATA_DIGIT;
|
||||
}
|
||||
break;
|
||||
case STATE_WAIT_FOR_DATA_DIGIT:
|
||||
if (c == '-') {
|
||||
axes[axis].newtarget_sign = 1;
|
||||
}
|
||||
if (c >= '0' && c <= '9') {
|
||||
axes[axis].newtarget_mantissa = (axes[axis].newtarget_mantissa * 10) + (c - '0');
|
||||
if (axes[axis].newtarget_exp)
|
||||
axes[axis].newtarget_exp++;
|
||||
}
|
||||
if (c == '.') {
|
||||
axes[axis].newtarget_exp = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (c == 13) {
|
||||
uint8_t i;
|
||||
for (i = 0; i < AXIS_COUNT; i++) {
|
||||
uint32_t n = axes[i].newtarget_mantissa;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue