ISR(TIMER0_COMPB_vect) { static uint8_t ct0, ct1, currentstep; // keep value (local variable) uint8_t key_i ; // temporary OCR0B=TCNT0+stepper_speed; // increase compare value // debounce switches key_i = key_state ^ ~DEBOUNCE_PIN; // key changed ? ct0 = ~( ct0 & key_i ); // reset or count ct0 ct1 = ct0 ^ (ct1 & key_i); // reset or count ct1 key_i &= ct0 & ct1; // count until roll over key_release |= key_state & key_i; // 1->0: key release detect key_state ^= key_i; // then toggle debounced state key_press |= key_state & key_i; // 0->1: key press detect // stepper motor - either: if( (stepper_mode == UP) || (stepper_mode == DOWN) || ( (stepper_mode == AUTO) && (stepper_target != stepper_position) ) ) { if( (stepper_mode == DOWN ) || ( (stepper_mode == AUTO) && (stepper_target > stepper_position) ) ) { // go down if (currentstep>0) currentstep --; else currentstep=3; stepper_position ++; } if((stepper_mode == UP) || ( (stepper_mode == AUTO) && (stepper_target < stepper_position) ) ) { if (currentstep<3) currentstep ++; else currentstep=0; stepper_position --; } STEPPER_PORT = (STEPPER_PIN & ~STEP_MASK) | step[currentstep]; // update stepper outputs } else { // todo: turn off or hold properly STEPPER_PORT = (STEPPER_PIN & ~STEP_MASK) ; // turn off / stepper_mode = OFF; } } /* Functions */ // get debounced switch states // has switch been closed ? uint8_t switch_closed( uint8_t key_mask ) { // debounce switches cli(); // disable global interrupts key_mask &= key_press; // read key(s) key_press ^= key_mask; // clear key(s) sei(); // careful! this enables interrupts globally, regardless of previous state! return key_mask; } // current debounced state (open, closed) uint8_t switch_state( uint8_t key_mask ) { // debounce switches cli(); // disable global interrupts key_mask &= key_state; // read key(s) sei(); // careful! this enables interrupts globally, regardless of previous state! return key_mask; } // has switch been opened ? uint8_t switch_opened( uint8_t key_mask ) { // debounce switches cli(); // disable global interrupts key_mask &= key_release; // read key(s) key_release ^= key_mask; // clear key(s) sei(); // careful! this enables interrupts globally, regardless of previous state! return key_mask; } // get zero position void stepper_init(void) { if (!switch_state(1<