• Non ci sono risultati.

Prove effettuate con traffico di controllo periodico e casuale

3 Analisi del set-up sperimentale

4.4 Prove effettuate con traffico di controllo periodico e casuale

Il secondo gruppo di esperimenti è stato effettuato per valutare la qualità del segnale vocale trasmesso in presenza di una condizione di traffico sul bus CAN più generale possibile. Per simulare tale situazione è stata attivata sia la trasmissione dei messaggi periodici (dovuta al generatore di traffico periodico) che quella dei messaggi casuali (ad opera del generatore di traffico casuale). Anche in questo caso, il segnale vocale da trasmettere sul bus è stato inviato all’interfono collegando ambedue gli ingressi audio dei nodi vocali inizialmente ad un generatore di forme d’onda (per effettuare le prove oggettive e valutare i limiti di W.L. che garantiscono la trasmissione di tutti i messaggi vocali) ed in un secondo tempo ad un registratore audio in fase di riproduzione (per le prove soggettive di valutazione dei limiti di intelligibilità).

In Figura 4.11 viene mostrato, schematicamente, il collegamento al bus CAN dei dispositivi utilizzati per l’esperimento:

GENERATORE DI TRAFFICO CASUALE ingresso audio 2 ingresso audio 1 GENERATORE DI SEGNALE AUDIO GENERATORE DI TRAFFICO PERIODICO NODO VOCALE 2 uscita audio 2

uscita audio1 NODO

VOCALE 1

Bus CAN

Le modalità con cui è stata scelta la distribuzione dei messaggi di controllo all’interno della rete deriva dall’analisi di un benchmark fornito dalla SAE [6] che prende in considerazione una situazione di traffico reale su bus CAN in ambiente automotive.

La maggior parte dei dati che transitano sulla linea è rappresentata da messaggi periodici, inviati dai nodi CAN posti nell’autoveicolo, che determinano un’occupazione del bus (W.L.periodico) costante nel tempo. In aggiunta al traffico

periodico, vengono considerati diversi tipi messaggi sporadici che contribuiscono ad incrementare l’occupazione percentuale del bus di una quantità (W.L.casuale)

variabile nel tempo. E’ possibile notare tuttavia che il numero dei messaggi sporadici risulta inferiore rispetto a quello dei messaggi deterministici e che ciascuno di essi ha un campo dati costituito da un solo byte. L’intervallo di tempo minimo fra due trasmissioni successive dello stesso messaggio risulta inoltre dell’ordine delle decine di millisecondi. Per questo motivo è ragionevole supporre che il valore di W.L.casuale risulti decisamente più piccolo rispetto a W.L.periodico.

L’occupazione complessiva del bus dovuta ai soli messaggi di controllo è determinata quindi in modo prevalente (e costante nel tempo) dal traffico periodico mentre le trasmissioni casuali generano delle fluttuazioni di piccola entità. Poiché inoltre W.L.casuale risulta variabile nel tempo, è possibile esprimere

l’occupazione del bus dovuta ai soli messaggi casuali attraverso il parametro medio W.L.casuale e quindi l’occupazione totale (media) del bus risulta pari a

W.L.tot = W.L.periodico+W.L.casuale +W.L.audio.

Gli esperimenti sono stati effettuati secondo le seguenti modalità.

Inizialmente è stato inviato sul bus il solo traffico periodico in aggiunta ai messaggi vocali. I parametri B.L. e B.P. caratteristici del modello di traffico sono stati fissati ad un valore tale da garantire la condizione W.L.periodico+W.L.audio=95%

ai vari bit-rate e conseguentemente la trasmissione dei segnali vocali senza perdita di campioni. E’ importante notare che per garantire quest’ultima condizione sono stati scelti valori di B.L.< Tbusy.

In questo modo i messaggi periodici determinano un valore di W.L.periodico

Sono stati quindi aggiunti i messaggi casuali attivando il relativo generatore di traffico. Il valor medio degli intervalli di tempo di trasmissione fra due messaggi consecutivi (indicato con 1/λtot) è stato quindi fissato, attraverso il

programma Genera Intervalli, ad un valore iniziale che garantisse la condizione W.L.tot<100% e la la trasmissione dei segnali vocali senza perdita di campioni;

quest’ultima condizione è stata verificata effettuando le prove oggettive attraverso la sinusoide di prova e l’oscilloscopio. Per questo motivo, il valore iniziale di W.L.casuale risulta inferiore al 5% e contribuisce ad incrementare il carico di lavoro

dovuto ai messaggi di controllo del sistema.

E’ possibile notare che, in questo caso, la condizione W.L.tot<100% non

implica necessariamente che la trasmissione dei messaggi audio avvenga senza che vadano persi dei campioni vocali.

Il valore di 1/λtot è stato quindi progressivamente diminuito in modo da

incrementare l’occupazione totale (media) di banda W.L.tot.

In accordo con i dati forniti dal benchmark della SAE (e con i limiti imposti dal nostro sistema ed analizzati nel capitolo precedente) il range di variazione di 1/λtot viene fissato da un minimo di 900 µs ad un massimo di 10 ms.

Anche in questo caso, per valutare i limiti di W.L.tot a partire da cui si

verifica la perdita di campioni vocali, è stato inviato, attraverso un generatore di forme d’onda, un segnale sinusoidale all’ingresso di entrambi i nodi vocali. Come già detto in precedenza, la scelta della sinusoide permette di rivelare la perdita (anche minima) di campioni vocali. Il parametro 1/λtot è stato quindi

progressivamente decrementato finchè la sinusoide mostrata sul monitor dell’oscilloscopio collegato all’uscita audio dei nodi vocali non è apparsa disturbata.

La valutazione dei limiti di W.L.tot oltre i quali non è più garantita

l’intelligibilità del segnale vocale, è stata effettuata invece collegando all’ingresso dei nodi dell’interfono un registratore audio; anche in questo caso il parametro 1/λtot è stato progressivamente decrementato finchè la voce riprodotta negli

auricolari collegati ai nodi dell’interfono non è divenuta completamente inintelligibile.

Analizziamo, ad esempio, il caso in cui il bit-rate sul bus CAN è pari a 1 Mbps. Scegliendo b.p.=68 e b.l.=191 i parametri del traffico periodico e deterministico risultano B.P.=13 ms (che rappresenta il periodo del messaggio inviato) e B.L.=11 ms (che costituisce la lunghezza dello stream di messaggi inviati in un periodo). In questo modo si ottiene W.L.periodico = 84.85%.

Poiché a 1 Mbps W.L.audio = 11.452%, l’occupazione complessiva del bus,

in mancanza di messaggi casuali, risulta pari al 96.3%. Questa situazione di traffico garantisce la mancanza di disturbo e la perfetta intelligibilità del segnale audio trasmesso. Facendo quindi variare 1/λtot fra 10 ms e 900 µs si ottiene una

variazione di W.L.casuale in un intervallo di valori compreso fra 0.58% e 6.4%.

In Figura 4.12 viene riportata la variazione di W.L.tot (medio) in funzione

di 1/λtot nella situazione di traffico descritta precedentemente. I valori teorici di

W.L.tot (medio) superiori al 100% sono da intendersi come è stato spiegato nel

paragrafo 4.2. Vengono inoltre riportati i valori limite del parametro 1/λtot per il

canale a priorità più elevata.

2 bit-rate 1 Mbps 94 95 96 97 98 99 100 101 102 103 104 105 0,8 1,3 1,8 2,3 ,8 3,3 3,8 4,3 4,8 5,3 valor medio (ms) W .L. t o ta le m e di o ( %

) limite intelligibilità canale 1 imite perdita di campioni canale 1

trasm issione senza perdita di campioni disturbo del

segnale vocale voce non intelligibile

--- l

Figura 4.12: Limiti di intelligibilità e di perdita di campioni del segnale vocale a 1 Mbps (traffico

Come si può notare dalla figura, anche in questo caso, il limite di intelligibilità del segnale vocale risulta maggiore di quello a cui inizia la perdita di campioni vocali. Facendo cioè diminuire il valore di 1/λtot la trasmissione dei

messaggi casuali diventa (mediamente) più frequente; questo giustifica un aumento di W.L.casuale e determina una crescente indisponibilità del bus per la

trasmissione dei messaggi vocali (a più bassa priorità). A partire dalla condizione iniziale (fissata da 1/λtot = 10ms) in cui W.L.tot = 96.88% ed in assenza di disturbo

sul segnale vocale, la perdita di campioni audio (del canale vocale a priorità maggiore) comincia ad un valore di W.L.tot = 97.9% corrispondente a 1/λtot =

3.6 ms. In questa situazione tuttavia, tale perdita causa un disturbo del segnale vocale ricostruito dal nodo dell’interfono ma non ne compromette l’intelligibilità. Perché il segnale trasmesso dal nodo a priorità maggiore non risulti più comprensibile, è necessario raggiungere il valore 1/λtot=1.4 ms corrispondente a

W.L.tot = 100.4%. In questa condizione l’eccessiva perdita di campioni vocali non

permette più di interpretare il senso delle parole.

Il limite di W.L.tot a partire da cui inizia la perdita di campioni vocali, ed il

limite di W.L.tot a partire da cui il segnale vocale trasmesso risulta inintelligibile

vengono riportati in Tabella 4.2; i dati riguardano ambedue i canali vocali e mettono in evidenza anche il valore di 1/λtot corrispondente a W.L.tot indicato.

I dati si riferiscono ad una velocità di trasmissione di 1 Mbps.

Bit-rate 1 Mbps

W.L.tot 1/λtot Limite perdita di campioni del

canale 1 (priorità maggiore) 97.9% 3.6 ms Limite di intelligibilità del canale 1

(priorità maggiore) 100.4% 1.4 ms Limite perdita di campioni del

canale 2 (priorità minore) 97.5% 4.7 ms Limite di intelligibilità del canale 2

(priorità minore) 99.7% 1.7ms

E’ possibile notare che i limiti riportati trovati per il canale a priorità maggiore risultano più elevati rispetto a quelli relativi al canale con priorità più bassa.

E’ possibile inoltre notare come i valori limite di W.L.tot valutati nel caso

di traffico di controllo deterministico e casuale risultino (leggermente) inferiori rispetto a quelli analizzati nel paragrafo precedente in assenza di messaggi casuali. Tale fenomeno può essere spiegato considerando il fatto che il termine W.L.casuale

che compare nell’espressione di W.L.tot rappresenta il valore medio

dell’occupazione di banda dovuta al traffico casuale. Poiché gli intervalli di tempo di trasmissione dei messaggi casuali hanno una distribuzione esponenziale, si può verificare (con elevata probabilità) una serie di accodamenti di tali messaggi molto ravvicinati nel tempo; questo fatto determina un valore di W.L.casuale

istantaneo più elevato rispetto al relativo valor medio e quindi la perdita di campioni vocali (ed il relativo disturbo nel segnale vocale ricostruito dai nodi dell’interfono) si può verificare anche per W.L.tot inferiore al 100%.

Lo stesso fenomeno causa un peggioramento della qualità del segnale audio per valori di W.L.tot superiori al 100% e determina l’abbassamento dei

limiti di intelligibilità della voce (che può tuttavia risultare ancora comprensibile per W.L.tot al di sopra del 100%).

In Figura 4.13 vengono rappresentati i risultati degli eperimenti effettuati ad un bit-rate di 800 kbps ed in Tabella 4.3 sono riportati i valori numerici di W.L.tot e di 1/λtot corrispondenti alle differenti situazioni limite:

bit-rate 800 kbps 92 94 96 98 100 102 104 106 0,8 1,3 1,8 2,3 2,8 3,3 3,8 4,3 4,8 5,3 valor medio (ms) W .L. t o ta le m e di o ( %

) limite intelligibilità canale 1 --- limite perdita di campioni canale 1

Figura 4.13: Limiti di intelligibilità e di perdita di campioni del segnale vocale a 800 kbps

(traffico di controllo deterministico e casuale, canale audio a priorità maggiore).

Bit-rate 800 kbps

W.L.tot 1/λtot Limite perdita di campioni del

canale 1 (priorità maggiore) 98.2% 2.5 ms Limite di intelligibilità del canale 1

(priorità maggiore) 102 % 1.1 ms Limite perdita di campioni del

canale 2 (priorità minore) 97.7% 3 ms Limite di intelligibilità del canale 2

(priorità minore) 100.1% 1.5 ms

Tabella 4.3: Limiti di intelligibilità e di perdita dei campioni vocali (bit-rate 800 kbps).

I parametri scelti per il traffico periodico e deterministico (a 800 kbps) sono: B.P.=16 ms e B.L.=12.9 ms. In questo modo si ottiene W.L.periodico+W.L.audio

= 80.98% + 14.31% = 95.29%.

In Figura 4.14 ed in Tabella 4.4 sono riportati i risultati degli esperimenti effettuati a 500 kbps:

bit-rate 500 kbps 90 92 94 96 98 100 102 104 106 108 110 112 0,8 1,3 1,8 2,3 2,8 3,3 3,8 4,3 4,8 5,3 valor medio (ms) W .L . to ta le m e d io (% )

limite intelligibilità canale 1 --- limite perdita di campioni canale 1

Figura 4.14: Limiti di intelligibilità e di perdita di campioni del segnale vocale a 500 kbps

(traffico di controllo deterministico e casuale, canale audio a priorità maggiore).

Bit-rate 500 kbps

W.L.tot 1/λtot Limite perdita di campioni del

canale 1 (priorità maggiore) 98.5% 4.5 ms Limite di intelligibilità del canale 1

(priorità maggiore) 103.7 % 1.5 ms Limite perdita di campioni del

canale 2 (priorità minore) 98.2% 5.1 ms Limite di intelligibilità del canale 2

(priorità minore) 100% 3 ms

Tabella 4.4: Limiti di intelligibilità e di perdita dei campioni vocali (bit-rate 500 kbps).

I parametri scelti per il traffico periodico e deterministico (a 500 kbps) sono: B.P.=12 ms e B.L.=8.7 ms. In questo modo si ottiene W.L.periodico+W.L.audio

= 73.08% + 22.90% = 95.98%.

In Figura 4.15 ed in Tabella 4.5 sono riportati i risultati degli esperimenti effettuati a 250 kbps:

bit-rate 250 kbps 90 95 100 105 110 115 120 125 130 0,8 1,8 2,8 3,8 4,8 5,8 6,8 valor medio (ms) W .L . t o ta le me d io ( %

) limite intelligibilità canale 1 --- limite perdita di campioni canale 1

Figura 4.15: Limiti di intelligibilità e di perdita di campioni del segnale vocale a 250 kbps

(traffico di controllo deterministico e casuale, canale audio a priorità maggiore).

Bit-rate 250 kbps

W.L.tot 1/λtot Limite perdita di campioni del

canale 1 (priorità maggiore) 98.7% 6.5 ms Limite di intelligibilità del canale 1

(priorità maggiore) 106.7 % 2 ms Limite perdita di campioni del

canale 2 (priorità minore) 99.8% 4.9 ms Limite di intelligibilità del canale 2

(priorità minore) 101.7% 3.5 ms

Tabella 4.5: Limiti di intelligibilità e di perdita dei campioni vocali (bit-rate 250 kbps).

I parametri scelti per il traffico periodico e deterministico (a 250 kbps) sono: B.P.=23 ms e B.L.=11.4 ms.

In questo modo si ottiene W.L.periodico+W.L.audio = 49.34% + 45.80% =

95.14%.

In Figura 4.16 ed in Tabella 4.6 sono riportati i risultati degli esperimenti effettuati a 125 kbps:

bit-rate 125 kbps 90 100 110 120 130 140 150 160 0,8 2,3 3,8 5,3 6,8 8,3 9,8 valor medio (ms) W .L. t o ta le m e di o ( %

) limite intelligibilità canale 1 --- limite perdita di campioni canale 1

Figura 4.16: Limiti di intelligibilità e di perdita di campioni del segnale vocale a 125 kbps

(traffico di controllo deterministico e casuale, canale audio a priorità maggiore).

Bit-rate 125 kbps

W.L.tot 1/λtot Limite perdita di campioni del

canale 1 (priorità maggiore) 100% 8 ms Limite di intelligibilità del canale 1

(priorità maggiore) 110 % 3 ms Limite perdita di campioni del

canale 2 (priorità minore) 99.5% 9.5 ms Limite di intelligibilità del canale 2

(priorità minore) 103% 5 ms

Tabella 4.6: Limiti di intelligibilità e di perdita dei campioni vocali (bit-rate 1250 kbps).

I parametri scelti per il traffico periodico e deterministico (a 125 kbps) sono: B.P.=30 ms e B.L.=1 ms.

Conclusioni

Lo scopo degli esperimenti effettuati è stato quello di valutare qualitativamente e quantitativamente la trasmissione di segnali vocali realizzata attraverso un interfono che utilizza lo stesso protocollo di comunicazione e lo stesso bus dei dati di controllo all’interno di una rete CAN.

Poiché in tale tipo di reti i messaggi di controllo rappresentano un insieme di dati ad elevata priorità di trasmissione, è necessario che il traffico vocale introdotto dall’interfono non alteri le caratteristiche real-time di quello già esistente nel sistema. Perchè ciò avvenga, ai messaggi vocali viene assegnata bassa priorità e la loro trasmissione può avvenire soltanto quando il bus è libero. Per questo motivo il traffico vocale può subire dei ritardi in fase di trasmissione e quindi la qualità della voce riprodotta dall’interfono può variare in base all’occupazione del bus dovuta ai dati di controllo.

Nella prima fase del lavoro è stato quindi analizzato e realizzato un modello del traffico presente su rete CAN. A tal proposito i messaggi di controllo sono stati suddivisi in due categorie (messaggi periodici ad elevata priorità e messaggi casuali a priorità massima) e la loro trasmissione sul bus è stata simulata utilizzando due nodi della rete presente in laboratorio chiamati generatori di traffico. Il corretto funzionamento del generatore di traffico casuale è stato quindi verificato analizzando i tempi di trasmissione dei soli messaggi casuali e confrontando il relativo istogramma con l’andamento di una distribuzione esponenziale.

Gli esperimenti di laboratorio sono stati effettuati in un primo momento attivando l’interfono in presenza dei soli messaggi periodici ad elevata priorità. A partire da una condizione di traffico iniziale che garantisse la trasmissione di tutti

i messaggi vocali, l’occupazione del bus dovuta al traffico di controllo è stata progressivamente incrementata: in questo modo è stato possibile valutare (effettuando prove oggettive) fino a che punto il traffico vocale può essere trasmesso senza perdita di campioni. Aumentando ancora l’occupazione del bus dovuta ai messaggi periodici, sono stati inoltre valutati (in modo soggettivo) i limiti di intelligibilità del segnale vocale.

Gli stessi esperimenti sono stati nuovamente eseguiti attivando la trasmissione di ambedue i generatori di traffico per simulare in modo più accurato il traffico di controllo presente in una rete CAN reale.

I risultati degli esperimenti sono stati espressi in funzione di W.L.tot che

rappresenta il carico di lavoro complessivo del bus dovuto ai messaggi di controllo del sistema ed a quelli vocali. I limiti di intelligibilità sono stati espressi utilizzando lo stesso parametro: in questo caso i valori di W.L.tot superiori al 100%

indicano di quanto è possibile incrementare il traffico di controllo presente sul bus mantenendo intelligibile la voce riprodotta dall’interfono.

L’analisi dei risultati ottenuti ha permesso di verificare che, in presenza del traffico di controllo periodico e di quello casuale, la perdita dei campioni vocali dell’interfono si può verificare per valori di W.L.tot inferiori al 100%;

questo fenomeno tuttavia non pregiudica l’intelligibilità della voce ma crea soltanto un disturbo del segnale riprodotto dai nodi vocali. La voce infatti risulta ancora inelligibile se l’occupazione del bus dovuta al traffico di controllo viene incrementata oltre la condizione W.L.tot = 100%.

Confrontando inoltre i risultati delle prove effettuate in presenza del solo traffico di controllo periodico con quelli relativi alla situazione di traffico più generale (messaggi di controllo periodici e casuali), è stato possibile osservare come, nel secondo caso, la presenza dei messaggi trasmessi in modo casuale determinasse una (lieve) diminuzione dei valori di W.L.tot a partire da cui il

segnale vocale non risulta più intelligibile.

Il lavoro svolto ha permesso quindi di realizzare in laboratorio un modello del traffico di controllo presente in una rete CAN reale. Tale modello è stato infine utilizzato per effettuare l’indagine teorica e sperimentale della trasmissione di segnali vocali su rete CAN (VoCAN).

Appendice A

A-1 Istruzioni del programma Periodic Traffic Injector

#include "config.h" #include "init.h" #include "serial.h"

#define CAN_CH_ENABLE(ch) (ch>8 ? (CANEN1 & (1<<(ch-8))) : (CANEN2 & (1<<ch)))

#define MSK_TXOK 0x40

#define CAN_TXOK (CANSTCH & MSK_TXOK)

//--- DEFINIZIONE VARIABILI GLOBALI --- Uchar task_in_progress = 0;

Uchar NumMsg2Tx = 0; Uint16 BurstPeriod = 50; Uchar BurstLength = 1;

SystemStatus_t SystemStatus = Halted; #define MSKIPH1CAN 0x01 #define MSKIPL1CAN 0x01 main() { Uchar i; EA = 0;

CKCON |= 1; // imposto 6 cicli per istruzione X2=1 // inizializzazione periferuche uC

init_can(); init_timer1(); init_uart();

// metto l'interrupt CAN a priorità più alta IPH1 |= MSKIPH1CAN;

IPL1 |= MSKIPL1CAN;

put_string("Traffic Injector: I to insert, R to run and H to halt\n\r") EA = 1;

while(1) {

if (task_in_progress)

{

task_in_progress = 0;

// esecuzione task ciclo lento if (SystemStatus == Running) {

NumMsg2Tx += BurstLength; //accodo il nuovo burst di messaggi for(i=0; i<2; i++)

if(NumMsg2Tx>0) {

CAN_SET_CHANNEL(i);

if(!CAN_CH_ENABLE(i) && !CAN_TXOK) { ENABLE_CHANNEL_TX; NumMsg2Tx--; } } } if (RI) SerialComHandle(); } EA = 1; PCON = PCON | 0x01; } }

//--- DEFINIZIONE VETTORI DI INTERRUPT --- // DRIVER OROLOGIO

Interrupt(orologio(void), 3) {

static Uint16 conta_tempo = 0;

TF1 = 0; // acknowledgement interrupt conta_tempo++; if (conta_tempo == BurstPeriod) { task_in_progress = 1; conta_tempo = 0; } } // DRIVER CAN

Interrupt(it_can(void), 7) { fct_can_it(); } void can_fct_it_txok () { if (NumMsg2Tx>0) { ENABLE_CHANNEL_TX; NumMsg2Tx--; } } //--- INIZIALIZZAZIONE UART --- void init_uart() {

PCON &= 0xBF; // seleziono SM0 nel registro SCON SCON = 0x50; T2CON = 0; RCLK = 1; TCLK = 1; RCAP2H = HIGH(RCAP2_115200); RCAP2L = LOW(RCAP2_115200); TH2 = HIGH(RCAP2_115200); TL2 = LOW(RCAP2_115200); TR2 = 1; RI = 0; TI = 1; }

//--- INIZIALIZZAZIONE CAN CONTROLLER --- #define ID_1(id) ((Uint16)id*32)/256

#define ID_2(id) ((Uint16)id*32)%256 void init_can() { // variabili locali Uchar i, j; CAN_CONTROLLER_RESET; CAN_IT_DISABLE; CANTIM_IT_DISABLE; RazAllMailbox();

// impostazione del TIME BIT CanSetBRP(BRP);

CanSetPRS(PRS);

CanSetPHS1(PHS1); CanSetPHS2(PHS2);

CAN_CONTROLLER_ENABLE;

// configuro i canali 0 e 1 per trasmettere il msg con id = ID_TRAFFIC //abilito i canali a generare interrupt

// non abilito la trasmissione for(i=0; i<2; i++)

{ CAN_SET_CHANNEL(i); CANIDT1 = ID_1(ID_TRAFFIC); CANIDT2 = ID_2(ID_TRAFFIC); CANSTCH = 0x00; //CANCONCH = 0; CANCONCH = DLC_TRAFFIC;

for (j=0; j<DLC_TRAFFIC; j++) CANMSG = 0x55; CAN_CHANNEL_IT_ENABLE(i)

}

CAN_TX_IT_ENABLE; // abilitazione interrupt in trasmissione

CAN_IT_ENABLE; // abilitazione generale interrupt provenienti // dal CAN controller

}

//--- INIZIALIZZAZIONE TIMER1 --- void init_timer1()

{

CKCON |= 0x04; // dimezzo la freq. di clock del timer1 TMOD = TMOD & 0x0F;

TMOD = TMOD | 0x20; // 8 bit autoreload TH1 = 0; TL1 = 0; TR1 = 1; ET1 = 1; } ---FUNZIONI CHIAMATE--- // invio un carattere void put_char(char c) {

while(!TI); // aspetto che la UART sia libera a trasmettere TI = 0;

SBUF = c; }

void get_char(char* c) {

while(!RI); // aspetto che venga ricevuto un carattere *c = SBUF;

RI = 0; }

// invio una stringa di caratteri terminante con il carattere nullo void put_string(char* str)

{

Uchar i=0;

while(str[i]!='\0') put_char(str[i++]); }

// converto una cifra esadecimale in un carattere Uchar b2a(Uchar to_convert)

{

Uchar convert;

if ((to_convert >= 0) && (to_convert <= 9)) convert = to_convert + 0x30; else convert = to_convert + 0x37;

return (convert); }

// converto un carattere in una cifra esadecimale e restituisce vero se coerente Uchar a2b(Uchar ascii, Uchar* bin)

{

if ( (ascii >= 48) && (ascii <= 57) ) {

*bin = ascii - 0x30; return 1;

}

if ( (ascii>=65) && (ascii <= 70) ) { *bin = ascii - 0x37; return 1; } return 0; } void SerialComHandle() {

char c_rx; Uchar i, b_rx; EA = 0; c_rx = SBUF; RI = 0; switch(SystemStatus) {

case Running: if (c_rx == HALTED) { put_string("\n\rHalted\n\r"); SystemStatus = Halted; NumMsg2Tx = 0; } break;

case Halted: if (c_rx == RUNNING) { NumMsg2Tx = 0; put_string("Running\n\r"); put_string("Burst period = 0x"); put_char(b2a(HIGH(BurstPeriod) >> 4)); put_char(b2a(HIGH(BurstPeriod) & 0x0F)); put_char(b2a(LOW(BurstPeriod) >> 4)); put_char(b2a(LOW(BurstPeriod) & 0x0F)); put_string("\n\rBurst length = 0x"); put_char(b2a(BurstLength >> 4)); put_char(b2a(BurstLength & 0x0F)); put_string("\n\r"); SystemStatus = Running; } else if (c_rx == INSERT) {

put_string("Burst period (2 bytes) = 0x"); BurstPeriod = 0;

BurstLength = 0; for(i=0; i<4; i++) {

get_char(&c_rx);

while(!a2b(c_rx, &b_rx)) get_char(&c_rx); put_char(c_rx);

BurstPeriod = BurstPeriod << 4; BurstPeriod += b_rx;

}

put_string("\n\rBurst length (1 bytes) = 0x"); for(i=0; i<2; i++)

{

get_char(&c_rx);

while(!a2b(c_rx, &b_rx)) get_char(&c_rx); put_char(c_rx);

BurstLength = BurstLength << 4; BurstLength += b_rx; } put_string("\n\rPress R to run\n\r"); } break; default: break; } EA = 1; }

A-2 Istruzioni del programa Traffico Casuale

#include "config.h" #include "init.h" #define MSKIPH1CAN 0x01 #define MSKIPL1CAN 0x01 Uchar buffer_mem[LUNGHEZZA]; Uint16 num_mes = 0;

Uchar top =0; //oppure Uint16 o Uint32 a seconda di LUNGHEZZA Uchar bottom = 0; //oppure Uint16 o Uint32 a seconda di LUNGHEZZA Uchar errore = 0; Uchar canale = 0; void chiedi_byte(void); main() { Uchar c;

CKCON = 0x05; // timer1 in modalitá STD => CKCON=0x05 init_can();

init_uart(); init_timer1();

EA = 1; //abilito interrupt

// metto l'interrupt CAN a priorità più alta IPH1 |= MSKIPH1CAN; IPL1 |= MSKIPL1CAN; //riempio buffer_mem for(c=0; c<((LUNGHEZZA-2)/2); c++) { chiedi_byte(); }

//attivo timer 1 come timer degli intervalli di attesa TH1 = buffer_mem[top++];

TL1 = buffer_mem[top++]; //top punta a buffer_mem[2] TR1=1; //accendo timer1

//CAN_SET_CHANNEL(0); while(1)

{ if((bottom+2)%LUNGHEZZA!=top) { chiedi_byte(); } if(errore) {

SBUF = MANCANO_DATI; //buffer vuoto break;

} } }

//--- DEFINIZIONE VETTORI DI INTERRUPT --- //DRIVER TIMER1

Interrupt(driver_timer1(),3) {

//TF1=0; lo fa da solo il processore via hardware TR1=0;

if (top==bottom || ((top+1)==bottom)) errore=1; else

{

if (CANEN2 != 3) {

//CANSTCH=0; l'azzeramento di TXOK e'a carico di driver_can canale=CANEN2 & 1; CAN_SET_CHANNEL(canale);

Documenti correlati