MCS-51
Architektura

Port szeregowy

Mikrokontrolery rodziny MCS-51 posiadają wbudowany port transmisji szeregowej, który umożliwia przesyłanie informacji bit po bicie przy wykorzystaniu linii RxD (P3.0) oraz TxD (P3.1). Port ten może pracować w trybie full duplexowym, co oznacza, że informacje mogą być jednocześnie nadawane i odbierane lub w trybie half duplex - w danej chwiliinformacja może być albo nadawana albo odbierana. Zamiana danych z postaci równoległej na szeregową i odwrotnie oraz sterowanie odbywa się automatycznie.

Zarówno rejestr odbiorczy jak i nadawczy znajduje się w przestrzeni rejestrów specjalnych pod tym samym adresem 99H i noszą tą samą nazwę SBUF. Zapisanie danej do rejestru SBUF powoduje wpisanie jej do rejestru nadawczego oraz automatyczne, sukcesywne wysyłanie kolejnych bitów znaku z zadaną prędkością transmisji. Odczyt odebranej danej z rejestru SBUF powoduje odczytanie rejestru odbiorczego, który jest fizycznie niezależny od rejestru nadawczego.

Z portem szeregowym związany jest też bezpośrednio rejestr SCON, który służy do określania jego podstawowych ustawień.

Rejestr SCON
Numer bitu 7 6 5 4 3 2 1 0
Adres bitu 9Fh 9Eh 9Dh 9Ch 9Bh 9Ah 99h 98h
Oznaczenie bitu SM0 SM1 SM2 REN TB8 RB8 TI RI
Bit Symbol Funkcja
SCON.7 SM0 Wybór trybu (bit 0)
SCON.6 SM1 Wybór trybu (bit 1)
SCON.5 SM2 Bit sterujący aktywacją komunikacji wieloprocesorowej
SCON.4 REN Bit sterujący aktywacją odbiornika
SCON.3 TB8 Dziewiąty bit wysyłanego znaku w trybie 2 lub 3
SCON.2 RB8 Dziewiąty bit odebranego znaku w trybie 2 lub 3
SCON.1 TI Znacznik wysłania pojedynczego znaku informacji
Ustawiany sprzętowo, gdy wszystkie bity zapisane wcześniej do rejestru SBUF zostału przesłane. Zerowanie musi być realizowane programowo.
SCON.0 RI Znacznik odebrania pojedynczego znaku informacji
Ustawiany sprzętowo, gdy wszystkie bity odbieranej informacji zostaną skompletowane w rejestrze SBUF. Zerowanie musi być realizowane programowo.

Dwa najstarsze bity rejestru SCON służą do ustawienia jednego z czterech trybów pracy portu szeregowego numerowanych od 0 do 3, które w skrócie scharakteryzowano w poniższej tabeli.

Tryb SM0 SM1 Opis
0 0 0 Transmisja szeregowa synchroniczna half duplex
Znaki 8-bitowe
Prędkość transmisji fXTAL/12
1 0 1 Transmisja szeregowa asynchroniczna full duplex
Znaki 8-bitowe
Prędkość transmisji określana programowo
2 1 0 Transmisja szeregowa asynchroniczna full duplex
Znaki 9-bitowe
Prędkość transmisji fXTAL/32 lub fXTAL/64
3 1 1 Transmisja szeregowa asynchroniczna full duplex
Znaki 9-bitowe
Prędkość transmisji określana programowo

Bit SM2 służy do aktywacji komunikacji wieloprocesorowej, ktora zostanie omówiona w dalszej częsci opracowania.

Bit REN służy do aktywacji odbiornika portu szeregowego. Dopiero ustawienie tego bitu aktywuje do pracy część odbiorczą portu szeregowego. Domyślnie odbiornik portu szeregowego jest nieaktywny.

W trybie 2 i 3 pracy portu szeregowego przesyłane znaki informacji mają rozmiar 9 bitów. Ponieważ rejestr SBUF jest 8-bitowy, dlatego najstarsze bity zarówno przesyłanej, jak i odbieranej informacji zapisywane są odpowiednio do bitu TB8 i RB8 rejestu SCON.

Uwaga Zapis informacji do rejestru SBUF powoduje natychmiastowe uaktywnienie nadajnika portu szeregowego i rozpoczęcie przesyłania informacji. Należy zatem pamiętać, iż podczas wysyłania informacji 9-bitowych w trybie 1 lub 3, najpierw należy dokonać zapisu do TB8, a następnie do rejestru SBUF.

Dwa najmłodsze bity rejestru SCON, tj. TI oraz RI są znacznikami odpowiednio wysłania i odebrania znaku. Bit TI jest ustawiany sprzetowo po tym, jak zostaną przesłane wszystkie bity znaku znajdującego się w rejestrze SBUF. Zatem na podstawie stanu tego bitu można stwierdzić, czy możliwe jest przesłanie kolejnej informacji poprzez zapis nowej wartości do rejestru SBUF.

Z kolei bit RI jest ustawiany po odebraniu wszystkich bitów znaku informacji przychodzącego do portu szeregowego mikrokontrolera. Zatem stan wysoki tego bitu wskazuje, że informacja, która została odebrana w rejestrze SBUF, może zostać odczytana. Również ten bit jest ustawiany sprzętowo, jednak za każdym razem po odczycie rejestru SBUF musi być zerowany programowo. Wymóg programowego zerowania dotyczy także bitu TI.

Tryb 0

W trybie 0 port szeregowy pracuje jako half duplex, tzn. 8-bitowe dane mogą być w danej chwili nadawane lub odbierane (bit LSB najpierw) po linii RxD. Natomiast po linii TxD transmitowany jest równocześnie stały co do częstotliwości, zegarowy sygnał taktujący o częstotliwości fXTAL/12. Transmisja znaku, podobnie jak w pozostałych trybach, jest inicjowana przez dowolną instrukcję, która powoduje zapis rejestru SBUF. Całkowita ramka przesyłanej informacji skład się tylko z ośmiu bitów danych. W trybie tym nie występuje bit startu i stopu, gdyż transmisja jest synchronizowana sygnałem zegarowym przesyłanym na linii TxD.

Tryb 1

W trybie 1 poszczególne bity informacji, tj.: bit startu (zawsze 0), 8 bitów danych i bit stopu (zawsze 1) są nadawane linią TxD lub odbierane po linii RxD. Przy odbiorze bit stopu zapisywany jest do RB8 w rejestrze SCON. Zmienna prędkość transmisji określana jest przepełnieniem licznika-czasomierza T1 lub T2 (jeśli znajduje się w danej wersji mikrokontrolera).

Tryb 2

W trybie 2 poszczególne bity informacji, tj.: bit startu (zawsze 0), 9 bitów danych (bit LSB najpierw) i bit stopu (zawsze 1) są nadawane linią TxD lub odbierane po linii RxD. Podczas transmisji 9-temu bitowi (pobierany z TB8 w rejestrze SCON) może być przypisana wartość 0 lub 1, albo przepisana wartość bitu parzystości P z rejestru PSW. Pozwala to na weryfikację przesyłanej informacji za pomocą tzw. bitu parzystości. Przy odbiorze 9-ty bit danej zapisywany jest do RB8 w rejestrze SCON, natomiast bit stopu jest ignorowany.

Prędkość transmisji może być wybrana programowo, za pomocą bitu SMOD znajdującego się w rejestrze PCON, pomiędzy jedna z dwóch wartości: fXTAL/32 (gdy SMOD = 1) lub fXTAL/64 (gdy SMOD = 0).

Tryb 3

Praca portu szeregowego w trybie 3 jest identyczna z trybem 2 z tą różnicą, że prędkość transmisji określona jest częstotliwością sygnału okresowego przepełniania się licznika-czasomierza T1, jak miało to miejsce w trybie 1.

Programowe okreslanie prędkości transmisji

W trybie 1 i 3 prędkość BR transmisji określana jest przez częstotliwość fOVRFL przepełnień licznika-czasomierza T1 oraz wartość bitu SMOD według poniższej zależności

Prędkość transmisji

Sam licznik-czasomierz może być skonfigurowany zarówno do pracy w funkcji czasomierza, jak i licznika oraz w jednym z trzech trybów pracy. W większości typowych aplikacji jest on jednak konfigurowany w funkcji czasomierza w trybie 2 automatycznego przeładowywania wartością początkową. W takim wypadku, prędkość transmisji określana jest wzorem

Prędkość transmisji

Do celów praktycznych o wiele bardziej przydatny jest wzór umożliwiający wyznaczenie wartości, jaką jest przeładowywany rejestr TL1 w zależności od założonej wartości prędkości transmisji BR i wartości bitu SMOD (będącego najstarszym bitem rejestru PCON), tj.

Wartość rejestru TH1

Jeśli wyznaczona wartość TH1 jest ujemna oznacza to, iż zakładana prędkość transmisji nie jest możliwa do zrealizowania przy danej częstotliwości fXTAL. W niektórych przypadkach wartość wyznaczona z przedstawionego wzoru jest ułamkowa i konieczne jest jej zaokrąglenie do 8-bitowej wartości całkowitej. W takim wypadku należy ponownie obliczyć wartość prędkości transmisji BR dla zaokrąglonej wartości TH1. Jeśli względny błąd procentowy pomiędzy wyznaczoną a założoną wartością prędkości transmisji jest mniejszy niż 2%, to oznacz, że zaokrąglona wartość rejestru TH1 może zostać zaakceptowana. Jeśli obliczony błąd jest większy niż wspomniane 2%, wtedy prędkość transmisji generowana przez mikrokontroler będzie zbytnio różnić się od założonej, co może doprowadzić np. do przekłamania niektórych bitów odbieranych lub wysyłanych danych.

Uzyskanie bardzo małych prędkości transmisji jest możliwe przez uaktywnienie przerwania od licznika-czasomierza T1 oraz skonfigurować go do pracy w trybie 1, tj. jako czasomierz 16-bitowy, a przerwanie wykorzystywać do programowego przeładowania jego wartości początkowej.

Programowe określenie prędkości transmisji w trybie 1 lub 3 pracy portu szeregowego może być również realizowane w oparciu o licznik T2, co przedstawiono przy opisie jednego z trybów pracy tego licznika.

Komunikacja w systemie wieloprocesorowym

Ustawiając port szeregowy w tryb 2 lub 3 możliwa jest komunikacja w systemie wieloprocesorowym pomiędzy mikrokontrolerem głównym (ang. master), a mikrokontrolerami podrzędnymi (ang. slave). W każdym z tych dwóch trybów dana odebrana w przesuwnym rejestrze odbiorczym jest przepisywana do rejestru SBUF tylko wtedy, gdy bit SM2=1 oraz 9-ty bit odbieranego znaku jest również równy 1. Bazując na tej właściwości możliwe jest zrealizowanie protokołu komunikacyjnego typu master-slave.

Kiedy mikrokontroler master chce przesłać blok informacji do jednego z mikrokontrolerów slave, z których każdy ma ustawiony bit SM2 na 1, wysyła najpierw znak, w którym pierwsze 8-bitów zawierają adres właściwego mikrokontrolera, natomiast 9-ty bit (MSB) jest równy 1. Dzięki temu wysłany znak odbierany jest przez wszystkie mikrokontrolery. Każdy z nich sprawdza odebrany adres i tylko zaadresowany mikrokontroler zeruje bit SM2. Kolejne wysyłane znaki wiadomości zawierają 8 bitów danych i 9-ty bit równy 0, przez co są tylko odbierane przez zaadresowany mikrokontroler, natomiast ignorowane przez pozostałe mikrokontrolery slave. Po odebraniu informacji o stałej długości lub zakończonego określonym znakiem końca, mikrokontroler ponownie ustawia bit SM2 na 1.

Przesyłanie informacji pomiędzy mikrokontrolerami master-slave

Przesyłanie danych w odwrotnym kierunku, tj. z mikrokontrolera slave do master odbywa się tylko na żądanie tego drugiego.