In questo articolo affronteremo una delle problematiche incontrate da chi invia informazioni: la possibilità di interferenze elettromagnetiche e quindi la ricezione di bit errati. Entreremo nel dettaglio di una trasmissione seriale, affronteremo le tecniche di ricerca degli errori e vedremo un esempio di conferma dati con MCU Fujitsu F2MC/FR.
Le comunicazioni seriali sono affidabili e permettono la condivisione di informazioni tra dispositivi con un numero di conduttori contenuto. Lunghe distanze e zone con disturbi elettromagnetici pronunciati possono interferire con la comunicazione e rendere i dati inviati tra trasmettitore e ricevitori errati, e quindi non processabili dalle eventuali elettroniche di controllo. Fin dall’inizio, quando ancora le telecomunicazioni erano una scienza astratta, c’è stata la necessità di confermare la ricezione di un messaggio, dando la possibilità al trasmettitore di venire a conoscenza della destinazione dei propri dati.
Nei tempi moderni sarebbe alquanto anacronistico trovarsi alle prese con un messaggero a cavallo che ci consegna i messaggi, ma anche nel nostro secolo non c’è da stupirsi della tracciatura dei pacchi: il mittente spedisce una scatola contenente del materiale ricevendo in cambio un cedolino con un codice; durante tutto il viaggio del pacco è possibile risalire alla posizione istantanea, ricevendo conferma dell’avvenuta ricezione. Nelle telecomunicazioni, una procedura di conferma dati non si discosta molto dai fatti appena descritti per la spedizione di un qualsiasi prodotto postale. Il ricevitore, per operare correttamente con le informazioni appena ricevute, ha la necessità di sapere se i dati in suo possesso sono veritieri, e quindi non contengano errori dovuti a interferenze nella comunicazione. Molte tecniche sono state sviluppate, alcune permettono di rintracciare il o i bit errati, e di provvedere alla correzione senza la richiesta di ulteriori informazioni.
LE TECNICHE BASE PER IL CONTROLLO DEGLI ERRORI
Più elevata è la potenza di calcolo a disposizione, più efficace sarà l’algoritmo implementabile per il controllo e la verifica di un dato falsato durante una comunicazione. Come citato nell’introduzione dell’articolo, in questo testo concentreremo la nostra attenzione sulle tecniche implementabili nei microcontrollori Fujitsu F2MC/FR. Anche se le MCU di Fujitsu hanno potenzialità invidiabili messe a confronto con i concorrenti nel mercato, risulterà estremamente complesso e dispendioso in termini di risorse cominciare a impiegare un algoritmo per la ricerca degli errori troppo complesso.
BIT DI PARITÀ VERTICALE, IL VRC
Il bit di parità è forse uno dei metodi più semplici e facilmente utilizzabili per l’individuazione degli errori durante una comunicazione seriale. La parità permette, mediante un controllo numerico dei bit, di definire se una quantità precedentemente dichiarata sia pari o dispari, segnalando al ricevitore il risultato dell’operazione mediante un apposito bit, dando la possibilità di individuare errori senza la richiesta di una trasmissione ridondante. Esistono due possibili configurazioni per l’implementazione di un controllo di parità:
- si concorda a priori fra trasmittente e ricevente se la parità debba essere definita pari o dispari, ovvero se la somma dei bit settati a livello alto in un byte trasmesso debba sempre essere un numero pari o dispari. Il trasmittente setta a 1 o 0 l’ottavo bit in modo da forzare la parità concordata. Il ricevente controlla che la parità sia osservata in ogni byte. Se un byte è di parità sbagliata allora contiene almeno un bit errato;
- si determina a priori se il bit di parità a livello logico alto ha valore di pari o dispari e poi, durante la trasmissione, si procede alla conta dei singoli bit con lo stesso valore. Raggiunto l’ultimo valore, si prende il dato appena contato, si stima la parità e si aggiunge alla fine del messaggio prima del bit di stop. Il ricevitore effettuerà la medesima procedura, verificando il valore calcolato con quello ricevuto, e determinando quindi un possibile errore.
Il controllo di parità è estremamente semplice da implementare in maniera hardware, però scopre un’errata trasmissione solamente se i bit errati sono dispari.
CODICI POLINOMIALI, IL CRC
Molto efficace, ma esigente in fatto di prestazioni, il CRC consiste nel dividere per una costante il messaggio da trasmettere. Il risultato di tale operazione viene ignorato, il resto invece inviato in aggiunta al pacchetto. La stazione ricevente effettua sul blocco ricevuto la stessa operazione eseguita in trasmissione. Il resto del calcolo viene confrontato con il dato di controllo ricevuto: se i due corrispondono non vi sono errori nel messaggio, se i due non corrispondono il ricevitore effettua una richiesta di ritrasmissione. L’operazione matematica eseguita sul blocco per ottenere il “resto” è realizzata con un registro a scorrimento a più stadi reazionato attraverso porte EX-OR.
CHECKSUM
Il checksum non definisce un singolo algoritmo per l’identificazione di errore, ma raggruppa tutte quelle tecnologie che interessano la somma dei singoli bit dei blocchi dati in questione. Un messaggio da condividere viene diviso in più parti, solitamente multipli di 8, e a ogni blocco viene eseguita una funzione matematica che implica il rilascio di un risultato univoco per ogni pacchetto. Ogni singolo risultato viene a questo punto sommato con tutti gli altri, rilasciando un valore finale di controllo, o checksum. In fase di trasmissione, alla fine dei dati da inviare, viene accodato anche il checksum. Il ricevitore, con il dato in memoria e il valore di controllo, eseguirà la stessa funzione, ritrovandosi con il proprio valore calcolato. In questa situazione, se i due valori risultassero identici risulterebbe che nella comunicazione non sono sopraggiunti disturbi che hanno influito con i dati, comunicando al ricevitore che il messaggio in proprio possesso risulta immune da errori. Nel caso il checksum non fosse dello stesso valore in entrambi gli apparati coinvolti nella comunicazione, si procederà con la fase predefinita, cercando di recuperare il pacchetto originale, o richiamando una nuova trasmissione.
CODICI DI HAMMING
Molto più complesso ma allo stesso tempo efficace è l’impiego di codifiche di tipo Hamming. I sistemi di controllo errore fondano il loro funzionamento sul principio della ridondanza, proprio come farebbe una persona durante una comune conversazione. Ipotizzando di trovarsi in presenza di un forte disturbo acustico (interferenza) con due persone impegnate in una conversazione vocale, è difficile che queste riescano a udire completamente l’uno le frasi dell’altro, ma in ogni modo sono in grado di comprendersi. Ciò è dovuto al fatto che il cervello (MCU), automaticamente tende a mantenere un filo logico al discorso, sostituendo le parole sconosciute con alcune che riescano a mantenere un senso compiuto alla frase in discussione. Allo stesso modo, durante una comunicazione, in presenza di interferenze, le MCU riescono a riconoscere se un pacchetto è corrotto o meno, solamente seguendo il senso intrinseco della comunicazione. È scontato che il ricevitore non sarà a conoscenza dei dati che devono essere trasmessi, altrimenti non ci sarebbe la necessità di inviarli in linea, ma sfrutta bit noti appositamente aggiunti alla fine del blocco messaggio. Così facendo, anche in presenza di disturbi che comportino l’errata ricezione di una parte del messaggio, il micro nella maggior parte dei casi sarà in grado di determinare il problema ed eventualmente risolverlo.
LA RICERCA ERRORI CON F2MC/FR
Prima di poter affrontare con sicurezza una procedura di ricerca errori con un processore della famiglia F2MC/FR è opportuno fare un breve preambolo e cominciare analizzando le caratteristiche salienti di questi micro. Realizzata da Fujitsu Semiconductor America, Inc. per il mercato internazionale, la nuova famiglia F2MC/FR punta a un target di mercato molto evoluto e dalle caratteristiche rivoluzionarie. I nuovi microcontrollori sono equipaggiati con la nuova tipologia di memorie RAM Ferroelettriche (FRAM). Un integrato programmabile in tecnologia FRAM non suddivide più la propria memoria programma (ROM) con la memoria ad accesso casuale (RAM), ma predispone delle apposite procedure per definire quale porzione della FRAM dedicare al programma e quale parte dedicare alle variabili. Una memoria di tipo FRAM è un’opportuna parte del sistema in grado di comportarsi come una comunissima Random Access Memory durante la fase di utilizzo, ma in grado di mantenere i dati al proprio interno nelle stesse condizioni di una E2PROM. Ciò vuol dire una elevata quantità di cicli di scrittura/lettura in breve tempo, ma la possibilità di mantenere salvati i dati anche senza alimentazione. Oltre alla memoria il processore impiega una tecnologia a 8 bit operante con tensioni comprese tra 1,8 e 3,6 V, ideale quindi in qualsiasi applicazione portatile a batteria. È disponibile una serie completa di timer, porte UART, I2C e pin definibili come ingresso/uscita. Il debug viene eseguito connettendo l’interfaccia a un unico pin. In aggiunta un pratico circuito oscillatore trova posto all’interno del case, lasciando lo spazio a ulteriori pin per la gestione degli I/O.
LA RICERCA ERRORI
Il codice riportato nel Listato 1 rappresenta un metodo per il calcolo di un checksum spostando un dato formato da 16 bit in una porzione della RAM: le due variabili locali del programma sono dichiarate long visto che si utilizzano valori di dati a 16 bit. Il programma si suddivide in tre porzioni, due delle quali sono cicli. Si controlla la dimensione del messaggio e se questo ha valore superiore a uno, si aggiunge a sum il valore già presente al suo interno moltiplicato per addr + 1.
Il secondo blocco, utilizzato solo quando ci si trova all’ultimo bit da controllare a fine messaggio, esegue lo stesso algoritmo nel primo blocco, con l’unica differenza di effettuare un “and logico” con il valore appena calcolato prima di sommarlo al valore sum. Alla fine, si trasforma il dato in un valore a 16 bit e se ne effettua il complemento a uno. Il trasmettitore calcola con il codice nel Listato 1 il checksum relativo al messaggio da inviare, accodando il risultato dell’operazione alla fine del messaggio. Trasmesso in linea, alla fine della comunicazione, il ricevitore provvederà al proprio calcolo seguendo la funzione matematica, confrontando il dato ricevuto con quello calcolato. Se i due valori corrispondono, non ci sono stati problemi nella trasmissione, se invece i due dati non fossero uguali il controllore provvederà alla richiesta della ritrasmissione dei dati.
unsigned short calc_checksum( unsigned short *addr, int size) { unsigned long sum; unsigned long checksum; sum = 0; while( size > 1 ){ /*inizio primo blocco*/ sum+= *(addr++); size-= 2; } /*fine primo blocco*/ if( size > 0 ){ /*inizio secondo blocco*/ sum+= (*addr) & 0xff00; } /*fine secondo blocco*/ sum = (sum & 0xffff) + (sum >> 16); /* trasformazione a 16bit */ checksum = ~sum; /* complemento a uno */ }
Listato 1 |
CONCLUSIONI
La ricerca degli errori è una delle procedure più importanti nella trasmissione di un dato attraverso una linea. Spesso se ne sottovaluta l’importanza, stimando le probabilità che una linea porti al suo interno disturbi che possano influire con le interfacce ricetrasmittenti. Ma proprio per questi motivi spesso le comunicazioni raggiungono un rallentamento elevato.
Ho affrontato l’argomento della rilevazione degli errori in alcuni corsi universitari, è molto interessante leggere di come vengono effettivamente implementati in un microcontrollore.