Trasmissione seriale e verifica della sospensione del loop. (segue da questo articolo)

print 3zsp

Viene inviato all'uscita seriale un blocco di 4 caratteri per misurare bene cosa accade quando la trasmissione si prolunga un pochino a causa di un testo lungo da trasmettere.

Nella trasmissione, per riconoscere un blocco di 4 serial frame da quello successivo, il blocco viene modificato trasmettendo tre "z" ed uno spazio: "zzz " in modo che la presenza dello spazio ci possa permettere di riconoscere l'inizio e la fine del blocco inviato.

Lo spazio è codificato ASCII con 20H che in binario corrisponde a 0010 0000 che nella trasmissione vengono trasmessi in ordine inverso cioè 0000 0100 a cui deve essre anteposto il bit di start (in verde) che è zero; in questo modo si riconosce subito la sua posizione: 6 zeri consecutivi sono all'inizio del quarto carattere.

 

Lo sketch usato è il seguente (serial_Test_1)

serial Test 1

Con esso si invia ad ogni ciclo il blocco "zzz " a 9600 baud.

 

L'inizio del ciclo (riga 23) è rappresentato dal primo gradino che segue il ritardo fisso di 100µs messo al termine del ciclo (riga 37), vedi figura sotto.

 

 

serial Test1 base

Il ciclo base, senza alcun comando di stampa da eseguire, (riga 30 disabilitata) è nella figura a destra.

La durata del ciclo base è di 

5*52µs = 260µs = 0,26ms

 

 

 

 

 

Se si utilizza il comando di stampa si ha la fotografia dell'oscillogramma a regime:

print 3zspd

 

 

 

 

In esso si può osservare:

- l'inizio del blocco da inviare avviene con ritardo rispetto al comando di stampa; più in generale si può rilevare che a regime non c'è una relazione immediatamente deducibile dalla conoscenza dello sketch e del timing cioè dalla durata di esecuzione delle singole istruzioni;

- la misura del ciclo completo risulta essere circa 8,2*500µs = 4100µs =4,1ms

- c'è un notevole tempo di "attesa". o sospensione del ciclo principale, che dura circa 7,8*500µs = 3900µs = 3,9ms; questa attesa è dovuta alla necessità di arrestare il ciclo quel tempo che basta per poter inviare tutto il blocco prima che venga comandata un'altra stampa; se si aggiunge la durata del ciclo base si ha 3,9+0,26 = 4,16ms.

Nonostante gli inevitabili errori di apprezzamento, la durata misurata dell'intero ciclo è proprio la durata calcolata di quattro serial frame a 9.600 bit/s: 1,040*4= 4,16ms.

 

A questo punto si deve ricordare che la stampa avviene con un processo separato dal ciclo principale. Per consentire l'invio dei caratteri in modo indipendente dal ciclo principale occorre che ciascun carattere venga accantonato in una memoria apposita, il buffer, che provvede ad accumulare in ingresso caratteri alla velocità stabilita dal programma del loop in esecuzione ed a restituirli in uscita, con lo stesso ordine ma alla velocità richiesta per la trasmissione.

I serial frames in uscita vengono inviati, uno dopo l'altro, il primo direttamente alla USART interna al microcontrollore che ha un proprio registro interno, lo shift register, usato per serializzare la trasmissione e gli altri al buffer. Lo shift register deve vuotarsi prima di accogliere un altro carattere per cui è necessario che il carattere successivo, memorizzato nel buffer, debba attendere una autorizzazione prima di andare ad occupare lo shift register finalmente vuoto.

La USART provvede anche ad aggiungere i bit necessari alla trasmissione del serial frame.

 

Stampare veloce?

Cosa accade se la velocità di invio dei caratteri da parte del ciclo principale è maggiore della velocità di stampa?

Succede quello che capita quando si scrive sotto dettatura: lo scrivano dice "aspetta" e quando ha finito di scrivere le parole, quelle poche che può ricordare sul momento, dice di procedere con il dettato.  Chi detta, se non è uno sprovveduto, sa che può ricominciare a dettare prima che lo scrivano abbia finito perchè sa che la memoria è di nuovo disponibile anche se sta scrivendo l'ultima parola... in poche parole la memoria a brevissimo termine dello scrivano è un buffer che accumula le parole dettate e permette di scriverle con calma ricordandole per breve tempo solo che può ricordarne poche.

 

Per sapere cosa fa Arduino con una lunga serie di richieste di stampa si va ad indagare cosa succede con i primi byte inviati dopo un reset (nota 1) e risulta il seguente:

serialTest1 tr1a

Ci sono 16 cicli base che vengono ripetuti senza attesa, quindi un diciasettesimo ciclo con una attesa breve e poi si va a regime.

L'invio della parola "zzz " termina dopo il diciasettesimo ciclo, lì nasce il ritardo fisso rispetto al comando di stampa e si mantiene tale a regime.

Perchè 16 cicli in rapido avvicendamento e poi un rallentamento per effetto di intervalli di attesa?

  • Analisi della trasmissione:
    - il primo ciclo invia i primi quattro byte alla trasmissione
  • - il primo byte, va subito nello shift register della USART 
  • - gl altri tre vanno nel buffer occupando tre byte di 64 (nota 2)
  • - con i quindici cicli seguenti si inviano altri 15*4 = 60 byte e fanno 64 byte in tutto
  • - ora nel buffer ci sono in tutto 63 byte di 64 (il primo è andato subito nello shift register)
  • - al sedicesimo ciclo si rileva che l'invio dei 4 byte del primo blocco non è ancora terminato
  • - sono stati inviati due caratteri di quattro ed il terzo è nello shift register in fase di invio,
  • - significa che nel buffer cè ancora il quarto byte del primo blocco per cui ci sono 61 byte
  • - il diciasettesimo ciclo è pronto ad inviare i suoi 4 byte al buffer ma sono libere solo 3 posizioni di memoria
  • - occorre attendere che anche il quarto byte sia passato nello shift register
  • - quando inizia la trasmissione del quarto byte significa che esso ha lasciato il buffer per andare nello shift register
  • - in quel momento si libera la quarta posizione necessaria perchè il blocco di quattro caratteri possa essere salvato nel buffer ed il ciclo possa riprendere dal diciottesimo ciclo con la regolarità a regime descritta sopra in quanto, da ora in poi il ciclo principale, compresa l'attesa, deve durare 4,16ms.

 

 

Seguono alcuni esperimenti con baud rate diversi qui.

 

note

nota 1: per esempio dopo che si è chiesto di vedere sul monitor i caratteri inviati lo sketch viene forzato a riprendere dall'inizio

nota 2: di default il buffer per la stampa ha 64 byte (si può modificare: vai qui)