]> jspc29.x-matter.uni-frankfurt.de Git - coral.git/commitdiff
cleaned up a lot, but program does not work anymore ...
authorMichael Wiebusch <m.wiebusch@gsi.de>
Thu, 11 Dec 2014 15:54:26 +0000 (16:54 +0100)
committerMichael Wiebusch <m.wiebusch@gsi.de>
Thu, 11 Dec 2014 15:54:26 +0000 (16:54 +0100)
firmware/USBtoSerial.c
firmware/USBtoSerial.h
firmware/main.c [new file with mode: 0644]
firmware/makefile
firmware/misc.c [new file with mode: 0644]
firmware/misc.h [new file with mode: 0644]
firmware/motors.c [new file with mode: 0644]
firmware/motors.h [new file with mode: 0644]
firmware/pins.h

index 685511fe13fd695fb735976ff3ed3863a843256e..b290168f22294a93f6c78b58575a2b38a1410db6 100644 (file)
 #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
@@ -161,6 +156,11 @@ void SetupHardware(void)
        /* 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
@@ -269,445 +269,17 @@ void uart_puts(const char *s )
 \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
index 7a210f0b49740879b3886fc6d1b1f994eac5976c..3c5bb1621d88fcaeeabbfec8db9321cf2d2c7f47 100644 (file)
@@ -61,6 +61,8 @@
 \r
                /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */\r
                #define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3)\r
+               \r
+#define EMPTY 0xFF00\r
 \r
        /* Function Prototypes: */\r
                void SetupHardware(void);\r
                void EVENT_USB_Device_ControlRequest(void);\r
 \r
                void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo);\r
+                void uart_putc(unsigned char data);\r
+                void uart_puts(const char *s );\r
+                uint16_t uart_getc(void);\r
+                void Usb2SerialTask(void);\r
 \r
 #endif\r
 \r
diff --git a/firmware/main.c b/firmware/main.c
new file mode 100644 (file)
index 0000000..25065c1
--- /dev/null
@@ -0,0 +1,245 @@
+
+#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
index 0bbdfba09612836d543fde01dc4d39df64d960dc..3ee47e0f79edcb8a56e08abaaae5bfd51c28b5dd 100644 (file)
@@ -17,8 +17,8 @@ BOARD        = USBKEY
 F_CPU        = 16000000\r
 F_USB        = $(F_CPU)\r
 OPTIMIZATION = s\r
-TARGET       = USBtoSerial\r
-SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) TM1001A.c\r
+TARGET       = main\r
+SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) TM1001A.c motors.c misc.c USBtoSerial.c\r
 LUFA_PATH    = ../LUFA/LUFA-130303/LUFA\r
 CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/\r
 LD_FLAGS     =\r
diff --git a/firmware/misc.c b/firmware/misc.c
new file mode 100644 (file)
index 0000000..b09a03d
--- /dev/null
@@ -0,0 +1,58 @@
+#include <avr/io.h> 
+#include <stdlib.h>
+#include "USBtoSerial.h"
+#include "misc.h"
+
+
+char stringbuffer[16];
+
+// convert an unsigned integer to string
+void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits, char leading_char) {
+  int8_t i; // schleifenzähler
+
+  string[no_digits] = '\0'; // String Terminator
+  for (i = (no_digits - 1); i >= 0; i--) {
+    if (zahl == 0 && i < (no_digits - 1)) {
+      string[i] = leading_char;
+    } else {
+      string[i] = (zahl % 10) + '0';
+    } // Modulo rechnen, dann den ASCII-Code von '0' addieren
+    zahl /= 10;
+  }
+
+}
+
+uint32_t times_ten_pow(uint8_t exponent) {
+  uint32_t val = 1;
+  for (uint8_t i = 1; i <= exponent; i++) {
+    val *= 10;
+  }
+  return val;
+}
+
+int8_t sign(int16_t x) {
+  return (x > 0) - (x < 0);
+}
+
+
+void uart_print_number(uint32_t zahl, uint8_t no_digits) {
+  my_uitoa(abs(zahl),stringbuffer,no_digits,' ');
+  uart_puts(stringbuffer);
+}
+
+
+void uart_print_number_wlzeros(uint32_t zahl, uint8_t no_digits) {
+  my_uitoa(abs(zahl),stringbuffer,no_digits,'0');
+  uart_puts(stringbuffer);
+}
+
+void uart_print_signed_number(uint32_t zahl, uint8_t no_digits) {
+  my_uitoa(abs(zahl),stringbuffer,no_digits,' ');
+  if (sign(zahl) < 0) {
+    uart_putc('-');
+  } else {
+    uart_putc('+');
+  }
+  uart_puts(stringbuffer);
+  
+}
\ No newline at end of file
diff --git a/firmware/misc.h b/firmware/misc.h
new file mode 100644 (file)
index 0000000..c2a9b16
--- /dev/null
@@ -0,0 +1,12 @@
+
+
+void my_uitoa(uint32_t zahl, char* string, uint8_t no_digits, char leading_char);
+uint32_t times_ten_pow(uint8_t exponent);
+int8_t sign(int16_t x);
+void uart_print_number(uint32_t zahl, uint8_t no_digits);
+void uart_print_number_wlzeros(uint32_t zahl, uint8_t no_digits);
+void uart_print_signed_number(uint32_t zahl, uint8_t no_digits);
+
+
+
+
diff --git a/firmware/motors.c b/firmware/motors.c
new file mode 100644 (file)
index 0000000..2c1f134
--- /dev/null
@@ -0,0 +1,122 @@
+#include <avr/io.h> 
+#include <stdlib.h>
+#include <util/delay.h>
+#include "motors.h"
+#include "misc.h"
+
+
+
+
+
+/* motor stuff */
+
+uint8_t phase_pattern[4] = { 0b00001010, 0b00001001, 0b00000101, 0b00000110};
+    
+    
+void set_x(uint8_t byte) {
+  PORTX0 &= ~(1<<X0);
+  PORTX1 &= ~(1<<X1);
+  PORTX2 &= ~(1<<X2);
+  PORTX3 &= ~(1<<X3);
+
+  PORTX0 |= ((byte & (1<<0))>>0)<<X0;
+  PORTX1 |= ((byte & (1<<1))>>1)<<X1;
+  PORTX2 |= ((byte & (1<<2))>>2)<<X2;
+  PORTX3 |= ((byte & (1<<3))>>3)<<X3;
+}
+
+void set_y(uint8_t byte) {
+  PORTY0 &= ~(1<<Y0);
+  PORTY1 &= ~(1<<Y1);
+  PORTY2 &= ~(1<<Y2);
+  PORTY3 &= ~(1<<Y3);
+
+  PORTY0 |= ((byte & (1<<0))>>0)<<Y0;
+  PORTY1 |= ((byte & (1<<1))>>1)<<Y1;
+  PORTY2 |= ((byte & (1<<2))>>2)<<Y2;
+  PORTY3 |= ((byte & (1<<3))>>3)<<Y3;
+}
+
+void init_motors(void){
+  set_x(0);
+  set_y(0);
+  DDRX0 |= (1<<X0);
+  DDRX1 |= (1<<X1);
+  DDRX2 |= (1<<X2);
+  DDRX3 |= (1<<X3);
+  DDRY0 |= (1<<Y0);
+  DDRY1 |= (1<<Y1);
+  DDRY2 |= (1<<Y2);
+  DDRY3 |= (1<<Y3);
+}
+
+
+
+uint8_t motor_step(uint8_t motor, int8_t direction) { // motor: M1 or M2, direction +1 or -1, 0 for coil deactivation
+
+  uint8_t next_pattern, next_phase;
+  static uint8_t phase_memory[2] = { 0, 0 };
+  void (*setport)(uint8_t);
+  setport = &set_x;
+  
+  switch(motor) {
+    case X:
+      setport = &set_x;
+      break;
+    case Y:
+      setport = &set_y;
+      break;
+  }
+
+  next_phase = (phase_memory[motor] + 4 + direction) % 4;
+  phase_memory[motor] = next_phase;
+  
+
+  next_pattern = phase_pattern[next_phase];
+  if (direction != 0) {
+      (*setport)(next_pattern);
+  } else {
+      (*setport)(0);
+  }
+
+  return next_pattern;
+
+}
+
+
+
+uint8_t move_plate(int16_t dx, int16_t dy){
+  static int16_t todo_x,todo_y = 0;
+  int8_t signum;
+  uint8_t returnval = 0;
+  todo_x += dx;
+  todo_y += dy;
+  
+  signum = sign(todo_x);
+  if(signum != 0) {
+    returnval++;
+  }
+  motor_step(X,signum);
+  todo_x -= signum;
+  
+  signum = sign(todo_y);
+  if(signum != 0) {
+    returnval++;
+  }
+  motor_step(Y,signum);
+  todo_y -= signum;
+  _delay_us(PHASE_DELAY_US);
+  
+  return returnval; // busy
+  
+}
+
+
+
+
+
+
+
+  
+
+
diff --git a/firmware/motors.h b/firmware/motors.h
new file mode 100644 (file)
index 0000000..8cf5e35
--- /dev/null
@@ -0,0 +1,61 @@
+#define PHASE_DELAY_US 0
+
+
+#define X 0
+#define Y 1
+
+
+#define X0 4
+#define DDRX0 DDRC
+#define PORTX0 PORTC
+#define PINX0 PINC
+
+#define X1 5
+#define DDRX1 DDRC
+#define PORTX1 PORTC
+#define PINX1 PINC
+
+#define X2 4
+#define DDRX2 DDRD
+#define PORTX2 PORTD
+#define PINX2 PIND
+
+#define X3 6
+#define DDRX3 DDRC
+#define PORTX3 PORTC
+#define PINX3 PINC
+
+
+#define Y0 7
+#define DDRY0 DDRC
+#define PORTY0 PORTC
+#define PINY0 PINC
+
+#define Y1 6
+#define DDRY1 DDRB
+#define PORTY1 PORTB
+#define PINY1 PINB
+
+#define Y2 7
+#define DDRY2 DDRB
+#define PORTY2 PORTB
+#define PINY2 PINB
+
+#define Y3 5
+#define DDRY3 DDRB
+#define PORTY3 PORTB
+#define PINY3 PINB
+
+
+void set_x(uint8_t byte);
+void set_y(uint8_t byte);
+void init_motors(void);
+uint8_t motor_step(uint8_t motor, int8_t direction);
+uint8_t move_plate(int16_t dx, int16_t dy);
+
+
+
+
+
+
+
index e02e6c1cde2448279074eccb2d7ed0f81e6928e2..57d11e5729ac09641729696afae1075b41acbbf0 100644 (file)
@@ -1,47 +1,6 @@
 
 
 
-#define X0 4
-#define DDRX0 DDRC
-#define PORTX0 PORTC
-#define PINX0 PINC
-
-#define X1 5
-#define DDRX1 DDRC
-#define PORTX1 PORTC
-#define PINX1 PINC
-
-#define X2 4
-#define DDRX2 DDRD
-#define PORTX2 PORTD
-#define PINX2 PIND
-
-#define X3 6
-#define DDRX3 DDRC
-#define PORTX3 PORTC
-#define PINX3 PINC
-
-
-#define Y0 7
-#define DDRY0 DDRC
-#define PORTY0 PORTC
-#define PINY0 PINC
-
-#define Y1 6
-#define DDRY1 DDRB
-#define PORTY1 PORTB
-#define PINY1 PINB
-
-#define Y2 7
-#define DDRY2 DDRB
-#define PORTY2 PORTB
-#define PINY2 PINB
-
-#define Y3 5
-#define DDRY3 DDRB
-#define PORTY3 PORTB
-#define PINY3 PINB
-
 
 #define XEND1 7
 #define DDRXEND1 DDRD
 
 
 
-#define X 0
-#define Y 1
-