|
Esercizio#1 - Il primo programma, lampeggio di un LED - Output.spin
Dopo aver compreso l'architettura generale del propeller e dei suoi 'tool' di sviluppo, il modo migliore per imparare è sicuramente quello di cominciare subito a prendere famigliarità con il linguaggio ed il compilatore. In questo esempio proveremo ad applicare un piccolo codice che esegue un semplice lampeggio di un LED. Ovviamente il propeller è in grado di eseguire operazioni molto più complesse, ma per chi si accinge per la prima volta al mondo della programmazione è meglio che parta da una applicazione semplice. Il codice verrà poi modificato fino ad un certo livello di complessità fino a comprendere come interagiscono i Cog tra loro e con la memoria principale.
|
PUB Toggle
dira[16]~~
repeat
!outa[16]
waitcnt(3_000_000 + cnt)
|
Nella prima riga abbiamo dichiarato un 'metodo' chiamato 'Toggle'. Nei linguaggi 'object-oriented', un metodo è un termine per chiamare una 'procedura' o 'routine'. Il nome assegnato al metodo (Toggle) è stato scelto per ricordare cosa fa la routine, ma avremmo potuto scegliere anche un altro nome. Il prefisso 'PUB' indica che il metodo è di tipo 'Pubblico', ovvero può essere richiamato per l'esecuzione internamente o esternamente a questo file (o oggetto). Quando sono presenti più metodi di tipo 'PUB', il primo è sempre quello eseguito all'inizio, ammesso che il file in questione sia il 'Top Object File', ovvero il principale da eseguire nella gerarchia del progetto, oppure il progetto corrente è composto da un solo file.
La prima istruzione dira[16]~~ imposta il bit 16 della porta come output, in quanto il simbolo DIRA gestisce il registro delle direzioni I/O (da 0 a 32). Sarebbe stato equivalente scrivere dira[16] := 1.
La seconda istruzione (repeat) è l'inizio di una dichiarazione di un ciclo, in questo caso infinito perchè non ci sono parametri aggiuntivi. Da questo punto in poi, tutto il codice scritto all'interno del ciclo verrà eseguito in modo sequenziale all'infinito. L'istruzione !outa[16] esegue una operazione di I/O sul bit 16 della porta. Ad ogni esecuzione inverte lo stato logico passando da VSS a VCC e vice-versa. Il carattere '!' posto prima dell'istruzione indica che deve essere impostata la condizione logica contraria (in questo caso riferito al bit 16 della porta). L'ultima istruzione (waitcnt) ferma l'esecuzione del Cog per un tempo pari a 3 milioni di cicli. WAITCNT sta per: Wait System Clock, mentre 'cnt' ritorna il valore corrente del contatore clock di sistema. Tutta la riga 'waitcnt(3_000_000 + cnt)' significa: "Attendi il valore di clock di sistema a partire dal valore di clock corrente più i 3 milioni di cicli". In questo esempio non è stato specificato alcun valore del quarzo, quindi il propeller per default viene alimentato da un clock interno di circa 12Mhz. Con questo valore di clock, l'attesa per i 3 milioni di cicli è di circa 1/4 di secondo.
Ora potete salvare il file [CTRL+S]. Per l'esecuzione e l'invio del programma alla RAM del propeller premete F10.
Dove viene eseguito il programma ?
|

|
Il propeller come già accennato ha internamente otto identici processori chiamati "Cog". Ciascun Cog può essere avviato e fermato da un programma in esecuzione e può lavorare in modo indipendente o cooperativo con altri Cog secondo le necessità. Le due modalità possono cambiare anche durante l'esecuzione del programma. Nell'esempio non è stato specificato in quale Cog deve essere eseguito il programma, ma per capire meglio come funziona il propeller, spieghiamo sinteticamente la sequenza di 'boot-up'.
All'accensione, solo il primo Cog entra in funzione (Cog 0), dalla ROM viene caricato il bootloader nella RAM del Cog e viene verificato se un collegamento con il PC è richiesto. Successivamente il Cog0 verifica se un programma in EEPROM (esterna) è disponibile e deve essere caricato nella RAM principale. Infine l'interprete SPIN viene caricato dalla ROM nella RAM del Cog e quindi l'applicazione contenuta nella RAM viene finalmente eseguita. Fino a questo punto gli altri Cog rimangono in un stato 'dormiente' fintanto che il programma non ne richieste l'utilizzazione per eseguire dei task indipendenti.
|
|