Ik ben niet bepaald een voorstander van delays, maar voor zo'n simpele toepassing die verder niets hoeft te doen begrijp ik dat wel.
Waarom gebruik je geen array voor de ramp-up en ramp-down, en waarom heb je die apart gemaakt? Die had je m.i. gemakkelijk kunnen samenvoegen. Daarbij gaat het nu mis als je een paar stappen wilt zetten (omdat je een stukje folie tekort komt of het begin beschadigd is of zo), want je kunt nooit minder dan 20 stappen zetten.
Als je een array maakt, van 10 stappen (of welk ander aantal je wilt), die je gebruikt voor de interval tussen de stappen, en je die handig indexeert, kun je het hele programma terugbrengen tot een paar simpele regels.
Stel dat StapTotaal het totale aantal stappen is dat je moet zetten, en StappenGedaan het aantal stappen tot dusver, dan kun je die array indexeren met de kleinste waarde van StappenGedaan, StapTotaal - StappenGedaan, en de lengte van de array (10, in dit geval).
Stel dat je 30 stappen moet doen, dus StapTotaal = 30. Je begint bij 1 (of 0, geen idee waar arrays beginnen in PICbasic), en voor de eerste 10 stappen is StappenGedaan de kleinste waarde van die 3, want hij hij gaat in stappen van 1 omhoog, maar is nog steeds kleiner dan 10. Na de eerste 10 stappen is de lengte van de array de kleinste waarde; StappenGedaan is groter dan 10, en je moet nog meer dan 10 stappen tot het eind. De index in de array blijft dus op 10 staan; de hoogste snelheid. Als je, na 20 stappen, nog 10 stappen te gaan hebt, wordt de laatste term, "StapTotaal - StappenGedaan" kleiner dan 10, en dat is vanaf dat moment dus de kleinste term. Je stapt dan dus achteruit door de array, vanaf 10, om precies bij element 1 aan te komen op het moment dat je de laatste stap moet zetten.
In C kun je dat zo schrijven:
code:
#define ARRAYSIZE 10
unsigned short Intervals[ ARRAYSIZE ] = { 2000, 1880, 1600, 1400, 1200, 1000, 800, 600, 400, 200 };
unsigned short Min( unsigned short a, unsigned short b )
{
if( a < b )
return a;
return b;
}
void Move( unsigned short NrSteps )
{
unsigned short StepCount, DelayLength;
for( StepCount = 0; StepCount < NrSteps; StepCount++ )
{
<output high>
DelayLength = Intervals[ MIN( MIN( StepCount, NrSteps - SetCount ), ARRAYSIZE ) ];
delay( DelayLength );
<output low>
delay( DelayLength );
}
}