Il programma, scaricabile qui, governa tutte le funzioni
del robot. Giunto alla fine ho scoperto l'esistenza di PowerASM
una "libreria" che semplifica molto la programmazione, tuttavia e' utilizzata solo alla fine del programma.
Devo ancora ottimizzarlo con le nuove funzioni. Quella libreria e' comunque inclusa.
Ho utilizzato un watch dog timer perche' all'inizio succedeva che il programma riceveva comandi
sbagliati a causa di disturbi radio, da quando ho inserito i trucchetti di verifica non e' piu'
entrato in funzione. Il programma e' abbastanza commentato tuttavia descrivero' a grandi linee
il funzionamento.
Come si puo' vedere il MainLoop questa volta e' abbastanza lungo, infatti oltre a controllare la
presenza di segnali in arrivo deve anche gestire i servo e i motori. Per capire il programma occorre
avere a vista il circuito elettronico del robot, almeno si ha chiaro cosa succede all'accensione dei rele'.
Arrivati a VaiPow (linea 163) si vede come l'attivazione del transistor che attacca i motori dipenda da
Autostp. Questa variabile (caricata in SetAng) verra' decrementata ad ogni ciclo e serve a fare da
timer per i motori. Questa tecnica e' utile per evitare che se il robot esce dal campo radio o
entra in una zona molto disturbata (Murphy: il telefonino va in ricezione proprio quando stavi testando
il raggio d'azione...) continui ad andare avanti perdendone il controllo. In effetti ho implementato questa
tecnica dopo essermi giocato un pezzo di Ricetrasmettitore perche' si e' infilato sotto al divano a tutta velocita' :-(
Alla linea 188 (SkPow) avviene il settaggio dei servo comandi, il braccio snodato.
ARServ1 e' la subroutine che "rallenta" i servo. In pratica invece di settare direttamente il valore
corrispondente al servo setto un valore incrementale che arrivera' a raggiungere quel valore
solo dopo alcuni cicli. Il motivo e' quello di rendere piu' fluido il movimento.
Il loop si conclude con lo spegnimento di tutti i motori a spazzole, questo per evitare che
nella prossima istruzione (controllo antenna) vada ad interferire un disturbo causato
dallo scintillio delle spazzole.