Cerca

modulo attività

modulo tecnica

Come funziona il comando di stampa seriale utilizzato da Arduino?

18k 20160819 855234

Che tipi di segnali invia e come viene codificato un carattere?

 

Arduino UNO utilizza i pin digitali D0 e D1 per la comunicazione con il PC/MAC via porta USB (nota 1).

Utilizzando un solo pin digitale la trasmissione del segnale sotto forma di bit non può che avvenire in modalità seriale: i bit da trasmettere vengono presentati sul pin digitale uno dopo l'altro con una cadenza prefissata. Quando è in atto uno scambio di dati i LED Rx e /o Tx (quelli vicino al LED sul pin D13) lampeggiano.

Il pin D0 serve per ricevere dati (e si chiama RX), il pin D1 serve per trasmettere dati (e si chiama TX) .... lo scambio dei dati avviene sempre in forma digitale, ovvero, come successione di "zero" e "uno" nella quantità sufficiente a definire il contenuto della comunicazione.

Qui ci si occupa della trasmissione dei dati verso il monitor del PC/MAC ma non è molto diversa da quelle effettuate verso altri dispositivi purchè ammettano lo stesso protocollo utilizzato dalla scheda Arduino che usa lo standard EIA RS-232 a logica positiva (nota 2), la trasmissione seriale RS-232 è asincrona, la trasmissione avviene con un bit di start, un bit di stop e nessun bit di parità di defalut.  

Si predispone la scheda Arduino per inviare un carattere (senza ritorno a capo) con lo sketch a destra: tming test 04z

In figura sotto è riprodotto il serial frame che costituisce l'unità di tramissione prodotta dalla USART interna al microcontrollore sulla base del byte in ingresso e dei parameri fissati per la comunicazione.

Con un oscilloscopio collegato al pin D1 si registra la traccia della trasmissione della lettera "z" come in figura sotto:

zeta

 

Si vede che il segnale è inizialmente "alto" (l'inizio è a sinistra perchè sull'oscilloscopio la base dei tempi cresce da sinistra verso destra), c'è quindi una successione apparentemente senza senso di valori "alto" e "basso" ed infine un valore "alto". Secondo la logica positiva, il valore "alto" è codificato "1", il valore "basso" è codificato "0".

in dettaglio, se si suddivide il tempo in 10 unità u, si può vedere che il segnale trasmesso è composto dai seguenti bit a partire da sinistra: 

- inizialmente il segnale è "alto" cioè 1, questo valore segnala inattività, è lo stato di "idle",

- bit 0 = 0, la transizione 1/0 segnala l'inizio della trasmissione, il primo bit è 0, è lo "start bit", ed i due oscillatori, preventivamente accordati sulla stessa frequenza, attendono lo stesso tempo u per scrivere/leggere il bit successivo

Tx

- si vede quindi che:

bit 1 = 0

bit 2 = 1

bit 3 = 0

bit 4 = 1

bit 5 = 1

bit 6 = 1

bit 7 = 1

bit 8 = 0

bit 9 = 1

il bit 9 (il decimo bit) è lo "stop bit", vale uno e pone di nuovo la trasmissine in uno stato di attesa (idle = ozio).

La sequenza completa comprende 10 bit a partire dall'inizio della trasmissione: 0-0101 1110-1 (nota 3)

Si considerano solo gli 8 bit centrali, quelli in neretto, dato che il bit 0 ed il bit 9 servono solo per delimitare gli 8 bit utili alla trasmissione.

Questi 8 bit costituiscono il Byte trasmesso solo che il bit 1, che è quello più a sinistra perchè viene inviato per primo per convenzione, è il bit meno significativo per cui occorre leggere i bit da destra verso sinistra e scriverlo in modo da collocare il bit più significativo alla sinistra; in questo modo si ottiene che il Byte trasmesso è:

0111 1010

che in esadecimale si scrive 7A, in decimale vale 122 e sulla tabella di conversione ASCII corrisponde alla lettera "z" ... appunto!

 

Con una simulazione realizzata con Scratch2 si ottiene questo video

Il programma realizza le funzioni di un trasmettitore il cui ricevitore è l'operatore che deve registrare i bit utili nel momento fissato dalla cadenza.

Il primo bit serve per allertare l'operatore che così si "sveglia" e si predispone a raccogliere, dopo quello della sveglia, otto bit registrandoli appena sente il bip, quando ha finito di contare fino a otto riceve ancora un impulso e poi basta, la trasmissione è finita! (nota: deve saper contare fino a dieci)

L'operatore riscrive in senso inverso i bit registrati ed esegue la conversione per trovare il carattere ricevuto utilizzando la tabella ASCII.

 

Riassumendo:

- il dato viene inviato sotto forma di Byte che significa che si devono trasmettere 8 bit! La codifica avviene secondo lo standard ASCII (nota 4);

- dato che la comunicazione è asincrona, il trasmettitore ed il ricevitore si devono preventivamente accordare sulla cadenza temporale di invio dei dati (baud rate) (nota 5);

- per la corretta comprensione del segnale occorre aggiungere un bit di "start" prima del byte ed aggiungere un bit di "stop" alla fine: in tutto occorre trasmettere 10 bit (nota 6) che sono il serial frame;

- la trasmissione seriale avviene sempre a pacchetti di 10 bit per cui il ricevitore sa che devono arrivare 10 bit; il primo bit avverte che la trasmissione ha inizio, il secondo bit è il bit meno significativo del Byte, il nono bit è il bit più significativo del Byte, il decimo bit è un bit di stop che segnala la fine della trasmissione;

- in assenza di trasmissione il valore del pin è mantenuto "alto" ed il ricevente si mette in stato di attesa (idle).

  

Il baud rate

Il baud rate è la cadenza con cui vengono inviati i bit ovvero è la misura del numero di bit che vengono trasmessi in un secondo (nota 7).

La cadenza di scrittura di ciascun bit deve essere uguale alla cadenza di lettura: occorre che la scrittura e la lettura di ciascun bit siano contemporanei.

Il valore della cadenza deve essere identico sia per il trasmittente che per il ricevente; questo è il motivo per cui è necessario definire a priori la velocità di trasmissione in modo che sia in accordo con la velocità di ricezione.

 

Se si allarga la base dei tempi del'oscillogramma della trasmissione della lettera "z" in corrispondenza dei bit 2 e 3 che hanno durata u unitaria, si può misurare la durata dell'unità di tempo u18h 20160818 764550

La durata di u è di

5,2div*20µs/div = 104µs.

baud monitor

Trattandosi di un evento periodico di periodo u, si può calcolare la frequenza:

f = 1/u = 1/104*106 = 9.600 bit al secondo

che è il baud rate fissato con l'istruzione alla riga 10 dello sketch.

Il baud rate del monitor è, di default, fissato a 9.600 ma può essere modifcato purchè lo stesso valore venga inserito nella riga 10 dello sketch altrimenti vengono letti caratteri a caso.

 

Sono state effettuate delle prove per esaminare i problemi connessi con l'uscita seriale e la sua interferenza con il procedere del ciclo principale (qui

 

note

nota 1: il segnale digitale prodotto dal pin D1 non viene inviato all'esterno così com'è, cioè una successione di bit zero-uno, ma viene trattato con un apposito circuito sulla scheda Arduino che provvede a trasformare il segnale digitale in segnale a modulazione di frequenza adatto all'interfaccia USB,

nota 2: la ricezione di dati da un dispositivo seriale ha le stesse modalità di funzionamento;

nota 3: i bit 1 presenti durante la fase di idle non si utilizzano in quanto il ricevente sa che non c'è trasmissione di dati e quindi non li rileva o non li registra ma attende soltanto; quando si presenta la transizione 1/0 il ricevente si predispone a contare fino a 10  periodi di tempo del valore dell'unità u prescelta, in ciascun periodo registra il bit corrispondente;

nota 4: lo standard ASCII era inizialmente a 7 bit per cui si potevano scambiare 128 caratteri diversi (da 0 a 127) ed era condiviso da tutti i progettisti. Ora è esteso ad 8 bit ma non c'è accordo per cui la corrispondenza fra codice numerico e carattere non è assicurata per i codici di valore superiore a 127 (è il motivo per cui si deve comunicare al PC/MAC quale tastiera si vuole usare, sia per la collocazione dei caratteri sui tasti della tastiera, sia per il segno da attribuire ad un codice ASCII esteso voluto per codificare caratteri speciali di una particolare lingua. Arduino utilizza solo i primi 128 caratteri, trasmette e riceve un byte, cioè 8 bit, ma riconosce solo i primi sette bit, gli altri caratteri vanno codificati con procedura apposita. 

nota 5: se si prova a disallineare i due dispositivi impostando due baud rate diversi si vede che sul monitor compaiono caratteri a caso;

nota 6: questi due bit aggiuntivi sono quelli che consentono la sincronizzazione dei due oscillatori in modo che la lettura di ciascun bit avvenga nel momento giusto; se uno dei due oscillatori produce un periodo leggermente diverso, l'errore di tempo si accumula ed alla lunga il ricevitore potrebbe non riconoscere i caratteri inviati con errori che possono essere anche importanti; in questo modo l'errore dovuto alla frequenza leggermente diversa si accumula solo sui 10 bit della trasmissione ... niente;

nota 7: il baud rate non rappresenta la quantità di informazioni che transitano in un secondo: 8 bit al secondo non significa un Byte al secondo. Nel nostro caso un Byte ha bisogno di 10 bit per essere trasmesso. In altri casi, quando sono necessarie verifiche di parità o ridondanze ci vogliono molti bit oltre gli 8 necessari a trasmettere ciascun Byte.

Tu non hai i permessi necessari per i commenti! Devi registrarti.