Evoluzioni 3

Dino ha partecipato alle sue prime gare Explorer, al Pacinotti e al Von Neumann di Roma con i soli sensori di luce e suono.
È stata un'ottima esperienza che ha portato ad alcune piccole ma significative modifiche sia nell'hardware che nel software.
Tenendo conto della mancanza dei sensori di gas e dell'inesperienza non mi posso lamentare del 5° posto guadagnato in entrambe le gare, dietro ai pluripremiati veterani di questo tipo di gare.

immagine1.gif
Dopo il periodo di fermo tra le due gare, prosegue lo sviluppo.
Per primi i sensori di gas. Ne ho messi due per aumentare l'area sensibile, visto che il cerchio utile per ottenere il punto è abbastanza grande.
Questi richiedono una corrente di circa 150mA l'uno per alimentare i filamenti del riscaldatore, per questo gli ho dedicato un LM7805 che, con un minimo di dissipatore, fornisce i 5V stabilizzati a partire dalla tensione di alimentazione della logica (6 elementi NiMh da 2500mAH).
Schemi aggiornati
Prima di iniziare lo sviluppo di nuove funzioni SW, ho cambiato il microcontrollore, sostituendo il PIC16f877 con il più potente PIC18f452.
L'upgrade HW è stato molto facile, basta sostituire il quarzo a 20MHz con uno a 10MHz, con il PLL 4x interno si ottiene un MCU a 40MHz (100nS a istruzione).
Il porting del SW è stato un po' più complicato rispetto a quello HW ma ne è valsa sicuramente la pena: 16KB di flash per il programma, 1.536Byte di ram, un set di istruzioni molto più potente e una serie di migliorie a livello HW molto utili .
Per prima cosa ho dovuto trovare un bootloader adatto, il Tiny bootloader occupa solo 100Byte e funziona molto bene. Non è un problema il fatto di usare un loader proprietario invece del solito HyperTerminal.
La scelta del compilatore C è praticamente obbligata. Il compilatore C18 di Microchip è abbastanza simile al PICC Hi-tech, è praticamente gratuito per applicazioni amatoriali (le ottimizzazioni che si disabilitano dopo il periodo di prova non influiscono su questo tipo di progetti) e, ovviamente, è perfettamente integrato con l'MPLAB.

Una volta verificato il porting in "emulazione" 16f877, ho iniziato ad usare le funzioni specifiche del 18f452.
Innanzi tutto la gestione degli interrupt, la serie 18f ha la possibilità di assegnare un livello di priorità ai diversi interrupt. Inoltre aggiunge INT1 e INT2 sulle porte RB1 e RB2 con le stesse caratteristiche dell'INT0 della serie 16f. Questo mi ha permesso di gestire meglio gli interrupt degli encoder di movimento liberando molte risorse del microcontrollore.

Ricontrollando tutto il codice durante il porting, mi sono reso conto del tempo che l'MCU perde per effetuare le divisioni in base 10 nelle routine di movimento, anche se con variabili INT e in virgola fissa.
Ragionando con logica "fixed point" in base 2, ho ricalcolato le costanti e sostituito le divisioni con gli shift.
Il risultato è spesso più preciso e permette un risparmio di centinaia di microsecondi.
Un esempio per tutti, calcolare la velocità ogni 64mS invece che ogni 50mS non ha praticamente alcun effetto sulla precisione ma permette un risparmio di circa 120uS a istruzione.

Codice aggiornato

Ora che ho ripristinato le funzionalità che avevo durante le gare (ma con un MCU più potente, un codice più ottimizzato, insomma con molte risorse in più) posso pensare a nuove procedure.
Una cosa che mi manca è la comunicazione I2C: per pilotare il display LCD, per aggiungere porte al PIC, per la bussola, il sonar, ecc...

Il C18 ha delle ottime librerie per l'I2C, che usano perfettamente le risorse HW del PIC ma non sono compatibili con il concetto pseudo-RTOS del mio SW.
Per questo ho dovuto studiare una modalità compatibile usando gli interrupt dell'SSP e i soliti sistemi di flag e variabili globali di appoggio.

Procedure I2C

Attualmente queste routine non sono state verificate sull'HW che è ancora in costruzione, potrebbero subire quindi diverse modifiche in un futuro molto prossimo, ma non sui concetti di base.
aggiornato il 02 - 08 - 2005