Descrizione delle procedure per il movimento

Il cuore di tutto è il timer (TMR0) che ogni 1mSec genera un interrupt.
Nella InterruptServiceRoutine vengono incrementati i timer (a 8, 16, 24 bit secondo la durata necessaria) che servono per le temporizzazioni delle varie routine.

Anche il computo dello spazio percorso tramite encoder ottici in quadratura, funziona ad interrupt. Ognuno dei due encoder genera il proprio interrupt che, analizzato e confrontato con il flag di direzione, incrementa o decrementa le variabili di conteggio dello spazio.
Nella stessa ISR viene calcolata, ogni 64mSec, la velocità di avanzamento attuale, dividendo lo spazio percorso per il tempo.

Il main è semplicemente uno scheduler che lancia le diverse routine con le giuste priorità.
Una di queste è la MotSpeed che lavora in background e, ogni 64mSec (dopo la misura della velocità), imposta il PWM (calcolato tramite un algoritmo PID) per fare in modo che la velocità attuale corrisponda con quella desiderata
.
A questo punto abbiamo un sistema a loop chiuso nel quale sappiamo la velocità, lo spazio percorso ed il tempo trascorso.

Anche la routine Path lavora in background e, se abilitata, controlla la sequenza di operazioni da effetuare per seguire il percorso impostato da qualche altra routine che decide il comportamento del bot.
La routine che decida di eseguire un percorso diverso dal normale, deve:
- impostare il flag di attivazione della routine Path
- scrivere nell'array PathSeq la sequenza di codici della manovra da effettuare (0=fine sequenza)
- azzerare il puntatore della sequenza
Path comincerà allora a scandire l'array chiamando le routine in funzione del codice impostato (cammina X cm, ruota Y gradi, cammina W mm/sec).
La routine chiamata (Walk, Turn) calcola lo spazio che deve percorrere ogni ruota prima di ripassare il comando a Path.
A questo punto si è attivata Space2Run (schedulata da main) che si disattiva, ripassando il controllo a Path, solo quando le ruote si sono mosse dello spazio desiderato.
Path controlla la sequenza successiva ripetendo le operazioni o restituendo il controllo quando il codice è = 0.

Il Main è sempre attivo e, visto che le operazioni di movimento sono molto lente rispetto ai tempi di esecuzione del PIC, per la maggior parte del tempo sarà occupato dall'interrupt degli encoder:
A 36cm/s le ruote fanno 2 giri/s, l'encoder fa 40 giri/s, con 40 finestrelle genera 1600 impulsi/s (solo fronte di salita) quindi 3200 tick/s da entrambi gli encoder -> un impulso ogni 312,5us.
Con il clock a 40MHz (100ns a istruzione) -> 3125 istruzioni tra un interrupt e l'altro.

aggiornato il 23 - 08 - 2005