Le comunicazioni seriali
Le comunicazioni seriali richiedono un minimo di due connessioni elettriche per comunicare dati in
una direzione. Una linea dati (generalmente o di trasmissione o di ricezione) ed una linea per la
massa. Lo standard più diffuso storicamente per le comunicazioni seriali è la RS232 anche se
recentemente diversi standard elettronici più veloci ed affidabili si sono affermati.
RS232
Lo standard RS-232 è uno degli standard storici per la comunicazione seriale tra periferiche e nasce
dalla necessità di far comunicare telescriventi con sistemi modem. La sua specifica iniziale del 1962
prevedeva connessioni a 19200 bit al secondo su cavi di lunghezza di 20 mt, seguita nel 1969 dallo
standard più diffuso chiamato RS-232C. Questo standard ha visto la sua diffusione principale con
l’introduzione nel primo PC dell’IBM, e le sue evoluzioni più recenti del RS422/449 permettono di
arrivare fino a 10Mbps su cavi di 2km.
I livelli elettrici della RS232 sono compresi tra i 5 ed i 25 volt, ma i valori codificati assumono
5,10,12 e 15V. I bit vengono codificati con valori negativi per l’1 logico (marking) e valori positivi
per lo 0 logico (spacing), mentre i valori vicini allo zero non sono associati a valori logici. Il
numero di cavi dello standard è costituito da 22 con un connettore 25-pin “D” ma nella normale
comunicazione tra personal computer solo 9 vengono usati e per questa ragione si è diffuso il
connottore a 9 pin. Nella denominazione della RS232 si parla di DTE per Data Terminal Equipment
e di DCE Data Communications Equipment, dove il DTE corrisponde al personal computer
evoluzione dell’antico typewriter ed il DCE corrisponde al modem.
Il circuito elettrico equivalente è
Poichè I segnali elettrici (livelli di tensione) utilizzati sono molto maggiori rispetto ai livelli
utilizzati nei dispositi digitali quali microcontrollori per poter adoperare correttamente la
comunicazione seriale tra dispositivi integrati sono nati
In genere i segnali utilizzati dai sistemi digitali variano tra 0 e 5 V e non sono quindi direttamente
compatibili con la standard EIA RS-232. 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 MC1488 e MC1489, introdotti sul mercato dalla Motorola,
rispettivamente un trasmettitore ed un ricevitore, ambedue a quattro canali) sono molto usati in
sistemi in cui è presente (oltre all'alimentazione logica di 5 V o 3.3 V) un'alimentazione duale a +/12 V. 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, fu introdotto dalla Maxim ma è attualmente prodotto da molte ditte
di semiconduttori) è un circuito integrato che permette il collegamento tra logica TTL o CMOS a 5
V e le tensioni EIA RS-232, partendo solo da un'alimentazione a 5 V.
I segnali fondamentali sono:
2
3
4
5
6
7
20
DB25
TD
RD
RTS
CTS
DSR
GND
DTR
3
2
7
8
6
5
4
DB9
25 Pin Connector on a DTE device (PC connection)
Male RS232
DB25
Pin Number
Direction of signal:
1
Protective Ground
2
Transmitted Data (TD) Outgoing Data (from a DTE to a DCE)
3
Received Data (RD) Incoming Data (from a DCE to a DTE)
4
Request To Send (RTS) Outgoing flow control signal controlled by DTE
5
Clear To Send (CTS) Incoming flow control signal controlled by DCE
6
Data Set Ready (DSR) Incoming handshaking signal controlled by DCE
7
Signal Ground Common reference voltage
8
Carrier Detect (CD) Incoming signal from a modem
20
Data Terminal Ready (DTR) Outgoing handshaking signal controlled by DTE
22
Ring Indicator (RI) Incoming signal from a modem
9 Pin Connector on a DTE device (PC connection)
Male RS232
DB9
Pin Number
Direction of signal:
1
Carrier Detect (CD) (from DCE) Incoming signal from a modem
2
Received Data (RD) Incoming Data from a DCE
3
Transmitted Data (TD) Outgoing Data to a DCE
4
Data Terminal Ready (DTR) Outgoing handshaking signal
5
Signal Ground Common reference voltage
6
Data Set Ready (DSR) Incoming handshaking signal
7
Request To Send (RTS) Outgoing flow control signal
8
Clear To Send (CTS) Incoming flow control signal
9
Ring Indicator (RI) (from DCE) Incoming signal from a modem
Nel protocollo esteso di comunicazione seriale si possono usare i cavi aggiuntivi:
• RTS messo ad 1 dal DTE per inviare
• CLS è la risposta del DCE al RTS del DTE
•
•
DTR è proposta del terminale per indicare di essere pronto a ricevere
DSR è la risposta del DCE
Il baud rate è la velocità di trasmissione che vale 110-19200 per l’UART 8250 e 38400-921600 per
il 16550 dipendente però dal clock utilizzato per pilotare il chip.
La soluzione più semplice per l’invio in RS232 consiste nell’uso di soli tre fili RD/TD/GND
•
•
•
•
Attesa del bit di start uguale a 0
Campionamento dei valori T0 + TB/2 + n TB
Controllo del bit di parità 1
Controllo del bit di stop (1,1.5,2) di valore pari a 0
La configurazione tipica è 8 bit di dati, nessuna parità ed un bit di stop per un totale di 10 bit
Accuratezza di trasmissione
Uno dei problemi possibili nel caso della comunicazione seriale è costituito dalla precisione del
baud rate. Si supponga che sorgente e destinazione abbiano due fonti di clock diverse che si
discostano per un errore percentuale pari a delta.
Sarà pertanto (1+delta) = T2/T1.
I campionamenti del segnale sul ricevente (effettuati ai tempi T2, 2T2, 3T2,…) prvocheranno un
errore di allineamento rispetto alla trasmissione pari a:
T2-T1 =delta*T1
2*T2-2*T1 = 2* delta*T1
3*T2-3*T1 = 3* delta*T1
4*T2-4*T1 = 4* delta*T1
5*T2-5*T1 = 5* delta*T1
Errori via via crescenti man mano che il frame procede.
E’ chiaro che l’errore massimo sara` raggiunto sull’ultimo bit (N=lunghezza del frame). E perche’
sia rispettata la condizioni di integrita` di ricezione dovra’ essere”
delta * N* < T/2
da cui
delta < .5/N
Nel caso dei microcontrollori tale errore va conteggiato per assicurarsi che sia trascurabile poichè il
baudrate è stabilito attraverso una formula analitica collegata al timer (MCU) del controllore.
Nel caso di una trasmissione tipo 8N1 (8bit no parity, 1 bit di stop) delta<5%.
Inoltre per tener conto che anche la sorgente di trasmissione possa avere un errore percentuale
bisognera’ tenersi lontano dal limite del 5%.
Controllo del flusso
Il controllo del flusso della RS232 può avvenire secondo tre diverse modalità:
• Nessuno: in questo caso si cerca l’inizio del bit di start sul canale di ricezione. Con questo
sistema si usano solo 3 fili.
• Hardware: vengono usati i fili RTS/CTS per l’invio dal DTE al DCE e DTR/DSR per la
ricezione dal DCE
• Software XON/XOFF: si usano due caratteri 17 (CTRL+Q) e 19 (CTRL+S) per iniziare la
comunicazione
Quando si vuol connettere due periferiche (ad esempio due PC) si può procedere ad una
configurazione Null-modem. La configurazione Null-modem può essere effettuata in vari modi a
seconda del tipo di handshaking scelto, che può essere assente o completo, sulla base del tipo di
comunicazione scelta e della velocità massima. La soluzione minimale senza handshaking è la
seguente
Nei microcontrollori o in altri dispositivi di elaborazione solitamente si ha una interfaccia che si
chiama UART o USART che si occupa della trasmissione seriale e parallela. L'acronimo sta
rispettivamente per Universal asynchronous receiver/transmitter e Universal
synchronous/asynchronous receiver/transmitter ad indicare che la trasmissione effettuata può essere
sincrona o asincrona.
Una unità UART solitamente contiene le seguenti componenti:
• un generatore di clock, tipicamente ad un multiplo del bit rate per garantire il campionameno
a metà del periodo di bit.
• shift registers di ingresso e di uscita
• controllo di trasmissione/ricezione
• logica di controllo di lettura/scrittura
• transmit/receive buffers (optional)
• parallel data bus buffer (optional)
• First-in, first-out (FIFO) buffer memory (optional)
Le porte seriali nel AVR
L’atmega169 mette a disposizione diverse porte seriali (sia sincrone che asincrone) per le
comunicazioni con dispositivi remoti. In particolari due tipi principali di perficeriche sono
disponibli: le porte seriali sincrone (che non tratteremo in questo corso) e le porte seriali asincrone.
Siccome la Butterfly mette a disposizione un traslatore di livello per la comunicazione sui livelli
elettrici RS232 questa porta ci consentirà di connettere direttamente personal computer e schede
butterfly senza la necessità di interporre altra elettronica.
Per attivare il modulo delle perte seriali assicurarsi che il relativo bit (PRRUSARTx) di risparmio
energetico sia posto a zero.
Il funzionamento della porta e del protocollo seriale è stato già visto precedentemente, nel seguito
dettaglieremo come impiegare la periferica messa a disposizione dall’Atmega per controllare gli
stream di input e output. In primo luogo rivediamo lo schema della periferica:
Lo schema prevede due moduli (uno di trasmissione e uno di ricezione) affiancati ad un generatore
di temporizzazione. Lo schema di temporizzazione è in sostanza un divisore di frequenza il cui
comportamento è regolato sia dal calore del registro UBRR che da alcuni bit di controllo. Valgono
le seguenti relazioni tra il BAUDRATe e il Valore di UBRR.
Ovviamente il procedimento per calcolare la frequenza di comunicazione (data l’approssimazione
intera del valore di UBRR) è doppio. Dapprima dal BAUDRATE calcolo il valore del UBRR
seguendo la formula nella seconda colonna, quindi utilizzando la prima colonna calcolo il
BAUDRATE effettivamente realizzato. Ovviamente dovrò accertare che l’errore di frequenza
commesso, confrontato con la lunghezza del FRAM sia accettabile per non incorrere in errori di
comunicazione (OVERRUN/UNDERRUN).
Utilizzando le risorse disponibili possiamo quindi comporre dei frame socondo lo standard della
comunicazione seriale, ed in particolare:
• 1 bit di start;
• 5, 6, 7, 8, o 9 bit di dati;
• 1 bit di parità (pari o dispari);
• 1 o 2 bit di stop.
Tra quadre i campi opzionali.
Ovviamente i setting per la trasmissione e la ricezione sono identici, quindi una sola copia dei bit di
configurazione permette di controllare entrambi i moduli. Prima di vedere i valori ed i significati dei
registri ci configurazione, esaminiamo un esempio di operazione in codice C.
#define FOSC 8000000 // Frequenza dell’oscillatore RC
#define BAUD 115200 // frequenza di comunicazione
#define MYUBRR FOSC/8/BAUD-1 // Usare delle define per questi valori che sono
// poi costanti nel codice aiuta a diminuire spazio e ottimizzare il codice oggetto
#define MYUBRRH (MYUBRR/256)
#define MYUBRRL (MYUBRR&255)
void main( void )
{
...
/* Imposto il baud rate */
UCSRA |= 0x02; // Abilito modalità trasmissione veloce
UBRRH = MYUBRRH;
UBRRL = MYUBRRL;
/* Abilito moduli di ricezione e trasmissione */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Imposto il formato del frame: 8data, 2stop bit */
UCSRC = (1<<USBS)|(3<<UCSZ0);
...
}
Descrizione dei registri
Reg
Mode
BIT7
BIT6
BIT5
BIT4
BIT3
BIT2
BIT1
BIT’
UDR
UDR
UCSRA
UCSRB
UCSRC
UBRRH
UBRRL
RD
WR
RW
RW
RW
RW
RW
Rxb7
Txb7
RXC
RXCIE
UBR7
Rxb6
Txb6
TXC
TXCIE
UMsel
UBR6
Rxb5
Txb5
UDRE
UDRIE
UPM1
UBR5
Rxb4
Txb4
FE
RXEN
UPM0
UBR4
Rxb3
Txb3
DOR
TXEN
USBS
UBR11
UBR3
Rxb2
Txb2
UPE
UCSZ2
UCSZ1
UBR10
UBR2
Rxb1
Txb1
U2X
Rxb8
UCSZ0
UBR9
UBR1
Rxb0
Txb0
MPCM
Txb8
UCpol
UBR8
UBR0
RxbX: bit in ricezione dalla porta seriale
TxbX: bit in trasmissione dalla porta seriale
RXC: Rx Complete, dati disponibili nel buffer di ricezione (controllo in poll);
TXC: Tx Complete, trasmissione completata (per spegnere il device);
UDRE: UDR empty. Il registro di trasmissione è pronto per accettare nuovi dati;
FE: Frame Error, gli stop bit non tornano
DOR: Data Overrun, dati in arrivo e buffer pieno
UPE: Parity error (in ricezione ovviamente)
U2X: trasmissione a velocità doppia
MPCM: Multiprocesso Com Mode, abilita la USART a ricevere solo frame
che iniziano con un indirizzo preimpostato.
RXCIE, TXCIE, UDRIE: abilitazione interrupt relativi
RXEN: abilitazione del ricevitore
TXEN: abilitazione del trasmettitore
UCSZXXX: numero dei bit di dati 5, 6, 7, 8, 9
Umsel: Modo di operazione: = = Asincrono (default), 1 ==
sincrono
UPMX: Parity mode 0= disabilitato, 1= riservato, 2 = pari,
3= dispari;
USBS: numero di stop bit. =0= 1bit stop, 1=2bit stop;
UCSZX: 0=> 5, 1=>6, 2=>7, 3=>8, 7 =>9 bit
4,5,6 non permessi
UCPOL: in modo sincrono definisce se i campioni vanno
prelevati sui fronti in salita. Ovvero sui fronti in discesa (0 =
discesa, 1= salita);
La tabella di fianco riporta i valori tipici ottenibili con la
butterfly una volta che l’oscillatore interno sia stato calibrato per poter funzionare a 8MHz. In
alternativa alla programmazione del oscillatore potremo calibrare i valori di UBRR con la frequenza
effettiva (non calibrata).
Scarica

Le comunicazioni seriali RS232