Risoluzione del compito di Sistemi
classe 5 ET sez. D - I.T.I. "Panetti" B A R I
(a cura del prof. Giuseppe Spalierno- 3 aprile 1999)
Risposta al quesito 1.
Il connettore dell'interfaccia Centronics, posto sul retro del PC, è di tipo D a 25 poli femmina.
Tabella 1
Pin | Nome | Direzione | Descrizione |
---|---|---|---|
1 | /STROBE | ==> | Strobe |
2 | D0 | ==> | Data Bit 0 |
3 | D1 | ==> | Data Bit 1 |
4 | D2 | ==> | Data Bit 2 |
5 | D3 | ==> | Data Bit 3 |
6 | D4 | ==> | Data Bit 4 |
7 | D5 | ==> | Data Bit 5 |
8 | D6 | ==> | Data Bit 6 |
9 | D7 | ==> | Data Bit 7 |
10 | /ACK | <== | Acknowledge |
11 | BUSY | <== | Busy |
12 | PE | <== | Paper End |
13 | SELIN | <== | Select In |
14 | /AUTOFD | ==> | Autofeed |
15 | /ERROR | <== | Error |
16 | /INIT | ==> | Initialize |
17 | /SEL | ==> | Select |
18 | GND | Signal Ground | |
19 | GND | Signal Ground | |
20 | GND | Signal Ground | |
21 | GND | Signal Ground | |
22 | GND | Signal Ground | |
23 | GND | Signal Ground | |
24 | GND | Signal Ground | |
25 | GND | Signal Ground |
I bit D7...D0 rappresentano il byte di uscita del computer all'indirizzo 88810
(378H).
I bit posti sui pin 10, 11, 12, 13, 15 sono di ingresso al PC all'indirizzo 88910
(379H) ed hanno i seguenti significati:
BUSY (pin 11) vale 128 se è al livello basso (logica negativa).
ACK (pin 10) vale 64 se è al livello alto (logica positiva).
PAPER OUT (pin 12) vale 32 se è al livello alto (logica positiva).
SELECTED (pin 13) vale 16 se è al livello alto (logica positiva).
ERROR (pin 15) vale 8 se è al livello alto (logica positiva).
Tabella 2
|
_____ |
|
|
|
|
|
|
|
pin |
11 | 10 | 12 | 13 | 15 | |||
valore |
128 | 64 | 32 | 16 | 8 | 4 |
2 | 1 |
I rimanenti 3 bit meno significativi del byte di ingresso non sono accessibili sul connettore e sono posti, internamente, al livello alto (1112 = 710 ).
Alla luce di quanto detto, pertanto, si decide di collegare alle uscite D0, D1 e D2 i led verde, giallo e rosso del semaforo principale e alle uscite D4, D5 e D6 i led verde giallo e rosso del semaforo secondario.
I due ingressi S (semafori spenti) ed L (semafori lampeggianti) vengono collegati alle linee di ingresso ERROR (pin 15 con valore 8) e SELECTED (pin 13 con valore 16). La scelta delle due linee è stata assolutamente arbitraria.
Risposta al quesito 2.
Nella seguente figura si riporta lo schema elettrico proposto che fa uso di un collegamento passivo in logica positiva per l'accensione di un LED. Consideriamo, ad esempio, il LED verde della strada principale. Quando l'uscita D0 è al livello logico alto sul pin 2 del connettore di interfaccia Centronics è presente una tensione VOH approssimabile a circa 4V. Se la tensione di caduta sul LED VL è di circa 2V, il dimensionamento della resistenza R1 per limitare l'intensità di corrente a 5mA per una sufficiente luminosità fornisce il valore: R1=(VOH-VL)/I=400 Ohm. Gli interruttori S ed L, se aperti, forniscono il livello logico alto agli ingressi pin 15 e pin 13 grazie alla presenza di due resistenze di pull- up di valore intorno a 10K Ohm. La chiusura di un interruttore comanda il relativo ingresso col livello logico basso poiché il contatto di destra di ciascun interruttore è collegato a massa. |
Risposta al quesito 3.
Per risolvere il quesito 3 si può riproporre la tabella fornita nella traccia indicando, al posto dei secondi di funzionamento, lo stato logico della relativa linea. Si ottiene, pertanto, la seguente tabella che mostra nell'ultima colonna il codice numerico da fornire per pilotare i led correttamente.
semaforo | SECONDARIO |
PRINCIPALE |
codice |
||||||
peso bit | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
colore | R | G | V | R | G | V | |||
VP | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 65 |
GP | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 66 |
RP | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 68 |
VS | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 20 |
GS | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 36 |
RS | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 68 |
tutto spento | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
gialli accesi | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 34 |
Risposta al quesito 4.
Il programma da realizzare deve leggere lo stato degli interruttori di ingresso S ed L e, in funzione di questi, deve attivare il ciclo giorno, il ciclo notte (gialli lampeggianti) o spegnere l'impianto.
Le linee S ed L sono applicate agli ingressi 15 (di valore 8) e 13 (di valore 16) dell'interfaccia Centronics avente indirizzo di periferica 889. La lettura di tale indirizzo fornisce un codice binario compreso tra 0 e 255 da cui estrarre i valori di S ed L.
Una soluzione è la seguente:
X = INP(889) | S = ( X AND 8 ) / 8 | L = ( X AND 16) / 16 |
Con questo algoritmo si ha: S = 1 se l'interruttore è aperto e S = 0 se l'interruttore è chiuso. Analogamente per L.
Il software testa il valore di S e spegne i semafori se S=1. Per spegnere i semafori si deve inviare, all'indirizzo di periferica 888, il codice 0 come si evince dalla precedente tabella: OUT 888, 0.
Si attende un intervallo di tempo prestabilito (qualche secondo o qualche minuto) tramite una routine di ritardo (in Q-Basic è sufficiente l'istruzione SLEEP n% ove n% è il numero di secondi in cui il computer resta fermo) e successivamente, se non è premuto alcun tasto sulla tastiera del PC, il programma ritorna ad acquisire il byte presente all'indirizzo 889.
Se, invece, S = 0, il programma procede con il controllo di L.
Se L = 1 si entra nel ciclo notte consistente in un lampeggio intermittente dei gialli. Per far ciò si attiva l'istruzione OUT 888, 34 che consente l'accensione dei gialli, si esegue l'istruzione SLEEP specificando i secondi di "fermo", una successiva istruzione OUT 888,0 per spegnere i semafori e una conclusiva istruzione SLEEP. Se, nel frattempo, non è premuto alcun tasto sulla tastiera del PC, il programma ritorna ad acquisire il byte presente all'indirizzo 889.
Se, infine, anche L = 0 si entra nel ciclo giorno caratterizzato da sei fasi di funzionamento ognuno con un suo tempo proprio di durata come previsto nella precedente tabella.
La pressione di un tasto sulla tastiera deve consentire la fine del programma.
(Si omette la composizione grafica del flow-chart)
Risposta al quesito 5.
Il software di seguito proposto consente la visualizzazione grafica sul monitor dei due semafori così come avviene nella realtà.
Le leggere discordanze con le specifiche imposte dalla traccia sono state dettate da motivi di messa a punto del programma. Pochi e semplici interventi sul listato consentono di personalizzare a proprio piacimento la gestione dell'impianto semaforico proposto.
Si forniscono, infine, due immagini gif animate, ricavate dal programma dopo una semplice elaborazione grafica, che mostrano il funzionamento diurno e notturno del semaforo.
Funzionamento diurno
Funzionamento notturno.
Listato del programma:
'************************************ ' 5D_SEMA3.BAS * ' Gestione di un semaforo * ' 30.03.99 * '************************************
DECLARE SUB semaforo () DECLARE SUB giorno (n!) DECLARE SUB spegni ()
DATA 65,66,68,20,36,68 DATA 10,5,2,5,5,2 FOR i = 1 TO 6: READ codice%(i): NEXT i FOR i = 1 TO 6: READ durata%(i): NEXT i
COLOR 7, 1: CLS : BEEP: F = 0 SCREEN 12: WINDOW (0, 0)-(639, 479): semaforo
DO IF F = 0 THEN A = INP(889) S = 1 - (A AND 8) / 8: ' S=1 se l'interruttore S e' chiuso L = 1 - (A AND 16) / 16: ' L=1 se l'interruttore L e' chiuso END IF IF S = 1 THEN OUT 888, 0: ' Semafori spenti spegni SLEEP 2 ELSEIF L = 1 THEN OUT 888, 0: ' Gialli lampeggianti spegni SLEEP 1 OUT 888, 34 PAINT (128, 256), 14, 15 PAINT (512, 256), 14, 15 SLEEP 1 ELSE FOR i = 1 TO 6: ' Ciclo giorno giorno (i) OUT 888, codice%(i) SLEEP (durata%(i)) NEXT i END IF A$ = INKEY$ F = 0 IF A$ = "S" OR A$ = "s" THEN S = 1: F = 1 IF A$ = "N" OR A$ = "n" THEN S = 0: L = 1: F = 1 IF A$ = "D" OR A$ = "d" THEN S = 0: L = 0: F = 1 LOOP WHILE A$ = "" OR F = 1 OUT 888, 0 SCREEN 0 END
' ------------------------------------------ ' SEMAFORO SECONDARIO PRINCIPALE N. ' PESO BIT 128 64 32 16 8 4 2 1 ' COLORE R G V R G V ' ------------------------------------------ ' VERDE PRINC. 1 0 0 0 0 0 1 65 ' GIALLO PRINC. 1 0 0 0 0 1 0 66 ' ROSSO PRINC. 1 0 0 0 1 0 0 68 ' VERDE SECOND. 0 0 1 0 1 0 0 20 ' GIALLO SECOND. 0 1 0 0 1 0 0 36 ' ROSSO SECOND. 1 0 0 0 1 0 0 68 ' ------------------------------------------ ' SEMAFORO SPENTO 0 0 0 0 0 0 0 0 ' GIALLI ACCESI 0 1 0 0 0 1 0 34 ' ------------------------------------------ ' Ingressi: ' S al pin 15 (peso 8) ' L al pin 13 (peso 16) ' N.B. La chiusura dell'interruttore S pone S=0. ' Il software commuta tale linea: S=1-S. ' Idem per la linea L.
SUB giorno (n) spegni DIM C(3) C(1) = 2: C(2) = 14: C(3) = 4 IF n < 4 THEN PAINT (128, 128 * n), C(n), 15 PAINT (512, 384), 4, 15 ELSE PAINT (512, 128 * (n - 3)), C(n - 3), 15 PAINT (128, 384), 4, 15 END IF END SUB
SUB semaforo CLS LOCATE 1, 12: PRINT "PRINCIPALE" LOCATE 1, 60: PRINT "SECONDARIO" LOCATE 29, 15 PRINT "Funzionamento: S=SPENTI; N=NOTTURNO; D=DIURNO"; LINE (64, 64)-(192, 448), 14, B LINE (60, 60)-(196, 452), 14, B PAINT (62, 62), 14, 14 FOR Y = 128 TO 384 STEP 128 CIRCLE (128, Y), 51, 15 CIRCLE (128, Y), 54, 15 PAINT (180, Y), 15, 15 NEXT Y LINE (448, 64)-(576, 448), 14, B LINE (444, 60)-(580, 452), 14, B PAINT (446, 62), 14, 14 FOR Y = 128 TO 384 STEP 128 CIRCLE (512, Y), 51, 15 CIRCLE (512, Y), 54, 15 PAINT (564, Y), 15, 15 NEXT Y END SUB
SUB spegni FOR Y = 128 TO 384 STEP 128 FOR X = 128 TO 512 STEP 384 PAINT (X, Y), 0, 15: NEXT X, Y
END SUB