• Non ci sono risultati.

Analisi del programma Genera Intervalli

3 Analisi del set-up sperimentale

3.4 Generatore di traffico casuale

3.4.1 Analisi del programma Genera Intervalli

La generazione dei valori numerici con distribuzione esponenziale avviene nel PC attraverso l’ambiente di sviluppo LabVIEW 5.1. Il linguaggio utilizzato, chiamato G, permette una programmazione grafica in forma di diagrammi a blocchi. Per questo motivo non è disponibile un listato di istruzioni come nel caso dei programmi scritti in C ed analizzati nel paragrafo 3.3.

La successione dei comandi eseguiti dal programma principale, chiamato Genera Intervalli, può essere invece rappresentata attraverso un diagramma di flusso e suddivisa in tre parti:

o Generazione dei valori numerici con distribuzione esponenziale e definizione del parametro 1/λtotale del modello di traffico casuale

o Codifica dei campioni generati su 16 bit ed approssimazione della densità di probabilità risultante

o Gestione del protocollo di comunicazione col microcontrollore e invio dei dati attraverso l’interfaccia seriale RS232

Prima di eseguire le istruzioni suddette, il programma imposta i parametri per la comunicazione seriale stabilendo il valore del bit-rate (115.2 kbps), la lunghezza dei messaggi da inviare (8 bit), il numero dei bit di stop (2) e di parità (nessuno).

Per generare un insieme di numeri con densità di probabilità esponenziale è possibile ricorrere alla seguente considerazione [16]: data una v.a. A con densità di probabilità uniforme in [0,1], la v.a. Y ottenuta dalla relazione:

) 1 ln( 1 A Y =− − λ

risulta di tipo esponenziale con valor medio 1/λ. Poiché l’ambiente di sviluppo LabVIEW 5.1 fornisce, fra le funzioni di libreria, quella che genera un valore compreso fra 0 e 1 con densità di probabilità uniforme in tale intervallo, è possibile ricavare il corrispondente valore assunto dalla v.a. esponenziale, eseguendo le istruzioni rappresentate dal diagramma di flusso di Figura 3.10:

genero a con d.d.p. uniforme

su [0,1]

y=-1/L*ln(1-a)

x=int(y)

Figura 3.10: Diagrammma di flusso del primo gruppo di istruzioni.

Il valore 1/λ che appare nel secondo riquadro costituisce il v.m. della v.a. con densità di probabilità esponenziale da cui vengono ricavati i valori numerici da inviare al microcontrollore. Poiché il valor medio degli intervalli di tempo generati dal Timer1 risulta, come detto prima, 1/λtot = 750*1/λ ns (o la metà se il

timer lavora a frequenza doppia), il programma Genera Intervalli richiede all’utente di inserire attraverso la tastiera il valore 1/λtot espresso in secondi e

quindi, dopo aver effettuato la divisione per 750 ns (o 375 ns raddoppiando la frequenza di lavoro), assegna ad 1/λ tale risultato.

La definizione del parametro 1/λtot avviene quindi ad opera dell’utente

durante l’esecuzione del programma Genera Intervalli sul PC. Il campione generato dalla relazione espressa nel secondo riquadro viene poi approssimato ricavandone la parte intera in quanto il contenuto da inserire nel Timer1 deve essere un intero positivo espresso, in base 2, su 16 bit. Poiché il numero minimo da memorizzare nel Timer1 è 0 (a cui corrisponde l’intervallo di tempo più lungo) ed il massimo è 65536, è necessario limitare superiormente il valore di x attraverso l’esecuzione delle istruzioni rappresentate nel seguente diagramma di flusso (Figura 3.11): no si no x<=65536 ? x=65536 si x=0 ? x=1 z=65536-x

I valori assunti da z, codificati su 16 bit, vengono quindi trasmessi al microcontrollore suddivisi in 2 byte in modo che la parte più significativa del numero venga inviata per prima. Inoltre dato un certo valore di z caricato nel Timer1, il corrispondente intervallo di tempo generato è pari a 750*x ns (o 375*x ns raddoppiando la frequenza di lavoro). E’ possibile inoltre notare che il valore x = 0 corrispondente ad un intervallo di accodamento nullo fra due messaggi consecutivi, viene scartato in fase di esecuzione di questo blocco di istruzioni. La perdita di tale valore non comporta comunque conseguenze negative sul meccanismo di generazione del traffico casuale. Basta considerare infatti che il tempo più breve impiegato per trasmettere un messaggio sul bus CAN è pari a 47 µs (nel caso di bit-rate massimo, 1 Mbps, senza bit di stuffing e con un campo Data costituito da nessun byte) e quindi, se l’attivazione in trasmissione del messaggio successivo avviene prima di tale intervallo, tale messaggio si accoda ed attende che il bus ritorni libero per poi essere trasmesso. Per questo motivo tutti gli intervalli di tempo generati dal Timer1 (compreso quello nullo) ed inferiori al suddetto valore, sono assimilabili a 47 µs (come minimo). Se l’intervallo di lunghezza nulla viene quindi approssimato a 750 ns (o 375 ns), ciò non produce alcun effetto sul traffico casuale generato.

A questo punto è possibile fare alcune considerazioni sul range di variazione di 1/λtot.

Considerando l’andamento della densità di probabilità di una v.a. esponenziale, f(x) = λe-λx, si può ipotizzare che a partire da un certo valore di λx tale funzione valga 0. Se ad esempio si impone che tale limite corrisponda ad un valore di f(x) pari a 0.01λ, si ricava che 0.01λ = λe-λx da cui risulta (λx)max = 4.6.

L’errore commesso approssimando f(x) a 0 a partire da (λx)max è inoltre più

piccolo dell’1% e tale approssimazione risulta quindi del tutto ragionevole. In seguito all’approssimazione fatta, la densità di probabilità della v.a. risulta quindi leggermente alterata. L’andamento assunto dalla funzione approssimata è mostrato in Figura 3.12:

fapprossimata(x)/ λtot 0 1 0 4 δ ,6

Figura 3.12: Andamento della densità di probabilità dei campioni generati.

La δ-Dirac rappresentata nel grafico rende ragione del fatto che i valori di λx appartenenti all’inervallo (4.6-∞) vengono tutti approssimati a 4.6. La sua ampiezza può essere calcolata risolvendo il seguente integrale che fornisce come risultato 0.01. Tale valore risulta del tutto trascurabile rispetto all’area dell’intero grafico in accordo con la ragionevolezza dell’approssimazione fatta. ) ( 6 . 4 x d e λx λ

∞ −

Per valutare il valore massimo che può assumere il v.m. degli intervalli generati dal Timer1, basta considerare che xmax = 65536 da cui si ricava

(1/λ)max = 65536/4.6 = 14247; poiché il v.m. dei campioni generati da Genera

Intervalli è legato al v.m. degli intervalli prodotti dal Timer1 dalla relazione 1/λtot

= 1/λ*750 ns si ricava:

Per valori di 1/λtot > 10.5 ms, l’approssimazione fatta su f(x) produce un

errore superiore all’1% che può non essere accettabile. E’ possibile inoltre notare che se il Timer1 funziona a frequenza doppia, il valore di (1/λtot)max risulta

dimezzato così come la lunghezza di ogni intervallo generato.

Per verificare la correttezza delle approssimazioni fatte, sono stati generati 10000 campioni attraverso il programma Genera Intervalli utilizzando un v.m. della distribuzione esponenziale pari a (1/λ)max = 14247. Sono state quindi contate

le ricorrenze di ciascun valore ed è stato realizzato il seguente istogramma (Figura 3.13): 6000 0 1000 2000 3000 4000 5000 80000 0 20000 40000 60000

Figura 3.13: Istogramma relativo a 10000 campioni generari 1/λmax=14247.

L’asse x riporta il valore dei campioni generati mentre l’asse y fornisce il numero di ricorrenze di ciascun campione. Come si può notare, la distribuzione dei valori generati ha un andamento molto simile ad una curva esponenziale; è inoltre possibile rilevare che il grafico si discosta da tale andamento (con una

leggera “impennata”) in corrispondenza del campione x = 65536. Ciò dipende dall’approssimazione fatta che aumenta (di poco) la probabilità di generare il numero 65536 a cui corrisponde l’inervallo di attivazione più lungo fra due messaggi trasmessi sul bus CAN.

Scegliendo invece (1/λ)max = 20000 che corrisponde ad un v.m. degli

intervalli di tempo generati pari a 15ms (superiore al limite massimo imposto dall’approssimazione fatta), si può notare come l’istogramma che rappresenta la distribuzione dei campioni prodotti (Figura 3.14) si discosti maggiormente dall’andamento di una curva esponenziale. Aumentando il valore di (1/λ)max

infatti, si ottiene che (λx)max = 3.3; la δ-Dirac di Figura 3.12 si sposta quindi verso

sinistra e la sua ampiezza diventa pari a 0.04. In questo modo viene ulteriormente aumentata la probabilità di generare il campione con valore massimo e questo giustifica “l’impennata” non più trascurabile nel tratto finale. Un’approssimazione simile non può quindi essere accettata.

4000 0 500 1000 1500 2000 2500 3000 3500 80000 0 20000 40000 60000

Il valore minimo di 1/λtot viene invece imposto dalla velocità di

trasmissione dei dati sul collegamento seriale fra PC e microcontrollore. I campioni generati sul PC vengono infatti inviati alla UART del T89C51CC01 e memorizzati in un buffer circolare di tipo FIFO. Ciascun campione viene poi prelevato dal buffer, inserito nel Timer1 e “contato” per generare il corrispondente intervallo di tempo. Il valor medio degli intervalli, 1/λtot , risulta quindi

inversamente proporzionale alla velocità di svuotamento del buffer e non può essere inferiore al tempo con cui i campioni vengono riforniti attraverso il collegamento seriale. Poiché il protocollo di comunicazione prevede che ogni campione inviato dal PC sia suddiviso in 2 byte (con l’aggiunta di 2 bit di stop ciascuno) e venga trasmesso in risposta al carattere “a” (codificato su 8 bit più due di stop), si può concludere che:

(1/λtot)min = (3*8+3*2)*Tbit = 30*8,7 µs ≅ 300 µs

Tale risultato è stato ottenuto utilizzando un valore di Tbit pari a 87 µs che

corrisponde ad un bit-rate di 115.2 kbps. Come si può notare il valore di (1/λtot)min

è direttamente proporzionale a Tbit e quindi per ampliare il più possibile il range di

variazione di 1/λtot è consigliabile utilizzare una elevata velocità di trasmissione

dei dati sul collegamento seriale. Poiché il bit-rate massimo utilizzato dal PC è pari a 115.2 kbps, è necessario impostare tale valore anche per la UART del microcontrollore; utilizzando il Timer2 per generare la frequenza di trasmissione della porta seriale è possibile approssimare (come già visto in precedenza) il valore desiderato con un errore relativo del 3.5%. Se usiamo invece il Timer1 (attivato in modalità 8-bit-autoreload), l’errore commesso risulta ben più elevato. Infatti la frequenza di trasmissione può essere ricavata, in questo caso, dalla seguente formula: ] / [ * 6 * 32 2 * 1 s bit n f rate

dove SMOD1 rappresenta il valore del bit più significativo del registro PCON e viene settato se si vuole raddoppiare il bit-rate e n indica che il registro TL1 deve essere caricato con il valore 256-n. Scegliendo SMOD1= 1 ed n = 2 è possibile ottenere la migliore approssimazione del bit-rate richiesto commettendo però un errore relativo del 28%. L’uso del Timer2 per impostare la velocità di trasmissione del collegamento seriale col PC risulta quindi una scelta obbligata se si vogliono ottenere bassi valori di (1/λtot)min .

L’insieme delle istruzioni eseguite per inviare il campione utile al microprocessore, rispettando il protocollo di comunicazione stabilito, sono infine rapppresentate nel diagramma di flusso di Figura 3.15:

no si

Attendo di ricevere un dato sulla porta seriale

Il dato ricevuto è = “a” Invio z sulla porta seriale Torno all’inizio Notifico un messaggio di errore Interrompo l’esecuzione del programma

Le istruzioni che effettuano la lettura del dato ricevuto dalla seriale permettono inoltre di controllare il funzionamento del programma Traffico Casuale. Se infatti il valor medio degli intervalli di tempo generati risulta troppo piccolo, il buffer che contiene i campioni trasmessi dal PC si può svuotare; in tale caso, il programma Traffico Casuale notifica il malfunzionamento inviando al PC il carattere “g”. Se Genera Intervalli riceve tale carattere invece di “a”, invia sul monitor un messaggio che specifica la causa dell’errore e quindi arresta la sua esecuzione. Se viene letto invece un qualsiasi altro carattere non previsto dal protocollo di comunicazione, l’utente viene informato che il dialogo con il microprocessore non sta avvenendo correttamente (per un malfunzionamento del programma Traffico Casualeo per problemi sulla comunicazione seriale) e quindi

l’esecuzione del programma Genera Intervalli viene terminata.

Documenti correlati