Home → Tutorial →
Appunti scolastici → Digitale →
Circuiti sequenziali → Segnali seriali

In questa pagina esamineremo segnali digitali non periodici, a volte
difficili da visualizzare con un oscilloscopio o un analizzatore di stati
logici. In particolare
useremo Arduino per trasmettere un segnale seriale, cioè una
sequenza di otto bit generati dall'hardware, ed un oscilloscopio digitale
per la loro analisi; lo scopo è soprattutto apprendere l'uso
del trigger dell'oscilloscopio con segnali non periodici.
Le immagini presenti in questa pagina sono state ottenute con un Picoscope
2205A MSO. Il
software usato è la versione 7.1.39 l'ultima
disponibile per Linux nel momento della stesura di questa pagina.
Segnale asincrono
Un segnale seriale asincrono, a volte indicato impropriamente come UART (nota 5), è costituito da:
- un bit LOW (bit di start)
- otto bit di dati trasmessi uno dopo l'altro a partire dal bit meno
significativo (LSB)
- almeno un bit HIGH (bit di stop)
- al termine della trasmissione il segnale rimane alto, fino al
successivo bit di start
Come indica il nome asincrono, non è trasmesso il segnale di
clock che deve essere generato autonomamente dal trasmettitore (TX) e dal
ricevitore (RX).
Tutti i bit hanno rigorosamente la stessa durata; l'inverso della durata di un bit è il
bit rate ed è misurato in bit/s. A volte è usato il termine
baud, misurato in simboli al secondo: in questo contesto coincide
numericamente
con il bit rate.
Qui una trattazione estesa,
piuttosto
datata e relativa all'implementazione tecnologica RS232.
Il grafico seguente mostra come esempio un segnale a 9 600 bit/s (9 600
baud); ciascun bit ha durata 1 / 9 600 = 104 µs. Il byte trasmesso è 0xAF
(10101111) a partire dal bit meno significativo, in un certo senso "al
contrario":
- la traccia in alto è quella mostrata da un oscilloscopio; è visibile
il rumore e può essere misurata la tensione corrispondente al livello
logico alto (5 V circa) ed al livello logico basso (0 V circa)
- la traccia in basso è mostrata da un analizzatore di stati logici;
i due livelli sono semplicemente HIGH ed LOW, senza alcun riferimento alla
tensione (nota 1).

Il segnale mostrato è generato da Arduino sul pin 1 (TX) mentre esegue il seguente codice:
void setup()
{ Serial.begin(9600);
}
void loop()
{ Serial.write(0xAF);
delay(10);
}
Per visualizzare il segnale con l'oscilloscopio occorre collegare la sonda
al pin 1 (TX) di Arduino; per usare l'analizzatore di stati logici occorre
collegare al pin 1 (TX) uno degli ingressi digitali. Ovviamente va collegata
anche la massa (GND).
Triggerare un segnale complesso come un byte trasmesso
serialmente potrebbe essere difficile; qui sotto
alcuni suggerimenti.
Attività 1
- scrivere il codice di esempio e visualizzare il byte trasmesso sia
in modalità analogica (oscilloscopio) che digitale (logic analyser).
Verificare la corrispondenza tra quando codificato e quanto visualizzato
- modificare il codice per generare un byte diverso da 0xAF
- modificare il bit rate. Consultare la
documentazione. Quale è il massimo bit rate che può essere
generato da Arduino?
- aggiungere un bit di
parità e modificare il
numero di bit trasmessi. Consultare la
documentazione.
- trasmettere due byte diversi, uno di seguito all'altro
- ridurre il ritardo delay(10) o addirittura
eliminare la riga del codice; ciò rende
ulteriormente difficile l'uso del trigger in quanto mancano "pause"
facilmente identificabili
Utilizzare la decodifica seriale (Serial decoding
→ RS232/UART) per decodificare
il segnale trasmesso:

Occorre:
- scegliere il canale da utilizzare, A nell'esempio
- impostare una soglia (indicativamente metà della tensione massima) e
l'isteresi (qualche decimo di volt). In genere questi valori sono
impostati automaticamente.
- scegliere il Baud Rate, la quantità di bit trasmessi, la parità ed
il numero di bit di stop coerentemente con le impostazioni del software.
In genere i valori predefiniti sono già corretti
- impostare il formato dei dati da utilizzare. In genere si preferisce
il binario oppure l'esadecimale
Accanto al segnale seriale verà
mostrato:
- il bit di start (LOW, su fondo grigio chiaro)
- il bit di stop (HIGH, su fondo grigio scuro)
- il byte trasmesso, su fondo violetto. Qui è mostrata la
rappresentazione binaria, ma è possibile scegliere altre
codifiche

Trigger
Triggerare correttamente un segnale seriale potrebbe essere complesso... La ragione risiede nel fatto
che, per sua natura, il
segnale seriale cambia continuamente e quindi non è periodico. In
particolare non è
facilmente distinguibile il bit di start da un altro bit LOW
successivo ad un bit HIGH.
Alcuni suggerimenti:
- Impostare il
trigger sul fronte di discesa, cioè in corrispondenza
dell'inizio del bit di start. Utile impostare la
base dei
tempi pari a 2-3 volte il tempo necessario per trasmettere un byte e
posizionare il
pre-trigger nella prima metà dello schermo:

- in aggiunta al punto precedente, utilizzare
Stopped per
"congelare" la forma d'onda; un modo per fare ciò senza premere il
pulsante è quello di impostare il trigger su Single invece che
Auto

- impostare come trigger valido solo quello distanziato di un intervallo minimo
rispetto al fronte precedente: ciò, a volte, permette di distinguere un
bit di start da un bit LOW. Per esempio se tra due byte è presente in
intervallo di 1 ms, possiamo inserire la seguente impostazione (utile
osservare la rappresentazione grafica sopra la scritta Interval):

- impostare come trigger valido solo quello successivo ad un impulso
positivo sufficientemente lungo, per esempio 900 µs nel caso in cui
l'intervallo tra due byte sia 1 ms

SPI
SPI permette di trasmettere un byte con due linee: il dato (COPI, Controller
Out Peripheral In, in precedenza indicato come MOSI, Master Output Slave
Input) ed il clock (SCK, Serial Clock).
Esaminiamo l'esempio seguente: gli otto bit 0x40 (0100 0000) vengono
generati uno dopo l'altro (segnale blu, COPI/MOSI, nota 3) in corrispondenza del fronte di salita
del clock (segnale verde, SCK). I due cursori sono in
corrispondenza dei primi due bit (01000000). La frequenza del clock è
125 kHz, quindi un bit dura 8 µs.

Inoltre è spesso presente un terzo segnale (CS, Chip Select, in precedenza
indicato come SS, Slave Select) che viene posto LOW all'inizio della
trasmissione e posto HIGH al termine. In questo caso, per osservare il
segnale, occorre disporre di un oscilloscopio con almeno tre canali oppure
di un analizzatore di stati logici.
Un codice di esempio che utilizza il
metodo SPI:
#include <SPI.h>
void setup() {
pinMode(10, OUTPUT); // set the CS pin as an output
SPI.begin();
SPI.beginTransaction (SPISettings (125000, MSBFIRST, SPI_MODE0));
}
void loop() {
digitalWrite(10, LOW); // set the CS pin to LOW
SPI.transfer(0xAF); // send a data
digitalWrite(10, HIGH); // set the CS pin HIGH
delay(1);
}
Anche in questo caso potrebbe essere complesso l'uso del trigger: se
presente, è particolarmente utile usare come riferimento CS.
Anche per il segnale SPI è disponibile la decodifica automatica (Serial decoding
→ SPI-SDIO):

Attività 2
- modificare il codice per trasmettere un byte diverso da 0xAF.
Verificare con l'oscilloscopio il corretto funzionamento.
- modificare il codice per trasmettere un numero a 16 bit. Verificare
con l'oscilloscopio il corretto funzionamento.
- modificare il codice per trasmettere una sequenza di byte contenuta
in un buffer. Verificare con l'oscilloscopio il corretto funzionamento.
- modificare la frequenza del clock. Quale è il massimo bit rate?
Verificare con l'oscilloscopio il corretto funzionamento.
- eliminare dal codice delay(1), rendendo
più veloce la trasmissione di più byte. Verificare con l'oscilloscopio
il corretto funzionamento.
- [ Complesso ] utilizzare un secondo Arduino, usato come periferica,
per ricevere il byte trasmesso. Sul ricevitore occorrerà utilizzare
l'ingresso CIPO/MISO da collegare all'uscita COPI/MOSI del trasmettitore
(nota 4)
Note
- Attenzione a non farsi ingannare dal grafico che, apparentemente,
mostra per il livello logico alto una tensione di circa -4 V. In
realtà i numeri lungo l'asse verticale sono relativi al solo canale
analogico
- Sono possibili quattro diverse modalità di funzionamento
- La numerazione dei pin può essere reperita
in questa pagina
- In alternativa è possibile collegare in un singolo Arduino uscita
COPI ed ingresso CIPO, cioè trasmettere il byte... a se stesso (loopback)
- Universal Asynchronous Receiver-Transmitter è il dispositivo
hardware che converte segnali seriali in parallelo o viceversa. A volte,
per estensione, indica anche i segnali seriali generati
Pagina creata nel gennaio 2021
Ultima modifica: 27 marzo 2025