Scarica il documento zippato

In una cittadina, sulle strade a scorrimento veloce e dotate di spartitraffico, è stata predisposta una rete di centraline per la rilevazione delle velocità dei mezzi in transito, collegate ad una centrale operativa tramite linee dedicate. 

 

 

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.

 

SCHEMA A BLOCCHI DEL SISTEMA

 

 

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. 

 

 

 

INTERFACCIAMENTO  TRA μP E I/O

 

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

 

 

 

 

 

 
INTERFACCIAMENTO  TRA μP E MEMORIE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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:

 

N=3.33•10ˉ³/6.4•10ⁿ=520     [n=-6]

 

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:  

X X X X X 0 1 1 = 03H

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]

N=31

Allora si ha che in corrispondenza di un

Δv=180-22=158km/h si ha un ΔN=255-31=224

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:

ΔN=50-22/0.7=40         N=255-40=215

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:

V=0.7•N+22

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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