Verifica della interazione fra loop e trasmissione seriale.

Dopo aver compreso come avviene la comunicazione seriale (articolo "l'uscita seriale di Arduino"), vengono effettuate alcune prove per approfondirne il funzionamento in relazione al timing.

La durata della trasmissione di una intera stringa ed il baud rate producono effetti sul procedere regolare del ciclo principale in esecuzione.

Le prove servono ad osservere cosa succede se la trasmissione di una stringa dura molto tempo in relazione alla durata del ciclo principale (per esempio perchè si devono trasmettere molti caratteri con uno stesso comando di stampa) oppure cosa accade se si usano baud rate diversi.

 

Predisposizione delle prove

Si usa uno sketch che produce alcuni impulsi sul pin D9 con lo scopo di individuare correttamente la posizione della trasmissione di un singolo serial frame.

serial Test 1

Lo sketch è predisposto per inviare un array di caratteri contenente almeno una "z" (in ASCII = 7Ahex = 122dec); il baud rate è 9600, il loop invia impulsi sul pin D9 prima e dopo il comando di stampa nel modo seguente (le fasi hanno delle lettere di identificazione):

a- inizio del loop caratterizzato dal gradino positivo (riga 23)

b- ritardo "alto" di 50µs (nota 1) (riga 24)

c- quindi un gradino negativo (riga 25)

d- un ritardo "basso" di 50µs (riga 26)

e- un impulso breve "alto/basso" (righe 27 e 28)

f- comando di stampa, da questo momento deve partire la trasmissione seriale (riga 30)

g- un impulso breve "alto/basso" (righe 32 e 33)

h- un ritardo "basso" variabile usato per intervenire in fase sperimentale (riga 34)

k- un impulso breve "alto/basso" (righe 35 e 36)

j- un ritardo "basso" di 100µs con cui termina il loop (riga 37)

impulsi

Nel grafico (50µs/div, 2div) si vedono due cicli completi di esecuzione dello sketch in assenza di segnale da stampare (righe 30 e 34 disabilitate).

Il loop inizia con il gradino a- e la stampa al termine dell'impulso e-

La durata base del ciclo, misurata da un inizio loop al successivo inizio loop, senza alcun segnale di stampa, è di 5,2*50µs = 260µs = 0,26ms.

Una stampa ordinaria è già stata esaminata nell'articolo "l'uscita seriale di Arduino".

Lo schema della misurazione prevede l'uso di due sonde dell'oscilloscopio

- la sonda rossa sul pin D9 per monitorare il loop

- la sonda gialla sul pin D1 per monitorare TX

Tx

 

Nelle prove successive verrà inviata in vari modi la lettera "z" con il comando Serial.print della riga 29; la trasmissione seriale a dieci bit, che è quella di default in Arduino, produce il disegno oscillografico a destra dove sono visibili

- il bit di start (verde)

- il Byte della lettera "z" (giallo) con i bit inviati nell'ordine dal meno significativo al più significativo per cui vanno letti in ordine inverso ( epe questo c'è scritto etyB che è Byte capovolto)

- il bit di stop (rosso)

in tutto 10 bit che costituiscono il "serial frame"

Il componente interno al microcontrollore ATMEL adibito a questa operazione (la USART) riceve in parallelo il byte, lo converte in seriale con uno shift register ed aggiunge il bit di start ed il bit di stop; la serie di bit viene portata sul pin D1 uno dopol'altro al ritmo del baud rate fissato secondo il protocollo della trasmissione RS232.

La USART è un componente a parte rispetto al processore che esegue le istruzioni del loop; i due processi sono eseguiti separatamente salvo rispettare la necessità di assicurare che tutti i byte inviati vengano trasmessi e che nessuna istruzione del ciclo principale vanga saltata.

Come riconoscere sugli oscillogrammi il singolo serial frame?

L'inizio della trasmissione di stampa (Tx) avviene con un gradino negativo (passaggio repentino da alto a basso) ed un valore basso che si mantiene per una unità di tempo (l'intervallo di tempo tra due tacche verdi successive) a cui segue il Byte della lettera "z" che, come stabilito dalla tabella di codifica ASCII con gli 8 bit ordinati dal meno significativo (LSB) al più significativo (MSB), è 01011110. 

Il primi due bit inviati sono 0: il bit di start ed il primo bit del carattere, quelli numerati con 0 e 1, questi due bit  "bassi" rappresentano l'inizio del blocco di Tx o serial frame da riconoscere.

Il valore dell'unità di tempo dipende dal baud rate che di default è 9.600 bit/sec per cui l'unità di tempo è 104µs e la trasmissione del serial frame dura in totale 10*104µs = 1040µs.

 

 

println zb

Per completezza di esposizione si precisa che il comando Serial.println() aggiunge alla lettera z due caratteri: un ritorno carrello (CR) ed un avanzamento di linea (LF) per ordinare al ricevente di scrivere il nuovo carattere all'inizio della linea successiva: in tutto 3 serial frame (figura a destra) .

 

 

Il seguito dell'articolo si occupa di vari aspetti della trasmissione della sola lettera "z" in quanto non è il carattere o il gruppo specifico di caratteri che condiziona il timing ma la loro durata e la loro quantità per cui si faranno esperimenti con la sola istruzione Serial.print().

 

 

 

A) Stampa della lettera "z" con ritardo di 5ms nel loop

 print z r5d

Si riconosce il byte della lettera "z" che si presenta dopo una unità di tempo a aprtire dall'inizio della trasmissione.

La trasmissione inizia dopo il primo impulso breve e-, come previsto, con un gradino negativo (alto/basso), dopo una unità di tempo, viene posto sulla linea di trasmissione il bit meno significativo ... così via fino al completamento del Byte di carattere dopodichè viene prodotto un gradino positivo (basso/alto) che segnala la fine della trasmissione del Byte, il valore alto dura almeno una unità di tempo.

In assenza di trasmissione il valore del pin D1 rimane alto.

Dalla misurazioni di dettaglio si vede che il ritardo di inizio della trasmissone è di circa 20µs, intervallo di tempo trascorso dall'impulso e- e l'inizio della trasmissione.

print z rTx

 

 

 

 

 

 

 

 

 

 

 

print z r5t

Inviata la lettera "z", segue un lungo ritardo di 5ms come programmato nello sketch (base tempi 500µs/div).

Il ritardo serve ad assicurare tempo sufficiente alla trasmissione in modo da poter vedere che la trasmissione si attiva proprio quando previsto e senza che la trasmissione stessa, che dura circa 1ms, vada ad influenzare lo svolgimento del ciclo. Siamo cioè sicuri che il ciclo proceda regolarmente come programmato e la stampa avvenga completamente come stabilito, infatti:

- in questa situazione il ciclo dura in tutto: ciclo base + ritardo = 0,260 + 5 = 5,260ms

- la trasmissione dura 1,04ms (10 unità di tempo a baud rate 9.600) 

- resta un tempo di attesa per una nuova trasmssione pari a 5,26 - 1,04 = 4,22ms.

Con l'oscilloscopio si misura una attesa di 4,2ms: bene, l'attesa è spiegata! (nota 2).

 

 

B) Stampa della lettera "z" con ritardo di 1ms nel loop

Si diminuisce il ritardo a 1ms col risultato che la trasmissione riesce a terminare appena prima (220µs) che si debba trasmettere un nuovo carattere.print z r1t

Dal grafico si può vedere che dalla fine della trasmisisone all'inizio di una nuova trascorrono 220µs di attesa ed infatti:

- la trasmissione ha bisogno di 1040µs 

- il ciclo, che si svolge indipendentemente dalla trasmissione, ne occupa 1260 (ciclo base + ritardo di 1ms)

- l'attesa è allora pari a 1260 - 1040 = 220µs.

L'attesa minima necessaria per non interferire con una nuova trasmissione è di 1040 -260 = 780µs!

Cosa succede se il ritardo prodotto dal ciclo è minore? (nota 3)

 

C) Stampa della lettera "z" senza ritardo nel loop

Ecco cosa accade quando viene disabilitato il ritardo.

print z r0a 

Succede che a regime, appena termina la trasmissione del carattere con l'invio del bit di stop, subito viene emesso il bit di start del carattere successivo; il passaggio immediato dallo stop allo start si traduce in un impulso in trasmissione che dura una unità di tempo.

Con questa prova non si vede una relazione con il ciclo principale se non il fatto che la posizione relativa è costante, almeno a regime, quando è stata scattata la foto.

Si nota però un ritardo del ciclo (rosso) che non è dovuto ad alcuna istruzione; il ritardo è prodotto in qualche modo dalla trasmissione che interagisce con l'esecuzione del ciclo ed ha la durata giusta per allungare il ciclo di quel tanto da farlo durare in tutto esattamente quanto la trasmissione di un singolo carattere (1040ms).

La trasmissione di un carattere deve poter avvenire solo dopo che sia terminata quella del carattere precedente. 

Si vede che dopo l'impulso è-, quello che precede il comando di stampa, c'è una lunga pausa non programmata e si vede che l'inizio della trasmissione non corrisponde con ll'impulso e-.

Anzi, è la fine della trasmissione che corrisponde con la ripresa del ciclo principale a partire dall'impulso g-.

 

In generale la stampa procede in modo indipendente rispetto al loop ma i due processi interagiscono per poter essere eseguiti entrambi per intero, senza perdite.

 

D) Stampa della stringa "zzzz" senza ritardo nel loop

 Allungo la durata della trasmissione inviando quattro "z" consecutive.

print 4zp

La lettera "z" viene inviata in stampa a blocchi di quattro.

Il ritardo nell'esecuzione del ciclo è maggiore ed è dovuto all'attesa necessaria a consentire l'invio di quattro lettere "z", ma da questa prova non si vede quando termina il trasmissione del blocco. 

Ora il ciclo principale deve durare in tutto 4 volte 1040 con conseguente aumento del ritardo di esecuzione inserito entro il ciclo.

Per poter fare congetture sul modo di inviare caratteri occorre cambiare blocco da trasmettere (vedi seguito)

 

 

 

 

note

nota 1: sull'oscillogramma si vede che il ritardo è un po' maggiore di 50µs; questo è dovuto al fatto che il tempo necessario ad Arduino per eseguire due istruzioni successiva del tipo digitalWrite() richiede del tempo prima di essere eseguita, circa 6µs (vedi esperimenti sul timing di Arduino)

nota 2: risultato più che soddisfacente se si pensa che con l'oscilloscopio si producono errori di apprezzamento pari a circa 0,1 divisioni che alla scala di 500µs/div significano 50µs!

nota 3: il ritardo qui è imposto da una specifica istruzione ma analogo ritardo può essere dovuto allo svolgimento di altre operazioni che non prevedono la trasmissione.