28_09.pdf

(272 KB) Pobierz
1128251 UNPDF
Też to potrafisz
Po dłuższej przerwie w opisie blo−
ków funkcjonalnych mikrokontrolera
8051, wypełnioną opisem niezbęd−
nych do programowania, instrukcji
asemblera, kontynuujemy prezenta−
cję pozostałych układów wewnę−
trznych procesora.
Dzięki temu, że już znacie język ma−
szynowy procesora, a przynajmniej
orientujecie się w jego składni i spo−
sobach „panowania” na różnego ro−
dzaju rejestrami kostki, będzie mi
łatwiej opisywać elementy proceso−
ra, bowiem za każdym razem będę
ilustrował opisy, przykładami sposo−
bów programowania takich elemen−
tów jak port szeregowy, układy licz−
nikowo−czasowe, czy układ prze−
rwań. Cel takiego podejścia do te−
matu jest oczywisty, to praktyczne
nauczenie Was, drodzy Czytelnicy,
łatwego i przyjemnego korzystania
z wszystkich możliwości mikrokon−
trolera 8051.
Mikrokontrolery?
To takie proste...
Część 12
UART – port szeregowy procesora
Zanim przejdę do sedna dzisiejszego odcinka, chciałbym zaanonso−
wać wszystkim zainteresowanym Czytelnikom, że od dzisiejszego nu−
meru EdW uruchamiam
„Kąciik pocztowy 8051”, w którym będę odpowiadał na wszystkie za−
warte w waszych listach problemy, dotyczące programowania naszego
mikrokontrolera. Ze względu na to, że część z ogromnej liczby listów
które dostaję będzie wiązała się z wybranymi, prezentowanymi w kolej−
nym odcinku, problemami, odpowiedzi będą wiązały się z tematami,
które już omawialiśmy lub tymi, które akurat są tematem kolejnego od−
cinka klasy mikroprocesorowej.
W dzisiejszej części zapoznamy się z układem transmisji szeregowej
oraz praktycznymi sposobami programowania go i wykorzystywania do
własnych celów, w tym także do przesyłania danych pomiędzy kompu−
terem PC lub dwoma komputerkami edukacyjnymi.
Port szeregowy
Mikrokontroler 8051 i pochodne posiadają sprzętowy port szeregowy
(w skrócie UART), dzięki któremu możliwe jest wysyłanie i odbieranie
informacji w postaci szeregowej, czyli „bit po bicie”. Jak już wiecie z o−
pisu wyprowadzeń, który przedstawiłem na początku naszego kursu,
procesor posiada dwie dedykowane końcówki które wchodzą w skład
portu P3 procesora. Są to:
RXD – (P3.0) wejście szeregowe („ R eceive data”)
TXD – (P3.1) wyjście szeregowe („ T ransmit data”)
Jak zapewne pamiętacie, końcówki te mogą być wykorzystywane jako
uniwersalne wejścia−wyjścia, dzięki instrukcjom zapisu do portu P3, np.
MOV P3, #dana
lub indywidualnym sterowaniem każdej końcówki portu np.:
SETB P3.0 ;ustawienie „1” na końcówce RXD
CLR P3.1 ;ustawienie „0” na końcówce TXD
Jednak przy wykorzystaniu portu szeregowego, sterowanie końców−
kami odbywa się automatycznie (za pomocą CPU), według ustawio−
nych wcześniej przez programistę parametrów przesyłowych. Port sze−
regowy wysyła i odbiera dane w postaci bajtów (8−bitowych słów da−
nych). Konwersja danej wysłanej lub odebranej przez procesor z posta−
ci bajtu do postaci szeregowej lub odwrotnie, odbywa się automatycz−
nie. Dzięki temu wystarczy wskazać tylko dana którą chcemy wysłać
lub czekać na odbiór jej z zewnętrznego urządzenia, także wyposażone−
go w port szeregowy.
Miejscem z którego wysyła się wspomniane dane – bajty, lub do któ−
rego one trafiają po transmisji z zewnątrz jest specjalny rejestr, znajdu−
jący się pod adresem 99h w pamięci wewnętrznej danych procesora w
obszarze rejestrów specjalnych SFR. Rejestr ma nazwę SBUF a zapisać
go można tak samo jak każdy inny rejestr, np. instrukcją zapisu poprzez
wskaźnik Ri:
MOV SBUF, @R1
W przypadku, kiedy wcześniej ustawiliśmy parametry transmisji i u−
ruchomiliśmy port szeregowy (o tym jak to zrobić – za chwilę), taki za−
pis spowoduje automatyczne wytransmitowanie bajtu który wcześniej
znajdował się pod adresem wskazywanym przez rejestr indeksowy R1.
W przypadku odbioru danej, po zakończeniu transmisji odebrany bajt
informacji będzie automatycznie umieszczony w rejestrze SBUF, a fakt
zajścia takiego zdarzenia zostanie zasygnalizowany w programie auto−
matycznie. Dzięki temu będziemy wiedzieć, że w rejestrze SBUF czeka
na odczytanie gotowa odebrana dana, z którą można zrobić na co się
ma ochotę.
Zanim przejdę do omawiania sposobu sterowania transmisją danych
poprzez port szeregowy, pragnę wyjaśnić dwa pojęcia związane z por−
tem szeregowym. Być może niektórzy z Was dokładnie wiedzą o co
chodzi, lecz pozostałym Czytelnikom należy się wyjaśnienie zasady sa−
mej transmisji szeregowej.
Po pierwsze, należy wiedzieć że istnieją praktycznie dwa sposoby na
przysyłanie danych metodą szeregową, są to: transmisja synchroniiczna
i transmisja asynchroniiczna.
Ponieważ port szeregowy procesora 8051 może pracować w oby
tych trybach, wyjaśnię na początku o co chodzi i jakie są zasadnicze róż−
nice pomiędzy obiema rodzajami transmisji.
Transmiisjja synchroniiczna
W tym przypadku dane (informacje) przesyłane są od nadajnika do
odbiornika za pomocą dwóch przewodów (nie licząc oczywiście masy).
Jednym przesyłane są dane, a drugim generowany jest sygnał zegaro−
wy, w takt którego odbiornik może odebrać informację i stwierdzić, czy
nadeszła „1”−ka czy logiczne „0”. Można więc powiedzieć że dane są
przesyłane synchronicznie z przebiegiem zegarowym transmitowanym
równolegle z danymi, stąd m.in. nazwa rodzaju transmisji.
Sytuację tę ilustruje rys.1a. Stan nieaktywny na linii może być umo−
wny, może to być logiczne 0 lub jedynka, umowny jest też sposób ge−
nerowania sygnału zegarowego, wszystko zależy od przyjętego w ukła−
dzie rozwiązania. Nie dotyczy to konkretnie mikrokontrolera 8051 i po−
chodnych, lecz tu także ustalono, kiedy transmisja się zaczyna i w jaki
sposób generuje się sygnał zegarowy (nazywany czasem „synchronizu−
jącym”). O tym jakie zasady obowiązują w przypadku 8051 powiem za
chwilę.
E LEKTRONIKA DLA WSZYSTKICH 4/98
35
1128251.013.png
Też to potrafisz
Rys.. 1.. Transmiisjja synchroniiczna ii asynchroniiczna
Jakie są zalety a jakie wady obu rodzajów
transmisji?...hm, na to pytanie dość trudno
jednoznacznie odpowiedzieć, zresztą jedna
wyraźna korzyść od razu się rysuje:
zmniejszenie liczby przewodów w przypadku
transmisji asynchronicznej.
Istnieją urządzenia które po prostu z definicji
potrzebują zewnętrznego sygnału zegarowe−
go, nie tylko do przesyłania danych pomiędzy
nim a systemem nadrzędnym, lecz także do
poprawnej pracy innych funkcjonalnych blo−
ków systemu. W takich przypadkach transmi−
sja synchroniczna staje się nieodzowna.
Do niedawna panowało mniemanie, że trans−
misja synchroniczna jest „bezpieczniejsza” od
asynchronicznej, a także znacznie szybsza. Tak
jednak było dla niedużych połączeń pomiędzy
nadajnikiem a odbiornikiem (do kilkudziesięciu
centymetrów dla szybkości do kilkunastu
MHz). Wynikało to z tego, że jak dotąd urzą−
dzenia nadawcze i odbiorcze pracujące w try−
bie asynchronicznym nie były dość doskonałe,
i często przy stosunkowo dużych (choć i tak
małych w porównaniu z transmisją synchro−
niczną) prędkościach transmisji następowały
„przekłamania” i „gubienie” informacji.
W dzisiejszych czasach, kiedy mamy do dyspo−
zycji takie urządzenia jak port szeregowy
w kontrolerze 8015 i podobnych, zaawansowa−
ne układy UART w komputerach PC, zdolne do
transmitowania danych w trybie asynchronicz−
nym z prędkościami nawet do 4Mb/sek. (tak !,
czterech megabitów na sekundę), problem ten
praktycznie zniknął. Dochodzą do tego jeszcze
inne udogodnienia takie jak korekcja błędów o−
raz kompresja danych, co zwiększa realne szyb−
kości transmisji oraz zwiększa bezpieczeństwo
przed utratą często tak cennej informacji.
Jednak w wielu sytuacjach fakt że procesor 8051 potrafi przesyłać
danej w sposób synchroniczny, może pomóc w rozwiązywaniu wielu
ciekawych zagadnień przy projektowaniu peryferyjnych układów cyfro−
wych, wykorzystywanych nie tylko w domowym zaciszu. Warto zatem
o tym pamiętać.
Transmiisjja asynchroniiczna
W przypadku tego rodzaju transmisji (patrz rys.1b) nie ma oddzielnej
linii zegarowej, a dane są przesyłane w takt wewnętrznego sygnału ze−
garowego, generowanego oddzielnie w nadajniku i odbiorniku. Warun−
kiem prawidłowego przesłania danych w asynchronicznym sposobie
transmisji jest to, aby nadajnik i odbiornik miały ustawioną tę samą czę−
stotliwość wspomnianych sygnałów zegarowych (nazywanych też
„taktującymi”). Takie ustalenie prędkości transmisji odbywa się na róż−
ne sposoby, z reguły jest to „ręczne” ustalenie przez operatora.
Zauważcie przecież że w naszym komputerku, przed przesłaniem da−
nych z komputera PC można ustawić (za pomocą klawisza „B”−baud)
żądaną szybkość transmisji, tak samo można postąpić w portem szere−
gowym komputera PC, za pomocą komendy DOS’u np.:
UART w miikrokontrollerze 8051
Teraz, kiedy już wiecie na czym polega różnica pomiędzy transmisją
synchroniczną a asynchroniczną możemy przejść do omawiania układu
UART w naszym procesorze.
Oprócz rejestru SBUF istnieje dodatkowy rejestr sterujący wszystki−
mi funkcjami portu, a więc trybem jego pracy, sygnalizowaniem stanu
transmisji, czy wreszcie uaktywnianiem odbiornika portu szeregowego.
Znajduje się on pod adresem 98h w obszarze wewnętrznej pamięci da−
nych procesora i jest jednym z rejestrów specjalnych SFR. Na sciągaw−
ce we wkładce z numeru 11/97 EdW znajduje się opis tego rejestru,
jednak przedstawię poniżej nieco dokładniej znaczenie poszczególnych
jego bitów.
MODE COM2: 9600, n, 8, 1 {Enter}
gdzie szybkość ustalono na 9600 bitów na sekundę (bodów). Pozosta−
łe parametry omówię za chwilę.
Jeżeli zatem urządzenie odbiorcze uczestniczące w przesyłaniu da−
nych wie z jaką szybkością nadawane są dane, to będzie mogło odebrać
informację, bez dodatkowej linii zegarowej, jak to miało miejsce w przy−
padku transmisji synchronicznej. Zaoszczędzimy w ten sposób jeden
„przewód”. No tak, ale przecież w mikrokontrolerze 8051 są dwie linie
portu szeregowego: nadawania (TXD) i odbioru (RXD). To prawda, nie
jest możliwe przesyłanie danych w obie strony po jedne linii w trybie
asynchronicznym (oczywiście przy wykorzystaniu sprzętowego portu
szeregowego o którym mowa), lecz zauważmy że w przypadku, kiedy
np. do naszego komputerka dołączymy urządzenie które potrafi tylko
odbierać dane, to wystarczy połączyć je tylko 1 przewodem z końców−
ką TXD procesora (nie zapominając o masie), a linię RXD pozostawić nie
wykorzystaną.
Z drugiej strony, wyobraź sobie że jeżeli np. do naszego komputerka
dołączono oddalony o kilkadziesiąt metrów cyfrowy układ automatycz−
nego termometru, który w określonych odstępach czasu automatycz−
nie przesyła dane dotyczące aktualnej temperatury, to do odbioru tych
danych wystarczy dołączyć linię do wejścia RXD procesora.
W obu przypadkach jeżeli chcielibyście wykorzystać transmisję syn−
chroniczną, trzeba by pociągnąć jeszcze jeden przewód między odbior−
nikiem a nadajnikiem,. co zwiększyłoby koszty takiego przedsięwzięcia
a jednocześnie skomplikowało instalację urządzenia.
SCON..0 ((RII)) – (ang. „Receive Interrupt”) znacznik odebrania przez port
szeregowy bajtu, jest jednocześnie znacznikiem zgłoszenia przerwa−
nia (przy uaktywnionym systemie przerwań). W przypadku kiedy u−
kład szeregowy mikrokontrolera jest ustawiony na odbiór (odbloko−
wany jest układ odbiornika: bit REN=1), po odebraniu poprawnego
znaku z urządzenia zewnętrznego, znacznik ten zostaje automatycz−
nie ustawiony. Zerowanie tego znacznika odbywa się wyłącznie pro−
gramowo, np. przez instrukcję:
CLR RI
SCON..1 (TII)) – (ang.”Transmit Interrupt”) znacznik wysłania przez port
szeregowy bajtu, jest jednocześnie znacznikiem zgłoszenia przerwa−
nia jeżeli uaktywniono wcześniej układ przerwań. W przypadku kiedy
do rejestru SBUF zostanie zapisany znak (bajt) po wytransmitowaniu
go przez procesor, bit ten zostaje automatycznie ustawiony (TI=1), co
informuje o zakończeniu nadawania znaku przez UART. Podobnie jak
w przypadku znacznika RI, znacznik ten jest ustawiany automatycz−
nie a musi być zerowany programowo za pomocą instrukcji np.
CLR TI
36
E LEKTRONIKA DLA WSZYSTKICH 4/98
1128251.014.png 1128251.015.png 1128251.016.png 1128251.001.png 1128251.002.png
Też to potrafisz
SCON..2 (RB8)) – (ang. „Receive Bit no. 8”) port szeregowy mikrokon−
trolera 8051 ma możliwość odbioru i transmisji znaków 9−bitowych –
istnieje specjalny tryb pracy UART, o tym za chwilę. W takim trybie
w przypadku odbioru znaku z urządzenia zewnętrznego, bit RB8 za−
wiera właśnie wspomniany 9−ty bit odebranego znaku, Oczywiście 8
pierwszych bitów znaku znajduje się jak poprzednio w rejestrze
SBUF.
SCON..3 ((TB8)) – (ang. „Transmit Bit no. 8”) 9−ty bit nadawanego znaku
w trybie transmisji z 9 bitami danych. Sytuacja analogiczna do po−
przedniej, lecz w tym przypadku aby wysłać 9−bitowy znak poprzez
port szeregowy należy najpierw wpisać 9−ty bajt nadawanego znaku
do bitu TB8 a potem załadować rejestr SBUF ośmioma młodszymi bi−
tami (bajtem) nadawanego znaku.
SCON..4 ((REN)) – („Receive ENable”) bit uaktywnienia odbiornika trans−
misji szeregowej. W celu odbioru znaku (oczekiwania na nadejście
bajtu z portu szeregowego) należy najpierw wyzerować bit REN, aby
odblokować sprzętowy odbiornika znaku zawarty w mikrokontrole−
rze. W przypadku nadawania znaku bit ten powinien być wyzerowa−
ny (REN=0).
SCON..5 (SM2)) – znacznik maskowania odbioru transmisji. Bit ten mo−
że być zmieniany programowo. Ustawienie go (SM2=1) powoduje że
odbiornik ignoruje te odbierane znaki, których (w trybie 9−bitowym) 9−
ty bit (RB8) jest równy zero (RB=0). W efekcie w takim przypadku nie
jest ustawiany znacznik odebrania znaku (RI). Dodatkowo w trybie 8−
bitowym (tryb=1) sytuacja jest identyczna kiedy po odebraniu znaku
nie został wykryty bit stop’u.
czekaj: jnb TI, czekaj ;testowanie flagi nadania
;(czekanie na zakończenie nadawania)
clr TI
;wyzerowanie flagi nadawania
ret
;powrót z procedury (podprogramu)
Zaś procedur odebrania znaku i umieszczenia go w akumulatorze mo−
że wyglądać tak:
INRS:
setb REN
;odblokowanie odbiornika
czekaj: jnb RI, czekaj ;
testowanie flagi odbioru
;(czekanie na odbiór znaku)
clr RI
;po odbiorze wyzerowanie flagi
clr REN
;i zablokowanie odbiornika
mov A, SBUF
;przepisanie znaku do akumulatora
ret
;powrót z podprogramu
O ile podprogram nadania znaku nie zajmie z reguły więcej niż 10 cyk−
li maszynowych procesora, o tyle sprawa odbioru znaku bez włączone−
go układu przerwań może być czasochłonna. Popatrzcie przecież, że w
przypadku gdy nie będzie nadchodził żaden znak z portu szeregowego,
procedura INRS w ogóle się nie zakończy, innymi słowy program może
się „zawiesić” w przypadku gdy czekamy na jakis znak z urządzenia ze−
wnętrznego, a on nie nadchodzi.
Właśnie dlatego użycie układu przerwań przy odbiorze znaków może
okazać się bardzo pomocne. Jak tego dokonać omówię w dalszej czę−
ści cyklu klasy mikroprocesorowej.
Istnieje jednak sposób zabezpieczenia się przed takim „nieskończo−
nym” czekaniem na odbiór znaku bez angażowania często i tak przecią−
żonego systemu przerwań procesora. Otóż wystarczy oprócz flagi RI
sprawdzać stan jakiegoś przyjętego w programie rejestru, który jest au−
tomatycznie zmniejszany o jeden np. co 1 sekundę. Załóżmy że zmniej−
szanie odbywa się automatycznie w procedurze przerwania generowa−
nej przez jeden z liczników procesora np. T0. W takim przypadku, jeże−
li stwierdzimy że rejestr ten (nazywany często rejestrem „przetermino−
wania”) jest równy zero, kończymy sprawdzanie flagi RI, uznając że na−
stąpił błąd w odbiorze znaku. Wtedy nasza procedura odbioru znaku bę−
dzie wyglądała następująco.
Załóżmy przy tym że wspomniany rejestr „przeterminowania” na−
zwaliśmy np. jako „overtime” i zdefiniowaliśmy jego adres jako np.
Numeracja trybów ich znaczenie oraz wyjaśnienie bitów „stop’u” już
za chwilę.
SCON..7 (SM0)) oraz SCON..6 (SM1)) – bity ustalające jeden z czterech
trybów pracy portu szeregowego. Oto one:
SM0 SM1 = 00 – tryb 0: Transmisja szeregowa synchroniczna, znaki 8−
bitowe, taktowane sygnałem zegarowym o częstotliwości Fxtal/12,
SM0 SM1 = 01 – tryb 1: Transmisja szeregowa asynchroniczna, znaki
8−bitowe, szybkość transmisji może być określana programowo (tryb
do pracy np. z PC−tem)
SM0 SM1 = 10 – tryb 2: Transmisja szeregowa asynchroniczna, znaki
9−bitowe, szybkość określona jako 1/32 lub 1/64 częstotliwości zega−
ra procesora,
SM0 SM1 = 11 – tryb 3. Transmisja szeregowa asynchroniczna, znaki
9−bitowe, szybkość transmisji może być określana programowo
(znajduje także zastosowanie przy pracy z PC−tem)
overtime EQU 7Fh
czyli 7Fh w pamięci wewnętrznej danych kontrolera. Zakładamy też że
w wywoływanej automatycznie co 1 sekundę procedurze przerwania od
licznika T0 licznik „overtime” w przypadku stwierdzenia jego wartości ja−
ko różnej od zera jest zmniejszany o 1. Wtedy użycie podprogramu:
Znaczenie i funkcje poszczególnych trybów są następujące.
Tryb 0
Jak już powiedziałem w tym synchronicznym trybie przesyłania infor−
macji port szeregowy pracuje nadawając i odbierając znaki 8−bitowe. Za−
wsze pierwszym nadawanym lub odbieranym bitem jest najmniej zna−
czący (D0).
Znaki przesyłane są po dwukierunkowej linii P3.0 (RXD). Odbierane
są i nadawane za pośrednictwem znanego nam już rejestru SBUF w
takt sygnału zegarowego, który generowany jest przez kontroler na linii
P3.1 (TXD).
W tym trybie częstotliwość sygnału zegarowego jest stała i jest ró−
wna 1/12 (jednej dwunastej) częstotliwości sygnału taktującego proce−
sor. W przypadku użycia obwodu oscylatora procesora z rezonatorem
kwarcowym 12 MHz, znaki w tym trybie będą przesyłane z szybkością
1 000 000 bitów / sek. (1 Mb/sek).
Przy nadawaniu znaku obowiązuje zasada, że zapis wysłanego kolej−
nego bitu znaku w urządzeniu odbiorczym (zewnętrznym np. rejestrze
przesuwnym) powinien nastąpić przy narastajjącym sygnale zegarowym
wytwarzanym na linii TXD.
W przypadku odbioru (REN=1) narastające zbocze sygnału zega−
rowego powinno powodować przesunięcie zawartości zewnętrzne−
go rejestru przesuwnego, z którego odbierane są dane, czyli de fac−
to odczyt odbywa się przy opadającym sygnale przesyłanym linią
TXD procesora.
Po odebraniu znaku następuje automatyczne ustawienie znacznika
RI, a przy nadawaniu – znacznika TI. Fakt że znaczniki te nie są zerowa−
ne automatycznie pozwala programiście na testowanie stanu ich, a co
za tym idzie monitorowanie faktu odbioru czy nadania znaku bez potrze−
by uruchamiania układu przerwań.
Oto praktyczny przykład ilustrujący tą właściwość.
Procedura nadania znaku z akumulatora bez korzystania z układu
przerwań może wyglądać następująco:
INRS:
setb REN
;odblokowanie odbiornika
czekaj: jb
RI, jest
;testowanie flagi odbioru
;(czekanie na odbiór znaku)
mov A, overtime
;sprawdzenie rejestru
„przeterminowania”
jnz czekaj
;jeżeli jeszcze <>0 to czekaj
na znak
sjmp koniec
;jeżeli =0 to zaniechaj czekania
jest: clr RI
;po odbiorze wyzerowanie flagi
mov A, SBUF
;przepisanie znaku do akumulatora
koniec: clr REN
;i zablokowanie odbiornika
ret
;powrót z podprogramu
z uprzednim załadowaniem rejestru „overtime” liczbą sekund przezna−
czonych na maksymalne oczekiwanie na odbiór znaku poprzez instrukcję:
mov overtime, #10 ;10 sekund na odbiór znaku
lcall INRS
;i wywołanie podprogramu odbioru
spowoduje czekanie maksymalnie 10 sekund na dobiór znaku z portu
szeregowego.
Opisana zasada znajduje zastosowanie w trzech pozostałych trybach
pracy portu szeregowego, a więc w trybach 1, 2 i 3.
Tryby 1,, 2 ii 3
Zanim opiszę szczegółowo wspomniane trzy pozostałe tryby pracy
portu szeregowego kontrolera powinienem przedstawić wspólną cechę
charakteryzująca te tryby a mianowicie postać przesyłanej asynchronicz−
nie informacji, czyli format przesyłania znaku (8−bitowy lub 9−bitowy).
Ponieważ w trybie asynchronicznym nie istnieje linia przesyłająca syg−
nał taktujący poszczególne nadawane i odbierane bity, obie strony
nadawcza i odbiorcza muszą w jakiś sposób „wiedzieć” o tym że np.
w danej chwili nadajnik rozpoczął nadawanie znaku. Wtedy odbiornik
OUTRS:
mov SBUF, A ;przepisanie zawartości
;akumulatora do rejestru UART
E LEKTRONIKA DLA WSZYSTKICH 4/98
37
1128251.003.png
Też to potrafisz
MODE COMx: baud, parity, data, stop, retry
gdzie, poszczególne nazwy oznaczają:
x – określa numer portu szeregowego, do którego dołą−
czony jest UART mikrokontrolera (1 dla COM1, 2 dla
COM2, 3 dla COM3 itd.)
baud – określa szybkość transmisji w bitach na sekundę
(standardowe najczęściej używane szybkości to: 600,
1200, 2400, 4800, 9600, 19200 bodów czyli bitów/sek)
parity – parametr określający sposób kontroli parzysto−
ści. Możliwe wartości to: „o”−odd (nieparzysty) lub „e”−
even (parzysty)
data – parametr określający liczbę bitów danych. Warto−
ści typowe akceptowane przez instrukcję MODE to 5...8
stop – liczba bitów stopu. Wartości akceptowane to 1
lub 2 (bity stopu).
Parametru „retry” nie należy w ogóle podawać.
W ten sposób można zdefiniować parametry transmisji
w komputerze PC dla następujących trybów pracy portu
szeregowego mikrokontrolera 8051, np.:
MODE COM2: 9600, n, 8, 1
(1)
dla trybu 1 portu UART w 8051, prędkości 9600 bodów,
dołączonego do portu COM2 komputera PC, a w przy−
padku trybu 9−bitowego (3) :
MODE COM2: 9600, e, 8, 1
(2)
w przypadku badania parzystości bitów danych lub
Rys..2.. Format znaku w trybiie 8−biitowym (a)) oraz 9−biitowym (b))..
MODE COM2: 9600, o, 8, 1
(3)
detektując takie zajście będzie, znając oczywiście częstotliwość na−
dawani znaku przez nadajnik (znając prędkość transmisji), wiedział w
jaki sposób odbierać nadawany z zewnątrz znak.
Ustalono, że podczas „ciszy na łączach”, linie portów (RXD – odbioru i
TXD – nadawania ) są w stanie wysokim. Sygnałem rozpoczęcia na−
dawania znaku, a z drugiej strony sygnałem konieczności jego odbio−
ru jest pojawienie się tzw. „bitu startu”, czyli niskiego poziomu lo−
gicznego na linii (TXD w przypadku nadawania) lub (RXD – w przypad−
ku odbioru).
Bit startu trwa dokładnie tyle ile powinny trwać (w zależności od
szybkości transmisji) pozostałe bity informacji. Na rysunku 2 oznaczono
ten bit dokładnie.
Po bicie startu (pamiętajmy, zawsze równy zero!), następują kolejno
bity danych. I tak pierwszy transmitowany jest najmłodszy bit (D0) baj−
tu wpisanego do rejestru SBUF, potem starszy (D1) i tak dalej aż do bi−
tu D7, a w przypadku transmisji 9−bitowej dodatkowo transmitowany
jest bit SCON.3 (TB8), po czym następuje bit stopu, który zawsze jest
równy „1”.
Pojawienie się bitu stopu kończy nadanie znaku, a po drugiej stronie
jego odbiór.
Mechanizm transmisji znaku w trybach 1, 2 i 3 jest taki sam, różna
jest tylko liczba bitów danych oraz szybkość transmisji, zgodnie z opi−
sem wcześniej.
Dla przykładu powiem, że choć transmisja 9−bitowa może wydawać się
mniej naturalna i niepotrzebna, to jednak jest ona często wykorzystywa−
na do przesyłania danych z tzw. bitem parzystości. Jest to prosty sposób
na wyeliminowanie odbioru zafałszowanych danych, kiedy to pomimo, że
w określonej, koniecznej chwili nastąpiło wygenerowanie poprawnego
bitu startu o raz bitu stopu, to jednak bity danych uległy zniekształceniu,
co spowodowało zafałszowanie danych i odbiór niewłaściwego znaku.
Przy korzystaniu z transmisji z komputerem PC można poleceniem
MODE ustawić tryb transmisji portu szeregowego komputera na kilka
sposobów, a mianowicie:
dla nieparzystości.
Najczęściej jednak przydaje się ustawienie portu komputera PC jak w
linii (1) oraz korzystanie z trybu 1 UART kontrolera 8051.
W trybie 2 pracy, port szeregowy taktowany jest sygnałem zegaro−
wym o częstotliwości Fxtal/32 lub Fxtal/64 (gdzie Fxtal to częstotliwość
rezonatora oscylatora). O tym, która z częstotliwości będzie taktować
port, decyduje stan bitu 7 (SMOD) w rejestrze SFR o nazwie PCON (a−
dres: 87h). Ustawienie tego bitu powoduje podwojenie szybkości trans−
misji (Fxtal / 32) wyzerowanie – ustawienie taktowania na Fxtal/64.
Jak wspomniałem wcześniej w trybach 1 i 3 szybkość transmisji może
być określana programowo. W tym przypadku układ transmisyjny taktowa−
ny jest za pomocą sygnału przepełnienia licznika T1 układu czasowo−liczni−
kowego.
W kontrolerach 8032/52 do taktowania portu może także posłużyć
licznik dodatkowy T2. Jak tego dokonać pokażę na przykładach po opi−
sie sposobów modyfikacji i wartości szybkości transmisji.
Ponieważ wgłębianie się w przebiegi i szczegóły nadawania i odbioru
znaków w trybach asynchronicznych jest mało praktyczna, zaintereso−
wanych odsyłam do lektury [1]. Poniżej skupie się jedynie na praktycz−
nych aspektach korzystania z dobrodziejstw portu szeregowego oraz
programowania jego rejestrów.
Zanim do tego przejdę zapoznajmy się z możliwościami modyfikowania
Szybkościi transmiisjjii
W trybiie 0 szybkość przesyłania danych, jak powiedziałem wcześniej
jest niezmienna i wynosi Fxtal/12.
W trybiie 2 prędkość transmisji wynosi: Fxtal/32 przy SMOD=1, lub
Fxtal/64 przy SMOD=0.
W trybach 1 i 3 sprawa ma się nieco inaczej. W tym przypadku pręd−
kość transmisji określa wzór:
Fxtal
n = ———————————
(256 – TH1) x 12 x dz
Jak się za chwilę przekonasz nasz UART w mikrokontrolerze 8051
potrafi pracować z większymi szybkościami, lecz ustawienie tych
szybkości transmisji w PC−cie jest możliwe tylko za pomocą specjal−
nie utworzonych programów, które są dostępne jako programu ter−
minalowe „shareware”, lub mogą być napisane przez Czytelników,
tych którzy potrafią to zrobić. Najprostszym a jednocześnie ogólnie
dostępnym programem twego typu jest program pochodzący z pa−
kietu popularnego DOS−owego „Norton Commander’a” pod nazwą:
„TERM90.EXE”. O sposobie używania tego programu nie będę się
tu rozwodził, zasady powinien znać każdy komputerowiec, a jeżeli
nie to radzę się tym programem nieco pobawić.
gdzie: dz = 32 w przypadku gdy SMOD = 0 zaś dz = 16 gdy SMOD = 1, zaś
TH1 to wartość początkowa 8−bitowego licznika TH1 (starszy bajt T1)
pracującego w trybie taktowania portu szeregowego.
Aby wykorzystać standardowe prędkości transmisji znane z kompu−
terów PC oraz innych wyposażonych w asynchroniczny port szeregowy
(Commodore, Amiga), czyli: 600, 1200, 2400, 4800, 9600, 19200,
28800, 38400, 57600, 76800 bit/sek należy zastosować taki kwarc (os−
cylator) aby po lewej stronie równania otrzymać te wartości przy pamię−
taniu że wartość TH1 jest liczbą całkowitą z zakresu 0...255.
I tu wyjaśni się sprawa stosowania trochę dziwnych wartości rezona−
torów kwarcowych w niektórych układach wykorzystujących procesory
rodziny 8051 i ich port szeregowy.
38
E LEKTRONIKA DLA WSZYSTKICH 4/98
1128251.004.png 1128251.005.png 1128251.006.png 1128251.007.png 1128251.008.png 1128251.009.png 1128251.010.png 1128251.011.png
Też to potrafisz
Też to potrafisz
Ot chociażby w naszym komputerku edukacyjnym zastosowany re−
zonator kwarcowy ma wartość 11,0592 MHz, zobaczmy dlaczego i co
w efekcie uzyskamy.
Podstawiając do powyższego wzoru, określającego prędkość trans−
misji danych, wartość oscylatora równą 11059200 Hz oraz zakładając że
SMOD = 1 (czyli dz = 16) otrzymamy np. dla
TH1 = F4h (244 dziesiętnie): n = 11059200/((256−244)x12x16)=4800
bodów.
Postepując podobnie z innymi wartościami początkowymi licznika
TH1 otrzymamy dla podanego rezonatora oraz innych (których częstot−
liwość rezonansowa dzieli się przez liczbę 12 i 32 (lub 16)) inne standar−
dowe wartości, oto one:
2400 bodów (TH1 = F3h, SMOD = 0), wtedy błąd wyniesie tylko: 0,16%
4800 bodów (TH1 = E6h, SMOD = 0), wtedy błąd wyniesie także 0,16%
ale już przy prędkości transmisji równej
9600 bodów (TH1 = F9h, SMOD = 1), błąd wyniesie aż 7%, bo aktual−
na szybkość transmisji będzie mniejsza od założonej i wyniesie w tym
przypadku: 8923 body.
W przypadku użycia do taktowania portu szeregowego w kontrole−
rach 8032/52 licznika T2, prędkość transmisji określona będzie wzorem:
Fxtal
n = ———————————−−−
(65536 – RLD) x 16 x 2
Fxtall ((MHz)) SMOD TH1 n ((bodów))
11,0592 1 FFh 57600
11,0592 1 FEh 28800
11,0592 1 FDh 19200
11,0592 1 FCh 14400
11,0592 1 FAh 9600
11,0592 1 F4h 4800
11,0592 1 E8h 2400
11,0592 1 D0h 1200
11,0592 1 A0h 600
gdzie RLD to wartość początkowa, zapisana przez program użytkowni−
ka do pary rejestrów RLDH i RLDL. Jeżeli zastosujemy rezonator kwar−
cowy o częstotliwości np. 16 MHz to możliwe do uzyskania częstotli−
wości transmisji będą z przedziału:
7...50000 bitów / sek.
Praktyczne wskazówkii
Jak zatem zaprogramować rejestr sterujący portu szeregowego oraz
jak zmusić do pracy licznik którego zadaniem będzie taktowanie trans−
misji. Oto przykład który pomogą wam zrozumieć ten problem.
14,7456 1 FFh 76800
14,7456 1 FEh 38400
14,7456 1 FCh 19200
14,7456 1 F8h 9600
14,7456 1 F0h 4800
14,7456 1 E0h 2400
14,7456 1 C0h 1200
Przykład
Zaprogramujemy UART tak, że będzie pracował w trybie asynchro−
nicznym 8−bitowymi znakami, a taktowany będzie licznikiem T1. Pręd−
kość transmisji określimy np. na 19200 bitów / sek (bodów). Inne war−
tości transmisji – patrz tabela.
Aha, byłby zapomniał, zakładamy że w systemie zastosowano rezo−
nator kwarcowy o Fxtal = 11,0592 MHz.
Oto sekwencja początkowa uruchamiająca pracę portu:
INIT_RS:
mov SCON, #01000000b
1,8432 1 FFh 9600
1,8432 1 FEh 4800
1,8432 1 FDh 2400
1,8432 1 FAh 1200
1,8432 1 F4h 600
;tryb 1 portu
orl TMOD, #00100000b
;licznik T1 tryb pracy 8−bitowej
;liczy TL1 z automatycznym
;wpisywaniem wartości
;początkowej
;z TH1
Jak zapewne się domyślacie wyzerowanie znacznika bitu SMOD w
rejestrze PCON (87h) spowoduje zmniejszenie o połowę wszystkich
prędkości transmisji podanych w tabeli. I tu uwaga, ponieważ rejestr
PCON nie może być adresowany bitowo, czyli nie da się zmodyfikować
wspomnianego bitu w tym rejestrze instrukcja np.
orl PCON, #80h
;ustawienie SMOD = 1
mov TH1, #FDh
;prędkość = 19200 bodów
;(tabela)
setb TR1
;start licznika T1 (TL1)
.....
;i gotowe...
setb SMOD
Teraz wystarczy użyć procedur które opisałem wcześniej (INRS i
OUTRS) aby wysłać dowolny znak poprzez łącze szeregowe. Zmienia−
jąc wartość ładowaną do rejestru TH1 (linia: mov TH1, #xx) można w
dowolnej chwili zmieniać prędkość transmisji w zakresie zależnym o−
czywiście od zastosowanego rezonatora kwarcowego.
Analogicznie, opierając się o opis rejestru licznika T2CON (w kost−
kach 8032/52) można zaprogramować i zmusić do pracy licznik T2, ra−
dzę poeksperymentować w domu, oczywiście zaopatrując się wcześ−
niej w odpowiedni mikrokontroler.
No dobrze ale czy można bezpośrednio dołączyć końcówki portu pro−
cesora 8051 (TXD i RXD) do np. komputera PC ?... absolutnie nie. Po−
trzebny jest do tego odpowiedni konwerter poziomów napięć. Przykład
takiego rozwiązania powinien nasunąć się Wam sam, no tak przecież w
naszym komputerku edukacyjnym zastosowaliśmy taki właśnie układ,
wykorzystujący popularną przetwornicę w postaci układu scalonego
MAX232 lub ICL232.
Więcej na temat portu szeregowego możecie przeczytać w kilku o−
statnich numerach EdW (6, 7, 9 z roku 1997).
Dodatkowe szczegółowe informacje oraz specyficzne cechy układu
UART mikrokontrolera 8051 o pochodnych znajdziecie w dodatkowej li−
teraturze [1].
stąd trzeba użyć innego polecenia, a mianowicie:
anl PCON, #7Fh ;aby SMOD = 0
lub
orl PCON, #80h ;aby SMOD = 1
sprawdźcie na kartce papieru lub kalkulatorze.
W tabeli podano najczęściej używane wartości rezonatorów kwarco−
wych dla zastosowań portu szeregowego 8051. Najbardziej popularną
jest wartość 11,0592 MHz, dość rozpowszechniona w handlu, w szcze−
gólnych zastosowaniach przydaje się rezonator o Fxtal = 14,7456 MHz,
kiedy chcemy aby nasz mikroprocesor konsumował jak najmniej prądu
a jednocześnie pracował przy kilku standardowych prędkościach trans−
misji, powinniśmy użyć kostki w wersji CMOS (80C51/80C31) oraz za−
stosować rezonator o Fxtal = 1,843200 MHz.
Możliwe jest także w praktyce stosowanie „okrągłych” wartości re−
zonatorów kwarcowych, lecz w tym przypadku należy liczyć się z błęda−
mi szybkości, które jednak przy małych prędkościach transmisji nie ma−
ją wielkiego znaczenia dla poprawnej pracy układu UART mikrokontro−
lera 8051. Wynika to z faktu że błędnie odebrany bit zawsze „leży” po−
za transmitowanymi 9−cioma czy 10−cioma bitami (nie występuje), któ−
re wchodzą w skład transmitowanego w trybie asynchronicznym sło−
wa. I tak np. z zastosowaniem rezonatora kwarcowego Fxtal = 12 MHz
możemy śmiało wymieniać dane z komputerem PC lub innym urządze−
niem wykorzystującym łącze szeregowe i standardowe prędkości
transmisji prędkościami:
Słławomiir Surowiińskii
Literatura
[1] A. Rydzewski – Mikrokomputery jednoukładowe rodziny MCS−51, WNT1992,
1995
E LEKTRONIKA DLA WSZYSTKICH 4/98
39
1128251.012.png
Zgłoś jeśli naruszono regulamin