Lei ha un po' travisato il problema originale,
in cui le elaborazioni dovevano essere fatte dalla CPU e l'interfaccia
avrebbe dovuto solo fare acquisizione e controllo, ma ovviamente e' meglio
cosi'. Solo, avrebbe dovuto spingersi ancora piu' in la', come vedremo
piu' avanti. Ma andiamo con ordine.
(1) Non e' necessario che le letture di temperatura siano ugualmente
spaziate nel tempo l'una dall'altra. Una soluzione alternativa (che le
avrebbe anche risparmiato la questione del modulo di conteggio a 5/16)
poteva anche consistere nel generare un opportuno segnale con periodo di 5
secondi, e con questo far partire il ciclo di 16 acquisizioni/controlli ad
alta velocita'.
(2) Trattandosi di sensori di temperatura, ossia di una grandezza che
varia molto lentamente rispetto ai tempi dell'elettronica, potremmo anche
fare a meno dei registri di ingresso e leggere direttamente il dato,
avendo probabilita' praticamente uguale a 1 di trovare il dato stabile.
(3) Il Multiplexer e' privo di ingressi di selezione; evidentemente,
questi devono essere prelevati dalle uscite del contatore mod 16.
(4) Come normale convenzione normale, ai bit di un dato si assegnano
gli indici piu' bassi ai bit meno significativi e quelli piu' alti ai bit
piu' significativi. Lei invece nel desegno ha assunto che il bit di segno
abbia indice 0.
(5) L'analisi della comparazione di due numeri in complemento a 2 va
benissimo. Tuttavia, lei dice: "Siccome mi viene richiesto che devo
mandare una richiesta di spegnimento elemento se Ti>Ni allora prelevo
l'uscita Ti0<Ni0 (infatti Ti>Ni se il suo primo bit è 0 e Ni0 è
1). Questa uscita mi dovrà andare a pilore una richiesta di
spegnimento." Ma, nel caso Ti0 = Ni0 (valori con lo stesso segno) lei
utilizza l'uscita di sinistra del comparatore a 7 bit che, in mancanza di
indicazioni in merito, io presumo essere l'uscita Ti(1-7) < Ni(1-7)
(con lo stesso ordine cioe' delle uscite sul comparatore a 1 bit); mentre
invece dovrebbe usare l'uscita Ti(1-7) > Ni(1-7).
(6) Analogamente per l'altro gruppo di comparazione: volendo mandare
una richiesta di accensione nel caso Ti < Mi, e' giusto prelevare
l'uscita < dal comparatore a 7 bit nel caso di segni uguali, non e'
corretto prelevare l'uscita segno(T) < segno(M) nel caso di segni
discordi -- va invece usata l'uscita segno(T) > segno(M), attiva quando
T < 0 e M >= 0.
(7) Visto che lei suppone di avere in ROM le temperature di soglia,
perche' mai allora mandare alla CPU le richieste di spegnimento e di
accensione, anziche' risolverle direttamente in hardware? E' sufficiente
usare un flip-flop per ciascun elemento riscaldante, forzarlo in ON al
posto dell'invio di una "richiesta di accensione", forzarlo in
OFF in presenza di una "richiesta di spegnimento", e lasciarne
lo stato immutato se la temperatura letta e' compresa nel range definito
dalle due soglie M, N.
(8) In ogni caso, mai una singola interfaccia invia due distinte
richieste di interrupt. Qualora occorra discriminare tra due diverse cause
di richiesta, e' sufficiente inviare un diverso Interrupt Vector Number
per ciascuna possibile richiesta. Le faccio anche notare che la porta OR
tra l'uscita Q e l'ingresso D del flip-flop puo' essere eliminata
sostituendo il flip-flop D con un flip-flop JK avente l'ingresso K fisso a
0 e l'ingresso J connesso alla sorgente della richiesta.
Lei chiede inoltre:
"1) So che è possibile modificare un Ck usando i contatori,
ma non ho mai visto usare un contatore mod 5/16. E' utilizzabile? Se non
lo è come avrei potuto crearmi un Ck con sedici colpi in 5
secondi?"
Un'alternativa a questo dilemma l'abbiamo gia' vista alla voce (1).
D'altra parte, (5/16) * 10^8 = 31250000 = (5 * 2^8 * 5^8) / (2^4) = (5^9 *
2^4), e dunque basta utilizzare una cascata di 9 contatori mod 5 seguita
da un contatore mod 16.
"2) La parte di interrupt la applico un po’ meccanicamente
in base a quello che ho capito a lezione. Tuttavia ci sono casi in cui
mando i segnali di richiesta di interruzione (nel mio caso Ric1 e
Ric2)anche alla porta and che pilota il tri-state e casi in cui non va a
pilotare tale porta. Quando si deve mandare in questa and del tri-state
e quando no?"
Abbiamo gia' visto che la CPU, date le premesse, puo' benissimo non
intervenire affatto nel processo. In ogni caso, mai condizionare le porte
AND tra IORD e SEL con alcunche': se vogliamo impedire alla CPU di leggere
il dato, ovviamente non ci riusciamo -- la CPU va a leggere a proprio
piacimento; d'altra parte, se va a leggere quando il dato non e' ancora
pronto, che legga un dato fasullo o che legga cio' che trova su un bus non
pilotato da un tri-state attivo (che e' un dato altrettanto fasullo), e'
evidentemente del tutto irrilevante. |