diff --git a/src/main.c b/src/main.c index 23bb223..853b2f1 100644 --- a/src/main.c +++ b/src/main.c @@ -533,60 +533,130 @@ int main() { printf("POS: %02d\n", positionSwitch); } - if (timeValidCnt > 0) { - if (step != 0) { - step = 0; + if ((timeValidCnt > 0) && (step != 0)) { + step = 0; - static uint8_t currentMinutePosition = 0; - uint8_t minuteStepPosition = clock.minute * STEPS_PER_MINUTE; + static uint8_t stepperState = 0; + + static uint8_t currentMinutePosition = 0; + uint8_t minuteStepPosition = 0; + int8_t minuteDirection = 0; + + static uint8_t currentHourPosition = 0; + uint8_t hourStepPosition = clock.hour * STEPS_PER_HOUR; + int8_t hourDirection = 0; + + switch (stepperState) { + case 0: + // is current minute position different from desired one? if (currentMinutePosition != minuteStepPosition) { - PORTA |= (1 << PA1); - printf("M: "); - if (currentMinutePosition > minuteStepPosition) { - printf("b "); - currentMinutePosition--; - PORTC |= (1 << PC2); - } else { - printf("f "); - currentMinutePosition++; - PORTC &= ~(1 << PC2); - } - printf("d: %d, c: %d\n", minuteStepPosition, currentMinutePosition); - PORTC |= (1 << PC3); - _delay_us(50); - PORTC &= ~(1 << PC3); + stepperState = 1; + } + break; + case 1: + // switch on the minute motor and set the direction + PORTA |= (1 << PA1); + + minuteStepPosition = clock.minute * STEPS_PER_MINUTE; + + if (currentMinutePosition > minuteStepPosition) { + printf("b "); + minuteDirection = -1; + PORTC |= (1 << PC2); } else { - PORTA &= ~(1 << PA1); + printf("f "); + minuteDirection = 1; + PORTC &= ~(1 << PC2); } - static uint8_t currentHourPosition = 0; - uint8_t hourStepPosition = clock.hour * STEPS_PER_HOUR; + stepperState = 2; + break; + case 2: + // move one step + + printf("d: %d, c: %d, ", minuteStepPosition, currentMinutePosition); + + currentMinutePosition += minuteDirection; + + PORTC |= (1 << PC3); + _delay_us(50); + PORTC &= ~(1 << PC3); + + if (currentMinutePosition == minuteStepPosition) { + stepperState = 3; + } + break; + case 3: + // switch off the minute motor + PORTA &= ~(1 << PA1); + + stepperState = 4; + break; + case 4: + // is current hour position different from desired one? if (currentHourPosition != hourStepPosition) { - PORTA |= (1 << PA0); + printf(" H: "); - printf("H: "); - if (currentHourPosition > hourStepPosition) { - printf("b "); - currentHourPosition--; - PORTC |= (1 << PC0); - } else { - printf("f "); - currentHourPosition++; - PORTC &= ~(1 << PC0); - } - printf("d: %d, c: %d\n", hourStepPosition, currentHourPosition); - - PORTC |= (1 << PC1); - _delay_us(50); - PORTC &= ~(1 << PC1); + stepperState = 5; } else { - PORTA &= ~(1 << PA0); + // done + printf("\n"); + stepperState = 0; } + break; + case 5: + // switch on the hour motor and set the direction + PORTA |= (1 << PA0); + + hourStepPosition = clock.hour * STEPS_PER_HOUR; + + if (currentHourPosition > hourStepPosition) { + printf("b "); + hourDirection = -1; + PORTC |= (1 << PC0); + } else { + printf("f "); + hourDirection = 1; + PORTC &= ~(1 << PC0); + } + + stepperState = 6; + break; + case 6: + // move one step + + printf("d: %d, c: %d, ", hourStepPosition, currentHourPosition); + + currentHourPosition += hourDirection; + + PORTC |= (1 << PC1); + _delay_us(50); + PORTC &= ~(1 << PC1); + + if (currentHourPosition == hourStepPosition) { + stepperState = 7; + } + break; + case 7: + // switch off the hour motor + PORTA &= ~(1 << PA0); + + stepperState = 8; + break; + case 8: + // done + printf("\n"); + stepperState = 0; + break; + default: + stepperState = 0; + break; } } + if (tack != 0) { tack = 0;