Op zich hoeft "op tijd" geen probleem te zijn, als je de pulstrein en de timer waarmee je die weer uit zet uit dezelfde klok haalt, en dat is het geval bij een microcontroller.
Als je een timer instelt op 160.000 cycles (dus 100Hz bij 16MHz clock), met een compare match op de helft, zodat je 50% pulsbreedte krijgt, en direct daarna een tweede timer start die na 16.000.000 cycles afloopt, en daarmee die eerste timer stopt, heb je exact 1000 stappen gemaakt; zolang je binnen 8000 cycles kunt reageren, klopt het aantal stappen precies.
Als je een ramp-up en ramp-down moet doen wordt het natuurlijk wat lastiger, maar waarschijnlijk is de frequentie alsnog zo laag dat je stappen prima kunt tellen als je bij elke stap een interrupt service routine in gaat, en dan kun je daar ook meteen de timer opnieuw instellen voor die ramp-up en ramp-down.
Ik denk dat 4 knopjes en misschien nog 1 potmeter genoeg is; één knopje voor "doe maar een cyclus", één voor "stapje vooruit", en als je die blijft vasthouden op een lage frequentie blijven joggen, één voor dezelfde functies achteruit, en één voor "sla dit maar op als de nieuwe lengte". Met de potmeter op een analoge ingang zou je dan nog de snelheid kunnen instellen, als je dat zou willen.
@MGP: je kunt toch gewoon interrupts gebruiken en bij de registers van de hardware timers komen om de periode te schrijven? Een taal waarmee dat niet kan heeft m.i. niets te zoeken bij microcontrollers.