Generatore di clock mediante NE 555
Selettore di modalità RUN/DMA.
La scheda, basata su microprocessore Z80, ha uno scopo didattico, essendo progettata per permettere l’analisi sperimentale del funzionamento di questo microprocessore.
Deve essere presente
Un generatore di clock che permetta di
avere due segnali di frequenza rispettivamente 20 Hz e 2 KHz
Un circuito di reset
Possibilità di operare in modalità DMA
Possibilità di visualizzare mediante
opportuni display lo stato dei bus durante i vari cicli possibili
Presenza di un connettore per
collegare questa scheda a schede di espansione di memoria e IO
Come appare dallo schema, si è usato come generatore di clock, il timer NE555
Consideriamo la seguente figura
L’integrato
NE555 è quello racchiuso dalla linea tratteggiata. Si nota, all’interno
dell’integrato, un latch di tipo SR. Un latch di tipo SR è un circuito
sequenziale con due ingressi denominati S ed R e due uscite Q e Q che soddisfano alla seguente tabella
S |
R |
Q |
Q\ |
0 |
0 |
Q |
Q\ |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
X |
X |
La prima combinazione degli ingressi fa in modo che le uscite permangano ai valori che avevano precedentemente. L’ultima combinazione non è utilizzata. Come si può notare dalla figura, i segnali S ed R sono ricavati dalle uscite di due comparatori (individuati dai due simboli triangolari). Inoltre il latch contenuto nell’integrato presenta la sola uscita negata. Un comparatore di tensione è un dispositivo che presenta un’uscita e due morsetti individuati rispettivamente con un + ed un –
Questo dispositivo confronta le due tensioni V1 e
V2 presenti agli ingressi dell’operazionale. Se V1 > V2,
l’uscita si porta a livello logico alto, se V1 < V2 l’uscita
si porta a livello logico basso. La condizione V1 = V2
seppur logicamente possibile, non può, in realtà verificarsi in quanto, essendo
il comparatore estremamente sensibile, basta una differenza infinitesima fra i
due segnali a far scattare il comparatore. All’interno del NE555 vi è un
partitore resistivo costituito da tre resistenze in serie da 5 kohm. Ne deriva
che al morsetto - del comparatore B
arriva una tensione pari a mentre al morsetto +
del comparatore A giunge la tensione di
. I componenti che, nella figura, appaiono all’esterno della
linea tratteggiata non fanno parte dell’integrato e sono aggiunti per fare in
modo che esso si comporti come un circuito astabile. Un circuito astabile è
un circuito che non presenta ingresso e la cui uscita . Il condensatore da 10
nF collegato al piedino 5 ha lo scopo di mantenere stabile la tensione fornita
dal partitore resistivo.
All’accensione il condensatore C alla sinistra del circuito è resettato
per
cui al morsetto + del comparatore B giunge una tensione nulla. Poiché al
morsetto – giunge una tensione superiore, l’uscita del comparatore B è pari a
0. inversamente per il comparatore A, abbiamo al morsetto – una tensione nulla
per cui questa è inferiore a quella al morsetto + e l’uscita è a livello logico
alto. Si ha che S = 1 ed R = 0, il latch è settato per cui Q = 1 e Q = 0. Ma quest’ultimo comanda la base del BJT
che risulterà, pertanto, in interdizione. Poiché un transistor in interdizione
si comporta da circuito aperto, il condensatore C risulta collegato, attraverso
le resistenze R1 ed R2 alla tensione di alimentazione VCC per cui
può caricarsi
La tensione ai capi del condensatore aumenta. Ad un certo
istante essa raggiungerà il valore , per cui l’uscita
del comparatore A passerà dal valore logico 1 al valore logico zero. Per quanto
riguarda il comparatore B, a questo punto la tensione al morsetto + è ancora
inferiore a quella presente al morsetto – per cui la sua uscita permane al
livello logico zero. Gli ingressi del latch RS sono allora S = 0 ed R = 0.
dalla tabella precedente si vede che le uscite permangono al livello precedente
per cui il BJT resta interdetto e il condensatore continua a caricarsi. Quando
la sua tensione giunge al valore
, l’uscita del comparatore B passa al valore logico uno. Gli
ingressi del latch diventano S = 0 ed R = 1 e le uscite commutano a Q = 0 e
=1. il BJT va in saturazione trasformandosi in un corto
circuito. Da questo momento il condensatore C, attraverso la resistenza R2 ed
il BJT viene posto a massa
e, quindi scarica
Quando la tensione del condensatore
scende di nuovo al di sotto del valore si ha di nuovo la
condizione S =1 ed R = 0, per cui l’uscita
va di nuovo a zero,
conseguentemente il BJT va di nuovo in interdizione ed il condensatore risulta
di nuovo collegato alla VCC e si può ricaricare di nuovo. Da questo momento la
tensione del condensatore oscillerà fra
e
. Si osservi che, quando il condensatore sta caricando si ha
= 0 per cui l’uscita dell’integrato, essendo negata sarà a
livello logico uno. Invece, quando il condensatore sta scaricando, si ha
= 1 per cui l’uscita
dell’integrato va a zero.
Otteniamo dunque, un’onda quadra. Per calcolare il periodo e il duty cycle della stessa dovremmo effettuare alcuni calcoli, ma possiamo già osservare che il tempo tH durante il quale l’uscita è alta dipende dal tempo che il condensatore mette a caricarsi, per cui è proporzionale alla tau di carica, che a sua volta è pari a
τC = C(R1 + R2). Analogamente il tempo tL durante il quale l’onda rimane a livello basso sarà proporzionale al tempo di scarica, a sua volta proporzionale alla tau di scarica τS= C(R2), ne deriva che tH deve necessariamente essere superiore a tL per cui
cioè il duty cycle è
Ora dobbiamo trovare una formula di progetto che leghi i valori delle capacità e resistenze inserite nel circuito al valore di frequenza che si vuole ottenere.
L’equazione differenziale che regge il fenomeno della carica e scarica in un circuito RC ha per soluzione generale la seguente espressione
dove A e B sono due costanti che dipendono dalle condizioni iniziali. Cerchiamo, allora di calcolare il tempo tH e supponiamo di fissare l’istante iniziale t = 0, proprio quando il condensatore inizia a caricarsi.
per t = 0 si ha , quindi
Ora notiamo che, se il condensatore fosse lasciato libero di caricarsi, in un tempo infinito avremmo
abbiamo allora che
la legge che regola nel nostro caso, la carica e scarica di un condensatore è allora
dal grafico si vede che per t = tH , quindi
ripetiamo lo stesso procedimento per la scarica, ponendo t = 0 all’istante in cui comincia a scaricarsi il condensatore
per t = 0 si ha ,
Ora notiamo che, se il condensatore fosse lasciato libero di scaricarsi, in un tempo infinito avremmo
dal grafico si vede che per t = tL , quindi
Il periodo dell’onda quadra è allora
Se adesso, andiamo al nostro progetto, vediamo che tra i piedini 6 e 7, è collegata una resistenza chiamata R5, mentre tra i morsetti 4 e 7 è collegata una resistenza R4; confrontando con lo schema di principio vediamo allora che R5 corrisponde ad R2 ed R4 ad R1.
Vediamo come R4 = 820 Ω << R5 = 5600 Ω
Come richiesto per avere un duty cicle praticamente del 50%. Inoltre vediamo che, se l’interruttore S3 è aperto, la capacità collegata ai piedini 6 e 2 del NE555 ha un valore di 10 nF, per cui otteniamo un clock di frequenza
Invece, se S3 è chiuso si ha che la capacità totale è
per cui
Da notare che C13 è il condensatore che serve per stabilizzare la tensione del partitore di resistenze.
La resistenza R6 è una resistenza di pull-up per il corretto interfacciamento del timer con lo Z80.
Il circuito di master – reset ha lo scopo di assicurare che il microprocessore venga resettato all’accensione della scheda o quando lo decide l’utilizzatore premendo un opportuno pulsante.
Ricordiamo che è essenziale che il microprocessore venga resettato all’accensione della scheda poiché, altrimenti, i suoi registri interni potrebbero porsi in uno stato iniziale aleatorio, casuale.
Il diodo D1 serve solo come protezione da eventuali sovraelongazioni negative della tensione che, infatti, lo polarizzerebbero positivamente mentre, normalmente esso è polarizzato inversamente.
Quando si dà alimentazione alla scheda, il condensatore C tende a caricarsi attraverso R1. La tensione del condensatore è in ingresso ad una NOT triggerata. Una NOT triggerata ha la seguente caratteristica di trasferimento
Da questa curva si vede che, quando la tensione di ingresso cresce partendo da zero, se non supera il valore V+, la tensione di uscita rimane sempre al valore logico alto mentre se la tensione di ingresso sta scendendo, finchè essa non scende al di sotto del valore di soglia V- , la tensione di uscita rimane sempre a livello logico basso. Allora la situazione è la seguente
Ora bisogna ricordare che, affinché sia efficace, la durata dell’impulso di reset deve essere pari ad almeno 3 cicli di clock, il che vuol dire, alla frequenza di 20 KHz, che deve essere
Dal diagramma vediamo che l’impulso di reset torna alto quando vc raggiunge il valore di soglia V+ che si può ricavare dai data sheet, e vale tipicamente 2 volt e VCC = 5 volt, mentre V- tipicamente vale 1,2 volt. Poiché la relazione che determina la carica del condensatore è, in questo caso
si ha che l’istante t+ in cui termina il reset è
cioè deve essere
Posto R1 = 10 KΩ e C10 =10 μF si ha
molto maggiore del valore richiesto, mentre non vale per f = 2Hz dove dovrebbe essere
In questo caso non resta che effettuare il reset manuale premendo il pulsante S1. chiudendo S1 il condensatore scarica molto rapidamente a massa essendo la resistenza offerta dal pulsante chiuso, molto bassa
In generale, in una scheda con microprocessore questi è il master della piastra, cioè colui che gestisce i bus intorno a cui la piastra è organizzata; quindi è il microprocessore che decide quali integrati possono o meno collegarsi ai bus o devono invece sconnettersi ponendo le loro uscite in three-state. In altri casi, quali la presenza di più microprocessori sulla scheda o la presenza di un coprocessori matematico, ci può essere un altro dispositivo che fa da master, detto DMA (direct memory access) che permette la gestione della memoria e del IO al di fuori del microprocessore, e gestisce autonomamente tutti i riferimenti dati tra memoria e memoria, IO e IO e memoria e IO.
Nel nostro caso specifico non c’è un dispositivo di questo tipo, però vogliamo fare in modo da poter agire direttamente sul contenuto della memoria collegata in una scheda separata, senza l’intervento del microprocessore. In sostanza, in questa modalità, volgiamo poter chiedere al microprocessore di staccarsi dai bus ponendo le sue uscite in three state. A tale scopo lo Z80 è munito di un piedino d’ingresso detto BUSREQUEST; uno zero logico in ingresso a questo piedino costringe il microprocessore a staccarsi dai bus e ad emettere un segnale di risposta ponendo a zero l’uscita BUSAK (bus acknowledgment).
Nel nostro progetto si nota che il piedino di busrequest è collegato all’interruttore S2, per cui se questo è aperto la resistenza di pull up R2 tiene il piedino a livello alto, mentre quando il pulsante è chiuso, il piedino di BUSAK viene portato a massa, portando la scheda in modalità DMA. Si nota anche la presenza del diodo led D2 che, quando è acceso, indica che stiamo lavorando in modalità DMA. Infatti la linea BISAK è collegata, tramite due not triggerate, al catodo del led il cui anodo è a VCC. Le due not in cascata non hanno alcuna funzione logica, in quanto la doppia negazione di una variabile booleana restituisce il su valore originario. Le due not però rendono il led insensibile ai disturbi e sarebbero comunque rimaste inutilizzate (ricordiamo che l’integrato 74ls14 presenta 6 not disponibili). La resistenza R3 serve a limitare la corrente che circola nel led (in un led in polarizzazione diretta può circolare una corrente ID compresa fra 10 e 20 mA).
Allora, detta VOL la tensione di uscita a livello logico basso della NOT (dai data sheet si vede che ha un valore tipico di 0,2 e max di 0,4 volt)
Si può vedere come i piedini dello Z80 non siano collegati direttamente ai avri dispositivi e al connettore presente sulla piastra, ma siano interfacciati con buffer di vario tipo. Analizzando i data sheet dello Z80, si nota che un su piedino eroga, quando a livello alto, una corrente IOH di circa 250 μA e, a livello basso,assorbe una corrente IOL di circa 2 mA, presentando, quindi, un fan-out molto modesto. In pratica il μP non sarebbe in grado di pilotare i vari dispositivi presenti nella scheda. Se analizziamo i dati sheet, ad esempio del buffer 74244, questo presenta una IOH di 15 mA e una IOL di 24 mA (il fan out sale a 12). Inoltre la presenza di un buffer sui bus preserva lo Z80 dai danni dovuti a cortocircuiti sul bus. Vediamo che il bus indirizzi è interfacciato con due buffer a 8 bit 74LS244 che sono unidirezionali essendo il bus indirizzi unidirezionale.
La struttura interna di un 74LS244 è la seguente.
Come si può vedere, ogni ingresso è interfacciato con la relativa uscita mediante una porta three state, triggerata per migliorare l’immunità al rumore, che ha un’abilitazione attiva alta. Gli 8 ingressi sono divisi in due gruppi, ciascuno dei quali ha un’abilitazione attiva bassa che passa attraverso una not.
La struttura interna del 74245 è quella presentata alla figura seguente.
Come si può vedere, l’abilitazione è unica per tutti e 8
gli ingressi, mentre il segnale DIR indica se i dati devono andare da A a B o
viceversa. Infatti se
= 0 e DIR = 1, la AND di sinistra da un 1 in uscita e la AND
di destra da uno 0 in uscita, per cui le porte a sinistra sono abilitate ed i
segnali passano dai piedinio A ai piedini B, mentre le porte di destra sono in
alta impedenza. Viceversa se
= 0 e DIR = 0, i dati
vanno da B ad A. Nel nostro progetto vogliamo che i buffer vadano in alta
impedenza quando il μP ha le sue uscite in alta impedenza, cioè quando
lavoriamo in DMA o resettiamo la cPU. Per far questo colleghiamo le
abilitazioni di tutti i buffer all’uscita di una OR i cui ingressi sono il
segnale negato di
ed il segnale RESche
è ricavato tra le due NOT del circuito di master reset per cui è il negato di
.
Allora, se stiamo resettando al CPU, = 0, per cui RES = 1.
avendo almeno un ingreso alto, la OR ha l’uscita a livello logico alto. Se
stiamo in modalità DMA,
= 0 per cui BUSAK = 1
e anche in questo caso
= 1. in entrambi i casi i buffer sono disabilitati.
Per quanto riguarda, in particolare, il buffer 74LS245,
occorre realizzare la circuiteria di comando del segnale DIR. Nella nostra
soluzione esso è ricavato dalla negazione del segnale di WRITE. Infatti, se il
microprocessore è impegnato in un ciclo di lettura, i dati devono viaggiare nel
buffer dai piedini A ai piedini B, ed, in effetti, in un ciclo di scrittura si
ha = 0, DIR = 1.
Viceversa, in un ciclo di lettura, i dati devono andare dai piedini B ai
piedini A e, poiché
= 1, DIR = 0, accade
esattamente questo.
Display
Come da specifiche di progetto, i bus sono collegati a display per visualizzare il contenuto dei bus stessi. Ogni display può visualizzare una cifra esadecimali, cioè il contenuto di un nibble (4 bit), per cui occorrono 4 display per visualizzare il contenuto del bus indirizzi e due per il contenuto del bus dati.
Come si può notare, sono display in cui è integrato anche il decoder che comanda i segmenti interni. In particolare si nota la presenza del segnale LS (latch strobe). Quando LS = 1 viene congelato l’ultimo dato visualizzato e il display non insegue l’andamento delle quattro linee di ingresso. Invece, per LS = 0, il display insegue l’andamento degli ingressi, per cui visualizza istante per istante, ciò che è presente sugli ingressi. Poiché questa è la condizione che a noi interessa, tutti gli ingressi LS sono posti a massa.
Il segnale BI (blanking input) a livello 1 spegne i segmenti
mentre a livello zero consente la visualizzazione degli ingressi. I segnali BI
sono ricavati dall’uscita di un commutatore a 5 ingressi. Quando il commutatore
è posto nella prima posizione, il NI è ricavato da , per cui i display verranno accesi soltanto in presenza di
operazioni di ingresso/uscita. Analogamente, nella seconda posizione, i display
visualizzeranno i contenuti del bus solo se la scheda è in modalità DMA e così
via. Per la quarta posizione si noti che, essendo un ingresso della OR
sicuramente a zero, questa porta non ha alcuna funzione logica. Infatti si ha
+0 =
. Però questa OR è una delle due porte che rimanevano
inutilizzate dell’integrato e, comunque, gli ingressi di una porta di un IC non
utilizzata, vanno fissati in qualche modo onde evitare che possano generare
disturbi. Per l’ultima posizione che è relativa al ciclo di fetch, vanno messi
in OR sia
che
. Ricordiamo, infatti, che la fase di fetch è caratterizzata
dall’aver questi due segnali entrambi a zero.
Notiamo infine che i segnali di controllo sono anch’essi
bufferizzati tramite il buffer 74LS367, la cui struttura interna è del tutto
analoga a quella dei buffer precedentemente descritti. L’unica differenza è che
abbiamo 6 ingressi divisi in un gruppo di 4 comandato dall’ingresso e un gruppo di due ingressi comandato dall’ingresso di
abilitazione
. Il primo gruppo è abilitato come tutti gli altri; del
secondo gruppo M1 non ci interessa nelle schede di espansione, mentre
deve essere
necessariamente inviato alle schede di espansione per segnalare quando il
microprocessore si trova in modalità DMA. Per questo il segnale di abilitazione
vien post a massa, in
modo che abiliti sempre i due ingressi cui sovrintende.
Si noti, inoltre, la presenza di un connettore a barretta J2 a cui vanno i segnali di controllo, al quale si possono collegare i puntali di un oscilloscopio per poter, in tal modo, analizzare le forme d’onda dei vari segnali.
Infine abbiamo i condensatori da C1 a C7 di 100 nF, che vanno posti in parallelo fra i piedini VCC e GND di ogni integrato presente sulla piastra. Questi sono i condensatori di disaccoppiamento delle alimentazioni. Infatti un IC TTL , durante le transizioni delle sue uscite dal livello basso a quello alto, assorbe per brevi intervalli di tempo correnti superiori alla media, provocando però dei disturbi di tensione agli altri intervalli. La presenza di un condensatore crea un’inerzia che protegge gli altri integrati da questi sbalzi di tensione.