In uno dei miei precedenti articoli ho parlato di come ho realizzato un programmatore EEPROM per scrivere il codice nella memoria del computer che sto costruendo. Adesso è tempo di fare il primissimo test. Non ci serve ancora la RAM, perché per ora possiamo usare solo i registri interni della CPU… e la memoria non volatile del programma, ovviamente. Per questo test ho acquistato uno Z80 PIO, un’interfaccia parallela programmabile di input/output che ha 2 porta da 8 bit che possono essere usate per inviare/ricevere dati verso/da un dispositivo esterno come una tastiera, un display LCD o altro. In questo test accenderò semplicemente una serie di LED, giusto per vedere se possiamo inviare il classico messaggio “Hello, World!” in stile 8 bit.
Lo Z80 PIO (Parallel Input/Output) è stato realizzato da Zilog per lavorare specificatamente in abbinamento con la CPU Z80: infatti, è un membro della famiglia Z80, che include altri chip come il CTC ed il SIO. Ho scartato il MOS VIA che avevo inizialmente pensato di usare perché è stato progettato per lavorare in abbinamento alle CPU della famiglia 65xx di MOS e per tale motivo c’erano dei problemi da risolvere per far sì che questo chip potesse lavorare con il mio Z80, così ho pagato circa 6/7 euro ed ho comprato un nuovissimo Z80 PIO (sì! i chip della famiglia Z80 sono ancora in produzione!)
Ecco la piedinatura del PIO:
Scegliendo un chip della famiglia Z80 ho avuto un importante extra: posso connettere direttamente il PIO alla CPU Z80 senza chip aggiuntivi. Qui sotto ci sono i collegamenti più importanti che ho dovuto fare (una “/” prima del nome indica un segnale attivo basso):
- D0..D7: le linee dati – vanno collegate ai corrispondenti piedini dello Z80
- /M1: in aggiunta alle sue normali funzioni (è usato come impulso di sincronizzazione e per indicare quando la CPU sta recuperando un’istruzione dalla memoria), la linea /M1 è usata sul PIO insieme a quelle /RD e /IORQ per resettare il chip (scegliendo il formato DIP-40 Zilog ha dovuto sacrificare alcune linee, ed il reset è una di queste)
- /IORQ: usato per informare il PIO che la CPU sta accedendo ad un dispositivo di input/output
- /INT: usato per inviare un segnale di interrupt alla CPU (non lo useremo, però, in questi primi test)
- /RD: usato per inviare un segnale di “lettura” al PIO. Il pin /WR manca per lo stesso motivo di quello del reset, perciò Zilog ha inserito un piccolo circuito nel PIO che crea il segnale /WR a partire da quello /RD (/WR è l’inverso di /RD)
- CLK: va collegato al clock di sistema dello Z80
- B/A: questo segnale seleziona quale porta sarà usata durante un trasferimento dati (porta A o porta B)
- C/D: questo segnale seleziona il tipo di dato trasferito tra la CPU ed il PIO, se un byte di Controllo o di Dato
- /CE: questa è la linea “Chip Enable”, per attivare il PIO
Ci sono un sacco di altri pin ma, per il momento, li ignoreremo perché non li useremo in questo primo test. Vi ricordo solo di collegare un condensatore di disaccoppiamento (un ceramico da 0.1 uF) tra il pin +5V e la massa, un resistore di pull-up da 10 K sul pin /IEI (questo pin è usato per impostare il PIO come il chip con la più alta priorità nella catena di gestione degli interrupt dello Z80).
Leggendo la scheda tecnica del PIO si può vedere come, quando usati come output, i pin del PIO non sono in grado di erogare correnti molto elevate, anche se i pin della porta B sono in grado di pilotare dei transistor di tipo Darlington, perciò ho optato per interfacciare la porta B con un array di transistor Darlington ULN2803,, che può erogare fino a 500 mA, molto più di quanto necessario per accendere 8 LED. Per immagazzinare il nostro programma avevo 2 chip EEPROM, un Atmel AT28C256 ed un Hynix X28C256, entrambi con 256 Kbit, ossia 32 Kx8 bit. Ovviamente potete scegliere anche un chip meno capiente: considerate che, al momento, il programma occupa solo qualche dozzina di byte! Per collegare la EEPROM alla CPU realizzate i seguenti collegamenti:
- A0..A14 – per usare la EEPROM da 32 KB servono solo 15 linee indirizzo: il pin A15 dello Z80 viene lasciato scollegato
- D0..D7 – le linee dati
- /WE – collegare un resistore di pull-up da 10 K (questo pin è usato solo durante la programmazione della EEPROM)
- /OE – collegatelo direttamente al pin /RD della CPU
- /CE – questa è la linea “Chip Enable”. Dato che non ci sono altri chip di memoria, possiamo collegare questo pin direttamente al pin /MREQ della CPU così che la EEPROM sarà selezionata quando la CPU accederà alla memoria.
Abbiamo già visto il ircuito di reset e di clock. Perciò colleghiamo il pin CLOCK della CPU al circuito di clock ed il pin /RESET al circuito di reset. Non dimenticate le linee di alimentazione (ovviamente…) e l’onnipresente condensatore di disaccopiamento. Infine, collegate le linee di input dell’ULN2803 ai pin PB0..PB7 del PIO, collegate la massa (non collegate la linea COM) e fate i collegamenti ai LED: gli anodi ai 5 V, i catodi agli output della matrice di Darlington attraverso alcuni resistor (dei valori universali vanno da 330 a 680 ohm). Ecco lo schema finale:
Adesso possiamo programmare la EEPROM usando il nostro programmatore. Il codice sorgente assembly sarà presto disponibile sul mio repository GitHub, al momento non è ancora disponibile. Come ultima cosa alimentate il circuito e osservate i LED accendersi e spengersi in sequenza, come un orologio binario:
A presto per i test con la RAM…
Codice e schemi come sempre disponibili su questo repository GitHub.