USART PIC 16F876 L’USART (Universal Synchronous Asynchronous Receiver Trasmitter) è uno dei due moduli di I/O seriali, esso è conosciuto anche come Serial Comunications Interface (SCI). L’USART può essere configurato in modalità full-duplex asincrona per poter comunicare con dispositivi periferici, quali terminali CRT e personal computer, oppure in modalità half-duplex sincrona per comunicare con dispositivi periferici tipo circuiti integrati A/D o D/A , EEPROM seriali ecc. Configurazioni dell’USART • Asincrona (full-duplex) • Sincrona – Master (half-duplex) • Sincrona – Slave (half-duplex) Il modulo USART ha una compatibilità a 9 bit, cioè si possono ricevere e trasmettere anche 9 bit per frame. Per poter utilizzare la trasmissione seriale con il PIC 16F876, il bit SPEN (Serial Port Enable) del registro RCSTA deve essere posto ad 1, e i pin RC6/TX/CK e RC7/RX/DT devono essere settati tramite il TRISC bit 7 e 6 come pin per la trasmissione seriale, facendo in modo che il pin RC6 sia in Output (TX) e RC7 in Input (RX). I registri TXSTA e RCSTA sono i due registri di stato relativi al modulo trasmettitore e a quello ricevitore. Il registro di stato del modulo trasmettitore TXSTA R/W-0 R/W-0 R/W-0 R/W-0 Bit 7: CSRC TX9 Bit 7 Bit 6 TXEN SYNC Bit 5 Bit 4 U-0 _ Bit 3 R/W-0 R-1 R/W-0 BRGH TRMT TX9D Bit 2 Bit 1 Bit 0 CSRC:Clock Source Select bit (Lettura/Scrittura) Asynchronus mode non contemplato Synchronus mode 1=Master (clock generato internamente dal Baud Rate Generator BRG); 0=Slave (Clock derivante da una fonte esterna). Bit 6: TX9: 9-bit Trasmit Enable bit (Lettura/Scrittura) 2005 Antonello Micci 1 1=Seleziona 9 bit in trasmissione 0=Seleziona 8 bit in trasmissione Bit 5: TXEN:Trasmit Enable bit (Lettura/Scrittura) 1=Trasmissione abilitata 0=Trasmissione disabilitata Note: SREN/CREN di RCSTA sovrascrivono il bit TXEN Bit 4: SYNC:USART Mode Select bit (Lettura/Scrittura) 1=Modalità sincrona 0=Modalità asincrona Bit 3: Non implementato (letto come 0) Bit 2: BRGH:Hight Baud Rate Select bit (Lettura/Scrittura) Asynchronus mode 1=Alta velocità 0=Bassa velocità Synchronous mode Non utilizzato in questa modalità Bit 1: TRMT:Trasmit Shift Register Status bit (Lettura) 1=TSR vuoto 0=TSR pieno Bit 0: TX9D:nono bit in trasmissione.(anche bit di parità) (Lettura/Scrittura) Il registro di stato del modulo ricevitore RCSTA R/W-0 R/W-0 R/W-0 R/W-0 Bit 7: SPEN RX9 SREN Bit 7 Bit 6 Bit 5 R/W-0 R-0 R-0 R-x CREN ADDEN FERR OERR RX9D Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 SPEN: Serial Port Enable bit (Lettura/Scrittura) 1=Porta seriale abilitata 0=Porta seriale disabilitata Bit 6: RX9: 9-bit Receive Enable bit 1=Seleziona 9 bit in ricezione 0=Seleziona 8 bit in ricezione Bit 5: SREN: Single Receive Enable bit (Lettura/Scrittura) Asynchronous mode non contemplato Synchronous mode – Master 2005 Antonello Micci 2 1=Abilita singola ricezione 0=Disabilita singola ricezione Questo bit viene posto a 0 a fine ricezione Synchronous mode – Slave Non usato in questa modalità Bit 4: CREN: Continuous Receive Enable bit (Lettura/Scrittura) Asynchronous mode 1=Abilita la ricezione continua 0=Disabilita la ricezione continua Synchronous mode 1=Abilita la ricezione continua finchè CREN è a 0 (CREN sovrascrive SREN) 0=Disabilita la ricezione continua Bit 3: ADDEN: Address Detect Enable bit (Lettura/Scrittura) Asynchronous mode 9-bit (RX9=1) 1=Abilita il rilevamento dell’indirizzo,abilita l’interrupt e carica nel buffer di ricezione quando Receiver Shift Register RSR<8> è settato 0=Disabilita il rilevamento dell’indirizzo, tutti i byte venfono ricevuti e il nono bit può essere usato come bit di parità Bit 2: FERR: Framing Error bit (Lettura) 1=Errore nel frame (viene aggiornato alla lettura del registro di ricezione RCREG alla validazione del prossimo byte) 0=Nessun errore nel frame Bit 1: OERR: Overrun Error bit (Lettura) 1=Errore il byte è stato letto ancor prima che fosse ricevuto tutto (può essere azzerato dall’azzeramento del bit CREN) 0=Nessun Errore di Overrun Bit 0: RX9D: Nono bit in ricezione (può essere il bit di parità) (Lettura) 2005 Antonello Micci 3 USART Baud Rate Generator (BRG) Il BRG supporta entrambe le modalità, sincrona e asincrona dell’USART. Consiste in un registro a 8 bit dedicato alla generazione del Baud Rate. Il registro SPBRG controlla il periodo di scorrimento di un timer a 8 bit. Nella modalità asincrona il bit BRGH (TXSTA<2>) controlla anche il baud rate. Nella modalità sincrona il BRGH è ignorato. Per il calcolo del baud rate per le differenti modalità dell’USART in master mode (clock interno) vedere la seguente tabella. SYNC 0 1 BRGH=0 (low speed) BRGH=1 (high speed) (asincrona) Baud Rate=Fosc/(64(x+1)) Baud rate=Fosc/(16(x+1)) (sincrona) Baud Rate=Fosc/(4(x+1)) x= valore in SPBRG (0-255) NA Fosc= frequenza del clock del microcontrollore I vantaggi derivanti da una alta velocità del baud rate rispetto ad un bassa velocità sta nel fatto che l’equazione BR=Fosc/(16(x+1)) riduce in alcuni casi errori nel baud rate. Scrivendo un nuovo valore nel registro SPBR si azzera il timer del Baud Rate Generator BRG. 2005 Antonello Micci 4 Valori di Baud Rate (Data sheet ufficiale Microchip Pic 16F876) 2005 Antonello Micci 5 USART in modalità asincrona In questa modalità, l’USART usa il formato standard non-return-to-zero (NRZ) che prevede un bit di start e uno di stop, otto o nove bit per dato. Il formato più comune di trasmissione è quello ad otto bit. Per la generazione del baud rate viene impiegato un registro dedicato che deriva la frequenza del baud rate dall’oscillatore del microcontrollore. La trasmissione e la ricezione inizia dal bit meno significativo LSB. La trasmissione e ricezione funzionano in modo indipendente, usano lo stesso formato per i dati e lo stesso baud rate. La parità non è supportata nel harware, ma può essere implementata via software (memorizzando il nono bit del dato). La modalità asincrona è fermata durante lo SLEEP. Questa modalità è selezionata ponendo a zero il bit SYNC del registro TXSTA. Il trasmettitore asincrono Il cuore del trasmettitore è il Trasmit Shift Register TSR (non mappato in memoria e quindi non accessibile dall’utente). Il TSR viene caricato dal buffer di trasmissione TXREG, il quale è caricato con i dati da trasmettere via software. Il TSR non viene caricato con un nuovo valore se non è stato trasmesso il bit di stop del precedente dato. Appena terminata la trasmissione del dato precedente (bit di stop), il TSR viene caricato dal TXREG con un nuovo dato se disponibile. Appena il TXREG ha trasferito il dato in TSR, e quindi si è svuotato, il flag TXIF (TX Interrupt Flag) del registro PIR1 viene settato lanciando una interruzione (interrupt). L’interruzione può essere abilitata/disabilitata, settando/azzerando il bit TXIE (TX Interrupt Enable) del registro PIE1. Il flag TXIF viene settato indipendentemente dallo stato del bit di abilitazione TXIE, e non può essere azzerato via software. Viene resettato solo quando un nuovo dato viene caricato nel TXREG. Mentre il flag TXIF mostra lo stato del TXREG, un altro bit, il TRMT (TXSTA<1>), 2005 Antonello Micci 6 mostra lo stato del registro a scorrimento TSR. Il TRMT è un bit di sola lettura e viene settato solo quando il TSR è vuoto, quindi lo si può testare per controllare se la trasmissione del dato è terminata. La trasmissione viene abilitata mediante il bit TXEN del registro TXSTA, ma avviene solamente quando il registro TXREG è riempito con il dato ed in BRG ha prodotto uno shift clock. Si può anche caricare prima il registro TXREG e poi settare il bit TXEN. L’azzeramento durante la trasmissione del bit TXEN comporta l’interruzione della trasmissione ed il pin RC6/TX/CK viene posto in alta impedenza. Per utilizzare una trasmissione a nove bit, bisogna settare il bit TX9 del registro TXSTA ed il nono bit da trasmettere deve essere scritto in TX9D sempre del registro TXSTA. Naturalmente il nono bit deve essere scritto nel TX9D prima di caricare gli altri 8 bit nel TXREG, in quanto scrivendo prima gli 8 bit in TXREG potrebbe causare l’invio immediato da parte del TSR degli stessi e provocare la trasmissione di un nono bit incorretto. Settagli della trasmissione asincrona 1. Inizializzare in SPBRG l’appropriato valore per il baude rate e settare il bit BRGH se si desidera una alta velocità di trasmissione. 2. Abilitare la porta seriale asincrona, azzerando il bit SYNC e settando il bit SPEN. 3. Se si desidera l’interruzione settare TXIE. 4. Se si desidera una trasmissione a 9 bit settare il bit TX9. 5. Abilitare la trasmissione settando il bit TXEN il quale settera il bit TXIF. 6. Se è selezionata una trasmissione a 9 bit caricare il nono bit in TX9D. 7. Caricare il dato in TXREG (inizio trasmissione). Registri associati con la trasmissione asincrona 2005 Antonello Micci 7 Il ricevitore asincrono La ricezione del dato avviene tramite il pin RC7/RX/DT. Una volta selezionato la modalità asincrona,la ricezione viene abilitata attraverso il settaggio del bit CREN del registro RCSTA. Il cuore del ricevitore è il Receiver Shift Register RSR. Dopo aver ricevuto il bit di stop il RSR trasferisce il dato nel registro di ricezione RCREG (se è vuoto).Quando il trasferimento è completato il flag RCIF del registro PIR1 viene settato. L’attuale interruzione può essere attivata/disabilitata, settando/azzerando il bit RCIE del registro PIE. Il flag RCIF è di sola lettura e viene azzerato dall’hardware quando RCREG è stato letto e quindi svuotato. IL RCREG è un doppio buffer register di tipo FIFO, in quanto può accadere che due byte vengono ricevuti, mentre un terzo sta iniziando a scorrere nel RSR. Se al termine di quest’ultima ricezione (lettura bit di stop), il RCREG è ancora pieno, il bit di over run error OERR di RCSTA viene settato e il dato in RSR viene perso, mentre i due byte nel RCREG FIFO possono ancora essere recuperati. Il bit OERR può essere azzerato via software, resettando il ricevitore logico (CREN a 0). Se OERR è settato il trasferimento da RSR a RCREG è inibito. Il bit FERR di RCSTA viene settato se un bit di stop viene rilevato uguale a 0 anziché uguale a 1. Il bit FERR e il nono bit sono bufferizzati allo stesso modo, come dati ricevuti. Leggendo RCREG i bits RX9D e FERR verranno caricati con nuovi valori, quindi è essenziale per l’utente leggere prima RCSTA prima di leggere RCREG per non perdere i valori del FERR e del nono bit. 2005 Antonello Micci 8 Settagli della ricezione asincrona 1. Inizializzare in SPBRG l’appropriato valore per il baude rate e settare il bit BRGH se si desidera una alta velocità di trasmissione. 2. Abilitare la porta seriale asincrona, azzerando il bit SYNC e settando il bit SPEN. 3. Se si desidera l’interruzione settare RCIE. 4. Se si desidera una trasmissione a 9 bit settare il bit RX9. 5. Abilitare la trasmissione settando il bit CREN 6. Il flag RCIF sarà settato quando la ricezione sarà completata e verrà generato se abilitata l’interruzione attraverso il settaggio di RCIE 7. Leggere il registro RCSTA per ottenere il nono bit (se abilitato) e determinare se ci sono stati errori nella ricezione. 8. Leggere gli 8 bit ricevuti nel RCREG 9. Se ci sono stati errori, azzerargli attraverso l’azzeramento del CREN Registri associati con la ricezione asincrona La modalità con ADDRESS DETECT ,e la trasmissione sincrona non verranno trattati in questa dispensa. Per spiegazioni in merito alle modalità non trattate si può consultare il datasheet ufficiale del PIC 16F87X scaricabile dal sito della Microchip oppure consultare le Application Note AN774 sempre reperibili sul sito del costruttore (in lingua inglese). Antonello Micci 2005 Antonello Micci 9