Der trick ist das du eine move oder rotate auftrag nur einmal aufruft, aber nicht mit "blocking". Der auftrag wird dan automatisch weiter ausgefuhrt und ihre main program kan sich um andere Sachen bekummern. Ende von Auftrag wird dan in main abgefragt mit ismovementcomplete(). Eine kleines codeschnipsel (nicht einfach kopieren, da ich da gans fiele Sachen in die lib geandert habe):
Code:
void sharp_rotate(void) //elke 40 mS samplen tijdens 360° draai
{
if (state==1) {reset_odometrie();rotate(10,10,360,LEFT,0);state++;}
if (state==2) if (getStopwatch2()>40)
{
setStopwatch2(0);
adc0 = 0.3*adc0+0.7*readADC(ADC_0);
adc1 = 0.3*adc1+0.7*readADC(ADC_1);
adc2 = 0.3*adc2+0.7*readADC(ADC_2);
adc3 = 0.3*adc3+0.7*readADC(ADC_3);
int16_t sharp0= Sharp_LR(adc0);//omzetten naar afstand in mm
int16_t sharp1= Sharp_MR(adc1);
int16_t sharp2= Sharp_MR(adc2);
int16_t sharp3= Sharp_LR(adc3);
writeInteger((e_compass/E_COMPASS_RESOLUTION), DEC);writeString_P(" ");
writeInteger(sharp0, DEC);writeString_P(" ");
writeInteger(sharp3, DEC);writeString_P(" ");
writeInteger(sharp1, DEC);writeString_P(" ");
writeInteger(sharp2, DEC);writeString_P(" ");
writeChar('\n');
}
if (state==3) {program=0;state=1;}
if (isMovementComplete()&(state!=0)) state++;
}
Lesezeichen