UKŁADY MIKROPORCESOROWE

 Mikrokontrolery

 Programowanie

Opis Mikrokontrolera Atmel 2051

Cechy // Wyprowadzenia // Pamięć programu // Pamięć danych // Pamięć FLASH // Stos // Jednostka ALU // Rejestr stanu PSW // Układy czasowo-licznikowe // Port szeregowy // Przerwania // Specjalne tryby pracy //


Cechy mikrokontrolera AT89C2051:

• kompatybilny z układami rodziny MCS-51,
• 2kB wewnętrznej pamięci typu Flash-EPROM,
• zegar: 0Hz do 24MHz,
• 8-bitowa jednostka centralna,
• 128B wewnętrznej pamięci RAM,
• 15 programowalnych linii we/wy,
• dwa szesnastobitowe liczniki/zegary,
• interfejs szeregowy,
• wbudowany analogowy komparator.

Układ 89C2051 realizuje 111 instrukcji, z czego 49 jest jednobajtowych, 45 dwubajtowych, 17 trzybajtowych, 64 jest wykonywane w jednym cyklu. Cechą charakterystyczną jest duża liczba operacji na bitach i instrukcje mnożenia i dzielenia.
Rozkład wyprowadzeń procesora 89C2051 przedstawiono poniżej. Cechą charakterystyczną układu jest możliwość alternatywnego wykorzystania większości linii we/wy.


Wyprowadzenia mikroprocesora AT89C2051:

- PORT 1 (P1.0...P1.7) - są to wyprowadzenia 8-bitowego, uniwersalnego portu mikroprocesora oznaczonego jako P1.

- PORT 3 (P3.0...P3.5,P3.7) - podobnie jak w przypadku portu P1, port P3 może pełnić wszystkie opisane wcześniej funkcje - może być wyjściem lub wejściem. Dodatkowe symbole obok wyprowadzeń portu P3 sugerują że port może spełniać inne dodatkowe funkcje, co jest zresztą zgodne z prawdą.

- RST - zerowanie układu. Czynność ta wykonywana poprzez podanie logicznej 1 na te wyprowadzenie na pewien okres czasu powoduje skasowanie układu,a więc natychmiastowe przerwanie wykonywanych czynności i rozpoczęcie cyklu działania procesora od samego początku. Czas trwania dodatniego impulsu kasującego zależy od częstotliwości z jaką pracuje mikroprocesor. Z reguły w typowych zastosowaniach czas 1ms w zupełności wystarcza.

- VPP - napięcie programujące.

- XTAL1 i XTAL2 - końcówki te służą do dołączenia zewnętrznego rezonatora kwarcowego o częstotliwości zależnej od potrzeb użytkownika. W praktyce częstotliwość ta może wynosić od 0Hz do 24MHz. Dołączony do tych pinów rezonator kwarcowy po uzupełnieniu o dodatkowe kondensatory o wartości z reguły 22...40pF (w zależności od wartości rezonatora), umożliwiają pracę wbudowanemu w 89C2051 generatorowi, który napędza cały mikroprocesor. Oczywiście od częstotliwości rezonatora ściśle zależy szybkość działania mikrokontrolera.

- GND - masa.

- VCC - jest to końcówka zasilania mikroprocesora. Napięcie względem masy z reguły nie może przekraczać 6,5V. Dlatego układ mikrokontrolera należy zasilać napięciem 5V +/- 0,25V używając do tego celu dowolnego zasilacza stabilizowanego najlepiej przy pomocy znanego układu 7805. Zasadą przy projektowaniu układów z 89C2051 jest blokowanie tego wyprowadzenia kondensatorem o wartości 100nF do masy układu cyfrowego.



Wewnętrzna pamięć programu

Program napisany przez użytkownika, przewidziany dla konkretnego zastosowania mikroprocesora, powinien zostać umieszczony wewnątrz mikrokontrolera - czyli w wewnętrznej pamięci programu. Pamięć ta służy mikrokontrolerowi wyłącznie do odczytu rozkazów programu. W pamięci tej mogą być umieszczone także argumenty bezpośrednie rozkazów oraz tablice ze stałymi potrzebnymi do pewnych działań programu, np. tablica sinusów, tablica czasów zachodu słońca, lub cokolwiek innego. Mikroprocesor 89C2051 ma możliwość późniejszego pobrania ze swojej pamięci programu takiej stałej i wykorzystania jej np. w obliczeniach.

Po włączeniu zasilania dzięki obwodowi RESET, wyzerowane zostają prawie wszystkie wewnętrzne układy mikroprocesora w tym także "licznik rozkazów". Ten ostatni służy mikroprocesorowi do kolejnego pobierania rozkazów z pamięci programu, a dokładnie do adresowania (czyli wskazywania) gdzie w przestrzeni adresowej pamięci programu znajduje się kolejna komenda. Jego początkowa wartość wynosi 0, toteż pierwszym rozkazem pobranym z tej pamięci będzie ten umieszczony pod adresem 0000h.

Licznik rozkazów oznaczany jest w skrócie jako PC z angielskiego "Program Counter" -licznik programu (rozkazów). Licznik PC ma długość 16 bitów, czyli maksymalnie może liczyć do 65535 włącznie, po czym zostaje wyzerowany.

W trakcie pobierania i wykonywania prze mikrokontroler kolejnych instrukcji, licznik PC zmienia swoją wartość zawsze wskazując na aktualny adres kolejnego rozkazu w pamięci programu. Maksymalną wartość jaką może osiągnąć licznik w tym przypadku to 2048 -bowiem w układzie AT89C2051 mamy do dyspozycji 2kB pamięci programu.

Oprócz wspomnianego miejsca "startowego" programu - czyli adresu 0000h, w przestrzeni adresowej pamięci programu istnieje kilka innych istotnych dla programisty miejsc. W celu ujednolicenia systemu przerwań procesora w pamięci programu określono odpowiednie miejsca -adresy od których rozpoczyna się wykonywanie określonych procedur obsługi przerwań. W podstawowej rodzinie 51 są to adresy: 3, 11, 19, 27, 35 i 43 (03h, 0Bh, 13h, 1Bh, 23h, 2Bh szesnastkowo). Każdy z tych adresów określa początek wykonania innej procedury obsługi przerwania, dla 89C2051 są one następujące:

•0003h - przerwanie zewnętrzne z wejścia (końcówki) INT0,
•000Bh - przerwanie wynikające z przepełnienia pierwszego wewnętrznego licznika T0 procesora,
•0013h - przerwanie zewnętrzne z wejścia (końcówki) INT1,
•001Bh - przerwanie wynikające z przepełnienia drugiego wewnętrznego licznika T1 procesora,
•0023h - przerwanie wynikające z odebrania lub zakończenia wysyłania danej poprzez wewnętrzny port szeregowy mikroprocesora.

Wewnętrzna pamięć danych

W mikrokontrolerze pamięć ta przeznaczona jest dla użytkownika do przechowywania argumentów wartości zmiennych oraz wyników obliczeń arytmetyczno - logicznych. Pamięć ta ma pojemność 128 bajtów.



Na rysunku poniżej przedstawiono organizację wewnętrznej pamięci danych:

255(FFH)

128(80H)
SFR
 
127(7FH)

48(30H)
   
47(2FH)

32(20H)
   
31(1FH)

24(18FH)
R7

R0

Zbiór 3
23(17H)

16(10H)
R7

R0

Zbiór 2
15(0FH)

8(08H)
R7

R0

Zbiór 1
7(07H)

0(00H)
R7

R0

Zbiór 0


Wewnętrzna pamięć danych w mikrokontrolerze

W przestrzeni tej pamięci można wyróżnić kilka obszarów. Dwa główne, obszar pamięci użytkowej oraz obszar rejestrów specjalnych SFR. Pamięć użytkowa zajmuje 128 komórek, adresy: 0 - 127 (00h - 7Fh), natomiast obszar SFR obejmuje adresy 128 - 255 (80h - FFh), z tym że nie wszystkie są wykorzystywane przez rejestry specjalne.

I chociaż pamięć użytkownik podzielona jest na obszary, do których dostęp może odbywać się przez tzw. indeksowanie obszaru, to użytkownik może adresować ją poprzez proste adresowanie.

W pamięci użytkowej komórki o adresach 0...7, 8...15, 16...23 i 24...31 tworzą cztery zbiory uniwersalnych rejestrów roboczych. Każdy z rejestrów oznacza się symbolami R0...R7. W danej chwili użytkownik ma możliwość dostępu (poprzez nazwy R0...R7) tylko do jednego "banku" (zbioru) rejestrów roboczych. Przełączanie zbiorów odbywa się poprzez odpowiednie ustawienie dwubitowego wskaźnika zwanego jako RS - z angielskiego "Register bank Switch".

Rejestry R0 i R1 z aktywnego banku pełnią rolę wskaźników danych do pośredniego adresowania wewnętrznej pamięci danych jak i zewnętrznej. W przypadku adresowania pamięci wewnętrznej można adresować cały obszar czyli adresy 0...7Fh.



Pamięć FLASH

Pojedyncza komórka pamięci ma postać obszaru przewodzącego elektrycznie, otoczonego obszarem o własnościach izolatora. Doprowadzony do komórki ładunek elektryczny nie może jej opuścić - pamięć jest nieulotna - przechowuje więc informacje mimo odłączenia źródła zasilania. Przyłożenie dostatecznie dużego napięcia do izolatora otaczającego ładunek, umożliwi ładunkowi pokonanie bariery potencjału (przebicie) i wydostanie się na zewnątrz. Wykorzystując ten mechanizm można kasować jednocześnie całe grupy komórek pamięci, a następnie ponownie zapisać nowymi ładunkami. Jest to więc pamięć programowalna elektrycznie. Procesory AT89C2051 są przystosowane do programowania napięciem 12V.



Stos i wskaźnik stosu

Najprościej można stos określić jako bardzo prostą w działaniu strukturę przechowującą bajty. Pod pojęciem "przechowania" rozumiemy oczywiście operacje zapisu, a następnie odczytu dowolnej zmiennej lub rejestru SFR.

W przypadku takich operacji tylko z udziałem np. wewnętrznej pamięci danych użytkownika, aby dokonać zapisu (odczytu) trzeba daną komórkę pamięci najpierw zaadresować - czyli po prostu podać jej fizyczny adres.

W przypadku korzystania ze stosu adresowanie jest niekonieczne. Przy takim sposobie obsługi konieczne jest jednak zachowanie odpowiedniej kolejności w zapisie i odczycie tak aby dane nie "pomieszały się".

Otóż taki uporządkowany sposób przechowywania danych charakteryzuje właśnie stos. Wszystkie dane (bajty) przy zapisie odkładane są "na stos" jedna na drugą. Na wierzchołku stosu znajduje się zawsze ostatnio odłożona dana (np. oznaczona jako X), toteż aby "dobrać się" do danej leżącej pod nią (Y) należy najpierw "zdjąć" ze stosu daną X, a potem dopiero odczytać Y.

Stos służy do przechowywania zmiennych lub rejestrów SFR, a dostęp do nich odbywa się w sposób uporządkowany

Stos umieszczony jest w wewnętrznej pamięci danych użytkownika, czyli w obszarze o adresach 00h...7Fh.

Ilość pamięci zajętej przez stos będzie się zmieniać i zależeć od tego ile bajtów odłożonych jest na stosie.

Aby ściśle określić miejsce położenia stosu, w architekturze '51-ki znajduje się tzw. licznik stosu a fachowo mówiąc "wskaźnik stosu". Fizycznie jest on po prostu 8-bitowym rejestrem w obszarze SFR, położonym pod adresem 81h. W mnemonice (nazewnictwie) procesorów posiada on symbol SP - z angielskiego "stack pointer" - wskaźnik stosu.

Jego zadaniem jest automatyczne wskazywanie miejsca aktualnego wierzchołka stosu. Tak więc w przypadku odłożenia bajtu na stos, wskaźnik SP jest automatycznie (bez ingerencji programisty) zwiększany o 1, w przypadku zdjęcia danej ze stosu jest on zmniejszany.

Podsumowując, stos jest hierarchiczną strukturą do przechowywania danych (bajtów) z obszaru wewnętrznej pamięci RAM procesora (włączając SFR) a położenie jego wierzchołka jednoznacznie określa jego wskaźnik - SP. Przy korzystaniu ze stosu obowiązuje zasada, "ile bajtów odłożyłeś na stos, tyle potem musisz zdjąć", tak aby struktura stosu nie została zakłócona. W praktyce ma to szczególne znaczenie, bowiem stos wykorzystywany jest nie tylko poprzez świadome działanie użytkownika lecz także przechowywane są na nim ważne dla działania całego mikrokontrolera adresy powrotów z podprocedur oraz procedur obsługi przerwań, czyli innymi słowy mówiąc, aktualne zawartości 16-bitowego licznika rozkazów PC.

Ponieważ stos składa się z 8-bitowych komórek pamięci, a licznik rozkazów jest 16-bitowy to procesor na stos odkłada najpierw młodszy bajt rejestru PC, a następnie starszy bajt, wskaźnik stosu SP zostaje więc zwiększony automatyczne o 2. Tak więc w prosty sposób można przechowywać inne rejestry podwójne np. wskaźnik adresu zewnętrznej pamięci - DPTR, składający się z dwóch 8-bitowych rejestrów DPH (83h) oraz DPL (82h).

W przypadku rejestru DPTR jak i innych SFR przechowywanie na stosie odbywa się "na żądanie" użytkownika - w potrzebnym dla niego momencie.

Po włączeniu zasilania procesora (lub jego zresetowaniu) wskaźnik stosu SP przyjmuje domyślnie wartość 07h - czyli po prostu 7, wskazując tym samym że wierzchołek stosu - adres umieszczenia następnej danej - po odłożeniu jej na stos położony będzie w wewnętrznej pamięci danych pod adresem 08h (07h + 1).

Jeżeli więc odłożymy jakiś bajt na stos, najpierw licznik SP zostanie automatycznie zwiększony o 1 (08h), a następnie do komórki pamięci o tym adresie 08h, zostanie wpisany ten bajt. Przy zdjęciu ze stosu kolejność będzie odwrotna, najpierw zdjęty zostanie nasz bajt, a następnie zmniejszony zostanie wskaźnik SP o1.

Wskaźnik stosu SP tak jak każdy rejestr SFR może być dowolnie modyfikowany prze programistę poprzez zapisanie w nim dowolnej 8-bitowej wartości (0...255).

W praktyce jednak sytuacja taka występuje tylko wtedy, jeżeli chcemy zmienić położenie stosu (czyli go przesunąć) na początku wykonywania programu. Operacja ta ma sens jeżeli stos w danej chwili jest "pusty", w przeciwnym razie przy lekkomyślnej modyfikacji wskaźnika SP wszystkie dane odłożone wcześniej na stos staną się niedostępne (przynajmniej z punktu widzenia działania samego stosu).

Umiejętne i świadome korzystanie ze stosu przynosi często efekty w postaci znacznego przyśpieszenia działania programu oraz zmniejszenia jego rozmiarów.



Jednostka arytmetyczno-logiczna

Pod tym pojęciem kryje się jeden z elementów architektury 89C2051 odpowiedzialny za wykonywanie operacji arytmetyczno-logicznych. Blok ten nazywany w skrócie jako ALU, potrafi wykonywać operacje na liczbach (składnikach) 8-bitowych.

Do wprowadzenia składników działania służą zarówno niektóre rejestry specjalne z grupy SFR jak i dowolna komórka wewnętrznej pamięci danych. Dla różnych działań występują jednak pewne ograniczenia w swobodzie umiejscawiania składników.

Jednym z najważniejszych rejestrów z grupy SFR jest akumulator oznaczany dużą literą A (ang. "accumulator"). Akumulator umieszczony jest pod adresem 0Eh (224 dziesiętnie). Rejestr ten służy jednostce ALU za miejsce pobrania argumentu oraz umieszczenia wyniku większości operacji arytmetyczno logicznych.

Rejestr ten może być adresowany bitowo, dzięki czemu możliwe jest testowanie dowolnych jego bitów bez potrzeby wykonywania dodatkowych operacji logicznych. Dodatkowo rejestr A poza funkcjami związanymi z jednostką ALU służy do pobierania i umieszczania bajtów w zewnętrznej pamięci danych.

Przy przesyłaniu tego rejestru na stos (umieszczenie lub pobranie ze stosu) wykorzystuje się adresowanie bezpośrednie tego rejestru. Wtedy opisujemy go symbolem ACC.

Drugim po akumulatorze ważnym rejestrem współpracującym z ALU jest, także 8-bitowy, rejestr B. Służy on do umieszczenia jednego ze składników mnożenia lub dzielenia, a po wykonaniu jednej z tych operacji w rejestrze tym umieszczany jest:

• w przypadku mnożenia starszy bajt 16-bitowego wyniku mnożenia dwóch liczb 8-bitowych,
• w przypadku dzielenia: reszta z dzielenia dwóch liczb 8-bitowych.

Oczywiście zarówno rejestr B jak i akumulator A mogą być wykorzystywane dowolnie jako rejestry uniwersalne.

Trzecim ważnym rejestrem związanym z ALU jest "słowo stanu programu" nazywane w skrócie jako PSW (od ang. "program status word").



C AC FQ RST RSQ OV -- P


Zawartość rejestru stanu PSW

W skład tego rejestru wchodzi 8 bitów nazywanych znacznikami z których cztery informują o przebiegu wykonywania operacji arytmetyczno-logicznych. I tak:

PSW.0 (bit 0) - oznaczany jako P, to znacznik parzystości, ustawiany automatycznie w każdym cyklu maszynowym wskazuje na to czy liczba jedynek na poszczególnych pozycjach bitowych w akumulatorze A jest parzysta (P=1), czy nieparzysta (P=0).

PSW.2 (bit 2) - oznaczany jako OV, to znacznik przepełnienia (nadmiaru), ustawiany w wyniku wykonania dodawania lub odejmowania, a przy operacji dzielenia ustawienie go wskazuje na dzielenie przez zero.

PSW.6 (bit 6) - oznaczany jako AC, to znacznik przeniesienia pomocniczego, do którego wpisywane jest przeniesienie lub pożyczka z bitu 3, wykorzystywany jest przy korekcji dziesiętnej liczb.

PSW.7 (bit 7) - znacznik przeniesienia oznaczany jako C, do którego następuje przeniesienie z najbardziej znaczącego bitu w wyniku wykonania operacji logicznych przesunięć liczb 8-bitowych lub w wypadku przekroczenia wyniku poza zakres liczb zapisanych w naturalnym kodzie dwójkowym (>255).



Operacje jakie można wykonywać na liczbach 8-bitowych, to:

a) operacje arytmetyczne:

• dodawanie argumentów,
• dodawanie z przeniesieniem,
• odejmowanie z pożyczką.

W tych trzech przypadkach pierwszy z argumentów operacji (składnik lub odjemna) umieszczana jest w akumulatorze, drugi składnik lub odjemnik umieszczony jest w wewnętrznej pamięci danych, lub jest argumentem bezpośrednim rozkazu. Wynik działania umieszczany jest w akumulatorze. Dodatkowo w słowie PSW ustawiane są odpowiednio znaczniki: przeniesienia C i nadmiaru OV, co jest sygnałem przekroczenia zakresu liczb 8-bitowych odpowiednio bez lub ze znakiem.

Pozostałe operacje arytmetyczne to:

• mnożenie dwóch 8-bitowych liczb bez znaku, gdzie jeden składnik wpisywany jest do akumulatora drugi do rejestru B, 16-bitowy wynik umieszczany jest w rejestrach B i A - odpowiednio starszy bajt w B, młodszy w A,

• dzielenie dwóch liczb 8-bitowych, gdzie dzielna umieszczana jest w akumulatorze A, a dzielnik w B, 8-bitowy wynik dzielenia znajduje się po tej operacji w A, natomiast B przechowuje resztę z dzielenia,

• nkrementacja (zwiększanie o 1) lub dekrementacja (zmniejszanie o 1) akumulatora lub dowolnej komórki w wewnętrznej pamięci danych,

• korekcja dziesiętna wyniku zapisanego w akumulatorze.

b) operacje logiczne:

• logiczna suma (OR),
• iloczyn logiczny (AND),
• różnica symetryczna (EXOR),
• negacja (NOT) zawartość akumulatora A,
• przesuwanie cykliczne akumulatora w lewo lub prawo, z lub bez przeniesienia.

Zegar systemowy

Do pracy, czyli do „poruszenia” całego procesora potrzebny jest zewnętrzny obwód oscylatora. W praktyce taki obwód realizuje się dołączając zewnętrzny rezonator kwarcowy o częstotliwości z zakresu 0...24MHz. Wraz ze wzrostem częstotliwości pracy układu wzrasta wydzielana w nim moc, czyli wzrasta pobierany przez procesor prąd ze źródła zasilania.

Częstotliwość (FXTAL ) uzyskiwana z rezonatora kwarcowego jest we wnętrzu procesora kilkakrotnie dzielona. I tak w praktyce spotykamy się z następującymi pojęciami:

• dwufazowy sygnał taktujący procesor (FS ) – sygnał powstały z podzielenia przez 2 częstotliwości oscylatora (np. przy kwarcu = 12MHz, FS = 6MHz). Sygnał ten używany jest bezpośrednio do taktowania układów wewnętrznych procesora i nie jest dostępny na żadnym z zewnętrznych jego wyprowadzeń,

• sześć cykli sygnału FS składa się na tzw. cykl maszynowy procesora, czyli okres wykonywania elementarnej czynności przez procesor. Z prostych obliczeń wynika, że cykl maszynowy zajmuje: FS • 6 = 2 • FXTAL • 6 = 12 cykli oscylatora, czyli dla np. FXTAL = 12MHz będzie to 1MHz.

Cykl maszynowy jest bardzo ważnym pojęciem, z jego częstotliwością (FXTAL/12) zachodzą podstawowe czynności procesora takie jak:
• pobieranie kodu rozkazów (czy to z wewnętrznej pamięci programu, czy z zewnętrznej),
• wykonywanie instrukcji programu,
• pobieranie danych z zewnętrznej pamięci (jak i z wewnętrznej),
• zwiększanie wartości wbudowanych liczników: T0 i T1,
• próbkowanie wejść zewnętrznych przerwań: INT0 i INT1.

Z częstotliwością tą taktowany jest także wbudowany port szeregowy w specjalnym trybie ustawionym przez użytkownika programowo. Cykl maszynowy dzieli się także na fazy (po 6 na każdy cykl).

Układy czasowo-licznikowe

Pod pojęciem tym kryją się dwa 16-bitowe liczniki T0 i T1. Najogólniej mówiąc każdy z tych liczników a właściwie układów czasowo-licznikowych jest tak uniwersalnym blokiem że z wykorzystaniem jego można dokonać następujące dwie podstawowe operacje:
• za pomocą T0 można zliczać impulsy z zewnętrznego wejścia licznikowego,
• można zliczać wewnętrzne impulsy pochodzące z układu taktującego procesor.

W każdym przypadku będzie to sygnał o częstotliwości równej FXTAL/12, jeżeli więc dopięty jest do mikrokontrolera kwarc o częstotliwości 6MHz to częstotliwość sygnału taktującego licznik T0 lub T1 będzie równa 6MHz/12=500kHz. W tym trybie zwanym czasomierzem,licznik wykorzystuje się do odmierzania pewnych określonych programowo przez użytkownika odcinków czasu (opóźnień) i generowania przerwań po przepełnieniu któregoś z liczników. W przypadku wykorzystania układu licznikowego w obu przypadkach należy wiedzieć że:
• maksymalna liczba zliczonych impulsów jest określona pojemnością 16-bitowego licznika, czyli 2 do potęgi 16 = 65536 (licznik zlicza od 0 do 65535 poczym po nadejściu kolejnego impulsu jest zerowany oraz z zależności od potrzeb jest generowane odpowiednie przerwanie),
• licznik można w dowolnym momencie uruchomić (zezwolić na zliczanie) lub zatrzymać wydając w programie odpowiednią komendę,
• do licznika można w każdej wpisać dowolną wartość (16-bitową liczbę), co spowoduje że licznik będzie zliczał impulsy od tej wartości aż do przepełnienia; wpisu takiego najlepiej jest dokonywać w czasie gdy licznik jest zatrzymany,
• dodatkowo licznik można „bramkować” czyli uzależnić jego pracę lub zatrzymanie w zależności od stanu panującego na wejściach: INT0 dla licznika T0 oraz INT1 dla licznika T1,
• oprócz tego licznik T1 może „taktować” wbudowany port szeregowy w specjalnym trybie.

Port szeregowy

Mikrokontroler 89C2051 posiada 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”. Procesor posiada dwie dedykowane końcówki które wchodzą w skład portu P3 procesora i są to:
• RXD – (P3.0) wejście szeregowe („Receive data”)
• TXD – (P3.1) wyjście szeregowe („Transmit data”)

Końcówki te mogą być wykorzystywane jako uniwersalne wejścia-wyjścia, dzięki instrukcjom zapisu do portu P3 lub indywidualnym sterowaniem każdej końcówki portu.

Jednak przy wykorzystaniu portu szeregowego, sterowanie końcówkami odbywa się automatycznie (za pomocą CPU), według ustawionych wcześniej przez programistę parametrów przesyłowych. Port szeregowy wysyła i odbiera dane w postaci bajtów (8-bitowych słów danych). Konwersja danej wysłanej lub odebranej przez procesor z postaci bajtu do postaci szeregowej lub odwrotnie, odbywa się automatycznie. Dzięki temu wystarczy wskazać tylko daną którą chcemy wysłać lub czekać na odbiór jej z zewnętrznego urządzenia, także wyposażonego 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, znajdują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. W przypadku, kiedy wcześniej ustawiliśmy parametry transmisji i uruchomiliśmy port szeregowy, zapis 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 automatycznie. Dzięki temu będziemy wiedzieć, że w rejestrze SBUF czeka na odczytanie gotowa odebrana dana, z którą można zrobić na co ma się ochotę.

Transmisja synchroniczna

W tym przypadku dane (informacje) przesyłane są od nadajnika do odbiornika za pomocą dwóch przewodów (nie licząc masy). Jednym przesyłane są dane, a drugim generowany jest sygnał zegarowy, 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.

Transmisja asynchroniczna

W przypadku tego rodzaju transmisji nie ma oddzielnej linii zegarowej, a dane są przesyłane w takt wewnętrznego sygnału zegarowego, generowanego oddzielnie w nadajniku i odbiorniku. Warunkiem prawidłowego przesył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.

Tryby pracy portu szeregowego :

Tryb 0

W tym synchronicznym trybie przesyłania informacji port szeregowy pracuje nadając i odbierając znaki 8-bitowe. Zawsze pierwszym nadawanym lub odbieranym bitem jest najmniej znaczący (D0).

Znaki przesyłane są po dwukierunkowej linii P3.0 (RXD). Odbierane są i nadawane za pośrednictwem 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 częstotliwości sygnału taktującego procesor. W przypadku użycia obwodu oscylatora procesora z rezonatorem kwarcowym 12MHz, znaki w tym trybie będą przesyłane z szybkością 1 000 000 bitów/sek. (1Mb/s).

Przy nadawaniu znaku obowiązuje zasada, że zapis wysłanego kolejnego bitu znaku w urządzeniu odbiorczym (zewnętrznym np. rejestrze przesuwnym) powinien nastąpić przy narastającym sygnale zegarowym wytwarzanym na linii TXD.

W przypadku odbioru (REN=1) narastające zbocze sygnału zegarowego powinno powodować przesunięcie zawartości zewnętrznego rejestru przesuwnego, z którego odbierane są dane, czyli 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ą zerowane automatycznie pozwala programiście na testowanie stanu ich, a co za tym idzie monitorowanie faktu odbioru czy nadania znaku bez potrzeby uruchamiania układu przerwań.

Tryb 1,2,3

Ponieważ w trybie asynchronicznym nie istnieje linia przesyłająca sygnał 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 wykrywając takie zajście będzie, znając częstotliwość nadawania 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 nadawania znaku, a z drugiej strony sygnałem konieczności jego odbioru jest pojawienie się tzw. „bitu startu”, czyli niskiego poziomu logicznego na linii (TXD w przypadku nadawania) lub (RXD – w przypadku odbioru).

Bit startu trwa dokładnie tyle ile powinny trwać, (w zależności od szybkości transmisji), pozostałe bity informacji.

Po bicie startu (zawsze równy zero), następują kolejno bity danych. I tak pierwszy transmitowany jest najmłodszy bit (D0) bajtu wpisanego do rejestru SBUF, potem starszy (D1) i tak dalej aż do bitu 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.

W trybie 2 pracy, port szeregowy taktowany jest sygnałem zegarowym o częstotliwości FXTAL/32 lub FXTAL/64. O tym, która z częstotliwości będzie taktować port, decyduje stan bitu 7 (SMOD) w rejestrze SFR o nazwie PCON (adres: 87h). Ustawienie tego bitu powoduje podwojenie szybkości transmisji (FXTAL/32) wyzerowanie – ustawienie taktowania na FXTAL/64. W trybach 1 i 3 szybkość transmisji może być określana programowo. W tym przypadku układ transmisyjny taktowany jest za pomocą sygnału przepełnienia licznika T1 układu czasowo-licznikowego.

Przerwania

W mikrokontrolerach istnieje kilka źródeł przerwań. „Źródeł”, czyli dosłownie mówiąc podukładów mikroprocesora, które mogą generować przerwania. Układ przerwań procesora może przyjmować zgłoszenia następujących przerwań:
• Zewnętrzne: z wejść /INT0 i /INT1 (2 przerwania),
• Z portu szeregowego (jedno przerwanie),
• Z układu licznikowego: przepełnienie licznika T0, lub T1 (2 przerwania).

Wszystkie przerwania mogą być blokowane lub uaktywniane przez ustawienie odpowiednich bitów w rejestrze IE. Każde ze źródeł przerwań może mieć wybrany jeden z dwóch poziomów priorytetów prze odpowiednie zaprogramowanie rejestru IP. W ramach jednego poziomu obowiązują następujące priorytety przerwań od najbardziej uprzywilejowanego: zewnętrzne od /INT0, od licznika T0, zewnętrzne od /INT1, od licznika T1, od portu szeregowego UART.

Specjalne tryby pracy

W obszarze rejestrów SFR procesora znajduje się jeszcze jeden ciekawy rejestr specjalnego przeznaczenia. Jego funkcją jest kontrola specjalnych trybów pracy procesora, a mianowicie:
• Trybu tzw. „jałowego”,
• Trybu tzw. „uśpienia”.

Tryb jałowy

Instrukcja, która ustawia bit PCON.0 powoduje wprowadzenie procesora w ten tryb. Jest ona ostatnią wykonywaną przez procesor instrukcją. Wewnętrzny sygnał zegarowy zostaje odłączony od jednostki centralnej (CPU), ale układ przerwań, port szeregowy i licznikowy pracują dalej, jeżeli wcześniej były odpowiednio skonfigurowane i ustawione. Stan całego procesora, a więc stan:
• Rejestrów specjalnych SFR,
• Pamięci wewnętrznej RAM użytkownika,
• Pinów portów P1 i P3.
pozostaje bez zmian i jest taki sam jak był tuż przed wejściem procesora w tryb jałowy.

Istnieją dwa sposoby na wyjście z tego stanu:

1. Nadejście dowolnego przerwania – oczywiście jeżeli było ono wcześniej uaktywnione w rejestrze IE. Pojawienie się przerwania zeruje automatycznie (bez udziału programu użytkownika) flagę PCON.0 i procesor powraca do normalnej pracy, z tym, że następną instrukcją po wyjściu ze stanu jałowego pod wpływem przerwania będzie pierwsza znajdująca się w procedurze obsługi danego przerwania do instrukcji RETI, kiedy to procesor automatycznie powraca do instrukcji następnej po tej, która wprowadziła procesor w stan jałowy czyli tej, która ustawiła bit IDL w rejestrze PCON.

2. Drugim sposobem na wyjście z tego stanu jest zerowanie procesora. Ze względu na fakt, że podczas trybu „jałowego” procesora pracuje nadal zegar systemowy, do prawidłowego zresetowania potrzebny jest impuls zerujący o długości co najmniej 24 okresów oscylatora.


Tryb uśpienia – obniżonego poboru mocy

W tym trybie cały mikrokontroler pobiera znacznie mniej energii, oraz dodatkowo napięcie zasilające układu może zostać zmniejszone od standardowych 5V do 2V. Instrukcja ustawiająca bit PD (PCON) jest ostatnią wykonywaną przez procesor. W trybie tym oscylator procesora zostaje wyłączony. Zostają odłączone wszystkie układy funkcjonalne procesora, takie jak układy licznikowe, port szeregowy, układ przerwań. Pozostaje jedynie niezmieniona zawartość wewnętrznej pamięci RAM, w tym pamięci użytkownika oraz rejestrów specjalnych SFR. Bity portów pozostają zgodne ze stanami odpowiadających im bitów w rejestrach P1 i P3 w obszarze SFR. W tym trybie pracy procesora, a raczej nie trybie pracy, co uśpienia, procesor pobiera około 500 razy mniej prądu niż w stanie normalnej pracy.

Jedyną metodą na opuszczenie trybu uśpienia i powrót do normalnej pracy jest wyzerowanie mikroprocesora poprzez podanie impulsu resetującego na wejście RST o czasie trwania ok. 10ms.

 
ZST © 2005