// // This code is modifed by Joonhaeng Lee // joonhaenglee@gsd.harvard.edu // // This board read input from button and move step moter // // hello.stepper.bipolar.44.full.c // // bipolar full stepping hello-world // // Neil Gershenfeld // 11/21/12 // // (c) Massachusetts Institute of Technology 2012 // This work may be reproduced, modified, distributed, // performed, and displayed for any purpose. Copyright is // retained and must be preserved. The work is provided // as is; no warranty is provided, and users accept all // liability. // #include #include #include #include #define output(directions,pin) (directions |= pin) // set port direction for output #define input(direction,pin) (direction &= (~pin)) #define set(port,pin) (port |= pin) // set port pin #define get(port,pin) ((port) & (pin)) // get port pin #define clear(port,pin) (port &= (~pin)) // clear port pin #define pin_test(pins,pin) (pins & pin) // test for port pin #define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set // set up input and output pins /* #define serial_port PORTA #define serial_direction DDRA #define serial_pins PINA #define serial_pin_in (1 << PA0) #define serial_pin_out (1 << PA1) */ // #define bridge_port PORTA // H-bridge port #define bridge_direction DDRA // H-bridge direction #define A2 (1 << PA0) // H-bridge output pins #define A1 (1 << PA1) // " #define B2 (1 << PA3) // " #define B1 (1 << PA4) // " #define on_delay() _delay_us(25) // PWM on time #define off_delay() _delay_us(5) // PWM off time #define PWM_count 100 // number of PWM cycles #define step_count 20 // number of steps //Button #define button_port PORTB #define button_pins PINB #define button_direction DDRB #define button_pin (1 << PB2) #define button_interrupt (1 << PCIE1) #define button_interrupt_pin (1 << PCINT10) uint8_t previous_reading = 0; uint8_t button_was_pressed = 0; uint8_t button_pressed_length = 0; // // LED #define LED_port PORTA #define LED_direction DDRA #define LED_pin (1 << PA7) // static uint8_t count; // // // Set Timer // this code from Julia's hello.ftdi.44.button-interrupt.c // http://fab.cba.mit.edu/classes/863.17/Harvard/people/julia-ebert/assets/week-7/hello.ftdi.44.button-interrupt.c // ISR(TIM0_COMPA_vect) { // // Timer interrupt // if (get(button_pins, button_pin) != previous_reading) { if (!button_was_pressed) { button_was_pressed = 1; button_pressed_length = 0; } else { button_was_pressed = 0; } previous_reading = get(button_pins, button_pin); } else { if (button_was_pressed) // while butten is pressed { button_pressed_length ++; } } } // // A+ B+ PWM pulse // void pulse_ApBp() { clear(bridge_port, A2); clear(bridge_port, B2); set(bridge_port, A1); set(bridge_port, B1); for (count = 0; count < PWM_count; ++count) { set(bridge_port, A1); set(bridge_port, B1); on_delay(); clear(bridge_port, A1); clear(bridge_port, B1); off_delay(); } } // // A+ B- PWM pulse // void pulse_ApBm() { clear(bridge_port, A2); clear(bridge_port, B1); set(bridge_port, A1); set(bridge_port, B2); for (count = 0; count < PWM_count; ++count) { set(bridge_port, A1); set(bridge_port, B2); on_delay(); clear(bridge_port, A1); clear(bridge_port, B2); off_delay(); } } // // A- B+ PWM pulse // void pulse_AmBp() { clear(bridge_port, A1); clear(bridge_port, B2); set(bridge_port, A2); set(bridge_port, B1); for (count = 0; count < PWM_count; ++count) { set(bridge_port, A2); set(bridge_port, B1); on_delay(); clear(bridge_port, A2); clear(bridge_port, B1); off_delay(); } } // // A- B- PWM pulse // void pulse_AmBm() { clear(bridge_port, A1); clear(bridge_port, B1); set(bridge_port, A2); set(bridge_port, B2); for (count = 0; count < PWM_count; ++count) { set(bridge_port, A2); set(bridge_port, B2); on_delay(); clear(bridge_port, A2); clear(bridge_port, B2); off_delay(); } } // // clockwise step // void step_cw() { pulse_ApBp(); pulse_AmBp(); pulse_AmBm(); pulse_ApBm(); } // // counter-clockwise step // void step_ccw() { pulse_ApBm(); pulse_AmBm(); pulse_AmBp(); pulse_ApBp(); } int main(void) { // // main // static uint8_t i,j; // // set clock divider to /1 // CLKPR = (1 << CLKPCE); CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0); // // initialize output pins // /* set(serial_port, serial_pin_out); output(serial_direction, serial_pin_out); */ //initialize LED pin // clear(LED_port,LED_pin); output(LED_direction,LED_pin); // Set up button set(button_port, button_pin); input(button_direction, button_pin); // initialize bridge pins // clear(bridge_port, A1); output(bridge_direction, A1); clear(bridge_port, A2); output(bridge_direction, A2); clear(bridge_port, B1); output(bridge_direction, B1); clear(bridge_port, B2); output(bridge_direction, B2); // // // Set up timer + interrupt (for button debouncing) TCCR0B |= ((1 << CS02) | (1 << CS00)); // Timer 0 prescaling - divides by 1024 */ TCCR0A |= (1 << WGM01); // Put timer 0 in CTC mode OCR0A = 100; // Count 100 cycles for interrupt TIMSK0 |= (1 << OCIE0A); // enable timer compare interrupt sei(); // Enable global interrupts // // // // main loop // while (1) { // LED //run stepper moter if(!button_was_pressed){ if( button_pressed_length > 0){ set(LED_port,LED_pin); for (j = 0; j < PWM_count*0.5; ++j) step_ccw(); button_pressed_length = 0; } } else{ clear(LED_port,LED_pin); } } }