Caricare documenti e articoli online 
INFtub.com è un sito progettato per cercare i documenti in vari tipi di file e il caricamento di articoli online.


 
Non ricordi la password?  ››  Iscriviti gratis
 

Porta Seriale - Inizializzare il modo di funzionamento della porta seriale

informatica



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


Hits: 3013
Apprezzato: scheda appunto

Commentare questo articolo:

Non sei registrato
Devi essere registrato per commentare

ISCRIVITI



Copiare il codice

nella pagina web del tuo sito.


Copyright InfTub.com 2024