Progetto: Gestione del traffico su di un ponte mediante microprocessori
PROGETTO
Il traffico a senso unico
su di un ponte è regolato da un semaforo a tre luci aventi, nel ciclo normale,
le seguenti temporizzazioni: giallo 10 s, rosso 50 s,
verde 120s.
Allo scopo di tenere sotto osservazione le deformazioni
causate dal traffico, si è deciso di posizionare, in particolari punti della
struttura, otto sensori aventi la proprietà di rilevare spostamenti positivi e
negativi rispetto allo zero (assenza di deformazione), fornendo all’uscita una
tensione che è nulla a riposo e che varia linearmente di 100 mV per ogni mm di
spostamento. Se almeno uno dei sensori rileva uno spostamento di ampiezza di 1
cm (valore di soglia), deve essere attuato un ciclo di emergenza così strutturato:
giallo 10 s, rosso 80 s, verde 90 s.
Quanto
richiesto viene realizzato con un sistema a microprocessore attivando una
procedura di interruzione. Le funzioni che deve svolgere il microprocessore
sono le seguenti:
-
gestire la temporizzazione delle luci semaforiche,
disponendo di un’onda quadra di periodo 1 s;
-
tramite procedura d’interruzione, attivata dal superamento
del valore di soglia, iniziare il ciclo di emergenza partendo dal giallo;
-
dopo tre cicli di emergenza, ripristinare il ciclo
normale;
-
durante i tre cicli di emergenza trascurare ulteriori
superamenti del valore di soglia;
-
ogni trenta minuti trasmettere ad un centro di
sorveglianza lontano 3 km il numero di interruzioni verificatesi dopo l’ultimo
invio.
COMPARATORE SOGLIA
SUPERIORE AMPLIFI-CATORE SENSORE DI DEFORMAZIONE
1 ![]()
![]()
![]()
![]()
![]()
U1
COMPARATORE SOGLIA
INFERIORE
![]()
![]()
![]()
![]()
COMPARATORE SOGLIA
SUPERIORE SENSORE DI DEFORMAZIONE 2 AMPLIFI-CATORE
![]()
![]()
![]()
![]()
![]()
U2
![]()
![]()

SENSORE DI DEFORMAZIONE 3 AMPLIFI-CATORE

![]()
![]()
![]()
COMPARATORE SOGLIA
INFERIORE COMPARATORE SOGLIA
INFERIORE COMPARATORE SOGLIA
SUPERIORE COMPARATORE SOGLIA
SUPERIORE COMPARATORE SOGLIA
INFERIORE COMPARATORE SOGLIA
SUPERIORE COMPARATORE SOGLIA
INFERIORE AMPLIFI-CATORE AMPLIFI-CATORE AMPLIFI-CATORE COMPARATORE SOGLIA
INFERIORE COMPARATORE SOGLIA
SUPERIORE COMPARATORE SOGLIA
SUPERIORE COMPARATORE SOGLIA
INFERIORE AMPLIFI-CATORE AMPLIFI-CATORE SENSORE DI DEFORMAZIONE 8 SENSORE DI DEFORMAZIONE 7 SENSORE DI DEFORMAZIONE 6 SENSORE DI DEFORMAZIONE 5 SENSORE DI DEFORMAZIONE 4![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
U3
U4
U5
U6
U7
U8


I sensori di deformazione
forniscono una tensione che va sicuramente amplificata. L’uscita di ognuno va a
due comparatori poiché si presuppone che la deformazione rilevata può essere
sia positiva che negativa, quindi ci sono due soglie diverse da rilevare.
L’interruzione al microprocessore deve avvenire, come si può evincere dalla
traccia, su una condizione di OR logico. Le 16 uscite dei comparatori vengono
riunite in coppie mediante connessioni con diodi e inviate alla porta A di un
PIO Z80. Attraverso piedini della porta B controlliamo anche le tre luci
semaforiche. Per il problema della temporizzazione un CTC si occupa di contare
i fronti attivi dell’onda quadra che la traccia mette a disposizione.
INTERFACCIA
ELETTRONICA
Lo spostamento di un centimetro corrisponde ad una
tensione di uscita dai sensori pari a
|V|= 100 mV x 1 cm= 1000 mV = |1 V|
10^-1 cm
Scegliamo di
amplificare il segnale, nell’ipotesi che l’amplificazione della scheda sia Vcc=
± 5 volt, in modo da portare le soglie a ± 3 volt.
Dopo il buffer poniamo
allora uno stadio amplificatore non invertente con Av=3

Possiamo scegliere i valori commerciali R1=100 kW ed R2=200 kW
eventualmente trimmer per effettuare una taratura fine.

Per ottenere soglie di 3 V

R4 = 40 kW
Possiamo scegliere i valori commerciali R5 = 60,4 kW
e R4= 40,2 kW
Il condensatore C2 introduce una frequenza
di taglio superiore equiparando le deformazioni a segnali lentamente variabili
nel tempo. Poniamo


Scegliamo relè subminiati in grado di sopportare correnti
anche di 3A, con resistenza di avvolgimento di 69 W. Trascurando la VCE di
saturazione del transistor si ha:
![]()
Il BJT 2N2222 è in grado di fornire una corrente ICMax = 800
mA.
Per questo transistor hFEMin=
100 per cui:

Poniamo IB = 7 mA, R7 deve servire ad
accelerare la commutazione in OFF del BJT, e deve valere alcuni kW. Poniamo R7 = 4,7 kW

I6 = I7 + IB = 7,15
mA
Il segnale di ingresso , di tipo TTL , a livello alto vale
VOHmin=4,5 V

Altro problema è, però,
il fatto che un’uscita dal PIO al livello alto non potrà generare la corrente
necessaria per cui occorre interporre un buffer tipo 74LS244

Usando un CTC, contiamo i fronti di salita dell’onda
quadra che abbiamo a disposizione, usando il contatore 0 come counter facendo
in modo che le interruzioni da esso generate scandiscano i cicli delle luci
semaforiche. Usando il contatore 1 sempre come counter generiamo ogni 200
secondi un impulso in uscita contato dal contatore 2 che contiene 9 in modo che
generi un’interruzione ogni 9 × 200= 1800 s =30 minuti per costringere il
microprocessore ad inviare i dati al centro remoto.

![]()
![]()
![]()
![]()
![]()
![]()
dal decoder I/O
![]()
![]()
![]()
![]()
1
s
![]()
![]()
A1
![]()
A0
INT
Poiché i contatori sono
in daisy chain al loro interno facciamo in modo che l’interruzione da parte del
contatore 0 abbia priorità superiore a quella per l’invio dei dati.
COLLEGAMENTO
AL CENTRO REMOTO
Poiché un segnale di
pericolo che parte dai sensori comporta un ciclo di emergenza di 3 minuti,
nella peggiore delle ipotesi in 30 minuti abbiamo 10 interruzioni. Si tratta,
quindi, di spedire un solo byte.
Il modem può dunque essere anche un modem V21 da 300 bit/s
che opera in modalità full-duplex, asincrono, con modulazione FSK a due
livelli.
Il collegamento con il modem si può realizzare con lo
schema seguente dove si suppone che il fattore di baud rate interno all’ 8251
sia impostato a 16.

PROGETTO
DELL’INTERFACCIAMENTO DI I/O

|
A7 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
|
HEX |
|
|
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
10H |
dati
porta A PIO |
|
|
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
11H |
programmazione
porta A PIO |
|
|
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
12H |
dati
porta B PIO |
|
|
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
13H |
programmazione
porta B PIO |
|
|
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
30H |
contatore
0 CTC |
|
|
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
31H |
contatore
1 CTC |
|
|
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
32H |
contatore
2 CTC |
|
|
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
33H |
contatore
3 CTC |
|
|
0 |
1 |
0 |
1 |
0 |
0 |
X |
0 |
50H |
dati
al 8251 |
|
|
0 |
1 |
0 |
1 |
0 |
0 |
X |
1 |
51H |
programmazione
8251 |

|
A15 |
A14 |
A13 |
A12 |
A11 |
A10 |
A9 |
A8 |
A7 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
|
|
|
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0000H |
EPROM |
|
|
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0FFFH |
||
|
0 |
0 |
1 |
0 |
X |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2000H |
RAM |
|
|
0 |
0 |
1 |
0 |
X |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2FFFH |
||
EPROM
0000H
NON UTILIZZATO
0FFFH
1000H
1FFFH
RAM
2000H
2FFFH
![]()
![]()
NON
UTILIZZATO
![]()
![]()

PROGRAMMA
DI GESTIONE DELL’INTERRUZIONE DEL CONTATORE ZERO 


|
2000H |
INDIRIZZO
SOTTOPROGRAMMA |
TABELLA
VETTORI INTERRUZIONI |
||
|
2001H |
CONTATORE
ZERO CTC |
|||
|
2002H |
INDIRIZZO
SOTTOPROGRAMMA |
|||
|
2003H |
CONTATORE
UNO CTC |
|||
|
2004H |
INDIRIZZO
SOTTOPROGRAMMA |
|||
|
2005H |
CONTATORE
DUE CTC |
|||
|
2006H |
CONTATORE
NUMERO INTERRUZIONI |
*
(VEDI SOTTO) |
||
|
2007H |
CONTATORE
DI CICLO |
**
(VEDI SOTTO) |
||
|
2008H |
CONTATORE
CI CICLI INTERRUZIONI |
***
(VEDI SOTTO) |
||
|
2009H |
COSTANTE
TEMPO GIALLO |
|
||
|
200AH |
COSTANTE
TEMPO ROSSO |
|||
|
200BH |
COSTANTE
TEMPO VERDE |
|||
|
200CH |
FLAG
INTERRUZIONI |
|||
|
200DH |
||||
|
200EH |
INDIRIZZO
SOTTOPROGRAMMA |
|||
|
|
PORTA
A PIO |
|||
|
|
||||
|
2FFFH |
||||
* CONTA QUANTE INTERRUZIONI SI SONO AVUTE
IN 30 MINUTI
** INIDCA NEL CICLO SEMAFORICO SE È LA FASE
DEL GIALLO, DEL VERDE O DEL ROSSO
*** CONTORE CHE PERMETTE DI
STABILIRE SE SONO STATI ESEGUITI I 3 CICLI DI INTERRUZIONI
CNI DEFB
2006H
;CNI = contatore
numero interruzioni
;area in cui verrà
conservato il numero di interruzioni dovute ai sensori di deformazione
CDC DEFB
2007H
;CDC = contatore
di ciclo
;se è uguale a 3
occorre eseguire il ciclo della luce gialla
;se è uguale a 2
occorre eseguire il ciclo della luce rossa
;se è uguale a 1
occorre eseguire il ciclo della luce verde
CCI DEFB
2008H
;CCI = contatore
cicli di interruzione
;questo contatore
consente di sapere se sono stati eseguiti i tre cicli semaforici di
;emergenza
CTG DEFB
2009H
;CTG = costante di
tempo gialla
;contiene il
numero di secondi del ciclo giallo, cioè la costante di tempo da inserire nel
;contatore 0 del
CTC
CTR DEFB
200AH
;CTR = costante di
tempo rossa
;contiene il
numero di secondi per i quali deve essere accesa la luce rossa
CTV DEFB
200BH
;CTV = costante di
tempo verde
;contiene il
numero di secondi per i quali deve essere accesa la luce verde
FLAG DEFB
2000H
;questo byte
funziona da flag per indicare se stiamo eseguendo un ciclo semaforico di
;emergenza o meno
LD SP, 2800H
;inizializziamo lo
stack alla fine della RAM
LD A, 10|10
LD (CTG), A
;inizializziamo i valori delle durate dei vari cicli
;LD A con 10s per il giallo, 50s per il rosso,
120s per il verde
LD A, 50|10
LD (CTR), A
LD A, 120|10
LD (CTV), A
LD A, D7H
;parola di
programmazione del contatore 0 del CTC
;D0 = 1
perché identifica la parola di programmazione channel control word
;D1 = 1 determina
il reset software del contatore
;D2 = 1
indica che segue costante di tempo
;D3 = 0
indifferente poiché vogliamo programmare il contatore come counter
;D4 = 1
scegliamo come fronte attivo del CK/TRG quello di salita
;D5 = 0
condizione di indifferenza in modalità counter
;D6 = 1
funziona come counter
;D7 = 1
abilita le interruzioni
;11010111 = D7
OUT (30H), A
;invio della channel control word al canale 0 del CTC
LD A, (CTR)
OUT (30H), A
;invio della
costante di tempo
;si comincia con il
ciclo giallo
LD A, 00H
OUT (30H), A
;invio della parte bassa del vettore delle interruzioni
LD A, 57H
;programmazione
contatore 1 del tutto identica a quella del contatore 0 escluso il
;fatto che le
interruzioni sono disabilitate
OUT (31H), A
LD A, 200|10
;questo contatore deve contare 200
OUT (31H), A
LD A, 02H
OUT (32H), A
;parte bassa
vettore delle interruzioni contatore 1
LD A, C7H
;programmazione
contatore 2 con interruzione abilitata
OUT (32H), A
LD A, 04H ;parte bassa
vettore interruzioni
OUT (32H), A
LD A, 09H ;costante di tempo
OUT (32H), A
LD A, CFH
;mode control word
per il PIO Z80 porta A
;D3D2D1D0 = 1111
;identifica la
mode control word
;D5D4 = 00
;condizione
d’indifferenza
;D7D6 = 11 ;modo 3
OUT (11H), A
LD A, 0EH
;parte bassa per il
vettore delle interruzioni
LD A, FFH
;I/O register
control word per la porta A
;sono tutti 1
poiché i piedini della porta A devono essere impostati tutti come ingressi
OUT (11H), A
LD A, A7H
;interrupt control word
;D3D2D1D0 = 01111
;identifica la interrupt control word
;D4 = 0 non
segna maschere
;infatti gli
ingressi sono tutti impostati per la generazione delle interruzioni
;D5 = 1 dice
che gli ingressi sono attivi alti
;D6 = 0 interruzione
su condizione di OR
;infatti dalla
traccia si desume che deve scattare l’allarme quando almeno uno dei
;sensori è attivo
;D7 = 1
interruzioni abilitate
OUT (11H), A
LD A, CFH
;stessa parola di modo per la porta B
OUT (13H), A
LD A, 00H
OUT (13H), A
;poniamo i pin
della porta B tutti come uscite
LD A, 07H
OUT (13H), A
;interrupt control word con interruzioni disabilitate
LD A, FEH
;parola di modo
per 8251
;D1D0 = 10
fattore di baud rate pari a 16
;D3D2 = 11
lunghezza carattere a 8 bit
;D4 = 1
parità abilitata
;D5 = 1
parità pari
;D7D6 = 11 due
bit di stop
OUT (51H), A
LD A, 01H
;parola di controllo con D0 = 1 per
impostare l’8251 come trasmettitore
OUT (51H), A
LD A, 20H
LD I, A
;imposta la parte
alta del vettore delle interruzioni
LD HL, 0300H
LD (2000H), HL
;suppongo che il programma di gestione del contatore 0 sia
in EPROM a partire dalla
;locazione 0300H
LD HL, 0600H
OUT (2002H), HL
;suppongo che il
programma di gestione del contatore 1 sia un EPROM a partire dalla
;locazione 0600H
;ho così costruito
la tabella dei vettori delle interruzioni IM2
LD A, 01H
OUT (12H), A
;manda 1 sul bit 0 della porta B del PIO in modo da far
accendere la lampada gialla
LD A, 03H
LD (CDC), A
;in questo modo alla prima interruzione del contatore 0
del CTC passeremo al rosso
LD A, 00H
LD (CNI), A
;poniamo il
contatore del numero delle interruzioni a zero EI
CICLO : JP
CICLO
;resta in attesa interruzioni
ORG 0300H
LD A, (CDC)
;leggi contatore di ciclo
CP 03H
;se è uguale a 3
devi accendere la luce rossa
LD A, 00000001B
;invia la parola alla
porta B del PIO per accendere la lampada rossa
LD A, (CDC)
DEC A
LD (CDC), A
;decrementa il contatore di ciclo
LD A, D7H
OUT (30H), A
;riprogrammazione del contatore per inviargli la nuova
costante di tempo
LD A, (CTR)
OUT (30H), A
;invio al canale 0
del CTC della costante di tempo per il ciclo rosso
JP, FINE2
AVANTI : CP, 02H
JP NZ, AVANTI2
;se è uguale a 2
devi accendere la luce verde
LD A, 00000010B
OUT (12H), A
LD A, (CDC)
DEL A
LD (CDC), A
LD A, D7H
OUT (30H), A
LD A, (CTV)
OUT (30H), A
JP, FINE
AVANTI2 : LD A, 00000100B
;devi accendere la
luce gialla
OUT (12H), A
LD A, 03H
LD (CDC), A
;poni il contatore
di ciclo di nuovo a 3
LD A, D7H
OUT (30H), A
LD A, (CTG)
OUT (30H), A
JP FINE2
FINE : LD A, (FLAG)
;controlla il flag
delle interruzioni
CP, 01H
JP NZ, FINE2
LD A, (CCI)
;se il flag è pari
ad 1 decrementare il contatore dei cicli di interruzione
DEC A
LD (CCI), A
CP 00H
JP NZ, FINE2
LD A, 10|10
LD (CTG), A
LD A, 50|10
LD (CTR), A
LD A, 120|10
LD (CTV), A
;se il contatore
di cicli di emergenza è arrivato a zero si ripristinano le vecchie durate
;dei cicli
semaforici
LD A, 00H
LD (FLAG), A
;e si pone il flag
a zero
LD A, 10000011B
OUT (11H), A
;invio interrupt disable word alla porta A del PIO per
riabilitare le interruzioni
FINE2 : RETI
ORG 0900H
LD A, 10|10
LD (CTG), A
LD A, 90|10
LD (CTV), A
LD A, 80|10
LD (CTR), A
;programma gestione interruzione del PIO
;si pongono i
valori dei cicli di emergenza nei semafori
LD A, 01H
LD (FLAG), A
;si setta il flag
di interruzione
LD A, (CNI)
INC A
LD (CNI), A
;incrementa il
contatore numero di interruzioni
LD A, 03H
LD (CCI), A
;poni a 3 il
contatore cicli di interruzione
LD A, 00000011B
OUT (11H), A
;invio interrupt
disable word alla porta A del PIO per disabilitare ulteriori interruzioni
FINE2 : RETI
ORG 0600H
;programma
gestione interruzione contatore 2 CTC
LD A, (CNI)
;preleva contatore
numero interruzioni
CALL SEND
;chiama
sottoprogramma per invio dati all’usart
LD A, 00H
LD (CNI), A
;azzera contatore
numero interruzioni
RETI