[Search] [Contact Us]
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sponsor di 8052.it ![]() µC Family FAQ Strumenti di Sviluppo Libri Bookmarks Mailing List Forum Download Area Prodotti Il sito 8052.it e' in continua evoluzione: se avete suggerimenti o richieste contattateci |
Corso 8051 CAPITOLO 8 - 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:
Vanno inoltre definiti i bit SM0 e SM1 con la seguente tabella:
(*) Nota : Il baud rate indicato in questa tabella e' raddoppiato se
PCON.7 (SMOD) e' settato.
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, 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 quarzoSe 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)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)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 zeroLe 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 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 attivatoLa 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. ![]() < I Timer > Interrupt (C)Copyright 1997, 1998 by Vault Information
Services. All
Rights Reserved.
Le informazioni sono fornite senza alcuna garanzia (vedi dettagli) Contattate l'autore Craig Steiner (presso 8052.com) per l'uso e/o il permesso di divulgazione di questo corso. Traduzione italiana di: Sergio Salvitti |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Serial |
Site made with Sworg - Simple Web Organizer
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||