X-Git-Url: https://git.realraum.at/?p=svn42.git;a=blobdiff_plain;f=avr-projects%2Fr3cam-steppermotor%2Fr3cam-steppermotor.c;h=f9ab2093cc5a406faa10f3bd88488ba4646cba9a;hp=1bcad566016d57461d72c8c40c4b8fb6e1ab80d7;hb=fff7d88ae580a68519a3b9f590a2cf9cce21ef8b;hpb=4c2c5449084ed35b84341c91c08595c0d55ef20d diff --git a/avr-projects/r3cam-steppermotor/r3cam-steppermotor.c b/avr-projects/r3cam-steppermotor/r3cam-steppermotor.c index 1bcad56..f9ab209 100644 --- a/avr-projects/r3cam-steppermotor/r3cam-steppermotor.c +++ b/avr-projects/r3cam-steppermotor/r3cam-steppermotor.c @@ -81,9 +81,13 @@ void EVENT_USB_Device_ControlRequest(void) #define M_RESET 3 #define M_FULLSTEPS 4 -static uint8_t m_clk_divisor_ = 0; +#define M_START_DIVISOR 2; + +static uint8_t cur_speed = 0xFF - M_START_DIVISOR; +static uint8_t m_clk_divisor_ = M_START_DIVISOR; static uint8_t m_clk_divisor_counter_ = 0; static uint16_t m_steps_to_go_ = 0; +static uint16_t m_steps_to_go_back_ = 0; inline void m_timer_enable(void) { @@ -100,12 +104,21 @@ void motor_stop(void) m_timer_disable(); M_PORT &= ~(1 << M_ENABLE); m_steps_to_go_ = 0; + m_steps_to_go_back_ = 0; } ISR(TIMER0_OVF_vect) { - if (m_steps_to_go_ == 0) - motor_stop(); + //if (m_steps_to_go_ == 0) + //{ + //if(m_steps_to_go_back_) + //{ + // M_PORT ^= (1 << M_DIRECTION); + // m_steps_to_go_=m_steps_to_go_back_; + //m_steps_to_go_back_=0; + //} else + // motor_stop(); + //} if (m_clk_divisor_counter_ == 0) { m_clk_divisor_counter_ = m_clk_divisor_; @@ -116,13 +129,17 @@ ISR(TIMER0_OVF_vect) m_clk_divisor_counter_--; } +static char set_speed_msg[] = "m_clk_divisor_ = %d\n\r"; + void motor_set_speed(uint8_t speed) { m_clk_divisor_ = 0xFF - speed; - CDC_Device_SendString(&VirtualSerial_CDC_Interface, "m_clk_divisor_ = %d\n",m_clk_divisor_); + char tmp[sizeof(set_speed_msg)+4]; + sprintf(tmp, set_speed_msg,m_clk_divisor_); + CDC_Device_SendString(&VirtualSerial_CDC_Interface, tmp); } -void motor_run(uint16_t steps, uint8_t direction) +void motor_run(uint16_t steps, uint8_t direction,uint16_t steps_back) { //reset by pulling reset low for 100ms M_PORT &= ~(1 << M_RESET); @@ -131,6 +148,7 @@ void motor_run(uint16_t steps, uint8_t direction) m_clk_divisor_counter_ = 0; m_steps_to_go_ = steps; + m_steps_to_go_back_ = steps_back; if (direction) M_PORT |= (1 << M_DIRECTION); @@ -157,7 +175,6 @@ void init_pins() OCR0A = 255; // (1+139)*8 = 1120 -> 70us @ 16 MHz -> 1*alpha } -uint8_t cur_speed = 0xFF; void handle_cmd(uint8_t cmd) { switch(cmd) { @@ -166,15 +183,20 @@ void handle_cmd(uint8_t cmd) case 't': led_toggle(); break; case 'r': reset2bootloader(); break; case 's': motor_stop(); break; - case 'c': motor_run(50,0); break; - case 'w': motor_run(50,1); break; - case 'C': motor_run(300,0); break; - case 'W': motor_run(300,1); break; + case 'y': motor_run(30,0,20); break; + //case 'x': motor_run(140,0,40); break; + //case 'c': motor_run(60,0,20); break; + //case 'v': motor_run(40,0,20); break; + //case 'q': motor_run(140,1,40); break; + //case 'w': motor_run(60,1,20); break; + //case 'e': motor_run(40,1,20); break; + //case 'C': motor_run(330,0,40); break; + //case 'W': motor_run(330,1,40); break; case '+': motor_set_speed(++cur_speed); break; case '-': motor_set_speed(--cur_speed); break; - default: CDC_Device_SendString(&VirtualSerial_CDC_Interface, "error\n"); return; + default: CDC_Device_SendString(&VirtualSerial_CDC_Interface, "error\n\r"); return; } - CDC_Device_SendString(&VirtualSerial_CDC_Interface, "ok\n"); + CDC_Device_SendString(&VirtualSerial_CDC_Interface, "ok\n\r"); }