to github
[svn42.git] / avr-projects / r3cam-steppermotor / r3cam-steppermotor.c
index fcebc65..f9ab209 100644 (file)
@@ -79,11 +79,15 @@ void EVENT_USB_Device_ControlRequest(void)
 #define M_CLK 1\r
 #define M_ENABLE 2\r
 #define M_RESET 3\r
-#define M_HALFSTEPS 4\r
+#define M_FULLSTEPS 4\r
 \r
-static uint8_t m_clk_divisor_ = 0;\r
+#define M_START_DIVISOR 2;\r
+\r
+static uint8_t cur_speed = 0xFF - M_START_DIVISOR;\r
+static uint8_t m_clk_divisor_ = M_START_DIVISOR;\r
 static uint8_t m_clk_divisor_counter_ = 0;\r
 static uint16_t m_steps_to_go_ = 0;\r
+static uint16_t m_steps_to_go_back_ = 0;\r
 \r
 inline void m_timer_enable(void)\r
 {\r
@@ -100,12 +104,21 @@ void motor_stop(void)
     m_timer_disable();\r
     M_PORT &= ~(1 << M_ENABLE);\r
     m_steps_to_go_ = 0;\r
+    m_steps_to_go_back_ = 0;\r
 }\r
 \r
 ISR(TIMER0_OVF_vect)\r
 {\r
-    if (m_steps_to_go_ == 0)\r
-        motor_stop();\r
+    //if (m_steps_to_go_ == 0)\r
+    //{\r
+        //if(m_steps_to_go_back_)\r
+        //{  \r
+    //      M_PORT ^= (1 << M_DIRECTION);\r
+    //      m_steps_to_go_=m_steps_to_go_back_;\r
+          //m_steps_to_go_back_=0;\r
+        //} else   \r
+        //  motor_stop();\r
+    //}    \r
     if (m_clk_divisor_counter_ == 0)\r
     {\r
         m_clk_divisor_counter_ = m_clk_divisor_;\r
@@ -116,12 +129,17 @@ ISR(TIMER0_OVF_vect)
         m_clk_divisor_counter_--;\r
 }\r
 \r
+static char set_speed_msg[] = "m_clk_divisor_ = %d\n\r";\r
+\r
 void motor_set_speed(uint8_t speed)\r
 {\r
     m_clk_divisor_ = 0xFF - speed;\r
+    char tmp[sizeof(set_speed_msg)+4];\r
+    sprintf(tmp, set_speed_msg,m_clk_divisor_);\r
+    CDC_Device_SendString(&VirtualSerial_CDC_Interface, tmp);\r
 }\r
 \r
-void motor_run(uint16_t steps, uint8_t direction)\r
+void motor_run(uint16_t steps, uint8_t direction,uint16_t steps_back)\r
 {\r
     //reset by pulling reset low for 100ms\r
     M_PORT &= ~(1 << M_RESET);\r
@@ -130,6 +148,7 @@ void motor_run(uint16_t steps, uint8_t direction)
     \r
     m_clk_divisor_counter_ = 0;\r
     m_steps_to_go_ = steps;\r
+    m_steps_to_go_back_ = steps_back;\r
     \r
     if (direction)\r
         M_PORT |= (1 << M_DIRECTION);\r
@@ -144,7 +163,7 @@ void motor_run(uint16_t steps, uint8_t direction)
 void init_pins()\r
 {\r
     M_DDR = 0x0F;\r
-    M_PORT = 0 | (1 << M_RESET);\r
+    M_PORT = (1 << M_RESET) | (1 << M_FULLSTEPS);\r
     \r
     // Configure timer 0 to generate a timer overflow interrupt every\r
     // 560us (NEC Protocol)\r
@@ -156,7 +175,6 @@ void init_pins()
     OCR0A = 255;        // (1+139)*8 = 1120 -> 70us @ 16 MHz -> 1*alpha\r
 }\r
 \r
-uint8_t cur_speed = 0xFF;\r
 void handle_cmd(uint8_t cmd)\r
 {\r
   switch(cmd) {\r
@@ -165,15 +183,20 @@ void handle_cmd(uint8_t cmd)
   case 't': led_toggle(); break;\r
   case 'r': reset2bootloader(); break;\r
   case 's': motor_stop(); break;\r
-  case 'c': motor_run(300,0); break;\r
-  case 'w': motor_run(300,1); break;\r
-  case 'C': motor_run(1000,0); break;\r
-  case 'W': motor_run(1000,1); break;\r
+  case 'y': motor_run(30,0,20); break;\r
+  //case 'x': motor_run(140,0,40); break;\r
+  //case 'c': motor_run(60,0,20); break;\r
+  //case 'v': motor_run(40,0,20); break;\r
+  //case 'q': motor_run(140,1,40); break;\r
+  //case 'w': motor_run(60,1,20); break;\r
+  //case 'e': motor_run(40,1,20); break;\r
+  //case 'C': motor_run(330,0,40); break;\r
+  //case 'W': motor_run(330,1,40); break;\r
   case '+': motor_set_speed(++cur_speed); break;\r
   case '-': motor_set_speed(--cur_speed); break;\r
-  default: CDC_Device_SendString(&VirtualSerial_CDC_Interface, "error\n"); return;\r
+  default: CDC_Device_SendString(&VirtualSerial_CDC_Interface, "error\n\r"); return;\r
   }\r
-  CDC_Device_SendString(&VirtualSerial_CDC_Interface, "ok\n");\r
+  CDC_Device_SendString(&VirtualSerial_CDC_Interface, "ok\n\r");\r
 }\r
 \r
 \r