stepper state engine

This commit is contained in:
hg
2013-01-28 10:42:20 +01:00
parent 2576f8854f
commit c820a6f9fc

View File

@ -533,59 +533,129 @@ int main() {
printf("POS: %02d\n", positionSwitch);
}
if (timeValidCnt > 0) {
if (step != 0) {
if ((timeValidCnt > 0) && (step != 0)) {
step = 0;
static uint8_t stepperState = 0;
static uint8_t currentMinutePosition = 0;
uint8_t minuteStepPosition = clock.minute * STEPS_PER_MINUTE;
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) {
printf("M: ");
stepperState = 1;
}
break;
case 1:
// switch on the minute motor and set the direction
PORTA |= (1 << PA1);
printf("M: ");
minuteStepPosition = clock.minute * STEPS_PER_MINUTE;
if (currentMinutePosition > minuteStepPosition) {
printf("b ");
currentMinutePosition--;
minuteDirection = -1;
PORTC |= (1 << PC2);
} else {
printf("f ");
currentMinutePosition++;
minuteDirection = 1;
PORTC &= ~(1 << PC2);
}
printf("d: %d, c: %d\n", minuteStepPosition, currentMinutePosition);
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);
} else {
PORTA &= ~(1 << PA1);
}
static uint8_t currentHourPosition = 0;
uint8_t hourStepPosition = clock.hour * STEPS_PER_HOUR;
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) {
printf(" H: ");
stepperState = 5;
} else {
// done
printf("\n");
stepperState = 0;
}
break;
case 5:
// switch on the hour motor and set the direction
PORTA |= (1 << PA0);
printf("H: ");
hourStepPosition = clock.hour * STEPS_PER_HOUR;
if (currentHourPosition > hourStepPosition) {
printf("b ");
currentHourPosition--;
hourDirection = -1;
PORTC |= (1 << PC0);
} else {
printf("f ");
currentHourPosition++;
hourDirection = 1;
PORTC &= ~(1 << PC0);
}
printf("d: %d, c: %d\n", hourStepPosition, currentHourPosition);
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);
} else {
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;