Construct

Tutto il software contenuto in questa pagina e' libero se non diversamente specificato; potete ridistribuirlo e/o modificarlo sotto i termini della GNU General Public License versione 2, come pubblicato dalla Free Software Foundation.

Questi programmi sono distribuiti con l'intento che possano essere utili, ma SENZA ALCUNA GARANZIA; senza nemmeno la garanzia implicita che servano allo scopo per cui sono stati creati. Vedere la GNU Genral Public License per maggiori dettagli.


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 FT2232 pinout 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).

construct board
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.

voltage selector
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

link example

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

SPI transmission

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.

SPI transmission

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.

Test circuit

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!

Positive clock

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.

Negative clock

SSD1770

Color display example

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

B/W display example

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 -
Radio example

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.

Radio cabling
Radio cabling

PSx connector

PSx adapter

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.

sceenshot

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.

Joypad layout

Download

construct-0.13.tar.gz Online documentation
datasheet_pack_01.tar.gz HD44780, SSD1328, SSD1770, ST7565.

Questo sito e' stato realizzato interamente con vim.
Grazie a tutta la comunita' open source, alla free software foundation e chiunque scriva software libero.