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)

dip.gif (6607 byte)

anibar.gif (4416 byte)

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


nome

_____
BUSY


ACK


PAPER OUT


SELECTED


ERROR


1


1


1

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.

ris1.gif (5532 byte)

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.

semaforo.gif (43050 byte)

Funzionamento diurno

giallo.gif (10319 byte)

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

Ritorna alla traccia