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).