Programmazione Hardware Software - Tutorial

bitPortal.it: Programmazione Hardware e Software


 Programmazione
Visual Basic.NET
Visual C++
LabView
C/C++ con Linux
Tcl/Tk
Bash
HTML
Javascript
Sicurezza

 Siti Interessanti
Articoli riguardanti il tema del lavoro da casa
 lavorare da casa

Tutorial sul web hosting + Articoli riguardanti il tema dell' hosting di siti web
  Hosting Sito Web


  L'interfaccia seriale RS232


Tutorial Interfaccia seriale RS-232



L'interfaccia seriale RS-232



Premessa

L'interfaccia seriale RS232 permette lo scambio di dati tra dispositivi digitali. In questo tutorial si illustreranno principalmente le caratteristiche di natura elettrica previste dallo standard con l'obiettivo di fornire le poche informazioni necessarie a progettare dispositivi elettronici che comunicano con un PC attraverso questa porta.


L'interfaccia seriale RS-232 - Versione 2.0d - Luglio 2001
Copyright © 2001, Vincenzo Villa

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

(E' garantito il permesso di copiare,  distribuire e/o modificare questo documento seguendo i termini della GNU Free Documentation License, Versione 1.1 o ogni versione successiva pubblicata dalla Free Software Foundation)

Il contenuto di questi documenti è fornito "così come è" (AS IS), a solo titolo didattico e senza garanzia alcuna, implicita o esplicita. In particolare non ci si ritiene responsabili di alcun danno diretto o indiretto causato dall'uso di queste informazioni.

Tutti i nomi di ditte e prodotti citati sono proprietà dei legittimi proprietari.


L'interfaccia RS-232 utilizza un protocollo seriale di tipo asincrono

Seriale significa che i bit che costituiscono l’informazione sono trasmessi uno alla volta su di un solo "filo". Questo termine è in genere contrapposto a "parallelo": in questo caso i dati sono trasmessi contemporaneamente su più fili, per esempio 8, 16 o 32.

Parlando astrattamente si potrebbe pensare che la trasmissione seriale sia intrinsecamente più lenta di quella parallela (su di un filo possono passare meno informazioni che su 16). In realtà questo non è vero in assoluto, soprattutto a causa della difficoltà di controllare lo skew (disallineamento temporale tra i vari segnali) dei molti trasmettitori in un bus parallelo, e dipende dalle tecnologie adottate: per esempio in una fibra ottica, in un cavo ethernet, USB o FireWire (tutti  standard seriali) le informazioni transitano ad una velocità paragonabile a quella di un bus PCI a 32 fili. In questa nota applicativa si parlerà solo di interfacce seriali "lente" cioè gestibili da PC e microcontrollori "normali".

Asincrono significa, In questo contesto, che i dati sono trasmessi senza l’aggiunta di un segnale di clock, cioè di un segnale comune che permette di sincronizzare la trasmissione con la ricezione; ovviamente sia il trasmettitore che il ricevitore devono comunque essere dotati di un clock locale per poter interpretare i dati. La sincronizzazione dei due clock è necessaria ed è fatta in corrispondenza della prima transizione sulla linea dei dati.

Le unità di misura

Le unità di misura della velocità di trasmissione sono essenzialmente due: il baud ed il bit per secondo (bps o, meno spesso, b/s), spesso trattate erroneamente come sinonimi.

Il baud rate indica il numero di transizioni al secondo che avvengono sulla linea; il bps indica, come dice il nome, quanti bit al secondo sono trasmessi lungo la linea.

Nel caso di trasmissione binaria (cioè è presente un livello alto ed uno basso) le due cose ovviamente coincidono numericamente, da cui la parziale equivalenza dei due termini. Nel caso di trasmissioni a più livelli, invece, è possibile trasmettere con una sola transizione più bit: se per esempio posso trasmettere otto diversi valori di tensione tra 0 ed 7 volt, con un solo valore di tensione invio tre bit (0V = 000, 1V = 001, 2V = 010…) ed in questo caso una trasmissione a 1000 baud equivale ad una a 3000 bps.

In questa nota parlerò solo di segnali binari trasmessi secondo lo standard RS232: quindi il baud rate, pari all'inverso della durata di un bit, coincidente numericamente con il bps.

Half-duplex e full-duplex

Le due parole sono riferiti a sistemi con un solo ricevitore ed un solo trasmettitore, come nel caso di un sistema che utilizza la RS232.

Il primo termine indica che la trasmissione è bidirezionale ma non avviene contemporaneamente nelle due direzioni: un dispositivo (ricevitore, listener o Rx) ascolta e l’altro (trasmettitore, talkner o Tx) emette segnali. Quando è necessario si scambiano i ruoli.

La trasmissione full-duplex indica che la trasmissione è bidirezionale e contemporanea. In questo caso sono necessari ovviamente due fili oppure qualche altro sistema per distinguere i due messaggi contemporanei nelle due direzioni.

Lo standard RS232 permette una trasmissione full-duplex in quanto è utilizzato un conduttore separato per ciascun verso di trasmissione delle informazioni. Il vincolo è in genere la necessità che trasmissione e ricezione abbiano lo stesso formato e, ovviamente, che ciascuno dei due nodi abbia sufficiente potenza di calcolo per la gestione del duplice flusso di informazioni.

Se la trasmissione è sempre in un solo verso, si parla di simplex.

Come è fatto un segnale RS-232

La cosa più semplice per descrivere un segnale RS232 è partire con un esempio.

Nell’immagine che segue è visualizzato, in modo idealizzato, cosa appare collegando un oscilloscopio ad un filo su cui transita un segnale RS-232 a 9600 bps del tipo 8n2 (più avanti verrà spiegata questa sigla) rappresentante il valore binario 00110000.

Trasmissione di un byte seriale

L’ampiezza del segnale è caratterizzata da un valore "alto" pari a circa +12V ed un valore "basso" pari a –12V. Da notare che, nello standard RS-232 un segnale alto rappresenta lo zero logico ed uno basso un uno, come indicato nel disegno e rovesciato rispetto al comune pensare.

A volte un segnale alto (+12V, cioè uno zero logico) è indicato come space ed uno basso (-12V, uno logico) come mark.

Tutte le transizioni appaiono in corrispondenza di multipli di 104us (pari ad 1/9600 cioè ciascun bit dura esattamente l'inverso del baud rate).

La linea si trova inizialmente nello stato di riposo, bassa (nessun dato in transito); la prima transizione da basso in alto indica l’inizio della trasmissione (inizia il "bit di start", lungo esattamente 104us). Segue il bit meno significativo (LSB), dopo altri 104 uS il secondo bit, e così via, per otto volte, fino al bit più significativo (MSB). Da notare che il byte è trasmesso "al contrario", cioè va letto da destra verso sinistra. Segue infine un periodo di riposo della linea di almeno 208us, cioè due bit di stop e quindi (eventualmente) inizia un nuovo pacchetto di bit.

Le varianti possibili sono le seguenti:

  • Se la trasmissione è più veloce o più lenta, la distanza tra i fronti varia di conseguenza (p.e. a 1200 bps le transizioni avvengono a multipli di 0,833 ms, pari a 1/1200)
  • Invece di trasmettere 8 bit, ne posso trasmettere 6, 7 o anche 9 (ma quest’ultima possibilità non è prevista dalle porte seriali dei normali PC)
  • Alla fine è possibile aggiungere un bit di parità
  • Alla fine la linea rimane nello stato di riposo per almeno 1 o 1.5 o 2 bit; notare che, se non ho più nulla da trasmettere, il "riposo" è molto più lungo, ovviamente. Molti sistemi non possono utilizzano 1.5 bit di stop

In genere il formato del pacchetto trasmesso è indicato da una sigla composta da numeri e cifre, per esempio 8n1 e 7e2:

  • La prima cifra indica quanti bit di dati sono trasmessi (nei due esempi rispettivamente 8 e 7)
  • La prima lettera il tipo di parità (rispettivamente nessuna ed even-parity, cioè parita pari)
  • La seconda cifra il numero di bit di stop (rispettivamente 1 e 2)

Tenendo conto che esiste sempre un solo bit di start, un singolo blocco di bit è quindi, per i due esempi riportati, costituito rispettivamente da 10 (1+8+0+1) e 11 (1+7+1+2) bit. Da notare che di questi bit solo 8 e, rispettivamente, 7 sono effettivamente utili.

Lo standard originale prevede una velocità fino a 20Kbps. Uno standard successivo (RS-562) ha portato il limite a 64Kbps lasciando gli altri parametri elettrici praticamente invariati e rendendo quindi i due standard compatibili a bassa velocità. Nei normali PC le cosiddette interfacce seriali RS-232 arrivano in genere almeno a 115Kbps o anche più: pur essendo formalmente al di fuori di ogni standard ufficiale non si hanno particolari problemi di interconnessione.

Ovviamente sia trasmettitore che ricevitore devono accordarsi sul modo di trasmettere i dati prima di iniziare la trasmissione.

E' importante garantire il rigoroso rispetto della durata dei singoli bit: infatti non è presente alcun segnale di clock comune a trasmettitore e ricevitore e l'unico elemento di sincronizzazione è dato dal fronte si salita del bit di start. Come linea guida occorre considerare che il campionamento in ricezione è effettuato di norma al centro di ciascun bit: l'errore massimo ammesso è quindi, teoricamente, pari alla durata di mezzo bit (circa il 5% della frequenza di clock, considerando che anche il decimo bit deve essere correttamente sincronizzato). Naturalmente questo limite non tiene conto della possibile difficoltà di riconoscere con precisione il fronte del bit di start (soprattutto su grandi distanze ed in ambiente rumoroso) e della presenza di interferenze intersimboliche tra bit adiacenti: per questo spesso si consiglia caldamente di usare un clock con una precisione migliore dell'1% imponendo di fatto l'uso di oscillatori a quarzo. Si potrebbe anche ipotizzare un meccanismo che tenta di estrarre il clock dai fronti intermedi ma si tratta nel caso specifico di un lavoro poco utile, visto che la lunghezza del pacchetto è piuttosto breve.

Il bit di parità

Oltre ai bit dei dati (in numero variabile tra 5 ed 9) viene inserito un bit di parità (opzionale) per verificare la correttezza del dato ricevuto. Esistono cinque tipi di parità:

  • None: nessun tipo di parità, cioè nessun bit aggiunto
  • Pari (even): il numero di mark (incluso il bit di parità) è sempre pari
  • Dispari (odd): il numero di mark (incluso il bit di parità) è sempre dispari
  • Mark: il bit di parità vale sempre mark
  • Space: il bit di parità vale sempre space

I parametri elettrici RS-232

La tensione di uscita ad un trasmettitore RS232 deve essere compresa in valore assoluto tra 5V e 25V (quest'ultimo valore ridotto a 13V in alcune revisioni dello standard). A volte le tensioni in uscita sono intenzionalmente diminuite a +/- 6V anziché 12V per permettere minori emissioni EMC, peraltro sempre critiche, e favorire maggiori velocità di trasmissione.

Il ricevitore deve funzionare correttamente con tensioni di ingresso comprese, sempre in modulo, tra i 3V ed i 25V. Molti ricevitori commerciali considerano semplicemente una tensione di soglia al valore di +2V (sopra viene riconosciuto un segnale alto, sotto uno basso) anche se ciò non è pienamente aderente alla norme. E' però utile per effettuare una trasmissione "rs232" con livelli TTL...

L’impedenza di uscita del trasmettitore deve in ogni situazione essere maggiore di 300 ohm; l’impedenza di ingresso deve essere compresa tra i 3 ed i 7 kohm, anche a dispositivo spento. La corrente prelevabile in uscita mantenendo i corretti valori logici deve essere di almeno di 1.6 mA (potrebbe però essere maggiore, anche di un ordine di grandezza) e nel caso di corto circuito deve essere minore di 100mA.

Infine lo slew-rate (cioè la pendenza del grafico del segnale nel passare da 1 a 0 o viceversa) deve essere minore di 30V/us per evitare eccessive emissioni elettromagnetiche.

Come collegare una porte TTL o CMOS alla RS232

In genere i segnali utilizzati dai sistemi digitali variano tra 0 e 5V e non sono quindi direttamente compatibili con la standard RS232. In commercio esistono appositi traslatori di livello che hanno il compito di fornire sia in trasmissione che in ricezione gli opportuni livelli pur non modificando la forma del segnale trasmesso.

Alcuni integrati (per esempio i classici 1488 e 1489, rispettivamente un trasmettitore ed un ricevitore, ambedue a quattro canali) sono molto usati in sistemi in cui è presente (oltre all'alimentazione logica di  5V o 3.3V ) un'alimentazione duale a +/-12V. Questo integrato, come praticamente tutti i circuiti di questo tipo, contiene un inverter per ciascun canale e quindi nel  segnale in uscita o in ingresso uno zero logico appare come 0 volt, cioè in quella che a molti sembra essere la rappresentazione ovvia dei segnali digitali.

L'uso di questi integrati è semplice ma non è sempre attuabile a causa della necessità di disporre di tre alimentazioni: si pensi per esempio alle apparecchiature alimentate a batteria.

Il MAX232 (ed integrati simili, fatti da un po' tutti i produttori di semiconduttori) è un circuito integrato che permette il collegamento tra logica TTL o CMOS a 5V e le tensioni RS-232, partendo solo da un'alimentazione a 5V.

Per ottenere la tensione positiva e negative necessarie per il funzionamento dell'integrato è usata una configurazione a pompa di carica, costituito da circuiti interni all'integrato e quattro condensatori esterni di circa 1 uF. La capacità effettiva dipende dal tipo di integrato e dalla relativa frequenza di commutazione; a volte i condensatori sono presenti all'interno dell'integrato stesso.

Sono disponibili anche integrati che richiedono un'alimentazione di solo 3.3V (p.e. il MAX3232).

La sezione ricevente del MAX232 è costituita da due porte invertenti che accettano in ingresso una tensione di +/- 12V (o altra tensione compatibile allo standard RS232) ed in uscita hanno un segnale TTL compatibile.

La sezione trasmittente ha due driver invertenti con in ingresso TTL compatibile e capaci  di erogare a vuoto una tensione di poco meno di +/- 10V, compatibile con lo standard RS232.

Un circuito a pompa di carica

Per ricavare le tensioni positive e negative necessarie per garantire i livelli richiesti dalla RS232 è pratica comune utilizzare un duplicatore ed un invertitore di tensione a pompa di carica.

Circuito a pompa di carica (immagioni A, B, C e D)

Le figure A e B mostrano come viene ottenuto il raddoppio della tensione. Una immagine che rende l'idea è quella di un contenitore (C2) che preleva acqua da una fonte e la riversa in un secondo contenitore (C1) posto a maggiore altezza. Più in dettaglio:

  • Inizialmente il condensatore C2 viene connesso tra massa e Vcc; quindi la corrente (in blu) carica C2 alla tensione di alimentazione (in giallo). Quindi Vc2 = Vcc
  • C2 viene successivamente connesso tra Vcc ed un secondo condensatore C1; la tensione ai capi di C1 deve essere uguale alla somma di Vcc e Vc2 e quindi C2 si scarica verso C1, che aumenta la propria tensione rispetto a massa
  • Il processo è ripetuto fino a quando la tensione ai capi di C1 è uguale a 2Vcc: in questo caso infatti C2 non si può più scaricare.

Da notare che, nel funzionamento normale, il processo non può mai interrompersi in quanto il carico collegato a C1, non disegnato, assorbe corrente e quindi tende a scaricare C2 stesso.

Analogamente le figure C e D mostra l'inversione di tensione:

  • Inizialmente C2 è caricato alla tensione di alimentazione (magari, come nel disegno da 2Vcc, ricavata con il precedente circuito)
  • Quindi C2 è connesso tra massa e C1 avendo cura di invertire le polarità. In questo modo C1 si carica a -2Vcc

Il limite dei circuiti a pompa di carica è la limitata quantità di corrente disponibile: infatti se prelevo corrente da C1 questo tende a scaricarsi, facendo scendere la tensione; la corrente generata da un circuito integrato tipo Max232 è generalmente tutta utilizzata per il solo funzionamento del driver e quindi non è disponibile per altri circuiti.

La piedinatura del connettore RS-232 del PC

Sono disponibili sul PC due tipi di connettori RS-232: DB9 (nove pin) e DB25 (25 pin, il connettore originale e presente solo sui PC più vecchi); ambedue i connettori sono maschi e praticamente identici dal punto di vista funzionale anche se non coincidente con quello proposto dallo standard ufficiale.

Connettori della interfaccia seriale e parallela

Nell'immagine sono visualizzati in basso i due tipi di connettori utilizzati sui PC di vecchia generazione; in quelli più recenti sono utilizzati solo connettori DB9, quando ci sono. Quello in alto è relativo alla porta parallela.

Di seguito la tabella con indicati i nomi dei segnali, il numero dei pin e la direzione del segnale (O = uscita dal PC).

Sigla

25pin

9pin

In/Out

Nome

TxD

2

3

O

Dati trasmessi

RxD

3

2

I

Dati ricevuti

RTS

4

7

O

Request To Send

CTS

5

8

I

Clear To Send

DTR

20

4

O

Data Terminal Ready

DSR

6

6

I

Data Set Ready

RI

22

9

I

Ring Indicator

DCD

8

1

I

Data Carrier Detect

GND

7

5

-

Massa

-

-

1

-

Terra

Non ho riportato un disegno dello schema per un semplice motivo: in genere crea solo problemi interpretativi in particolare se non è specificato se si tratta del connettore maschio o di quello femmina e se la vista è dal lato connettore o dal lato dei pin. Molto meglio leggere i numeri sempre riportati sul connettore plastico.

Una nota: quello usato dal PC non è il connettore previsto ufficialmente dallo standard che assegna una funzione a tutti e 25 i pin del connettore DB25.

Perché tanti fili ?

In teoria per ricevere e trasmettere un segnale RS-232 bastano tre fili: ricezione, trasmissione e massa. Spesso lo è anche in pratica.

Gli altri fili (spesso opzionali, ma dipende dall’applicazione) servono per il cosiddetto handshake tra PC e periferica (o tra PC e PC) cioè per sincronizzare in hardware la comunicazione.

Sono presenti due coppie di fili:

  • RTS/CTS: quando il PC inizia la trasmissione pone RTS alto, la periferica risponde quando pronta ponendo CTS alto. Per interrompere la trasmissione la periferica pone CTS basso.
  • DTR/DSR: Quando il PC è collegato per la prima volta, pone alto DTR. La periferica risponde ponendo alto DSR

Purtroppo questo modo di procedere ha un’infinità di variazioni. La parola d’ordine è: arrangiarsi per tentativi.

Un uso alternativo dei pin RTS e DTR è l'utilizzo come fonte di alimentazione del dispositivo collegato alla porta seriale stessa. L'esempio classico è il mouse seriale ma nulla impedisce di collegare un microcontrollore generico o qualche altro circuito. Unico ed importante limite è la corrente erogata, visto che questi pin non sono pensati per questo uso: è opportuno limitarsi ad un paio di mA anche se molti PC (ma non i portatili) permettono di arrivare tranquillamente a 10mA o anche più. Attenzione che è una sorgente non regolata.

Uart

Gli UART integrati che permettono di trasformate il segnale parallelo proveniente dal processore in segnale seriale. In genere vengono gestite dall'hardware tutte le funzioni a basso livello necessarie (inserimento dei bit di start e di stop, generazione o riconoscimento del bit di parità, generazione di interrupt) e spesso è presente un buffer FIFO che permette di ricevere ed inviare dati anche quando la CPU è impegnata. La descrizione di una UART va oltre gli scopi di questo tutorial: vi rimando quindi ad altre risorse disponibili in rete.

A volte, usando microcontrollori, questa funzione viene svolta in software anche se spesso in questo modo non si superano i 9600bps.

Risorse in rete

Un tutorial sulla RS232 veramente completo e ben fatto è quello di Craig Peacock disponibile sul sito http://www.beyondlogic.org, dove viene affrontato in particolare l'uso della UART del personal computer. Relativamente all'uso della seriale in ambiente DOS, posso segnalare anche la libreria C uart_lib di Chris Blum (purtroppo non riesco a trovare riferimenti aggiornati in rete).

Sul http://www.vincenzov.net ho inserito alcuni tutorial su altre interfacce seriali e parallele e in diversi progetti ho utilizzato routine di trasmissione e ricezione seriale per i microcontrollori ST6.

I siti dei produttori di componenti elettronici presentano i fogli tecnici con tutte le informazioni relative ai loro prodotti per l'interfaccia RS232: a solo titolo di esempio cito http://www.ti.com, http://www.maxim-ic.com e http://www.national.com.

GNU Free Documentation License

La licenza GNU FDL, disponibile sul sito http://www.gnu.org anche in versione italiana, è parte integrante di questo documento e ne contiene i termini di utilizzo. 

Questo tutorial è liberamente disponibile sul sito http://www.vincenzov.net.
















 Hosting
servizi di hosting, registrazione dominio, redirect con il nome a dominio .. con Aruba
       [Dettagli]