giovedì 1 gennaio 2009

macchina a stati e pseudo-interrupt

Un problema con NXT-G e' che non c'e' modo per un task (o sequenza) di fermare o interrompere un altro task (o sequenza) parallela. Un modo per affrontare il problema e' sfruttare il fatto che un blocco Move programmato su STOP interrompera' qualsiasi altro blocco Move che provi a controllare quello stesso motore.
B. Davis propone questo approccio.

Ci sono 2 loop che vanno in parallelo.
Il loop piu' in basso lavora sul sensore ultasonico. Se si avvicina troppo a qualcosa, la variabile testo "state" viene impostata ad un certo valore (ad esempio "fwd-1") e fa partire una data azione nella struttura a switch nel loop di sopra.

Davis mostra un esempio fra i diversi casi dello switch (la scelta di quale caso dipende da "state") quello corrispondente al valore "fwd-1). In questo caso la variabile viene impostata a "left-2" e i motori BC azionati in modo da avanzare per 2 rotazioni.
Dopodiche', al giro successivo del loop, il programma rientra nello switch nel caso "left-2" (che non e' illustrato ma presumibilmente fara' girare a sinistra...): qui la variabile state deve prendere il valore "fwd-3". Nel caso fwd-3 la variabile prendera' il valore left-4 e nel caso left-4 prendera' il valore iniziale "init" e mandera' percio' nel primo stato dove i motori andranno dritti indefinitamente.

Qui ci sono invece esempi di come affrontare i problema in altri linguaggi.