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
Scarica

Tx_Rx_PIC - Robotica