Ogni centralina è
costituita da:
Ø
Un sistema a
microprocessore.
Ø
Due coppie
sorgente/rilevatore a raggi infrarossi con fascio orientato perpendicolarmente
alla strada, poste a 20cm di distanza l’una dall’altra.
Ø
Una macchina
fotografica automatica, posizionata in modo da poter acquisire l’immagine della
targa della vettura in contravvenzione quando supera il limite di velocità di
50km/h.
Ø
Un sensore di
luminosità, opportunamente tarato, per valutare la fattibilità della foto.
Il sistema risale
alla velocità del mezzo in transito misurando il tempo che intercorre tra
l’interruzione del primo fascio e quella del secondo.
Rilevato
l’eccesso di velocità, se la luminosità è sufficiente (uscita del sensore
superiore a 15µA) il sistema provvede ad inviare il comando di azionamento
della macchina fotografica e a confrontare il numero di foto scattate con
quelle a disposizione nel rullino.
Dopo
aver scattato l’ultima foto, la centralina invia alla centrale il suo codice di
identificazione, quindi diventa non operativa fino all’arrivo della
manutenzione.
La
tesina comprende:
Ø Disegno e commento dello schema a blocchi
dell’intero sistema.
Ø Progetto dell’interfaccia tra il sensore di
luminosità ed il sistema a microprocessore più idoneo alla situazione
considerata.
Ø Sistema in grado di misurare il tempo di transito
dell’automezzo tra i due punti di rilevazione.
Ø Algoritmo di misura della velocità e quello
relativo alle operazioni di registrazione dell’infrazione.
Figura 1
SCHEMA A
BLOCCHI.
(COMMENTO)
Lo
schema a blocchi rappresenta una prima soluzione possibile del problema
proposto. I sensori a raggi infrarossi sono collegati agli ingressi di un PIO
Z80.
Nella
soluzione proposta si vuol fare in modo che, supponendo come ipotesi aggiuntiva
che la strada sia a senso unico di percorrenza dalla coppia 1 alla coppia 2,
l’interruzione del fascio 1 da parte dell’autovettura faccia scattare un
meccanismo di conteggio del tempo mediante tecnica di interruzione e l’interruzione
del fascio 2 faccia invece scattare un meccanismo di blocco della misura del
tempo e calcolo della velocità del veicolo sempre con le interruzioni dello
Z80.
Poiché
gli eventi causa di interruzione devono essere diversi e quindi programmi di
gestione diversi, la coppia 1 è collegata alla porta B e la coppia 2 alla porta
A.
In
tal modo le due porte genereranno due interruzioni diverse con la produzione in
modalità di gestione delle interruzioni (Modo2) di due diversi indirizzi di
programmi di gestione delle interruzioni.
Alla
porta A è collegata inoltre l’uscita di un comparatore che informerà lo Z80
sulla presenza di luminosità sufficiente.
Si
noti che non ci interessa il valore dell’uscita del sensore di luminosità ma
soltanto se questa supera una soglia (15 µA).
Nella
nostra soluzione, la misura del tempo è affidata ad un CTC Z80.
La
macchina fotografica è collegata ad un piedino della porta A del PIO Z80 che
sarà impostato come uscita.
Si
è quindi supposto che la macchina fotografica sia dotata di un circuito di
azionamento integrato che venga attivato da un segnale TTL ad esempio attivo
alto.
Le
porte del PIO Z80 vanno impostate in modo 3 (BIT a BIT).
Il
CTC funzionerà invece come TIMER decontando il clock del sistema.
La
comunicazione dello Z80 con l’esterno porta alla necessità di inserire nella
scheda un USART che interfacci il µP con un modem.
Progetto dell’interfaccia tra μP E sensore di luminosità.
Lo schema di principio può essere il seguente:
supponendo di alimentare il
comparatore a +5V, decidiamo che la soglia di luminosità da superare diventi in
tensione una soglia di 2.5V.
Il convertitore I/V deve essere allora progettato in modo tale
da dare una tensione di 2.5V quando il sensore genera una corrente di 15µA.
Deve essere allora:
R1=Vo/I=2.5/15•10ⁿ= 16.7 kΩ [n=-6]
Si può realizzare con una resistenza fissa di
10 kΩ in serie con un potenziometro di valore max 10 kΩ. Per le
resistenze R del partitore si può usare
un valore di 10 kΩ.
METODO DI MISURA DEL TEMPO
Come gia accennato, l’interruzione del fascio
della coppia 2 provoca la generazione di un’interruzione da parte della porta B
che è programmata in modo 3 e per generare un’interruzione se si attiva
l’ingresso a cui è collegato il sensore a infrarosso (si fa naturalmente
l’ipotesi aggiuntiva che l’uscita del sensore sia un segnale TTL compatibile).
L’interruzione farà in modo che venga
eseguita una routine di servizio che faccia partire il conteggio del clock di
sistema da parte di un contatore del CTC Z80.
A questo punto occorre controllare che basti
uno solo dei quattro contatori del CTC oppure sia necessario metterne più di
uno in serie.
Tenendo presente che imponendo il prescaler a
256 un singolo contatore può contare:
N•P=256•255=65280 Impulsi di clock.
Supposto un clock di 2MHz, Tck=0.5µs.
Un singolo contatore può allora misurare un
intervallo di tempo di valore max pari a T=32640µs.
Una macchina che percorresse la distanza di
20cm in tale tempo avrebbe una velocità:
v=20•10ˉ²/32640•10ⁿ=20•10³•10/32640=6.12m/s
[n=-6]
v=6.12•3600=22032m/h=22km/h
E’ chiaro che una macchina più veloce dà
ancora meno problemi.
L’interruzione del fascio 1 provoca l’esecuzione
di una seconda routine di servizio che legge il numero che il contatore
contiene al momento, calcola 256-N e usa questo valore per determinare la
velocità del veicolo.
In
base alle scelte circuitali fatte la mappa I/O è la seguente:
A7 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
|
|
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
=10H |
Indirizzo
dati porta A PIO |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
=11H |
Indirizzo
progr. porta A PIO |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
=12H |
Indirizzo
dati parta B PIO |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
=13H |
Indirizzo
progr. porta B PIO |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
=30H |
Canale
0 CTC |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
=31H |
Canale
1 CTC |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
=32H |
Canale
2 CTC |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
=33H |
Canale
3 CTC |
0 |
1 |
0 |
1 |
0 |
0 |
X |
0 |
=50H |
Dati
8251 |
0 |
1 |
0 |
1 |
0 |
0 |
X |
1 |
=51H |
Programma
8251 |
Progetto
dell’interfacciamento di memoria:
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 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
=7FFFH |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
=8000H |
RAM |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
=87FFH |
COLLEGAMENTO CENTRALINA – SISTEMA DI CONTROLLO
Le
specifiche di progetto non impongono stringenti esigenze dal punto di vista
della velocità di trasmissione.
Supponendo
che la velocità di ogni auto in infrazione occupi un byte e che il rullino a
disposizione sia di 36 foto si nota che occorre inviare sporadicamente una
piccola quantità di dati.
Il
collegamento può allora avvenire in rete commutata tramite un modem in banda
fonica di tipo V.21 con velocità 300 BAUD, modulazione FSK, trasmissione
asincrona modalità full–duplex.
Per
collegare il µP al modem possiamo utilizzare una USART 8251 che abbiamo gia
inserito nello schema a blocchi.
Il
collegamento completo appare in fig.1.
Usando
un generatore di clock con frequenze 2.5MHz, Tck=0.4µs e imponendo all’8251 un
fattore di baud rate pari a 16 , occorre
fornire all’8251 un
clock con periodo tale che:
Tcktxd=15/300=3.33ms=N•16•0.4•10ⁿ [n=-6]
Quindi
il periodo di clock della scheda deve essere moltiplicato di un fattore:
Possiamo
ricavare il clock dell’8251 mandando il
clock del sistema in ingresso ad un contatore asincrono e ricavando il clock
dell’8251 dall’uscita a9 del contatore.
Ciò
corrisponderà a moltiplicare il periodo per un fattore 2ⁿ=512 [n=9].
PROGETTAZIONE SOFTWARE
Si
è cominciato col scrivere la routine di inizializzazione della scheda.
Essa
si deve occupare della programmazione del PIO Z80 ,del CTC e dell’8251.
Per
il PIO Z80 dobbiamo programmare la porta A in modo 3 inviando la seguente
parola di controllo di modo:
1 1 X X
1 1 1 1 =CFH
Poi il vettore d’interruzione. Per quest’ultimo
dobbiamo decidere dove inserire la tabella dei vettori d’interruzione. Si può
pensare di usare le prime locazioni della RAM, ad esempio le prime 128
locazioni.
Possiamo
porre i programmi di gestione delle interruzioni nell’ultimo kbyte di EPROM: ad
esempio facciamo partire il programma di servizio della porta A all’indirizzo
7C00 e quello della porta B a: 7C00+200-1= 7DFF riservando 512 locazioni alla
1ª routine e 512 alla seconda.
Il
vettore d’interruzione della porta A è allora 00H .
Sempre
per la porta A occorre una parola di controllo registro I/O che selezioni quali
sono le linee d’ingresso e quali d’uscita. Per le scelte fatte A0 e A1 sono ingressi mentre A2 è un’uscita. Possiamo allora inviare:
Occorre
una parola di controllo interruzioni che abiliti la generazione delle
interruzioni (D7=1) , D6 è indifferente (AND – OR) poiché solo A0 va controllato per l’interruzione.
Supponendo
che l’uscita dei sensori ad infrarosso va a zero quando il fascio viene
interrotto poniamo D5=0
(livello logico attivo basso) , D4=1 poiché va testato solo D0.
Quindi
abbiamo:
1 X 0 1
0 1 1 1 = 97H
Occorre
poi la maschera per far ignorare A1 nella generazione di interruzioni:
X X X X X X 1 0 =
02H
La
porta B va anch’essa programmata in modo 3 con la parola CFH ; segue
il vettore 02H ; per la
parola di controllo I/O interessa solo B0 come ingresso:
X X X X
X X X 1 = 01H
Per
la parola di controllo interruzione deve essere:
D7=1 , D6=X , D5=0 , D4=0 le altre
linee possiamo dire che sono uscite così da non dobbiamo inviare la maschera.
Per
il CTC Z80 dobbiamo programmare solo il contatore 0 , ponendo:
ü
D7=0 (disabilita le interruzioni),
ü
D6=0 (modo timer),
ü
D5=1 (fattore di prescaling pari a 256),
ü
D4=X , D3=0 (inizio conteggio software),
ü
D2=1 (segue costante di tempo),
ü
D1=1 (reset software e attende la costante di tempo),
D0=1
Quindi: 0 0 1 X
0 1 1 1 = 27H
La
time constant word sarà 00 per 256.
L’8251
ha bisogno di una parola di modo, in cui porremo:
ü
D7-D6=01 (per scegliere un bit di stop),
ü
D5=1 (parità pari),
ü
D4=1 (abilità parità),
ü
D3-D2=11 (dati a 8 bit),
ü
D1-D0=10 (fattore di baud rate pari a 16),
Quindi: 0 1 1 1
1 1 1 0 = 7EH
Inviando
la parola di comando 01H
impostiamo l’8251 come trasmettitore.
Il programma di inizializzazione è allora il seguente:
ORG 0000
LD A,CFH ; parola
di controllo di modo per la porta A (PIO Z80)
OUT (11),A
LD A,00H ; parte bassa vettore delle interruzioni porta A
OUT (11),A
LD A,03H ; parola di controllo I/O porta A
OUT (11),A
LD A,97H ; parola di controllo interruzioni porta A
OUT (11),A
LD A,02H ; parola di maschera
OUT (11),A
LD A,CFH ; parola di modo porta B
OUT (13),A
LD A,02H ; parte bassa vettore delle interruzioni porta B
OUT (13),A
LD A,01H ; parola controllo I/O porta B
OUT (13),A
LD A,87H ; parola controllo interruzioni porta B
OUT (13),A
LD A,27H ; programmazione CTC Z80 (canale 0)
LD A,7EH ; parola di modo 8251
OUT (51),A
LD A,01H ; parola controllo
OUT (51),A
LD A,80H ; parte alta vettore interruzioni
LD I,A
LD HL,7C00H ; scrittura tabella dei vettori d’interruzione
LD (8000),HL
LD HL,7DFFH
LD (8002),HL
IM2 ; imposta modo d’interruzione 2
EI ; abilita le interruzioni
LD SP,8800H ; si mette lo stack nella parte alta della RAM
LD HL,8080H ; si imposta il puntatore alla zona dove conserva
i dati
LD C,20H ; C conta le foto effettuate (rullino da 36 foto)
HALT
Il
programma di servizio della porta B è molto semplice poiché deve solo far
partire il CTC Z80 scrivendo la costante di tempo:
ORG 7DFFH
LD A,FFH
OUT (30),A
RETI
Il
programma di servizio della porta A deve:
Ø
Bloccare il contatore
leggendo il numero N a cui esso è arrivato ,
Ø
Calcolare il tempo
trascorso (255-N) Tck ,
Ø
Determinare la
velocità del veicolo ,
Ø
Controllare se ha
superato i limiti ,
Ø
Se si, controllare la
luminosità ,
Ø
Se la luminosità è
sufficiente far scattare la foto ,
Ø
Controllare se il
rullino è finito .
Per
quanto riguarda il meccanismo di calcolo della velocità , abbiamo già calcolato
che il conteggio di 255 da parte del CTC corrisponde ad una velocità di 22
km/h.
Analogamente
una velocità di 180 km/h comporta che :
t = 20•10ˉ²/(180•10³m/3600s) = 4•10ˉ³s
cioè:
4•10ˉ³=256•N•0.5•10ˉⁿ [n=6]
Allora
si ha che in corrispondenza di un
per
cui ogni numero in meno contato dal CTC Z80 corrisponde ad un aumento di
velocità di:
158/224=
0.7km/h
Ad
esempio ad una velocità di 50km/h corrisponderà un:
In
definitiva l’algoritmo si può impostare nel seguente modo:
Ø
Calcola il numero N
di clock decantati dal CTC (cioè 255-il numero letto dal CTC) ,
Ø
Confronta il
risultato con 215 ,
Ø
Se è più piccolo si è
superato la velocità limite ,
Ø
Per la registrazione
della velocità essa si calcolerà ponendo:
PROGRAMMA:
ORG 7C00H
IN A,(30H) ; lettura del conteggio CTC 0
LD A,27H ;
riscrittura parola di controllo per bloccare il CTC con D1=1
OUT (30H),A
LD B,A
LD A,FFH
SUB A,B ; calcolo di 255 – numero letto nel CTC
CP D7H ; confronta con 215
JP P,FINE ; se è > 215 non sono stati violati i
limiti di velocità
IN B,(12H) ; altrimenti controlla la luminosità testando il
bit A1 (comparatore)
BIT 1,B ; della porta A PIO
JR Z,FINE ; se A1=0 (quindi FZ=1) non c’è luce per
la foto
LD B,04 ; altrimenti si fa scattare la macchina
fotografica ponendo A2=1
OUT (12H),B
PUSH BC ; si salva il contatore di foto
PUSH HL ; si salva nello stack il puntatore alla
memoria
LD L,A
LD H,00H ; si pone N in HL
LD B,07H
LOOP: ADD HL,HL ; si moltiplica per 7
DJNZ LOOP
LD A,16H
PUSH
LD C,0AH
LD B,00H ; contiene il divisore che è 10
CALL DIV
; supponiamo di avere a disposizione questa routine
per la divisione che porrà ; in DE il
risultato della divisione intera (trascuriamo il resto)
POP HL ; si ripristina il puntatore
LD (HL),E
LD (HL),D ; si salva in memoria
POP BC ; recupera il contatore di foto
DEC C ; si decrementa
JRNZ,FINE ; se non è finito il rullino si esce
CALL SEND ; altrimenti si inviano i dati
LD A,03H ; mandiamo una interrupt disable word alle porte
del PIO per
; bloccare la centralina
OUT (12H),A
OUT (13H),A
FINE: RETI