#include <stdlib.h>\r
#include "USBtoSerial.h"\r
#include <util/delay.h>\r
-#include "TM1001A.h"\r
-// #include "rfm70.c"\r
-#include "pins.h"\r
-#include "leds.c"\r
\r
-int16_t plate_pos_x = 0,plate_pos_y = 0;\r
-char stringbuffer[16];\r
+\r
\r
/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */\r
static RingBuffer_t USBtoUSART_Buffer;\r
/* Hardware Initialization */\r
// LEDs_Init();\r
USB_Init();\r
+ \r
+ RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data));\r
+ RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data));\r
+\r
+ GlobalInterruptEnable();\r
}\r
\r
/** Event handler for the library USB Connection event. */\r
\r
}/* uart_puts */\r
\r
-\r
-// convert an unsigned integer to string\r
-void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits, char leading_char) {\r
- int8_t i; // schleifenzähler\r
-\r
- string[no_digits] = '\0'; // String Terminator\r
- for (i = (no_digits - 1); i >= 0; i--) {\r
- if (zahl == 0 && i < (no_digits - 1)) {\r
- string[i] = leading_char;\r
- } else {\r
- string[i] = (zahl % 10) + '0';\r
- } // Modulo rechnen, dann den ASCII-Code von '0' addieren\r
- zahl /= 10;\r
- }\r
-\r
-}\r
-\r
-int8_t sign(int16_t x) {\r
- return (x > 0) - (x < 0);\r
-}\r
-\r
-\r
-void uart_print_number(uint32_t zahl, uint8_t no_digits) {\r
- my_uitoa(abs(zahl),stringbuffer,no_digits,' ');\r
- uart_puts(stringbuffer);\r
-}\r
-\r
-\r
-void uart_print_number_wlzeros(uint32_t zahl, uint8_t no_digits) {\r
- my_uitoa(abs(zahl),stringbuffer,no_digits,'0');\r
- uart_puts(stringbuffer);\r
-}\r
-\r
-void uart_print_signed_number(uint32_t zahl, uint8_t no_digits) {\r
- my_uitoa(abs(zahl),stringbuffer,no_digits,' ');\r
- if (sign(zahl) < 0) {\r
- uart_putc('-');\r
- } else {\r
- uart_putc('+');\r
- }\r
- uart_puts(stringbuffer);\r
- \r
-}\r
-\r
-\r
-/** Main program entry point. This routine contains the overall program flow, including initial\r
- * setup of all components and the main program loop.\r
- */\r
-\r
-/* motor stuff */\r
-\r
-uint8_t phase_pattern[4] = { 0b00001010, 0b00001001, 0b00000101, 0b00000110};\r
- \r
- \r
-void set_x(uint8_t byte) {\r
- PORTX0 &= ~(1<<X0);\r
- PORTX1 &= ~(1<<X1);\r
- PORTX2 &= ~(1<<X2);\r
- PORTX3 &= ~(1<<X3);\r
-\r
- PORTX0 |= ((byte & (1<<0))>>0)<<X0;\r
- PORTX1 |= ((byte & (1<<1))>>1)<<X1;\r
- PORTX2 |= ((byte & (1<<2))>>2)<<X2;\r
- PORTX3 |= ((byte & (1<<3))>>3)<<X3;\r
-}\r
-\r
-void set_y(uint8_t byte) {\r
- PORTY0 &= ~(1<<Y0);\r
- PORTY1 &= ~(1<<Y1);\r
- PORTY2 &= ~(1<<Y2);\r
- PORTY3 &= ~(1<<Y3);\r
-\r
- PORTY0 |= ((byte & (1<<0))>>0)<<Y0;\r
- PORTY1 |= ((byte & (1<<1))>>1)<<Y1;\r
- PORTY2 |= ((byte & (1<<2))>>2)<<Y2;\r
- PORTY3 |= ((byte & (1<<3))>>3)<<Y3;\r
-}\r
-\r
-void init_motors(void){\r
- set_x(0);\r
- set_y(0);\r
- DDRX0 |= (1<<X0);\r
- DDRX1 |= (1<<X1);\r
- DDRX2 |= (1<<X2);\r
- DDRX3 |= (1<<X3);\r
- DDRY0 |= (1<<Y0);\r
- DDRY1 |= (1<<Y1);\r
- DDRY2 |= (1<<Y2);\r
- DDRY3 |= (1<<Y3);\r
-}\r
-\r
-\r
-\r
-uint8_t motor_step(uint8_t motor, int8_t direction) { // motor: M1 or M2, direction +1 or -1, 0 for coil deactivation\r
-\r
- uint8_t next_pattern, next_phase;\r
- static uint8_t phase_memory[2] = { 0, 0 };\r
- void (*setport)(uint8_t);\r
- setport = &set_x;\r
- \r
- switch(motor) {\r
- case X:\r
- setport = &set_x;\r
- break;\r
- case Y:\r
- setport = &set_y;\r
- break;\r
- }\r
-\r
- next_phase = (phase_memory[motor] + 4 + direction) % 4;\r
- phase_memory[motor] = next_phase;\r
- \r
-\r
- next_pattern = phase_pattern[next_phase];\r
- if (direction != 0) {\r
- (*setport)(next_pattern);\r
- } else {\r
- (*setport)(0);\r
- }\r
-\r
- return next_pattern;\r
-\r
-}\r
-\r
-\r
-uint32_t times_ten_pow(uint8_t exponent) {\r
- uint32_t val = 1;\r
- for (uint8_t i = 1; i <= exponent; i++) {\r
- val *= 10;\r
- }\r
- return val;\r
-}\r
-\r
-// #define PHASE_DELAY_MS 1\r
-#define PHASE_DELAY_US 0\r
-\r
-uint8_t move_plate(int16_t dx, int16_t dy){\r
- static int16_t todo_x,todo_y = 0;\r
- int8_t signum;\r
- uint8_t returnval = 0;\r
- todo_x += dx;\r
- todo_y += dy;\r
- \r
- signum = sign(todo_x);\r
- if(signum != 0) {\r
- returnval++;\r
- }\r
- motor_step(X,signum);\r
- todo_x -= signum;\r
- \r
- signum = sign(todo_y);\r
- if(signum != 0) {\r
- returnval++;\r
- }\r
- motor_step(Y,signum);\r
- todo_y -= signum;\r
- _delay_us(PHASE_DELAY_US);\r
- \r
- return returnval; // busy\r
- \r
-}\r
- \r
- \r
-void print_steps_in_mm(int16_t steps) {\r
- int16_t predot,postdot;\r
- \r
- predot = steps/24;\r
- postdot = ((abs(steps)%24)*417)/10;\r
- uart_print_signed_number(predot,3);\r
- uart_putc('.');\r
- uart_print_number_wlzeros(postdot,3);\r
- \r
-}\r
- \r
-void pos_report(void){ \r
- uart_puts("x_pos: ");\r
-// uart_print_signed_number(plate_pos_x,6);\r
- print_steps_in_mm(plate_pos_x);\r
-// my_uitoa(plate_pos_x, stringbuffer, 6);\r
-// uart_puts(stringbuffer);\r
- uart_puts(" y_pos: ");\r
-// uart_print_signed_number(plate_pos_y,6);\r
- print_steps_in_mm(plate_pos_y);\r
- uart_puts("\r");\r
-}\r
-\r
-#define POSITION 0\r
-#define GOTO 1\r
-#define MOVEREL 2\r
-#define SETZERO 3\r
-\r
-void parse_command(void){\r
- \r
- \r
- static char cmdbuffer[32];\r
- static char numbuffer[16];\r
- static uint16_t predot = 0,postdot = 0;\r
- static uint8_t cmdPos, curCmdLen, num_start = 0, nums_found = 0;\r
- uint8_t action=0,axis=0;\r
- int8_t num_sign = 1;\r
- char byte;\r
- \r
- /* Load the next byte from the USART transmit buffer into the USART */\r
+uint16_t uart_getc(void) {\r
if (!(RingBuffer_IsEmpty(&USBtoUSART_Buffer))) {\r
- byte = RingBuffer_Remove(&USBtoUSART_Buffer);\r
- \r
- if (byte == '\r' || byte == '\n') {// end of command, evaluate cemmand!\r
- uart_puts("\r\n");\r
- cmdbuffer[cmdPos] = '\0'; // terminate new command string\r
- curCmdLen = cmdPos;\r
- cmdPos = 0;\r
- \r
- \r
- if (cmdbuffer[0] == 'g' || cmdbuffer[0] == 'G') { // goto command\r
- action = GOTO;\r
- } else if ( cmdbuffer[0] == 'm' || cmdbuffer[0] == 'M') {\r
- action = MOVEREL;\r
- } else if ( cmdbuffer[0] == 'z' || cmdbuffer[0] == 'Z' ) {\r
- action = SETZERO;\r
- } else {\r
- action = POSITION;\r
- }\r
- \r
- if (cmdbuffer[1] == 'x' || cmdbuffer[1] == 'X') {\r
- axis = X;\r
- } else if (cmdbuffer[1] == 'y' || cmdbuffer[1] == 'Y') {\r
- axis = Y;\r
- }\r
- \r
- // if you expect coordinate, parse number!\r
- if (action == GOTO || action == MOVEREL){\r
-\r
- predot = 0;\r
- postdot = 0;\r
- num_sign = 1;\r
- num_start = 0;\r
- nums_found = 0;\r
- \r
- for (uint8_t i=2; i<=curCmdLen; i++) {\r
- if ( num_start == 0 && cmdbuffer[i] == '-' ) { // if you find a minus before\r
- // you find a digit, it's a negative number\r
- num_sign = -1;\r
- }\r
- \r
- if ( cmdbuffer[i] >= 48 && cmdbuffer[i] <= 57 ){ // is it a number?\r
- if ( num_start == 0) { // this is the first digit in the string\r
- num_start = i;\r
- }\r
- } else { // no digit!\r
- if ( num_start != 0) { // digits have been found before\r
- strncpy(numbuffer,cmdbuffer+num_start,i-num_start); // copy number found to\r
- // numbuffer\r
- numbuffer[i-num_start] = '\0'; // make sure it's always a terminated string\r
- nums_found++;\r
- if(nums_found == 1) { // its the predot digits\r
- predot = atoi(numbuffer);\r
- } else { // its the postdot digits\r
- uint8_t postdotlen = i-num_start;\r
- if (postdotlen < 3){ // if too small ,fill with zeros\r
- for( uint8_t j = postdotlen; j <=2; j++) {\r
- numbuffer[j] = '0';\r
- }\r
- }\r
- // crop the number to three post dot digits\r
- numbuffer[3] = '\0';\r
- \r
- postdot = atoi(numbuffer);\r
- }\r
- num_start = 0;\r
- }\r
- }\r
- }\r
- \r
- }\r
- \r
- int16_t steps = 0,dest=0;\r
- \r
- switch (action) {\r
- case GOTO:\r
- uart_puts("GOTO ");\r
- uart_putc(88+axis);// x or y\r
- uart_putc(' ');\r
- uart_print_signed_number(predot*num_sign,3);\r
- uart_putc('.');\r
- uart_print_number_wlzeros(postdot,3);\r
- uart_puts("\r\n"); \r
- \r
- dest = num_sign *( predot*24 +(postdot*10)/416);\r
- \r
- if (axis == X) {\r
- steps = dest - plate_pos_x; // experimental correction!\r
- move_plate(steps,0);\r
- plate_pos_x += steps;\r
- } else if (axis == Y) {\r
- steps = dest - plate_pos_y;\r
- move_plate(0,steps);\r
- plate_pos_y += steps;\r
- }\r
- pos_report();\r
- \r
- break;\r
- case MOVEREL:\r
- uart_puts("MOVE ");\r
- uart_putc(88+axis);// x or y\r
- uart_putc(' ');\r
- uart_print_signed_number(predot*num_sign,3);\r
- uart_putc('.');\r
- uart_print_number_wlzeros(postdot,3);\r
- uart_puts("\r\n"); \r
- \r
- steps = num_sign *( predot*24 +(postdot*10)/416);\r
- \r
- if (axis == X) {\r
- move_plate(steps,0);\r
- plate_pos_x += steps;\r
- } else if (axis == Y) {\r
- move_plate(0,steps);\r
- plate_pos_y += steps;\r
- }\r
- pos_report();\r
- break;\r
- \r
- case SETZERO:\r
- plate_pos_x = 0;\r
- plate_pos_y = 0;\r
- pos_report();\r
- break;\r
- \r
- case POSITION:\r
- pos_report();\r
- break;\r
- \r
- }\r
- \r
- \r
- \r
- } else { // queue command\r
- if( cmdPos == 0 ){\r
- uart_puts("\r\n$ ");\r
- }\r
- \r
- if( byte == 8 ){ // backspace\r
- cmdPos--;\r
- } else {\r
- cmdbuffer[cmdPos++] = byte;\r
- }\r
- uart_putc(byte);\r
- \r
-\r
- }\r
+ return RingBuffer_Remove(&USBtoUSART_Buffer);\r
+ } else {\r
+ return EMPTY;\r
}\r
}\r
\r
-int main(void)\r
-{\r
- \r
- init_motors();\r
-// init_leds();\r
-// init_sw();\r
-\r
- \r
- char dummy;\r
- uint8_t field_val = 0;\r
- SetupHardware();\r
-\r
\r
\r
- RingBuffer_InitBuffer(&USBtoUSART_Buffer, USBtoUSART_Buffer_Data, sizeof(USBtoUSART_Buffer_Data));\r
- RingBuffer_InitBuffer(&USARTtoUSB_Buffer, USARTtoUSB_Buffer_Data, sizeof(USARTtoUSB_Buffer_Data));\r
-\r
-// LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
- GlobalInterruptEnable();\r
-\r
- touchpad_init(); // you need to call this to setup the I/O pin!\r
- _delay_ms(500);\r
- sei();\r
-\r
-\r
-\r
- \r
- uint16_t loopcounter=0;\r
-\r
\r
\r
-// uart_puts("you selected the relative position demo modus:\n\r");\r
- touchpad_set_rel_mode_100dpi();// use touchpad in relative mode\r
-// touchpad_set_rel_mode_200dpi(); // uncomment this line if you want double resolution\r
- int16_t x, y = 0;\r
- int8_t dx, dy = 0;\r
- uint8_t busy = 0, last_busy = 0;\r
-\r
- while (1) {\r
- \r
-// set_led0(sw0_state());\r
-// set_led1(sw1_state());\r
-// set_led2(sw2_state());\r
-\r
- Usb2SerialTask();\r
-// loopcounter++;\r
-// if(loopcounter<2000) {\r
-// continue;\r
-// }\r
-// loopcounter=0;\r
- parse_command(); // read data from virtual comport\r
- touchpad_read(); // read data from touchpad\r
-// if(sw0_state()){ // if left switch is active\r
- dx = -4*delta_x();// returns the amount your finger has moved in x direction since last readout\r
-// } else {\r
-// dx = 0;\r
-// }\r
-// if(sw1_state()){ // if middle switch is active\r
- dy = -4*delta_y();// returns the amount your finger has moved in y direction since last readout\r
-// } else {\r
-// dy = 0;\r
-// }\r
-\r
- // increment/decrement some dummy variables with the\r
-\r
- plate_pos_x += dx;\r
- plate_pos_y += dy;\r
- \r
- \r
- last_busy = busy;\r
- busy = move_plate(dx,dy);\r
- \r
- \r
- if (last_busy && !(busy)){\r
- pos_report();\r
- }\r
- \r
-\r
- }\r
- // end of relative mode demo block\r
-\r
-// #endif\r
- \r
- \r
- \r
- \r
\r
\r
-} // end of main
\ No newline at end of file
--- /dev/null
+
+#include <avr/io.h>
+#include <stdlib.h>
+#include "USBtoSerial.h"
+#include <util/delay.h>
+#include "TM1001A.h"
+#include "motors.h"
+#include "misc.h"
+#include "pins.h"
+#include "leds.c"
+
+
+
+int16_t plate_pos_x = 0,plate_pos_y = 0;
+
+
+
+
+
+void print_steps_in_mm(int16_t steps) {
+ int16_t predot,postdot;
+
+ predot = steps/24;
+ postdot = ((abs(steps)%24)*417)/10;
+ uart_print_signed_number(predot,3);
+ uart_putc('.');
+ uart_print_number_wlzeros(postdot,3);
+
+}
+
+void pos_report(void){
+ uart_puts("x_pos: ");
+ print_steps_in_mm(plate_pos_x);
+ uart_puts(" y_pos: ");
+ print_steps_in_mm(plate_pos_y);
+ uart_puts("\r");
+}
+
+
+
+typedef enum {POSITION, GOTO, MOVEREL, SETZERO} action_t;
+
+void parse_command(void){
+
+ static char cmdbuffer[32];
+ static char numbuffer[16];
+ static uint16_t predot = 0,postdot = 0;
+ static uint8_t cmdPos, curCmdLen, num_start = 0, nums_found = 0;
+ uint8_t axis=0;
+ action_t action = POSITION;
+ int8_t num_sign = 1;
+ char byte;
+
+ /* Load the next byte from the USART transmit buffer into the USART */
+
+ uint16_t pop = uart_getc();
+ if(!(pop == EMPTY)){
+
+ byte = (char) pop;
+
+ if (byte == '\r' || byte == '\n') {// end of command, evaluate cemmand!
+ uart_puts("\r\n");
+ cmdbuffer[cmdPos] = '\0'; // terminate new command string
+ curCmdLen = cmdPos;
+ cmdPos = 0;
+
+
+ if (cmdbuffer[0] == 'g' || cmdbuffer[0] == 'G') { // goto command
+ action = GOTO;
+ } else if ( cmdbuffer[0] == 'm' || cmdbuffer[0] == 'M') {
+ action = MOVEREL;
+ } else if ( cmdbuffer[0] == 'z' || cmdbuffer[0] == 'Z' ) {
+ action = SETZERO;
+ } else {
+ action = POSITION;
+ }
+
+ if (cmdbuffer[1] == 'x' || cmdbuffer[1] == 'X') {
+ axis = X;
+ } else if (cmdbuffer[1] == 'y' || cmdbuffer[1] == 'Y') {
+ axis = Y;
+ }
+
+ // if you expect coordinate, parse number!
+ if (action == GOTO || action == MOVEREL){
+
+ predot = 0;
+ postdot = 0;
+ num_sign = 1;
+ num_start = 0;
+ nums_found = 0;
+
+ for (uint8_t i=2; i<=curCmdLen; i++) {
+ if ( num_start == 0 && cmdbuffer[i] == '-' ) { // if you find a minus before
+ // you find a digit, it's a negative number
+ num_sign = -1;
+ }
+
+ if ( cmdbuffer[i] >= 48 && cmdbuffer[i] <= 57 ){ // is it a number?
+ if ( num_start == 0) { // this is the first digit in the string
+ num_start = i;
+ }
+ } else { // no digit!
+ if ( num_start != 0) { // digits have been found before
+ strncpy(numbuffer,cmdbuffer+num_start,i-num_start); // copy number found to
+ // numbuffer
+ numbuffer[i-num_start] = '\0'; // make sure it's always a terminated string
+ nums_found++;
+ if(nums_found == 1) { // its the predot digits
+ predot = atoi(numbuffer);
+ } else { // its the postdot digits
+ uint8_t postdotlen = i-num_start;
+ if (postdotlen < 3){ // if too small ,fill with zeros
+ for( uint8_t j = postdotlen; j <=2; j++) {
+ numbuffer[j] = '0';
+ }
+ }
+ // crop the number to three post dot digits
+ numbuffer[3] = '\0';
+
+ postdot = atoi(numbuffer);
+ }
+ num_start = 0;
+ }
+ }
+ }
+
+ }
+
+ int16_t steps = 0,dest=0;
+
+ switch (action) {
+ case GOTO:
+ uart_puts("GOTO ");
+ uart_putc(88+axis);// x or y
+ uart_putc(' ');
+ uart_print_signed_number(predot*num_sign,3);
+ uart_putc('.');
+ uart_print_number_wlzeros(postdot,3);
+ uart_puts("\r\n");
+
+ dest = num_sign *( predot*24 +(postdot*10)/416);
+
+ if (axis == X) {
+ steps = dest - plate_pos_x; // experimental correction!
+ move_plate(steps,0);
+ plate_pos_x += steps;
+ } else if (axis == Y) {
+ steps = dest - plate_pos_y;
+ move_plate(0,steps);
+ plate_pos_y += steps;
+ }
+ pos_report();
+
+ break;
+ case MOVEREL:
+ uart_puts("MOVE ");
+ uart_putc(88+axis);// x or y
+ uart_putc(' ');
+ uart_print_signed_number(predot*num_sign,3);
+ uart_putc('.');
+ uart_print_number_wlzeros(postdot,3);
+ uart_puts("\r\n");
+
+ steps = num_sign *( predot*24 +(postdot*10)/416);
+
+ if (axis == X) {
+ move_plate(steps,0);
+ plate_pos_x += steps;
+ } else if (axis == Y) {
+ move_plate(0,steps);
+ plate_pos_y += steps;
+ }
+ pos_report();
+ break;
+
+ case SETZERO:
+ plate_pos_x = 0;
+ plate_pos_y = 0;
+ pos_report();
+ break;
+
+ case POSITION:
+ pos_report();
+ break;
+
+ }
+
+
+
+ } else { // queue command
+ if( cmdPos == 0 ){
+ uart_puts("\r\n$ ");
+ }
+
+ if( byte == 8 ){ // backspace
+ cmdPos--;
+ } else {
+ cmdbuffer[cmdPos++] = byte;
+ }
+ uart_putc(byte);
+
+
+ }
+ }
+}
+
+int main(void)
+{
+
+ init_motors();
+
+ char dummy;
+ uint8_t field_val = 0;
+ SetupHardware();
+
+ touchpad_init(); // you need to call this to setup the I/O pin!
+ _delay_ms(500);
+ sei();
+
+ touchpad_set_rel_mode_100dpi();// use touchpad in relative mode
+ int16_t x, y = 0;
+ int8_t dx, dy = 0;
+ uint8_t busy = 0, last_busy = 0;
+
+ while (1) {
+ Usb2SerialTask();
+ parse_command(); // read data from virtual comport
+ touchpad_read(); // read data from touchpad
+ dx = -4*delta_x();// returns the amount your finger has moved in x direction since last readout
+ dy = -4*delta_y();// returns the amount your finger has moved in y direction since last readout
+
+ plate_pos_x += dx;
+ plate_pos_y += dy;
+
+ last_busy = busy;
+ busy = move_plate(dx,dy);
+
+ if (last_busy && !(busy)){
+ pos_report();
+ }
+ }
+
+
+} // end of main
\ No newline at end of file