![]() | ![]() |
|
|
Porta Seriale
Una delle caratteristiche piu' potenti dell'8051 e' l'UART integrata, conosciuta anche come porta seriale. Questo vuol dire che puoi facilmente leggere e scrivere dati sulla porta seriale. Senza tale periferica, simulare il comportamento della porta seriale richiederebbe un processo noioso di controllo dei pin di I/O in rapida successione per campionare un bit alla volta compresi i bit di start, stop e parita'.
Nel nostro caso invece, l'unica operazione da effettuare e' quella di configuarare la porta seriale con il modo operativo ed il baud rate. Una volta configurata la porta e' sufficiente leggere o scrivere un registro SFR per ricevere od inviare dei dati in linea. L'8051 dal suo canto ci avvertira' automaticamente quando avra' finito di trasmettere un byte oppure quando avra' terminato di ricevere un byte. Non ci dobbiamo assolutamente preoccupare della trasmissione a livello di bit con un evidente risparmio di codice e tempo di elaborazione.
Inizializzare il modo di funzionamento della porta seriale
Il primo passo da compiere per usare la porta seriale e' quello di configurarla. Dobbiamo informare l'8051 di quanti bit vogliamo usare, quale sara' la sorgente del baud rate ed in quale modo verra' ricavato il baud rate dalla sorgente assegnata.
Prima di tutto analizziamo il registro SCON "Serial Control" e definiamo il significato di ogni bit:
|
Nome |
Indirizzo a bit |
Spiegazione della funzione 414h77e |
|
SM0 |
9Fh |
Bit 0 di modo |
|
SM1 |
9Eh |
Bit 1 di modo |
|
SM2 |
9Dh |
Abilitazione della Comunicazione Multiprocessore (vedi in seguito) |
|
REN |
9Ch |
Receiver Enable. Questo bit deve essere settatto per abilitare la ricezione. |
|
TB8 |
9Bh |
Transmit bit 8. Nono bit da trasmettere nel modo 2 e 3 |
|
RB8 |
9Ah |
Receive bit 8. Nono bit ricevuto nel modo 2 e 3 |
|
TI |
99h |
Transmit Flag. Settato quando il byte e' stato trasmesso. |
|
RI |
98h |
Receive Flag. Settato quando un byte e' stato ricevuto. |
Vanno inoltre definiti i bit SM0 e SM1 con la seguente tabella:
SM0 |
SM1 |
Modo Seriale |
Spiegazione |
Baud Rate |
|
|
|
Shift Register a 8-bit |
Oscillatore/ 12 |
|
|
|
Uart a 8-bit |
Dal Timer 1 (*) |
|
|
|
Uart a 9-bit |
Oscillatore/ 32 (*) |
|
|
|
Uart a 9-bit |
Dal Timer 1 (*) |
(*) Nota : Il baud rate
indicato in questa tabella e' raddoppiato se PCON.7 (SMOD) e' settato.
Il registro SCON permette di configurare la porta seriale. Ora analizziamo
ciascun bit in dettaglio.
I primi 4 bit (bit da 4 a 7) servono alla configurazione.
I bit SM0 e SM1
permettono di impostare il modo seriale da 0 a 3. I quattro modi
sono definiti nella precedente tabella. Come potete osservare, il modo seriale
seleziona sia il modo operativo che la maniera con la quale viene calcolato il
baud rate. Nei modi 0 e 2 il baud rate e' fisso e basato sulla frequenza
dell'oscillatore principale. Nei modi 1 e 3 il baud rate e' variabile e dipende
dalla frequenza con la quale va in overflow il timer 1. Ne parleremo piu'
diffusamente tra poco.
Il bit successivo, SM2 e' un flag per impostare la "Comunicazione
Multiprocessore". Normalmente, alla ricezione di un byte, l'8051 attivera'
il flag "RI" (Receive Interrupt). Questo segnala al programma che un
dato e' stato ricevuto e deve quindi essere processato. Quando SM2 e' attivo,
il flag "RI" verra' attivato soltanto se il nono bit ricevuto ha il
valore uguale ad "1". Per cui se SM2 e' attivo e il nono bit ricevuto
e' zero, il flag RI non si attivera' mai. Questa funzionalita' puo' essere
utile in alcune applicazioni che usano funzioni avanzate di comunicazione
seriale. Per il momento e' opportuno porre il bit SM2 sempre a zero in maniera
da avere il flag RI attivo ogni volta che viene ricevuto un carattere,
Il bit successivo, e' REN "Receiver Enable." Questo bit e' molto semplice. Se volete abilitare la ricezione della porta seriale dovete settarlo.
Gli ultimi 4 bit (bit da 0 a 3) sono bit operativi. Essi vengono impiegati durante la fase di ricezione e trasmissione dei dati e non sono quindi usati per configurare la porta seriale.
Il bit TB8 e' usato nei modi 2 e 3 nei quali vengono trasmessi nove bit di dati. I primi 8 corrispondono a quelli inseriti nel registro SBUF e il nono bit e' preso da TB8.
Il bit RB8 funziona essenzialmente come TB8, ma e' usato durante la ricezione. Nei modi 2 e 3 vengono ricevuti 9 bit. I primi 8 corrispondono a quelli letti in SBUF ed il nono viene copiato in RB8.
Il bit TI "Transmit Interrupt." viene usato per segnalare la fine della trasmissione di un byte. Quando viene scritto un byte in SBUF, la porta seriale impiega un po' di tempo per inviare i dati dalla porta seriale. Se il programma scrive un nuovo dato prima che il precedente sia stato completamente inviato, verrano mischiati i bit in trasmissione. Il bit TI serve a segnalare al programma quando il byte e' stato completamente trasmesso e il buffer di trasmissione e' di nuovo pronto per inviare un altro byte.
Il bit RI "Receive Interrupt" e' simile al bit TI ma indica che un byte e' stato ricevuto dalla porta seriale. In questo caso il programma applicativo deve leggere alla svelta il valore da SBUF prima che un altro byte possa essere ricevuto.
Inizializzare il Baud Rate della porta seriale
Una volta che la porta seriale e' stata configuarata, bisogna impostare il baud rate. Cio' e' applicabile soltanto ai modi 1 e 3 poiche' nei modi 0 e 2 il baud rate e' fisso ed e' legato alla frequenza di oscillazione del quarzo del micro. Nel modo 0, il baud rate e' sempre ricavato dividendo la frequenza di clock principale per 12. Questo significa che se usate un quarzo a 11,059 MHz il baud rate sara' pari a 921.583 baud. Nel modo 2 invece la il baud rate e' sempre ricavato dividendo la frequenza di clock principale per 64, e quindi se usiamo un quarzo come quello dell'esempio precedente il baud rate sara' pari a 172.797.
Nei modi 1 e 3, il baud rate dipende dalla frequenza con la quale il timer 1 raggiunge l'overflow. Piu' spesso il timer 1 va in overflow, maggiore sara' il baud rate. Esistono varie maniere per fare cio', ma la piu' comune e' quella di configurare il timer 1 a 8-bit con auto-reload (modo 2) ed impostare il valore di reload in TH1. In questo modo il timer 1 andra' periodicamente in overflow generando il baud rate.
Per determinare il valore che deve essere scritto in TH1 per un dato baud rate, e' possibile usare la seguente equazione (assumiamo che PCON.7 sia impostato a zero):
TH1 = 256 - ((Fq/ 384) / Baud) - Fq = Frequenza del quarzo
Se PCON.7 e' settato, il baud rate vale il doppio, per cui va usata quest'altra equazione:
TH1 = 256 - ((Fq / 192) / Baud)
Per esempio, se abbiamo un quarzo che oscilla a 11,059 MHz e vogliamo impostare il baud rate a 19.200:
TH1 = 256 - ((Fq / 384) / Baud)
TH1 = 256 - ((11059000 / 384) /
TH1 = 256 - ((28,799) / 19200)
TH1 = 256 - 1.5 = 254.5
Come possiamo notare, per ottenere 19.200 baud dovremmo impostare TH1 a 254.5. Se lo impostiamo a 254 avremo 14.400 baud e se lo impostiamo a 255 avremo 28.800.
Come fare?
Tranquilli, per impostare 19.200 baud, imposteremo semplicemente PCON.7 (SMOD) a 1. Questo ci raddoppiera' il baud rate e utilizzando la seconda equazione avremo:
TH1 = 256 - ((Fq / 192) / Baud)
TH1 = 256 - ((11059000 / 192) / 19200)
TH1 = 256 - ((57699) / 19200)
TH1 = 256 - 3 = 253
Adesso possiamo usare 253 che e' un numero intero.
Scrivere un dato sulla porta seriale
Configurata la porta seriale, siamo ora in grado di ricevere e trasmettere dei dati. Se ritenete che la configurazione della porta seriale sia semplice, l'uso della stessa e' banale. Per scrivere un byte sulla porta seriale sara' sufficiente scriverlo sul registro SBUF (99h).
Per inviare la lettera "A" useremo la seguente istruzione:
MOV SBUF,#?A?
Dopo l'esecuzione dell'istruzione precedente, l'8051 comincera' a trasmettere il carattere attraverso la porta seriale. Ovviamente la trasmissione non e' istantanea, essa richiede una quantita' di tempo prestabilita. Poiche' l'8051 non dispone di un buffer di trasmissione aggiuntivo, dobbiamo essere completamente certi che il carattere sia stato inviato prima di tentare l'invio del prossimo.
L'8051 ci segnalera' quando la trasmissione e' stata completata settando il bit TI di SCON. Solo a quel punto saremo in grado di inviarne un altro.
Consideriamo il seguente codice:
CLR TI ;Accertati che il bit TI sia a zero
MOV SBUF,#?A? ;Invia il carattere A sulla seriale
JNB TI,$ ;Aspetta che il bit TI sia settato
Le tre istruzioni precedenti trasmettono un carattere e attendono che il bit TI sia settato prima di proseguire. Infatti l'ultima istruzione si puo' interpretare nel modo seguente: " Rimani all'interno dell'istruzione stessa finche' TI e' uguale a zero."
Leggere dalla porta seriale
Leggere i dati dalla porta seriale e' semplice come scriverli. E' sufficiente leggere il valore dal registro SBUF quando il flag RI di SCON e' stato attivato.
Il codice seguente vi mostra come questo puo' essere fatto:
JNB RI,$ ; Aspetta finche' il bit RI non venga attivato
MOV A,SBUF ; Leggi il dato dalla porta seriale
La prima linea del codice attende che l'8051
attivi il flag RI. Cio' viene fatto automaticamente quando il carattere e'
completamente ricevuto.
Finche' la condizione e' vera il programma ripete l'istruzione "JNB".
Appena RI si attiva, la condizione diventa falsa e il programma procede con l'istruzione successiva.
Privacy |
Articolo informazione
Commentare questo articolo:Non sei registratoDevi essere registrato per commentare ISCRIVITI |
Copiare il codice nella pagina web del tuo sito. |
Copyright InfTub.com 2025