Nuovo TSP Z80 con collegamento USB

foto

Caratteristiche

Scopo

Costruire una versione più moderna del vecchio TSP (terminale seriale programmabile) realizzato nel 1990, adatta ad essere collegata direttamente ai PC attuali dotati di sole porte USB, equipaggiata di bus I2C per interfacciarsi con la miriade di componenti che sono nati da allora, e, come ulteriore sfida costruttiva e non ultima motivazione, riuscire a fare tutto in modo ordinato su millefori senza usare neanche un filo volante, nè lato rame nè lato componenti (i ponticelli ortogonali alle piste di rame non si considerano fili volanti ma parte del circuito assieme ad esse).

Immagini (click per ingrandire)


Schema elettrico completo.
Non sono indicate le
alimentazioni degli integrati e
i condensatori di bypass, che
restano sottointesi.
Schema di montaggio sulle basette
stripboard (visto lato componenti).
In blu sono indicati i punti di
interruzione delle strisce di rame.
Immagini delle interruzioni
delle basette sopra e sotto
viste lato rame.
Foto delle basette montate,
quella superiore si innesta su
quella inferiore tramite connettori strip
lunghi (articolo 315031 su robot-italy.com).
Le due schede rimangono distanziate
esattamente di 15mm.
Vista lato rame. Le strisce conduttive di queste
schede (articolo 450160 su distrelec.it)
permettono montaggi estremamente ordinati
senza bisogno di costruire piste con
  spezzoni di conduttore o ponti di stagno.
Notare il nanofusibile SMD da 250mA
(articolo 272402 su distrelec.it)
Il circuito completo si collega ad un PC
tramite il solo cavetto mini USB, da cui
viene anche alimentato.
Il convertitore USB/seriale è il cuore
della comunicazione con il PC.
(articolo 990004 su robot-italy.com)


API  seriali

Il modulo TSP all'accensione, dopo un breve test e azzeramento della RAM, rimane in attesa di comandi da parte del PC. Questi comandi vanno inviati in modalità binaria, cioè non tramite stringhe ASCII ma inviando direttamente i byte con il valore del comando. Ad esempio: trasmettendo il byte di valore 31 il modulo risponde con due byte contenenti i valori ASCII dei caratteri 'OK'.


Funzioni di base

                   +--------------+
     31        --> |              |
                   |     SYNC     |
     'OK'      <-- |              |
                   +--------------+

                   +--------------+
     32        --> |              |    Load scrive in memoria all'indirizzo
     L_ADDR    --> |              |    ADDR una sequenza di LEN bytes
     H_ADDR    --> |              |    (solo RAM).
     L_LEN     --> |     LOAD     |   
     H_LEN     --> |              |    Indirizzo e lunghezza a 16 bit
     BYTE1     --> |              |    vengono ricevuti prima byte basso
       :           |              |    e poi byte alto.
     BYTEn     --> |              |
                   +--------------+

                   +--------------+
     33        --> |              |    Dump trasmette al PC una sequenza di
     L_ADDR    --> |              |    LEN bytes leggendoli dalla memoria
     H_ADDR    --> |              |    dall'indirizzo ADDR (sia ROM che RAM).
     L_LEN     --> |     DUMP     |   
     H_LEN     --> |              |
     BYTE1     <-- |              |
       :           |              |
     BYTEn     <-- |              |
                   +--------------+
      
                   +--------------+
     34        --> |              |     Effettua una CALL
     L_ADDR    --> |     CALL     |     all'indirizzo specificato.
     H_ADDR    --> |              |     Puo' essere effettuata una RET
                   +--------------+



API  programmi


Tramite chiamate RST i programmi sviluppati per il TSP possono usare le subroutines di ricezione/trasmissione seriale del firmware.
Tenere presente che:

      .------------------------+------------------------.
      |        ROM 32K         |        RAM 32K         |
      '------------------------+------------------------'
       ^                        ^                      ^
       |                        |                      |
   0 --'                32768 --'              65535 --'
 


   Locazioni RAM riservate
   -----------------------
  
   65530  inizio stack (decresce verso indirizzi bassi)
   65531  codici per effettuare una call a programma utente
     :
   65534   
   65535  valore condiviso (out_val) per scrittura su porta out



.............completare.....................




Idea per bootloader

E' possibile usare una EEPROM parallela 8K AT28C64B al posto della EPROM.
L'unica modifica riguarda il pin 27 (A14 sulla EPROM e write sulla EEPROM).
E' così possibile scrivere un bootloader nella EEPROM da 8K, che attende un paio di secondi sulla seriale e poi avvia l'applicativo vero e proprio. All'indirizzo 0 va naturalmente messo un JP all'indirizzo del bootloader.

Siccome la EEPROM durante la scrittura diventa inaccessibile, è necessario che il bootloader prima di tutto ricopi il proprio codice in RAM (quindi questa parte di codice va assemblata con l' org adatto) e continui da li l'esecuzione.

Il bootloader deve impedire la propria sovrascrittura. Se durante l'aggiornamento qualcosa va storto, il bootloader in EEPROM non viene comunque toccato, quindi basta un reset e rifare la procedura.

Il TSP diventa quindi non solo "aggiornabile", ma anche utilizzabile anche come sistema "standalone" (eventualmente in grado di salvare in modo non volatile i propri dati di lavoro/configurazione usando una subroutine di scrittura in RAM per quanto detto prima).



Files

Sorgente assembly firmware per la EPROM (.txt)
Binario assemblato (.zip) ottenuto con pyZasm.


Sorgente assembly firmware provvisorio per la EPROM (.txt)
(Nota: le subroutines I2C e le chiamate RST sono ancora in sviluppo)
(i2c_nuovo.txt)


Disegno basetta superiore (.svg)
Disegno basetta inferiore (.svg)
Disegno schema elettrico (.svg)


Programma TUI Python (2.x e 3.x) per dialogo con TSP (.txt) (da rinominare in .py)


EPROM programmata con Arduino e il vecchio programmatore.