|
Parte 1 - Introduzione al Parallax Propeller Chip P8X32A
Il chip P8X32A è un innovativo dispositivo prodotto dalla Parallax Inc. (www.parallax.com) caratterizzato da 8 processori a 32 bit integrati in un solo packeage. Gli otto processori (chiamati COGs) possono lavorare autonomamente o in modo cooperativo in quanto hanno a disposizione una propria memoria RAM dedicata da 512x32 bit e, in comune, periferiche I/O e una memoria di sistema composta da 32Kb di RAM e 32Kb di ROM. Questo chip collegato con un minimo di hardware esterno, è in grado di comunicare in modo semplice ed immediato, con periferiche comuni come ad esempio una tastiera per PC, un mouse, un monitor VGA o addirittura con un televisore dotato di ingresso video-composito. Infatti, grazie alle molteplici librerie messe a disposizione dalla Parallax, comunicare con una di queste periferiche non è più un problema per lo sviluppatore. L'ambiente di progettazione per PC viene fornito gratuitamente dal costruttore. Il tool di sviluppo software viene fornito con la possibilità di scrivere i programmi in due linguaggi diversi: Uno a basso livello (assembler) e uno ad alto livello (SPIN). Quest'ultimo viene compilato come codice-oggetto ed eseguito dall'interprete contenuto nella ROM del chip. E' possibile scrivere un programma anche utilizzando i due linguaggi contemporaneamente.
Un piccolo esempio pratico:
Per chi non ha mai visto le potenzialità di questo dispositivo, la semplicità di utilizzo delle librerie vi lascerà di stucco. Per fare un esempio se si vuole far comparire una scritta sul vostro monitor VGA, basta includere nel vostro progetto la libreria 'VGA_text' come scritto in queste pochissime righe di codice:
-
|
CON
_clkmode = xtal1+pll16x
_xinfreq = 5_000_000
OBJ
text : "vga_text"
PUB start
text.start(16)
text.str(string("VGA Test"))
|
L'hardware VGA ? Praticamente quasi inesistente, per collegare il Propeller al vostro monitor, sono sufficienti otto resistenze e un connettore VGA femmina, collegando il tutto, come nella figura di esempio.
Questo è possibile perché nella libreria 'VGA_text', uno degli otto COG viene impiegato come processore video, lasciando l'esecuzione del programma principale agli altri. Solo grazie a questa particolare caratteristica del dispositivo, è possibile avere diverse periferiche funzionanti contemporaneamente in un solo chip.
In questo esempio, se volete far comparire la scritta sul vostro televisore, invece che nel monitor VGA, basta sostituire la libreria 'VGA_text' con 'TV_text', ed il gioco è fatto.
Non vi basta ? Se volete gestire l'input da una tastiera PC per far comparire i caratteri sul monitor, basta utilizzare la libreria 'keyboard' e utilizzare nel programma il metodo 'getkey' per ricevere il codice ASCII dei caratteri digitati. La tastiera la collegate al propeller per mezzo di quattro resistenze.
Similarmente a questi esempi, ciascun COG lo potete far funzionare come convertitore A/D o D/A, oppure come una UART seriale, un generatore PWM, un generatore Video o di Audio. Basta sempre scegliere la libreria giusta per la vostra periferica.
Scrivere ed eseguire il programma nella memoria del Propeller:

Uno sviluppatore esperto si fa subito una domanda essenziale: Come faccio ad inviare il programma sviluppato nel mio PC nella memoria del chip ? La risposta è: NON SERVONO PROGRAMMATORI.
Il propeller lo collegate direttamente alla porta seriale del vostro PC, (o alla porta USB utilizzando un semplice convertitore) e dall'ambiente di sviluppo (IDE) della Parallax, compilate il programma e lo inviate subito nella memoria del propeller per l'esecuzione.
Il propeller ha un 'bootloader' integrato nella memoria ROM, quindi alla prima accensione, questo controlla se il PC deve inviare un programma da eseguire. In caso positivo, la comunicazione viene stabilita e il programma viene ricevuto.
All'interno del propeller, i programmi vengono eseguiti sempre dalla memoria RAM principale, questo significa che in assenza di alimentazione il software viene perduto. Per ovviare a questo problema, il chip è stato progettato per ospitare una memoria seriale I2C EEPROM esterna. All'accensione del propeller, se il software è presente nella memoria EEPROM, viene copiato in RAM ed eseguito.
Per scaricare il software sviluppato direttamente nella EEPROM, basta farlo dal compilatore con i tasti F11 o CTRL-F11 (Load EEPROM) invece dei tasti F10 o CTRL+F10 (Load RAM) per la normale esecuzione in RAM.
Sempre dal compilatore è possibile creare inoltre immagini HEX della memoria EEPROM nel caso in cui volete programmare la EEPROM con programmatori esterni.

Esempio di interfaccia per collegamento RS232
Composizione Hardware del chip P8X32A:
Il propeller P8X32A è disponibile in tre differenti packeage: DIP a 40 pin, LQFP a 44 pin e QFN.
La possibilità di avere la versione DIP a 40 pin con passo standard 2.54 pollici farà sicuramente contenti tutti i sviluppatori che desiderano iniziare a lavorare con questo dispositivo, in quanto spesso le versioni più piccole sono a volte un ostacolo da superare sotto il punto di vista delle saldature. Le altre versioni invece combinano il vantaggio della straordinaria potenzialità che offre questo dispositivo con le ridottissime dimensioni.
Di seguito le caratteristiche generali del propeller:
|
Modello
|
Packeage
|
I/O Pins
|
Alimentazione
|
Clock Esterno
|
Oscillatore interno RC
|
Velocità esecuzione
|
RAM/ROM Globale
|
COG RAM
|
|
P8X32A-D40
|
40-pin DIP
|
32 CMOS
|
3.3 Volt DC
|
DC ÷ 80 Mhz
|
12 Mhz o 20 Khz*
|
0 ÷ 160 MIPS
(20 MIPS/cog)
|
32K RAM
32K ROM
|
512x32 bits per COG
|
|
P8X32A-Q40
|
44-pin LQFP
|
|
P8X32A-M40
|
44-pin QFN
|
* Approssimativo: può variare da 8-20Mhz o 13-33 Khz rispettivamente.
Ciascun processore (COG) è caratterizzato da:

Le periferiche di Input/Output, i bus dati e quant'altro, vengono tutte condivise con un meccanismo chiamato 'Hub', ovvero una logica di 'round-robin' consente a ciascun processore (Cog) di usare a turno le risorse hardware. Più processori sono attivi e maggiore sarà il tempo di attesa necessario per l'accesso alle periferiche.
Le periferiche di Input/Output:
Le porte di I/O vengono gestite in ciascun Cog con un unico registro a 32 bit per la direzione e il dato. Ciascun Cog potrà accedere contemporaneamente agli stessi pin di I/O, utilizzando però una logica di arbitraggio che evita possibili conflitti che si potrebbero verificare nel caso in cui i registri di direzione e di dato dei differenti Cog non siano esattamente uguali.
Il propeller ha in totale 32 pin che possono funzionare singolarmente da Input o da Output. Di questi, 28 sono di uso generale, mentre i rimanenti (pin 28÷31) hanno delle funzioni speciali nella fase di boot-up (accensione). Successivamente a questa fase possono essere utilizzati anch'essi come I/O di uso generale. Dopo la fase di boot-up, tutti i pin I/O possono essere utilizzati in qualsiasi momento da qualsiasi Cog.
Tutti i Cog hanno a disposizione un loro personale registro di direzione e un registro I/O di Output dei dati. In ciascun Cog, il registro di direzione è collegato con il registro di direzione del Cog precedente rispettando una logica di 'OR' collegati in cascata, così da permettere sempre una configurazione globale che salvaguardi un'eventuale collisione causata nella condizione in cui i registri possano essere configurati diversamente tra loro. La stessa logica ad 'OR' in cascata viene applicata per il registro dei dati (I/O Output), così basterà che uno dei Cog imposti uno dei bit "a uno" per avere la corrispettiva uscita logica a livello 'alto'.
Nella tabella che segue, viene riportato un esempio di come i registri di direzione e di Output interagiscono tra loro rispettando la logica di 'OR' in cascata. Gli otto esempi vengono applicati al PIN P12 in differenti condizioni, riportando il risultato nella penultima colonna. L'ultima colonna riporta la 'regola' che viene seguita in quella condizione. La colonna 'Cog ID' rappresenta lo stato di direzione e di dato I/O del Bit 12 per ciascun Cog.
Per il registro di direzione: 0=input, 1=output
Per il registro di dati Output: 0=low, 1=high
Le tre regole di funzionamento:
|
A
|
Un pin può essere un 'input' solo se nessuno dei Cog attivi lo imposta come output.
|
|
B
|
Un pin è un output a livello logico basso (low) solo se tutti i Cog attivi lo hanno impostato come 'output' nel registro direzioni (1) e hanno quel bit impostato a zero (low).
|
|
C
|
Un pin è un output a livello logico alto (high) se un qualsiasi Cog attivo lo ha impostato come 'output' nel registro direzioni (1) e ha quel bit impostato a uno (high).
|

Tutti i Cog non attivi non hanno influenza sullo stato dei pin I/O in quanto non partecipando al funzionamento globale del processore, tutti i registri sono allo stato di reset (zero logico).
System Counter:
Il System Counter è un registro a 32 bit (solo lettura) che si incrementa ad ogni ciclo di clock. Questo registro è globale per tutti i Cog e può essere utile per il calcolo di temporizzazioni precise all'interno delle routines. Può essere letto contemporaneamente da più Cog.
Semafori (Locks):
Nel propeller sono stati previsti otto 'locks bits' (semafori) che hanno lo scopo di facilitare, da parte dei Cog, l'accesso esclusivo alle risorse del dispositivo. In alcune condizioni, come ad esempio la lettura e scrittura di dati nella memoria principale da parte di più Cog, potrebbe verificarsi la necessità di avere un accesso esclusivo da parte di un Cog in particolare, al fine di evitare che gli altri Cog possano effettuare modifiche nella stessa area e nello stesso momento.
Contatori:
Ciascun Cog ha a disposizione due contatori: CTRA e CTRB.
Configurando i contatori in modo differente è possibile avere:
-
sintetizzatori di frequenza
-
misuratori di frequenza
-
conteggio impulsi
-
misurazione di impulsi
-
modulazione di impulsi (PWM)
-
misurazione duty-cycle
-
conversione analogico/digitale
-
conversione digitale/analogico
Ciascun contatore può essere controllato per mezzo di tre registri:
-
Control Register (CTRA/CTRB)
-
Frequency Register (FRQA/FRQB)
-
Phase Register (PHSA/PHSB)
Ciascun contatore può essere alimentato da due pin di ingresso: APIN e BPIN.
|

|
Control Register (CTRA/CTRB): Seleziona i modi di funzionamento del contatore. Il nuovo modo di funzionamento del contatore parte appena questo registro viene impostato. Impostando a zero il valore di questo registro si interrompe immediatamente il funzionamento del contatore, dei suoi PIN associati e il conteggio del registro PHS. Attraverso questo registro è possibile anche impostare le caratteristiche del moltiplicatore di frequenza (PLL). Tutti i modi di funzionamento dei contatori sono riportati nel datasheet del propeller.
Frequency Register (FRQA/FRQB): Contiene il valore che verrà accumulato nel registro PHS.
Phase Register (PHSA/PHSB): Questo registro può essere letto e scritto utilizzando le istruzioni dei Cog. Ogni volta che si esegue la scrittura di un valore su questo registro, ne verrà sovrascritto il suo contenuto.
|
-
Generatore Video:
|

|
Ciascun Cog ha a disposizione un generatore video in grado di inviare informazioni ad un monitor VGA o un televisore con ingresso video-composito.
Se viene utilizzato il generatore video, il contatore A deve essere impostato come PLL al fine di generare i necessari segnali di temporizzazione. Il registro di configurazione video (VCFG) stabilisce il modo di funzionamento (NTSC o PAL). L'istruzione WAITVID è una speciale istruzione dedicata alla funzione di generazione del segnale video. Questa istruzione, che fa parte del gruppo di istruzioni WAITCNT, WAITPEQ, WAITPNE e WAITVID, arresta l'esecuzione delle istruzioni del Cog, in attesa che il generatore video sia pronto a prelevare l'informazione relativa al prossimo pixel da visualizzare. Nel datasheet originale, la Parallax raccomanda di seguire l'inizializzazione del contatore A e dei registri video correttamente prima di eseguire l'istruzione WAITVID. Se tale sequenza non viene rispettata, si rischia l'arresto definitivo dell'esecuzione del Cog.
|
La Parallax mette a disposizione delle ottime librerie per utilizzare il generatore video sia in modalità VGA che video-composito. Le librerie, di semplice utilizzo, vengono distribuite assieme il pacchetto di sviluppo Parallax dedicato al Propeller.
Clock di sistema:
Il clock di sistema è controllato dal registro CLK (System Clock); esso determina la sorgente del clock per l'esecuzione dei programmi, ed in generale per tutto il funzionamento del propeller.
Il clock di sistema può essere configurato utilizzando l'oscillatore interno (RC) o un quarzo/risonatore esterno collegato ai pins 30 e 31 (XIN/XOUT).
L'oscillatore può essere configurato direttamente in fase di compilazione utilizzando la dichiarazione _CLKMODE e successivamente, modificato in run-time con l'istruzione CLKSET.
Nel clock di sistema è possibile attivare anche un PLL in grado di moltiplicare la frequenza in input.
Nella tabella di seguito vengono riportate le maggiori funzionalità di questo registro:
|
BIT ->
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
Funzionalità
|
RESET
|
PLLENA
|
OSCENA
|
OSCM1
|
OSCM2
|
CLKSEL2
|
CLKSEL1
|
CLKSEL0
|
|
RESET
|
Effetto
|
|
0
|
Impostare sempre a '0' se non si desidera effettuare un RESET del chip
|
|
1
|
Stesso risultato di un RESET hardware - Riavvia il chip
|
|
PLLENA
|
Effetto
|
|
0
|
PLL disabilitato
|
|
1
|
Abilita il circuito PLL. La frequenza in input XIN viene moltiplicata per 16. Il bit OSCENA deve essere impostato ad '1' al fine di propagare il segnale in input al PLL. La frequenza interna del PLL deve essere compresa tra 64 Mhz e 128 Mhz, quindi la frequenza in ingresso XIN risulta compresa tra 4 Mhz e 8 Mhz.
|
|
OSCENA
|
Effetto
|
|
0
|
Circuito oscillatore disabilitato.
|
|
1
|
Circuito oscillatore abilitato. I due pin XIN/XOUT vengono utilizzati per collegare un quarzo/risuonatore. Nessun altro componente aggiuntivo (resistenze/condensatori) sono necessari per il funzionamento dell'oscillatore.
|
|
OSCM1
|
OSCM2
|
Effetto
|
|
0
|
0
|
Clock in input da DC a 80 Mhz
|
|
0
|
1
|
Quarzo/risuonatore da 4 Mhz a 16 Mhz
|
|
1
|
0
|
Quarzo/risuonatore da 8 Mhz a 32 Mhz
|
|
1
|
1
|
Quarzo/risuonatore da 20 Mhz a 60 Mhz
|
|
CLKSEL2
|
CLKSEL1
|
CLKSEL0
|
Master
Clock
|
Sorgente
|
Note
|
|
0
|
0
|
0
|
~12Mhz
|
Interno
|
Nessun componente esterno necessario. (8÷20 Mhz)
|
|
0
|
0
|
1
|
~20khz
|
Interno
|
Nessun componente esterno necessario. (13÷33 Khz)
|
|
0
|
1
|
0
|
XIN
|
OSC
|
Bit OSCENA deve stare a '1'
|
|
0
|
1
|
1
|
XIN x 1
|
OSC+PLL
|
Bit OSCENA e PLLENA devono stare a '1'
|
|
1
|
0
|
0
|
XIN x 2
|
OSC+PLL
|
Bit OSCENA e PLLENA devono stare a '1'
|
|
1
|
0
|
1
|
XIN x 4
|
OSC+PLL
|
Bit OSCENA e PLLENA devono stare a '1'
|
|
1
|
1
|
0
|
XIN x 8
|
OSC+PLL
|
Bit OSCENA e PLLENA devono stare a '1'
|
|
1
|
1
|
1
|
XIN x 16
|
OSC+PLL
|
Bit OSCENA e PLLENA devono stare a '1'
|

Organizzazione della memoria:
Il propeller ha a disposizione un totale di 64K di memoria, divisa tra 32K di RAM e 32K di ROM.
I primi 32K di RAM sono riservati ai programmi e ai dati che desideriamo conservare negli applicativi.
i secondi 32K di RAM sono divisi ulteriormente in cinque gruppi avente diverse funzionalità.
Font di caratteri: Il primo gruppo contiene tutti i caratteri che fanno parte della font Parallax, questi potrebbero essere utilizzati ad esempio per un ouput a video (VGA o video-composito), oppure per disegnare uno schema elettrico. Infatti la speciale font Parallax, include caratteri personalizzati che rappresentano parti di comuni schemi elettrici (es. condensatori, resistenze, induttanze, ecc..). Questi caratteri visualizzati in sequenza possono comporre uno schema elettrico.
Tabella per Funzioni Matematiche: Tre tabelle sono state riservate per speciali funzioni matematiche, Log, Anti-Log (per facilitare i calcoli con esponente) e una tabella per il calcolo del seno. Il manuale di programmazione spiega in dettaglio come utilizzare queste tabelle.
Interprete e Bootloader: Contiene l'interprete per i programmi scritti in SPIN (questo viene caricato nella RAM di ciascun Cog quando attivo) e un piccolo Bootloader che ha la funzione di trasferire i programmi compilati dal PC nella memoria del propeller.
|

|
RAM:
$0000÷$7FFF: Programmi applicativi e dati
ROM:
$8000÷$BFFF: Font di caratteri (256 cartteri composti da 16x32 pixel)
$C000÷CFFF: Tavola Log
$D000÷DFFF: Tavola Anti-Log
$E000÷F001: Tavola del seno
$F002÷$FFFF: Interprete e Bootloader
|
Font di caratteri Parallax:

Memoria RAM:
La memoria RAM, dedicata all'esecuzione dei programmi e al contenimento dei dati (es. contenuto delle variabili), ha inoltre una parte riservata ($000 ÷ $1FF) alla configurazione delle periferiche:

|