Home
Hardware
Lab
|
"This is the Construct. It's our loading program.
We can load anything... From Clothing to equipment,
weapons, training simulations; anything we need."
Con queste
parole Morpheus introduce Neo nel mondo di
Matrix.
Construct ha la medesima funzione: un ambiente virtuale in cui
poter creare dei driver e delle interfacce che terminano nel mondo
reale, un ambiente in cui, come in Matrix, il confine tra
virtuale e reale sia molto sottile.
Queto progetto nasce sulle ceneri di un progetto chiamato
Struttura, che potete trovare
ancora a:
questo link.
Con l'introduzione dell'interprete TCL e l'implementazione della
modalita' MPSSE reale, il progetto ha cambiato nome diventando
appunto Construct (originariamente aveva il nome italiano del
programma di caricamento di Matrix).
Lo scopo originario del progetto era di ridare ai computer
un'interfaccia hardware facilmente modificabile e collegabile ad
altri dispositivi: io sono cresciuto collegando roba alla porta
parallela o alla seriale, ora entrambe sono sparite e giocare
con aggeggi elettronici e' sempre piu' difficile.
Construct vorrebbe rendere nuovamente accessibili i
fili che ci sono stati portati via.
Construct e' un ambiente virtuale in cui poter caricare
driver diversi di volta in volta, l'adozione di un interprete TCL ha
dato al progetto una spinta notevole: per quanto, almeno per me, il
TCL possa sembrare alieno, ha dato una flessibilita' allo strumento
che prima potevo solo sognarmi.
Interfaccia hardware
Construct utilizza il chip FT2232 come interfaccia
hardware. L'FT2232 nasce come doppio adattatore seriale-USB,
in realta' puo' essere configurato in diverse modalita' operative, le
piu' interessanti per noi sono: MPSSE e CPU.
In modalita' MPSSE implementa un'interfaccia SPI
completa, mentre in modalita' CPU simula un bus parallelo a 16
bit.
L'immagine sottostante mostra le funzioni dei pin nelle varie
modalita'.
Generic |
Bit-bang |
MCU Bus |
UART 232 |
Pin |
|
Pin |
UART 232 |
MCU Bus |
Bit-bang |
MPSSE |
Generic |
SI/WUB |
|
|
|
1 |
40 |
TXD |
AD0 |
D0 |
TCK/SK |
ADBUS0 |
BCBUS3 |
RD# |
WR# |
TXLED# |
2 |
39 |
RXD |
AD1 |
D1 |
TDI/DU |
ADBUS1 |
BCBUS2 |
WR# |
RD# |
RXLED# |
3 |
38 |
RTS# |
AD2 |
D2 |
TDO/D1 |
ADBUS2 |
BCBUS1 |
RD# |
ALE |
SLEEP# |
4 |
37 |
CTS# |
AD3 |
D3 |
TMS/CS |
ADBUS3 |
BCBUS0 |
WR# |
CS# |
TXDEN |
5 |
36 |
DTR# |
AD4 |
D4 |
GPIOL0 |
ADBUS4 |
BDBUS7 |
D7 |
AD15 |
RI# |
6 |
35 |
DSR# |
AD5 |
D5 |
GPIOL1 |
ADBUS5 |
BDBUS6 |
D6 |
AD14 |
DCD# |
7 |
34 |
DCD# |
AD6 |
D6 |
GPIOL2 |
ADBUS6 |
BDBUS5 |
D5 |
AD13 |
DSR# |
8 |
33 |
RI# |
AD7 |
D7 |
GPIOL3 |
ADBUS7 |
BDBUS4 |
D4 |
AD12 |
DTR# |
9 |
32 |
TXDEN |
I/O0 |
WR# |
GPIOH0 |
ACBUS0 |
BDBUS3 |
D3 |
AD11 |
CTS# |
10 |
31 |
SLEEP# |
I/O1 |
RD# |
GPIOH1 |
ACBUS1 |
BDBUS2 |
D2 |
AD10 |
RTS# |
11 |
30 |
RXLED# |
IORDY# |
WR# |
GPIOH2 |
ACBUS2 |
BDBUS1 |
D1 |
AD9 |
RXD |
12 |
29 |
TXLED# |
OSC |
RD# |
GPIOH3 |
ACBUS3 |
BDBUS0 |
D0 |
AD8 |
TXD |
13 |
28 |
|
|
|
SI/WUA |
SI/WUA |
GND |
14 |
27 |
RSTIN# |
GND |
15 |
26 |
RSTOUT# |
VCCSW |
16 |
25 |
GND |
VCCIOB |
17 |
24 |
GND |
VCCIOA |
18 |
23 |
GND |
EXTVCC |
19 |
22 |
GND |
PORTVCC |
20 |
21 |
VCCUSB |
La prima scheda
Per poter maneggiare questo modulo ed essere comodo a fare i
collegamenti, mi sono costruito questa piccola scheda; niente di
eclatante: in sostanza si tratta di un supporto per il modulo, da un
lato ho aggiunto dei buffer che pilotano dei led rossi, giusto per
avere un'indicazione diretta dello stato dei pin. Dall'altra parte mi
sono preparato alcuni connettori per me comodi: un connettore a 16
pin che abbia tutti i segnali disponibili, una connettore a 14 pin
studiato per collegare i display alfanumnerici basati su
HD44780, una porta ISP a 10 pin per programmare i
processori della famiglia AVR di Atmel e la stessa versione a
6 pin (non si vede nella foto).
Prima scheda construct.
Il voltage selector seleziona la tensione della linea
+Vcc e degli I/O, e' molto importante selezionare
la tensione giusta in funzione del dispositivo che viene collegato.
La linea +5V rimane sempre a 5V qualunque sia la selezione,
questo permette di avere la doppia tensione disponibile per
alimentare i dispositivi, e' molto comodo ad esempio per alimentare
la retroilluminazione di alcuni display.
Selezione tensione di bus.
Prova I/O base
La directory TCL contiene diversi esempi, il piu' semplice dei
quali e' sicuramente: io_test_1.tcl.
In modalita' MPSSE l'FT2232 implementa una vera porta
SPI sui 4 primi pin di I/O, i restanti 8 pin sono di I/O
generico e possono essere riprogrammati a piacere come ingressi o
uscite. Questo esempio sfrutta gli 8 pin di I/O della modalita'
MPSSE e li accende uno alla volta.
Da un terminale digitare:
$ ../construct --mpsse io_test_1.tcl -
Questo script accende (alza) i pin di I/O uno alla volta, ripete il
giro per 3 volte e termina.
Il '-' in fondo alla riga di comando serve a bloccare
construct in modalita' interattiva; questo perche'
dopo aver eseguito tutti gli script passati, construct
termina. Questa semplice quanto naturale operazione, qualcuno si
stara' gia' chiedendo che cos'altro avrebbe dovuto fare, rimette
i pin dell'FT2232 nella loro configurazione originale; in
altre parole i led si accendono a casaccio e non si capisce bene che
cosa sia successo.
Per uscire dalla modalita' interattiva digitate il comando 'exit'.
Display alfanumerico
|
Un altro esperimento molto semplice si puo' fare con un display
alfanumerico a matrice di punti HD44780 like. Il
connettore a 14 pin dovrebbe essere compatibile con la maggior
parte dei display in commercio, basta fare attenzione
all'ordine dei pin perche' ogni tanto si invertono la fila
dispari e la fila pari.
Collegare il display all'interfaccia hardware, collegare il
cavo USB e digitare:
$ ../construct --mpsse hd44780_demo_2L.tcl -
Lo script stampa sul display il messaggio che si vede qui di
fianco. Questa demo richiede che il display sia a due righe.
Chi possedesse un display 40x2 potrebbe lanciare la seconda
demo, un pochino piu' dinamica:
$ ../construct --mpsse hd44780_demo_40x2.tcl -
Richiede 5V mode.
|
SPI
|
Ora proviamo l'interfaccia SPI. Per prima cosa dobbiamo
configurare il bus SPI, successivamente configurare il clock e
poi, finalmente, possiamo trasmettere.
Per fare questo avviamo construct in modalita'
interattiva.
$ ../construct --mpsse
mpsse_spi_set_mode 0 0
mpsse_clock_divider 0xffff
mpsse_spi_send 0x09
La prima riga configura il bus SPI per trasmettere prima il bit
meno significativo ed avere il clock basso in stato di riposo.
La seconda riga divide il clock a 6MHz per 0xffff (per andare
piano); infine la terza riga trasmette 0x09 sul bus.
L'FT2232 ha solo due modalita' di trasmissione: con
clock normalmente basso, con clock normalmente alto; non e'
possibile in alcun modo (io non l'ho ancora trovato) impostare
il primo o il secondo fronte del clock.
|
|
Configurando il bus SPI con clock normalmente alto si ottiene
il segnale qui a sinistra.
$ ../construct --mpsse
mpsse_spi_set_mode 0 1
mpsse_clock_divider 0xffff
mpsse_spi_send 0x09
Solitamente almeno uno dei due modi di trasmissione riesce ad
essere compatibile con la periferica (spero:-).
|
Analisi bus SPI
Per sfatare il mistero dei fronti di campionamento ho voluto
fare un piccolo esperimento: ho collegato un flip-flop di tipo
D tra MISO e MOSI, il risultato e' abbastanza interessante.
|
|
Il test consiste nell'inviare un solo byte attraverso il
flip-flop e rileggere il risultato dalla linea MISO. Come si
vede dall'immagine a fianco in ricezione si ottiene lo stesso
byte shiftato verso l'alto di 1 bit.
Questo risolve il mistero dei fronti di scrittura e lettura:
non e' possibile separarli in alcun modo, se il clock e'
normalmente basso l'istante di lettura/scrittura corrisponde al
fronte di salita, il bit viene centrato attorno a questo fronte
che e' il medesimo sia per trasmettitore che per il ricevitore,
esattamente come dovrebbe essere in un'interfaccia SPI.
Stando al data sheet sembra invece che sia possibile
trasmettere sul fronte di salita e ricevere sul fronte di
discesa, questa cosa non e' possible!
|
|
L'esperimento prosegue invertendo il clock, le freccia sul
clock evidenzia il fronte attivo per il flip-flop; il risultato
e' che il flip-flop registra solo zeri: il bit diventa invalido
un istante prima del fronte di salita, abbastanza perche' i bit
vengano persi. Questo esperimento scemo conferma la durata di
ogni singolo bit rispetto al clock.
|
|
SSD1770
|
Questa e' una tipica applicazione dell'interfaccia SPI. Si
tratta di un display rubato ad un Motorola C550: un piccolo
display a colori basato sul controller SSD1770.
Come al solito avviamo construct in modalita'
interattiva.
$ ../construct --mpsse ssd1770_demo.tcl -
Il risultato si puo' vedere qui a sinistra.
Ovviamente nessuno vi vieta di giocare con il codice della demo
e di spaziare come meglio credete.
Richiede 3V3 mode.
|
ST7565
|
Questo e' un display che devo aver rubato a qualche stampante,
non ricordo bene. Ha un controller ST7565 integrato ed
e' piuttosto particolare: il display e' organizzato in 4 fasce
orizzontali alte ciascuna 8 pixel; ciascun byte definisce una
colonna di pixel all'interno della fascia.
E' molto semplice creare font di larghezza diversa a patto di
rimenere all'interno della fascia, qui mi sono divertito
recuperando il font di un vecchio gioco per MSX.
La demo si avvia come al solito:
$ ../construct --mpsse st7565_demo.tcl -
|
nRF24L01+
Su consiglio di un collega ho acquistato alcune nRF24L01+,
una radio a 2.4GHz molto popolare nella rete.
Quale occasione migliore per sperimentare: ho organizzato una
piccola demo con 3 moduli radio, il primo fa da ricevitore
mentre gli altri trasmettono.
Ho attivato l'auto ACK con lunghezza dinamica dei pacchetti.
La demo si articola in 3 momenti, dapprima il modulo 2 tenta
una trasmissione verso la radio 1, tentativo che fallisce
miseramente malgrado il numero di tentativi in quanto la radio
1 non e' ancora in ascolto.
A questo punto laradio 1 viene messa in ascolto e finalmente la
radio 2 puo' trasmettere un nuovo messaggio, la cosa riesce al
primo tentativo senza bisogno di ripetizioni.
La terza fase e' piu' alticolata: le radio 2 e 3 vengono
impostate in trasmissione, la radio 1 si mette in ascolto ma
carica delle risposte differenti da accodare agli ACK per i due
trasmettitori; alla fine della terza fase tutto i messaggi
vengono recapitati senza ulteriori ripetizioni.
La demo si avvia come al solito:
$ ../construct --mpsse nRF24L01_demo.tcl -
|
|
Una vista del collegamento tra i moduli radio e la scheda base.
Per questo esperimento impostare +Vcc=3.3V, ciascun modulo
radio ha un proprio LDO alimentato dalla linea a +5V,
ma la parte logica lavora a bassa tensione.
Richiede 3V3 mode.
|
|
|
PSx connector
|
Finalmente ho realizzato una scheda tutta mia su cui
trapiantere un connettore originale rubato ad una vecchia
playstation.
L'interfaccia funziona sia con i joypad che con le cartucce di
memoria; nella demo e' contenutta anche una funzione per
detectare la dimensione della cartuccia, quella nella foto e'
da 128kB.
Per avviare la demo:
$ ../construct --mpsse psx.tcl -
> PSx_GetJoypad_0 0 0 10
> PSx_DumpMemory 0 3
> PSx_ContRead 10
Richiede 5V mode.
|
|
PSx joypad
Con lo stesso adattatore e' possible collegare il joypad della
playstation e leggere in tempo reale il suo stato: le pressioni
dei tasti e dei joystick analogici.
I primi 3 byte ricevuti non hanno alcun significato, i byte 4 e
5 contengono lo stato dei tasti, 0 significa tasto premuto. Gli
ultimi 4 byte contengono le coordinate dei joystick analogici
se la modalita' analog e' attiva (LED rosso acceso).
Per avviare la demo:
$ ../construct --mpsse psx.tcl -
> PSx_ContRead 10
Richiede 5V mode.
|
|
Download
|