Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
A&Q
PYTANIA I ODPOWIEDZI Z MIKROKONTROLERÓW
KŁ ZSP4 2012
Czym jest mikrokontroler ? Mikrokontrolery są układami sekwencyjnymi, synchronicznymi, tzn. wszystkie operacje wykonywane przez układy
procesora odbywają się w określonej kolejności i w ściśle określonych momentach czasowych. Dlatego muszą
współpracować z generatorami impulsów zegarowych. Układy mikroprocesorowe korzystają najczęściej z generatorów
zewnętrznych. Natomiast mikrokontrolery mają wewnętrzny generator, do którego dołącza się z zewnątrz albo tylko sam
rezonator kwarcowy lub ceramiczny oraz dodatkowo dwa kondensatory, ułatwiające wzbudzenie się generatora na
pożądanej częstotliwości.
W większości mikrokontrolerów praca generatora może być zatrzymana odpowiednim rozkazem, co powoduje
zatrzymanie działania wszystkich elementów mikrokontrolera. Ma to na celu zredukowanie do minimum prądu zasilania,
np. w momencie awarii sieci zasilającej.
momentu osiągnięcia założonej częstotliwości. Czas ten wynosi na ogół około 10 ms.
Ponieważ po włączeniu zasilania układy wewnętrzne mikrokontrolera przyjmują stan dowolny, dlatego musi istnieć
możliwość wymuszenia na mikroprocesorze powtarzalnych stanów początkowych wszystkich jego rejestrów. W
komputerach służy do tego przycisk RESET. Mikroprocesory posiadają wejście (RST), na które jeżeli poda się odpowiedni
sygnał, to nastąpi wymuszenie stanów początkowych rejestrów wewnętrznych. Ponieważ stan początkowy procesora musi
być ustalony po włączeniu zasilania, to do tego wejścia dołącza się układ czasowy RC, który wymusza, na wymagany
odcinek czasu, sygnał zerujący. W większości mikrokontrolerów, np. w mikrokontrolerach rodziny '51 wykonanych w
technologii CMOS rezystor jest umieszczony wewnątrz układu. Sygnałem tym, w zależności od typu mikrokontrolera
może być poziom zera logicznego (masa układu), jak na przykład w mikrokontrolerach 80C515 lub poziom jedynki
logicznej (zasilanie) jak w mikrokontrolerach 8051.
W większości układów mikroprocesorowych stosuje się przełączniki, dołączone do linii RST, do ręcznego zerowania
procesorów. Daje to możliwość uruchomienia od początku programu procesora, np. w przypadku testowania lub
zawieszania się programu procesora.
Podstawową jednostką określającą czas wykonywania instrukcji jest cykl maszynowy. Dla rodziny mikrokontrolerów
'51 składa się on z sześciu stanów, oznaczonych od S1 do S6, z których każdy dzieli się na dwie fazy P1 i P2. Czas trwania
jednej fazy jest równy okresowi oscylatora. Wynika stąd, że czas trwania cyklu maszynowego jest 12 razy dłuższy od
okresu oscylatora.
W każdym stanie cyklu maszynowego są realizowane pewne podstawowe procedury związane z wykonywaniem
rozkazów.
Rozkazy są pobierane z pamięci wewnętrznej lub zewnętrznej mikrokontrolera spod adresu wskazywanego przez licznik
rozkazów (PC).
Rozkazy mogą być jedno lub wielobajtowe, a czas ich wykonywania może trwać jeden lub kilka cykli maszynowych. W
rodzinie '51 występują rozkazy jedno, dwu i trójbajtowe, które są wykonywane w jednym, dwóch lub czterech cyklach
maszynowych.
Pobranie pierwszego bajtu rozkazu odbywa się zawsze w takcie S1.
1. Wymień najbardziej znanych producentów mikrokontrolerów. - Microchip, ze swoją rodziną: jednoukładowców” PIC...
- Motorola, lansująca układy 8, 16 i 32-bitowych mikrokontrolerów jednoukładowych
- Intel, produkujący bodaj najbardziej popularne procesory serii 8051...
- Zilog, producent nowoczesnych kontrolerów jednoukładowych – następców poczciwego Z80 (wykorzystywanego w
produkcji sędziwego ZX81, ZX Spectrum)
- SGS-Thompson z rodziną ST62.
- Philips,
- Siemesa
- Dallas –
- Atmel,
2. Ile wyprowadzeń liczy układ 8051 i które z nich pełnią role portów? Wszystkich końcówek jest 40
Końcówki 1..8 (Port P1)
Końcówki 21..28 (Port P2)
Końcówki o numerach 10...17(Port P3)
Końcówki o numerach 32..39 (Port P0)
3. Jakie funkcje pełni port P0 i czym się różni od P1 i P2? Podstawowe funkcje portu jako dwukierunkowej bramy do wymiany danych są takie same jak w przypadku portów P1 i
P2. Zasadniczą różnicą jest jednak zwiększona obciążalność (do 8 wejść TTL) tego portu oraz fakt nie posiadanie
wbudowanych rezystorów podciągających końcówki portu do plusa zasilania w przypadku odczytu.
Dlatego przy projektowaniu dowolnych układów wyjściowych dołączanych do tego portu należy uwzględnić wspomniane
wartości tak, aby np. odpowiednio spolaryzować bazy tranzystorów.
Drugą bardzo ważną rolą, jaką pełni P0, jest funkcja multipleksowanej magistrali danych (8-bitów:D7...D0) i młodszej
części adresu (A7...A0). multipleksowanej w praktyce znaczy “przełączalnej”, czyli raz na końcówkach portu P0 procesor
może wystawić bajt danych (np. do zapisu do wewnętrznej pamięci danych), w innym przypadku adres, w celu wybrania
potrzebnej komórki z pamięci SRAM, do której ma być zapisana.
4. Jakie funkcje pełni port P1 i P2? Port P1 może pełnić rolę wyjścia informacji binarnej. Tak więc, jeżeli zachodzi potrzeba, procesor może np. wpisać do
portu P1 dowolną liczbę binarną z zakresu 0...255, np. 48. Binarnie liczba 48 = 00110000b. Oznaczenie poszczególnych
końcówek portu P1 wskazują na kolejną pozycje bitu (cyfry liczby binarnej),.
Port (cały lub niektóre z jego pinów), podobnie jak przy zapisie, można ustawić także jako wejście informacji logicznej.
Każde z wyprowadzeń staje się wtedy wyjściem o wysokiej impedancji dzięki temu dowolny poziom logiczny podany z
wyjścia jakiegoś układu cyfrowego może być odczytany poprzez piny portu a informacja czy tym stanem była logiczna ‘1’
czy ‘0’, zostaje wykorzystana przez procesor dla dalszego jego działania w zależności od spełnianej funkcji. Krótko
mówiąc, procesor może odczytać stany logiczne, jakie z zewnątrz podano na końcówki portu.
Poziomy logiczne napięć wejściowych portu P1 (oraz dla każdego innego ) muszą zawierać się w przedziale napięć
zasilania mikrokontrolera, czyli w zakresie 0...5V. Detekcja poziomów logicznych odbywa się jak dla bramek CMOS, stąd
wartości progowe napięć tych stanów są zbliżone do połowy napięcia zasilającego. Istotną informacją jest fakt że w trybie
“odczytu” z portu P1 końcówki są wewnętrznie podczepiane (podciągane )do plusa zasilania poprzez wbudowane w 8051
rezystory, co wymusza odczyt wysoki z portu w wypadku nie podłączenia końcówki poru.
Port P2 spełnia wszystkie funkcje podobnie jak P1. Dodatkowo poprzez końcówki portu P2 podawana jest w razie potrzeby
starsza część adresu (A8...A15) przy dostępie do zewnętrznej pamięci danych (SRAM) a także programu (np. EPROM).
5. Jakie funkcje pełni port P3? 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. Port P3 spełnia dodatkowe funkcje.
Piny P3.0 (RXD) i P3.1 (TXD) mogą pełnić rolę portu transmisji szeregowej. W praktyce poprzez te dwa wyprowadzenia
można przesyłać informację (bajty i bity) z i do procesora z innych układów cyfrowych w sposób szeregowy, tzn. bit po
bicie. Przesyłanie to może odbywać się na kilka sposobów:
- synchronicznie – wtedy pin P3.0 pełni role dwukierunkowej magistrali szeregowej, po której przesyłane są dane, zaś pin
P3.1 generuje sygnał taktujący, pełniąc rolę zegara.
- asynchronicznie – kiedy z góry zadajemy prędkość transmisji pomiędzy naszym układem np. łączem RS232c komputera
PC. W takim przypadku końcówka P3.0 –RxD pełni rolę odbiornika przesyłanych szeregowo danych (R oznacza receive –
odbiór), zaś końcówka P3.1 – TxD nadajnika (T-transmitt – nadawanie).
Ponadto rozróżnia się kilka trybów pracy asynchronicznej.
Alternatywą funkcji końcówek P3.2 (INT0) oraz P3.3 (INT1) jest funkcja detekcji przerwań zewnętrznych. Pojęcie
przerwania w tym przypadku odnosi się do zmiany stany logicznego z ”1”na ”0”. W efekcie “we wnętrzu” procesora
8051zostaje ustawiona tak zwana flaga (nazywana także jako “znacznik zgłoszenia przerwania”, co w odniesieniu do
techniki cyfrowej można wyobrazić sobie jako przerzutnik). Konsekwencją tego jest automatyczne przerwanie
wykonywania przez procesor programu i natychmiastowe przejście do wykonania czynności ściśle określonych przez
programistę. Ciąg takich czynności nazywany jest w technice mikroprocesorowej: “procedurą obsługi przerwania”.
Wykrycie zmiany stanu logicznego na końcówkach przerwań INT0 i INT1 wiąże się ze spełnieniem jednego warunku, a
mianowicie, aby czas od wspomnianego ujemnego zbocza sygnału zgłoszenia przerwania do ponownego przejścia w stan
wysoki był odpowiedni długi. Podobnie jak w przypadku warunku sygnału RST, czas ten zależy od częstotliwości zegara
mikroprocesora.
Końcówki (P3.4 i P3.5) oznaczone jako T0 i T1 pełnią dodatkową funkcję wejść uniwersalnych, programowanych
liczników, wbudowanych w strukturę 8051. Procesor zawiera dwa bliźniacze liczniki T0 i T1. Maksymalnie mogą one
zliczać do 216
=65536, po czym zostają wyzerowane. Liczniki te oprócz zliczania impulsów z wejść T0 i T1 mogą także
zliczać impulsy wewnętrzne, pochodzące z generatora mikrokontrolera. W praktyce wykorzystywane jest to np. do
odmierzania określonych odcinków czasu np. przy funkcji zegarka. Liczniki mogą być programowane przez użytkownika,
a więc można np. zmniejszyć pojemność (do 28 lub 213), można także zapisać w nich wartość początkową, zatrzymać je w
dowolnym momencie lub uruchomić.
Pin WR jest sygnałem zapisu do zewnętrznej pamięci danych, a końcówka RD wysyła sygnał do odczytu.
6. Z jakimi częstotliwościami zegara może pracować MC 8051 i w jaki sposób można ustawiać tę
częstotliwość? W praktyce częstotliwość ta może wynosić od 1,2MHz do 12...16MHz na rynku spotyka się także wersje procesorów
pracujące przy wyższych częstotliwościach nawet do 40MHz, a także przy niskich – nawet do pojedynczych herców w
wypadku procesorów 8051 w wersji statycznej (np. 89C51 firmy Atmel).
Końcówki 18 i 19 (XTAL1 i XTAL2) służą do dołączenia zewnętrznego rezonatora kwarcowego o częstotliwości zależnej
od potrzeb użytkownika, ale także od wersji układu 8051.
Dołączony do tych pinów rezonator kwarcowy po uzupełnieniu o dodatkowe kondensatory o wartości z reguły z przedziału
22...40pF (w zależności od wartości rezonatora), umożliwiają pracę wbudowanemu w 8051 generatorowi, który “napędza”
cały mikroprocesor. Oczywiście od częstotliwości rezonatora ściśle zależy szybkość działania naszego mikrokontrolera.
Częstotliwość, z jaką pracują wewnętrzne układy mikroprocesora, jest określona wzorem:
gdzie Fxtal jest częstotliwością rezonatora kwarcowego.
Powodem takiego podziału częstotliwości rezonatora jest wewnętrzna architektura wszystkich procesorów serii 8051.
Końcówka XTAL1 (pin19) w układach w wersji CMOS może także pełnić rolę wejścia zewnętrznego sygnału zegarowego
o częstotliwości w zakresie, jak opisano w przypadku stosowania rezonatora kwarcowego. Wtedy rezonator i dodatkowe
kondensatory są zbędne. W przypadku gdy mamy do czynienia z wersją w technologii HMOS wejściem takiego sygnału
jest XTAL2 (pin 18). W obu przypadkach pozostały pin powinien być nie podłączony.
7. Jakim napięciem jest zasilany układ 8051 i jaka jest jego wielkość max? Do zasilania mikrokontrolera służy końcówka 40. Napięcie względem końcówki Vss (czyli masy) z reguły nie może
przekroczyć 6,5V. Dlatego układ mikrokontrolera należy zasilać napięciem 5V±0,25V używając do tego celu dowolnego
zasilacza stabilizowanego.
Zasadą przy projektowaniu układów z 8051 jest blokowanie tego wyprowadzenia kondensatorem o wartości 100nF do
masy układu cyfrowego. Praktycznie na płytce drukowanej należy zawsze przewidzieć miejsce na taki kondensator
umieszczając go jak najbliżej samego układu procesora lub po prostu przylutowując go od strony wyprowadzeń na płytce
drukowanej.
Masę układu dołącza się do końcówki 20 (Vss). Podobnie jak w większości układów cyfrowych ostatnie wyprowadzenie w
“dolnym rzędzie” obudowy jest końcówką ujemnego napięcia zasilającego – masy (GND). W przypadku układów CMOS
podaje się oznaczenie Vss co oznacza biegun ujemny napięcia zasilającego. W większości zastosowań pin 40 dołączany
jest do masy przyszłego układu elektronicznego.
8. Krótko scharakteryzuj działanie stosu w układzie 8051. Jak w każdym komputerze także i w mikrokontrolerach rodziny '51 do wywoływania podprogramu przy przejściu do
wykonywania innego podprogramu tworzony jest stos. Stosem jest wydzielony fragment wewnętrznej pamięci RAM
adresowany wskaźnikiem stosu SP. Kolejność odczytu bajtów ze stosu jest odwrotna w stosunku do kolejności ich
zapisywania, zgodnie z regułą pamięci LIFO. Bezpośrednio dostępne są tylko bajty adresowane przez wskaźnik stosu SP
znajdujące się na wierzchołku stosu, a nie w jego wnętrzu. Sytuację tę można porównać do sterty książek ułożonych jedna
na drugiej. Dokładając kolejną książkę umieszcza się ją na szczycie sterty. Zabierając książkę ze sterty zabiera się książkę
leżącą na jej szczycie. Książki leżące we wnętrzu sterty nie są dostępne.
Stos używany jest do zapamiętywania adresów powrotu z podprogramów wywołanych programowo lub sprzętowo (przez
przerwania), przenoszenia zmiennych między programami, czasowej ochrony rejestrów specjalnych i komórek
wewnętrznej pamięci RAM jeśli są one zmieniane w trakcie wykonywania podprogramów.
Najprościej stos można określić jako bardzo prostą w działaniu strukturę przechowującą bajty. Pod pojęciem
przechowywania rozumiemy oczywiście operację 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) musisz 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
12
xtalFF
odpowiedniej kolejności w zapisie i odczycie tak aby nasze cenne dane nie "pomieszały się". Otóż taki uporządkowany
sposób przechowywania danych charakteryzuje właśnie stos.
Jak widać 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 (w naszym przykładzie 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. Można to porównać do stosu talerzy
ustawionych jeden nad drugim. Odkładamy talerze na stos i zdejmujemy ze stosu. Nie możemy wyjąć talerza "z głębi"
stosu - dostajemy się do niego dopiero po zdjęciu wszystkich stojących na nim. "Po co jednak jest ten "stos", czy nie jest to
tylko niepotrzebna komplikacja"? Otóż struktura ta spełnia niezmiernie ważną rolę podczas wykonywania programu przez
mikroprocesor. Po pierwsze: stos służy do przechowywania zmiennych lub rejestrów SFR. Po drugie: dostęp do nich
(zmiennych) 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. Jak wynika z rysunku ilość tej pamięci zajętej przez stos będzie się zmieniać i
zależeć od tego ile bajtów odłożyliśmy na ten stos. Aby ściśle określić miejsce położenia stosu, w architekturze 8051
znajduje się tzw. licznik stosu, a fachowo mówiąc "wskaźnik stosu". Fizycznie jest on po prostu 8-bajtowym rejestrem w
obszarze SFR, położonym pod adresem 81h. W mnemonice (nazewnictwie) procesorów MCS-51 posiada on symbol SP (z
ang. "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 zwiększany o 1. W przypadku zdjęcia danej ze stosu jest on zmniejszany.
Sytuację tą wyjaśnia poniższy rysunek:
Stos jest więc hierarchiczną strukturą do przechowywania danych (bajtów) z obszaru wewnętrznej pamięci RAM
(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 z procedur oraz obsługi przerwań, czyli innymi słowy mówiąc, aktualne zawartości 16-bitowego licznika
rozkazów PC. Stos jednak składa się z 8-bitowych komórek, a licznik rozkazów jest 16-bitowy. Aby rozwiązać ten
problem procesor na stos odkłada się najpierw młodszy bajt rejestru PC, a następnie starszy bajt, wskaźnik stosu zostaje
więc zwiększony automatycznie o 2. Tak więc w prosty sposób można przechować 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 (adresy 83h) oraz DPL (adres 82h).
W przypadku rejestru DPTR jak i innych SFR przechowywanie na stosie odbywa się "na żądanie" użytkownika.
Teraz jeszcze kilka informacji. Otóż po wyłączeniu zasilania procesora (lub jego resecie) wskaźnik stosu 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 zgodnie z
opisaną wcześniej zasadą). Jeśli więc odłożymy jakiś bajt na stos, najpierw licznik SP zostanie automatycznie zwiększony
o 1, a następnie do komórki o 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 o 1.
Wskaźnik stosu SP tak jak każdy rejestr SFR może być dowolnie modyfikowany przez programistę poprzez zapisanie na
nim dowolnej 8-bitowej wartości (0..255).
W praktyce jednak sytuacja tak występuje tylko wtedy, jeżeli chcemy zmienić położenie stosu (czyli go przesunąć) na
początku wykonywania programu. Operacja ta z oczywistych względów 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 działania samego stosu).
I tak jeżeli chcesz wykorzystywać wewnętrzną. pamięć danych o adresach 08h..20h dla swoich potrzeb (a nie na stos),
musisz na początku swego programu zmodyfikować wskaźnik SP wpisując do niego wartość np. 20h, co jest jednoznaczne
z zawiadomieniem procesora, że stos ma rozpoczynać się od adresu 21h.
Pamiętajmy zatem o stosie jako ważnej strukturze w architekturze 8051 oraz o tym, że tylko umiejętne i świadome z niego
korzystanie przynosi efekty w postaci znacznego przyspieszenia działania programu oraz zmniejszenia jego rozmiarów.
9. Jakie funkcje pełni wewnętrzna pamięć danych układu 8051 i jaka jest jej wielkość? Wewnętrzna pamięć danych
W mikrokontrolerze wewnętrzna pamięć danych przeznaczona jest dla użytkownika do przechowywania argumentów
wartości zmiennych oraz wyników obliczeń arytmetyczno – logicznych. W zależności od typu mikrokontrolera pamięć ta
ma pojemność 128 lub 256 bajtów. Dla 8051 wynosi ona 128B (8052 – 256B).
10. Opisz przestrzeń adresową mikrokontrolera 8051.
W przestrzeni adresowej można wyróżnić kilka obszarów. Dwa główne, to obszar pamięci użytkowej, oraz 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ą wykorzystane przez rejestry specjalne.
I chociaż pamięć użytkownika podzielona jest na obszar, 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 Swich”.
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 8051 czyli adresy
0...7Fh.
11. Jaka może być wielkość zewnętrznej pamięci danych i jakie układy są tu najczęściej stosowane? Do podłączenia zewnętrznej pamięci danych używa się zwykle pamięci statycznych SRAM o ośmiobitowej organizacji
danych i adresowaniu równoległym.
Do kontrolerów serii ’51 można dołączyć maksymalnie 64kB zewnętrznej pamięci danych. Można więc w takim
przypadku zastosować:
2 kostki 6256 (2 x 32kB = 64kB) lub
8 kostek 6264 (8 x 8kB = 64kB) lub
32 kostki 6116 (32 x 2kB = 64kB).
SRAM są niepraktyczne, po pierwsze ze względu na ilość układów scalonych co prowadzi do zwiększenia płytki
drukowanej, po drugie pojawia się konieczność stosowania dodatkowego dekodera adresu (np. układu serii TTL-LS typ
74LS138 – dekoder 1 z 8).
12. Jak zmienia się wykorzystanie portów mikrokontrolera w przypadku stosowania zewnętrznej pamięci
danych? Zastosowanie zewnętrznej pamięci tak programu jak i danych wiąże się ze zubożeniem typowej “jednoukładowości”
mikrokontrolera, bowiem zajęte zostają porty P0 i P2 procesora. O ile w przypadku pracy z zewnętrzną pamięcią programu
dzieje się tak zawsze: port P0 pracuje jako multipleksowana (na zmianę) szyna danych lub młodszej części adresu, a port
P2 wystawia starsze 8 bitów 16-bitowego adresu, o tyle w przypadku pracy z zewnętrzną pamięcią danych ( bez
zewnętrznej pamięci programu) istnieje możliwość oszczędniejszego gospodarowania portami procesora.
Procesor przy odczycie lub zapisie ... wystawia 16-bitowy adres (A0...A15) ... . Do tego potrzebne są 2 porty, które w
takim przypadku nie nadają się do dodatkowego wykorzystania, jako np. wyjścia sterowania przekaźnikami, lub
czymkolwiek innym.
Istnieje jednak możliwość innego odczytu zewnętrznej pamięci danych, nazywana “stronicowaniem”. Ma ona
zastosowanie szczególnie wtedy, kiedy zewnętrzna pamięć danych ma mniejszy rozmiar od maksymalnej przestrzeni
adresowej procesora np. 2kB. Pamięć taka ma tylko 11 linii adresowych (A0...A10), co pozwala na zaadresowanie 2048
komórek pamięci (bajtów). Tak więc pozostałe linie adresowe procesora A11.A15 pozostałyby niewykorzystane gdyby
zastosować odczyt jak w poprzednim przypadku z pełnym adresem A0...A15.
Przy “stronicowanym” sposobie obsługi zewnętrznej pamięci danych, procesor wystawia tylko młodszą część 16-
bitowego adresu (linie AD0...AD7), zaś port P2 pozostaje “nietknięte”. W konsekwencji takiego sposobu obsługi możliwe
będzie zaadresowanie tylko 256 bajtów (2 do potęgi 8 = 256) tej pamięci, a nie jak w naszym przykładzie aż 2kB. No tak,
chyba że przed odczytem przez procesor, sami, za pomocą sygnałów A8...A10 (wystawionych poprzez 3 piny portu P0)
ustawimy niejako “fizyczny” adres 256 bajtowej strony adresowanej pamięci.
Zauważmy przecież że za pomocą tych trzech końcówek można “zaadresować” 8 stron po 256 bajtów każda co w sumie
da nam do dyspozycji pełne 2048 bajtów, czyli 2kB. Zauważmy też że, co najważniejsze, pozostałe końcówki portu P2
pozostają wolne i możemy je dowolnie wykorzystać jako wejścia lub wyjścia cyfrowe.
W celu rozróżnienia przedstawionych dwóch typów adresowania wprowadzone są dwie różne instrukcje procesora,
których używa programista podczas projektowania układu i pisania programu, w zależności od potrzeb.
Połączenie mikrokontrolera z zewnętrznymi pamięciami
13. Wyjaśnij sposób tworzenia rejestrów R0 – R7, wykorzystywanych do adresowania pośredniego. W 128-bitowym segmencie wewnętrznej pamięci RAM o adresach od 0 do 7Fh rozmieszczone są rejestry R0 i R1, które
wykorzystywane są przy adresowaniu pośrednim. Oprócz nich konstruktorzy mikrokontrolera dali użytkownikom do
dyspozycji 6 następnych rejestrów oznaczonych kolejnymi symbolami cyfrowymi: R2, R3, R4, R5, R6, R7.
W ten sposób mamy w mikrokontrolerze 8 rejestrów.
14. Co to są banki rejestrów ? Banki rejestrów tworzy osiem rejestrów (R0, .., R7). Takich banków mamy 4 oznaczonych symbolami RB0 (bank numer
0), .., RB3 (bank numer 3).
Z powyższego rysunku wynika, że wszystkie banki rejestrów rozmieszczone są w początkowym obszarze wewnętrznej
pamięci RAM mikrokontrolera. Oznacz to, że do każdego z rejestrów możemy odwołać się przez:
podanie jego symbolu i numeru banku rejestrów, np. rejestr R7 w banku RB1
podanie adresu komórki wewnętrznej pamięci RAM, np. adres 0Fh dla tego samego rejestru.
Pomimo, że mamy do dyspozycji 4 banki rejestrów, każdy po 8 rejestrów (łącznie 32 rejestry), to tylko programowy dostęp
przez podanie symbolu rejestru możliwy jest tylko do jednego, wybranego banku. Po sprzętowym zerowaniu procesora
(linią RTS) wybrany jest jako domyślny bank RB0, tzn. rejestry R0,..,R7 o adresach od 0 do 7. Adresując bezpośrednio
zewnętrzną pamięć RAM w zakresie 0..1F dostępne są wszystkie 32 rejestry (traktowane jako komórki pamięci).
Poza rejestrami R0,..R7 wszystkie inne rejestry, np. akumulator A, rejestr B, rejestr słowa statusowego PSW, itd., znajdują
się w bloku, segmencie rejestrów specjalnych SFR.
Jeśli w mikrokontrolerach rodziny '51 przewidziano 4 banki rejestrów (RB0, .., RB3) to oznacza to, że wystarczą 2 bity do
określenia numerów banków. Te dwa bity oznaczone symbolami RS0 i RS1 (Register Select) znajdują się w rejestrze
słowa statusowego PSW.
Kodowanie numeru banku rejestrów za pomocą bitów RS1 i RS0 jest binarne, tzn.:
RS1,RS0=00b oznacza zerowy bank rejestrów RB0;
RS1,RS0=11b oznacza trzeci bank rejestrów RB3.
15. Wyjaśnij, w jaki sposób adresowana jest zewnętrzna pamięć danych RAM. Zewnętrzna pamięć danych RAM, jeśli istnieje potrzeba jej dołączenia do mikrokontrolera wskutek zbyt małej
wewnętrznej pamięci RAM, adresowana jest w dwojaki sposób:
1. Wskaźnikowy rejestr danych DPTR:
Instrukcja: zapis binarny instrukcji: Wykonywana operacja
MOVX @DPTR,A 1111 0000b (DPTR)XDATA A
MOVX A,@DPTR 1110 0000b A (DPTR)XDATA
Jest to standardowy sposób odwoływania się do pamięci. 16-bitowy wskaźnikowy rejestr danych DPTR zawiera pełny
16-bitowy adres komórek pamięci. Ponieważ rejestr ten tworzą dwa połączone rejestry:
DPH jako 8-bitowa, bardziej znacząca część rejestru DPTR;
DPL jako 8-bitowa, mniej znacząca część rejestru DPTR.
W trakcie adresowania komórek pamięci stan obu rejestrów pojawia się na liniach portu P0 (stan rejestru DPL) i P2 (stan
rejestru DPH), tak jak przedstawiono na rysunku. Multipleksowanie stanu obu portów realizowane jest dynamicznie, tylko
na czas wykonywanej instrukcji.
Adresowanie zewnętrznej pamięci RAM za pośrednictwem wskaźnikowego rejestru danych DPTR
2. Zawartością portu P2 i rejestru R0 lub R1:
instrukcja zapis binarny
instrukcji wykonywana operacja
MOVX @R0,A 11110010b (256*P2+R0)XDATAA
MOVX A,@R0 11100010b A (256*P2+R0)XDATA
MOVX @R1,A 11110011b (256*P2+R1)XDATAA
MOVX A,@R1 11100011b A (256*P2+R1)XDATA
Składnia instrukcji jest trochę myląca. Wynika z niej bezpośrednio, że do adresowania zewnętrznej pamięci RAM używany
jest tylko jeden z rejestrów mikrokontrolera, R0 lub R1. Oba rejestry są rejestrami 8-bitowymi,a do zaadresowania pamięci
wymagany jest adres 16-bitowy. W trakcie wykonywania jednej z czterech przedstawionych instrukcji na liniach portu P0
pojawia się zawartość rejestru R0 lub R1 (8 mniej znaczących bitów adresu) ale stan portu P2 nie ulega zmianie. Oznacza
to, że przed wykonaniem instrukcji należy wpisać do portu P2 8-bardziej znaczących bitów adresowanej komórki
zewnętrznej pamięci RAM
Przykładowo do zapisu akumulatora A do komórki pamięci adresie 3C58h należy wykonywać poniższe instrukcje:
MOV R0,#58h ;R0-58H
MOVX P2,#3cH ;P2-3Ch
MOVX @R0,A
W każdej linii tego krótkiego programu pojawił się po znaku średnika (;) komentarz, który ma wyjaśnić, pomóc w
zrozumieniu działania programu. W trakcie asemblacji wszystkie komentarze (od znaku średnika do końca
wiersza ) są pomijane. Oba przedstawione sposoby adresowania zewnętrznej pamięci RAM określane są mianem adresowania pośredniego. We
wszystkich trybach takiego adresowanie, za pośrednictwem jakiegoś rejestru, przed nazwą rejestru pojawia się znak @.
Znak ten świadczy, że adres komórki pamięci podany jest w bezpośrednio po znaku występującym rejestrze, np.:
w instrukcji MOVX A,@DPTR adres komórki podany jest w rejestrze DPTR
w instrukcji MOVX @R1,A rejestr R1 zawiera część adresu komórki zewnętrznej pamięci RAM, 8-mniej znaczących
bitów adresu. Pozostałą część adresu, 8-bardziej znaczących bitów, zawiera port P2.
16. Jaka jest podstawowa składnia instrukcji (rozkazu) ? Najpowszechniejszym rozkazem są rozkazy, instrukcje przesłań, których składnia jest następująca:
Skrót instrukcji MOV pochodzi od słowa "MOVE" czyli przesunięcia, ruszenia czegoś z miejsca. W rozkazie tym użyto
tylko dwóch argumentów. Pierwszy (dst) do określenia komórki pamięci lub rejestru specjalnego SFR, do których ma być
przesunięta dana. Drugi (scr) także do określania adresu komórki pamięci lub rejestru specjalnego, z których ma być
pobrana dana. Kolejność argumentów jest bardzo ważna. W instrukcjach 2-argumentowych jako pierwszy występuje
zawsze adres docelowy, a jako drugi adres źródłowy. W innych instrukcjach liczba argumentów zmienia się od jednego do
trzech, w zależności od realizowanej funkcji.
17. Co to jest asemblacja? Program zawierający mnemoniki wykonywanych instrukcji jest czytelny dla człowieka. Jeśli te same instrukcje mają być
zrozumiałe dla mikrokontrolera, to muszą zostać przetłumaczone na ciąg zero-jedynkowy. Proces tłumaczenia i kodowania
nazw instrukcji i ich argumentów nazywany jest asemblacją. Wynika z tego, że program będący ciągiem poleceń
tłumaczony jest na kod wynikowy za pośrednictwem programu zwanego asemblerem. Przytoczona powyżej instrukcja
MOV 4Ah,8 zmieniona zostaje na trzy bajty w postaci:
18. Na czym polega różnica między mikrokontrolerami w wersji 8051, 8052, 8751, 8752, 89C51, 89C52? - 8051 posiada tylko 128B pamięci wewnętrznej, pamięć zewnętrzną dołącza się w postaci układów dodatkowych – 6256 -
32KB, 6264 - 8KB, 6116 – 2KB
- 8052 posiada 256B pamięci wewnętrznej, pamięć zewnętrzna jw.
- 8751, 89C51 – pamięć wewnętrzna jw., dodatkowo ma wbudowaną pamięć zewnętrzną o wielkości 4KB
- 8752, 89C52 jw. Ale ma 8KB pamięci zewnętrznej
19. Scharakteryzuj konfiguracje współpracy procesora z wewnętrzną i zewnętrzną pamięcią programu? Procesor może pracować w następujących konfiguracjach:
- tylko z wewnętrzną pamięcią programu (dla kostek 8751,8752)
- z wewnętrzną i zewnętrzną pamięcią programu jednocześnie, w tym przypadku zewnętrzna pamięć programu stanowi jak
gdyby “przedłużenie” pamięci wewnętrznej
- tylko z zewnętrzną pamięcią programu np. typu EPROM.
Pierwszy tryb jest bardzo wygodny, pozwala na “pełne” wykorzystanie wszystkich zalet mikrokontrolera jednoukładowego
w całym tego słowa znaczeniu. Programista wykorzystując procesor w wersji z wbudowaną pamięcią programu
(8751,8951,xx52) cały kod swego programu umieszcza wewnątrz kości, dzięki czemu ma do dyspozycji wszystkie porty
mikrokontrolera – w tym także P0 i P2. Kostka 87C51 (89C51) ma “tylko” 4kB (8x52 8kB pamięci programu), najczęściej
te “tylko” w zupełności wystarcza, lecz zdarza się że jest to za mało, wtedy konieczne jest dołączenie dodatkowej
zewnętrznej pamięci programu w postaci kostki EPROM. W tym przypadku maksymalna długość programu równa
wielkości obu pamięci zewnętrznej jak i wewnętrznej nie może przekroczyć 64kB – czyli 65536 8-bitowych słów.
Czyli że np. kostki 87C52 (zawierającej 8 kB wewnętrznej EPROM) można dołączyć maksymalnie 56kB EPROM z
zewnątrz.
Trzeci tryb pracy tylko z zewnętrzną pamięcią programu wymaga zwarcia wyprowadzenia EA (pin 31 procesora
8051/52) do masy.
20. Wyjaśnij jakie typ układów kryją się pod symbolami: 8051, 8052, 8751, 8752, 2764, 6116, 6264,
6256, 74LS138 ?
- 8051 – mikrokontroler 128B wewnętrznej RAM
- 8052 - mikrokontroler 256B wewnętrznej RAM
- 8751, 89C51 - mikrokontroler 128B wewnętrznej RAM i wbudowane 4KB zewnętrznej RAM
- 8752, 89C52 - mikrokontroler 256B wewnętrznej RAM i wbudowane 8KB zewnętrznej RAM
- 27C64 – kość RAM o pojemności 8KB
- 6116 - kość SRAM o pojemności 2KB
- 6264 - kość SRAM o pojemności 8KB
- 6256 - kość SRAM o pojemności 32KB
- 74LS138 – dekoder 1 z 8
- 74HCT573(74573) – 8-bitowy bufor
21. Co to jest adresowanie pośrednie, podaj przykład instrukcji zawierającej taki sposób adresowania.
Adresowanie pośrednie polega na wykorzystaniu zawartości jakiegoś rejestru np. DPTR jako
argumentu rozkazu.. Przy tym sposobie adresowania przed nazwą rejestru stosuje się znak @.
Obecność tego znaku oznacza, że adres komórki pamięci podany jest w rejestrze, którego nazwa
podana jest bezpośrednio po znaku @. Przykład takiego adresowania:
- MOVX A,@DPTR – adres komórki podany jest w rejestrze DPTR;
- MOVX @R1,A – rejestr R1 zawiera część adresu komórki zewnętrzne pamięci RAM, 8
mniej znaczących bitów adresu. Pozostałą część adresu, 8 bardziej znaczących bitów,
zawiera port P2
22. Scharakteryzuj sposób adresowania zewnętrznej RAM za pomocą wskaźnikowego rejestru danych
DPTR.
Instrukcja: zapis binarny instrukcji: Wykonywana operacja
MOVX @DPTR,A 1111 0000b (DPTR)XDATA A
MOVX A,@DPTR 1110 0000b A (DPTR)XDATA
Jest to standardowy sposób odwoływania się do pamięci. 16-bitowy wskaźnikowy rejestr danych DPTR zawiera
pełny 16-bitowy adres komórek pamięci. Ponieważ rejestr ten tworzą dwa połączone rejestry:
DPH jako 8-bitowa, bardziej znacząca część rejestru DPTR;
DPL jako 8-bitowa, mniej znacząca część rejestru DPTR.
W trakcie adresowania komórek pamięci stan obu rejestrów pojawia się na liniach portu P0 (stan rejestru DPL) i
P2 (stan rejestru DPH), tak jak przedstawiono na rysunku. Multipleksowanie stanu obu portów realizowane jest
dynamicznie, tylko na czas wykonywanej instrukcji.
Adresowanie zewnętrznej pamięci RAM za pośrednictwem wskaźnikowego rejestru danych DPTR
23. Scharakteryzuj sposób adresowania zewnętrznej RAM zawartością portu P2 i rejestru R0 i R1.
instrukcja zapis binarny
instrukcji wykonywana operacja
MOVX @R0,A 11110010b (256*P2+R0)XDATAA
MOVX A,@R0 11100010b A (256*P2+R0)XDATA
MOVX @R1,A 11110011b (256*P2+R1)XDATAA
MOVX A,@R1 11100011b A (256*P2+R1)XDATA
Składnia instrukcji jest trochę myląca. Wynika z niej bezpośrednio, że do adresowania zewnętrznej pamięci
RAM używany jest tylko jeden z rejestrów mikrokontrolera, R0 lub R1. Oba rejestry są rejestrami 8-bitowymi,a
do zaadresowania pamięci wymagany jest adres 16-bitowy. W trakcie wykonywania jednej z czterech
przedstawionych instrukcji na liniach portu P0 pojawia się zawartość rejestru R0 lub R1 (8 mniej znaczących
bitów adresu) ale stan portu P2 nie ulega zmianie. Oznacza to, że przed wykonaniem instrukcji należy wpisać do
portu P2 8-bardziej znaczących bitów adresowanej komórki zewnętrznej pamięci RAM
Przykładowo do zapisu akumulatora A do komórki pamięci adresie 3C58h należy wykonywać poniższe
instrukcje:
MOV R0,#58h ;R0-58H
MOVX P2,#3cH ;P2-3Ch
MOVX @R0,A ;(256*P2+R0)A
W każdej linii tego krótkiego programu pojawił się po znaku średnika (;) komentarz, który ma wyjaśnić, pomóc
w zrozumieniu działania programu. W trakcie asemblacji wszystkie komentarze (od znaku średnika do końca
wiersza ) są pomijane.
24. Scharakteryzuj odczyt danych z pamięci programu ROM wewnętrznej albo zewnętrznej. Wewnętrzna lub zewnętrzna pamięć programu zawiera oprócz kodu programu także stałe wykorzystywane w programie.
Ze względu na swój charakter, pamięć ROM (EPROM, EEPROM, Flash ROM), możliwy jest jedynie odczyt danych.
Wybór typu pamięci, wewnętrznej lub zewnętrznej, mikrokontroler dokonuje testując linię EA w trakcie zerowania:
EA=0, zewnętrzna pamięć programu
EA=1, wewnętrzna pamięć programu
Stan linii EA nie ma znaczenia jeśli licznik rozkazów PC zawiera adres większy niż adres wewnętrzny pamięci programu.
Przykładowo jeśli mikrokontroler 8051 zawiera 4KB-ową wewnętrzną pamięć programu to dla stanu licznika rozkazów
PC:
PC=0000h..0FFFh i EA-0 –mikrokontroler wykonuje program z zewnętrznej pamięci programu;
PC=0000h..0FFFh i EA=1 – mikrokontroler wykonuje program z wewnętrznej pamięci programu;
PC-1000h..0FFFFh - mikrokontroler wykonuje program z zewnętrznej pamięci programu, niezależnie od stanu linii EA
Pamięć programu (wewnętrzna lub zewnętrzna) adresowana jest na trzy różne sposoby:
1a. przez drugi lub przez trzeci bajt wykonywanej instrukcji. Sytuacja taka występuje przy pobieraniu 8-bitowych stałych z
pamięci programu, np. przy inicjalizacji wartości początkowych rejestrów komórek pamięci, np.:
Instrukcje Zapis binarny instrukcji Wykonywane
operacje
MOV A,#3Ch 0111 0100b 0011 1100b A 3Ch
MOV R0,#6 0111 1000b 0000 0110b R0 6
MOV 35,#4Bh 0111 0101b 0010 0011b
0100 1011b
(35) 4Bh
Dwie pierwsze instrukcje są instrukcjami 2-bajtowymi. Pierwszy bajt zawiera kod wykonywanej instrukcji i informację,
adres docelowego rejestru. Drugi bajt zawiera wartość stałej, która wpisywana jest do akumulatora A (MOV A,#3Ch) i
rejestru R0 (MOV R0,#6).
W trzeciej instrukcji (MOV 35,#4Bh) pierwszy bajt zawiera kod wykonywanej instrukcji, drugi adres komórki
wewnętrznej pamięci RAM (35) zamienianej na liczbę szesnastkową (23), a trzecia wartość stałej pobieranej z pamięci
programu (4Bh).
Z powyższej tabeli przedstawiono również zapis binarny wykonywanych instrukcji (zrozumiały dla mikrokontrolera) oraz
wykonywane operacje. Strzałka oznacza kierunek przepływu danych, wartość ujęta w okrągłe nawiasy (35) jest adresem
komórki pamięci, w tym przypadku wewnętrznej pamięci RAM. Należy zwrócić uwagę na sposób zapisu stałych, które
poprzedzone są zawsze znakiem #. Pominięcie tego znaku powoduje, że odwołujemy się do komórki pamięci RAM lub
rejestrów specjalnych SFR. Ten sposób adresowania nazywany jest adresowaniem natychmiastowym.
1b. przez drugi i trzeci bajt wykonywanej instrukcji. Sytuacja taka występuje przy inicjalizacji wartości początkowej
16-bitowego wskaźnikowego rejestru danych DPTR:
Instrukcja: zapis binarny instrukcji: wykonywana operacja
MOV DPTR,#2E59h 1001 0000b 0010 1110b 0101 1001b DPTR 2E59h
Przedstawiona 3-bajtowa instrukcja jest jedyną instrukcją, w której wpisywana jest do rejestru DPTR stała 16-bitowa.
Pierwszy bajt zawiera kod operacji, bajt drugi i trzeci wpisywaną stałą. Ten sposób adresowania także nazywany jest
adresowaniem natychmiastowym.
2. sumą zawartości 8-bitowego akumulatora A i 16-bitowego wskaźnikowego rejestru danych DPTR. Liczba zawarta w
akumulatorze A traktowana jest jako liczba całkowita bez znaku, co oznacza, że jej zakres zmienności ograniczony jest do
przedziału 0..255.
instrukcja: zapis binarny: wykonywana operacja
MOVC A,@A+DPTR 1001 0011b A (A+DPTR)
Aby wykonać dodawanie zawartości 8-bitowego akumulatora A i 16-bitowego wskaźnikowego rejestru danych DPTR,
zawartość akumulatora A rozszerzana jest znakowo z 8 bitów do 16 bitów o bajt równy 00. Adresowanie pamięci
programu określane jest jako adresowanie za pomocą rejestrów bazowych ( w tym przypadku za pomocą indeksowo-
rejestrowo pośrednie.
Pobieranie danych z pamięci programu i wymiana danych z/do zewnętrznej pamięci RAM
3. sumą zawartości 8-bitowego akumulatora A i 16-bitowego licznika rozkazów PC. Podobnie jak poprzednio liczba
zawarta w akumulatorze A traktowana jest jako liczba całkowita bez znaku:
instrukcja: zapis binarny
instrukcji:
wykonywana operacja
MOVC A,@A+PC 1000 0011b A (A+PC)
Zawartość akumulatora A jest rozszerzona znakowo z 1 do 2 bajtów. Różnica między tym, a poprzedni, rozkazem
polega na tym, że po pobraniu kodu instrukcji licznik rozkazów PC zwiększany jest o 1. W ten sposób licznik rozkazów PC
wskazuje na pierwszy bajt następnej instrukcji znajdującej się po wykonywanym rozkazie MOVC A,@A+PC. W podanej
instrukcji pamięć programu adresowana jest za pomocą rejestru bazowego jakim jest licznik rozkazów PC (adresowanie
indeksowo-rejestrowo pośrednie). W dwóch ostatnich rozkazach wskaźnikowy rejestr danych DPTR i bieżąca wartość
licznika rozkazów PC traktowane są jako wskaźniki (adresy początkowe) do tablic umieszczonych w pamięci programu
ROM. Zawartość akumulatora A traktowana jest jako indeks tablicy. Wielkość tych tablic ograniczona jest do 256 bajtów,
ze względu na 8-bitową zawartość akumulatora z pamięci programu kolejnych znaków komunikatów, np.: pomiarowego,
sterowanego urządzenia itp.
25. Jaka jest rola portu szeregowego i jakie rodzaje transmisji on obsługuje?
Zadaniem portu szeregowego jest zapewnienie komunikacji poprzez łącze szeregowe między mikrokontrolerem a urządzeniami
zewnętrznymi. Dane są wysyłane bit po bicie rozpoczynając od najmniej znaczącego bitu. Dane mogą być wysyłane i przyjmowane
synchronicznie lub asynchronicznie.
Przy transmisji synchronicznej przesyłanym danym towarzyszy sygnał synchronizujący, względem którego określa się stany
przesyłanych bitów. Zaletą transmisji synchronicznej jest jej odporność na dewiacje częstotliwości sygnału taktującego, natomiast
wadą - dwie linie przesyłowe: jedna dla danych, a druga dla sygnału taktującego.
Przy transmisji asynchronicznej (UART) przesyłane są tylko dane, a sygnały taktujące są wytwarzane w nadajniku i odbiorniku
niezależnie od siebie. Dlatego dla poprawnego odbierania danych nadajnik i odbiornik muszą być taktowane sygnałem o takiej
samej częstotliwości. Wymaga to generatorów o wysokiej stabilności i uzgodnienia co do prędkości transmisji. Dla ułatwienia
nawiązania łączności prędkości transmisji zostały unormowane. Są one podane w normie opisującej łącze szeregowe RS 232.
Opisany poniżej port szeregowy jest identyczny dla całej rodziny mikrokontrolerów '51. W mikrokontrolerach spoza rodziny '51
transmisja szeregowa może być realizowana zupełnie inaczej.
W rodzinie '51 port szeregowy może pracować w czterech trybach. Tryby pracy różnią się między sobą rodzajem transmisji
(synchroniczna, asynchroniczna), liczbą przesyłanych bitów w jednej ramce i źródłem sygnałów taktujących port szeregowy. Tryb
pracy portu szeregowego, źródło jego taktowania itd. są wybierane poprzez odpowiednie ustawienie znaczników w rejestrze SCON:
Rola znaczników jest następująca:
SM0, SM1- wybór trybu pracy
tryb pracy rodzaj transmisji częstotliwość taktująca
0 0 0 synchroniczna,
8bitów fosc/12
0 1 1 asynchroniczna, 8
bitów zmienna
1 0 2 asynchroniczna, 9
bitów fosc/64 lub fosc/32
1 1 3 asynchroniczna, 9
bitów zmienna
26. Jakie końcówki mikrokontrolera służą do odbioru i nadawania danych, podaj przykłady instrukcji
pozwalających na sterowanie pracą portu szeregowego P3. 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". Procesor posiada dwie dedykowane końcówki,
które wchodzą w skład portu P3 procesora. Są to:
RxD - (P3.0) wejście szeregowe ("Recieve Data")
TxD - (P3.1) wyjście szeregowe ("Transmit Data").
Końcówki te mogą być wykorzystywane jako uniwersalne wejścia-wyjścia procesora, dzięki instrukcjom zapisu do portu
P3, np.:
MOV P3,#dana
lub indywidualnym sterowaniem każdej końcówki
SETB P3.0 {ustawienie "1" na końcówce RxD
CLR P3.1 {ustawienie "0" na końcówce TxD}
27. Do czego służy układ UART w mikrokontrolerze 8051 przedstaw jego krótki opis.? Układ ten służy do asynchronicznej transmisji danych. Posiada dwie końcówki RxD-P3.0 – wej szeregowe oraz TxD- P3.1
– wyj. Szeregowe. Elementem, z którego wysyła się dane jest rejestr SBUF, znajdujący się pod adresem 99h w pamięci
wewnętrznej danych, w obszarze rejestrów specjalnych SFR. Oprócz niego jest jeszcze dodatkowy rejestr SCON sterujący
wszystkimi funkcjami portu takimi jak: tryby pracy, sygnalizowanie stanów transmisji, aktywowanie odbiornika portu
szeregowego. Jest to realizowane przez ustawienie odpowiednich znaczników SCON.0..7. Znaczniki te przesyłane są po
dwukierunkowej linii P3.0 (RxD) i odbierane i nadawane za pomocą rejestru SBUF
28. Jakie funkcje pełnią w 8051 porty- podaj ich krótki opis, przedstaw schemat ideowy portu P0? Porty umożliwiają dołączenie do mikrokontrolera takich urządzeń zewnętrznych jak: klawiatura, pole odczytowe,
przekaźniki. Porty mogą być cyfrowe – do przesyłania danych cyfrowych i logicznych oraz analogowe – np. wejścia
przetwornika A/C. Wszystkich portów jest cztery oznaczone są P0, P1, P2, P3. Są one dwukierunkowe, każdy zawiera
osiem linii, z których każda może pracować jako niezależna linia wejścia lub wyjścia. Każdy z portów zawiera przerzutnik
D, będący elementem rejestru danego portu umieszczonego w obszarze SFR.
29. Jakie rozkazy pozwalają ustawiać stany portów? Stan wyjść linii portów można ustawić rozkazami typu MOV, ale ma to tę niedogodność, że rozkazem tym ustawia się
jednocześnie wszystkie linie danego portu. Wygodniej jest użyć rozkazów logicznych operujących na bajtach lub
pojedynczych bitach.
W rodzinie mikrokontrolerów ’51 są wykonywane następujące operacje logiczne na bajtach:
CPL – negacja logiczna,
CLR – zerowanie bitów,
ANL – iloczyn logiczny,
ORL – suma logiczna,
XRL – różnica symetryczna.
Pierwsze dwie operacje są wykonywane wyłącznie w akumulatorze. Natomiast pozostałe mogą być wykonywane
również poza akumulatorem na wszystkich rejestrach obszaru SFR i komórkach pamięci wewnętrznej RAM.
Na pojedynczych bitach można wykonywać operacje:
CLR – zerowanie bitu,
SETB – ustawianie bitu w stan 1,
CPL – negacja bitu,
ANL – iloczyn logiczny,
ORL – suma logiczna.
30. Budowa i przeznaczenie ALU Jednostka artytmetyczno-logiczna wykonuje podstawowe działania arytmetyczne i logiczne. Należą do nich dodawanie
arytmetyczne (binarne i dziesiętne), odejmowanie, mnożenie, dzielenie, porównywanie, przesunięcie o jeden bit w lewo
lub w prawo, suma i iloczyn logiczny, różnica symetryczna oraz negacja. Wynik operacji wykonywanych w jednostce
arytmetyczno-logicznej może mieć wpływ na kolejność wykonywanych rozkazów, działania programu. Z jednostką
arytmetyczno-logiczną są funkcjonalnie powiązane trzy rejestry o ściśle sprecyzowanym przeznaczeniu: akumulator A,
rejestr statusowy PSW, rejestr B oraz licznik rozkazów PC.
- Akumulator jest umieszczony pod adresem E0h (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 (podobnie jak bajty spod adresów 20h ... 2Fh), dzięki czemu możliwe jest
testowanie 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.
- rejestr B - drugi po akumulatorze ważny rejestr współpracujący z ALU, 8-bitowy,. Służy on do umieszczenia jednego ze
składników mnożenia lub dzielenia, 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.
- Rejestr PSW (ang. "Program Status Word - słowo stanu programu ") - trzeci ważny rejestr związany z ALU. Rejestr ten
wchodzi w skład SFR a jego adres to D0h (208 dziesiętnie). W skład tego rejestru wchodzi osiem bitów nazywanych
znacznikami, z których cztery informują o przebiegu wykonania informacji arytmetyczno-logicznych.
- Licznik rozkazów PC („Program counter”) - służy do adresowania pamięci programu. Szesnasto-bitowy adres
umożliwia zaadresowanie 216=65536 komórek pamięci, tzn. 64 KB. Należy pamiętać, że 1 KB = 210=1024 bajty. Z
zaadresowanej komórki pamięci programu procesor pobiera rozkaz, który złożony jest z jednego, dwóch lub trzech bajtów.
Po pobraniu każdego bajtu rozkazu następuje zwiększenie licznika rozkazów PC o jeden (licznik rozkazów jest
inkrementowany). W ten sposób licznik rozkazów PC wskazuje na adres pierwszego bajtu następnego do wykonania
rozkazu. Przy pobieraniu rozkazów z zewnętrznej pamięci programu jej adres przesyłany jest za pośrednictwem portu P0 i
P2, a bajty rozkazów przesyłane są poprzez port P0. Zawartość licznika rozkazów PC może być zmieniana odpowiednimi
rozkazami, co umożliwia wykonywanie skoków do różnych fragmentów programu.
31. Jakie jest przeznaczenie rejestrów specjalnych SFR i jakie rejestry zalicza się do tej grupy? Służą one do wprowadzenia (np. przez programistę) składników działania . Do rejestrów specjalnych SFR zalicza się:
- Accumulator (A) - adres 0E0h (rw-00h).,
- rejestr B - adres 0F0h (rw-00h) ,
- rejestr PSW - 0D0h (rw-00h). "słowo stanu programu (ang. "Program Status Word").
- Wskaźnikowy rejestr danych DPTR (Data Pointer Register) - adresy: 82h, 83h (rw-00h każdy) służący do adresowania .
- Wskaźnik stosu SP (Stack Pointer) - adres 81h (rw-00h).
32. Co się kryje pod pojęciem „Układy czasowo – licznikowe”? Pod pojęciem tym kryją się dwa 16-bitowe liczniki T0 i T1 oraz dodatkowy licznik T2 który występuje w procesorze
8052. 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 operacje:
- za pomocą T0 (T1lub T2) można zliczać impulsy z zewnętrznego wejścia licznikowego; pin 14 dla T0 i pin 15 dla T1
(tryb licznika)
- 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:
gdzie Fxtal – częstotliwość oscylatora kwarcowego 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 65536 po czym po nadejściu kolejnego impulsu jest zerowany oraz z zależności od potrzeb jest
generowanie odpowiednie przerwanie);
- licznik można w dowolnym momencie uruchomić (zezwolić na zliczanie) lub zatrzymać komendę;
- do licznika można w każdej chwili wpisać dowolną wartość (16-bitowa liczbę), co spowoduje że licznik będzie zliczał
impulsy od tej wartości aż do przepełnienia; wpisu takiego najlepiej jest dokonać 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 (jak i T2 w 8052) może “taktować” zbudowany port szeregowy w specjalnym trybie;
33. Co to jest przerwanie i jak jest realizowana obsługa przerwań w 8051 Przerwanie (interrupt) to sposób pracy procesora polegający na tym, że pod wpływem sygnału zewnętrznego lub
pochodzącego z układu wewnętrznego mikrokontrolera, procesor przerywa wykonanie bieżącego programu i przechodzi
do wykonywania podprogramu związanego z sygnałem przerwania. Podprogram obsługi przerwania jest zakończony
specjalnym rozkazem, który powoduje, że procesor powraca do wykonywania przerwanego programu. Aby móc
kontrolować przerwany program, przed wejściem do podprogramu obsługi przerwania, procesor musi zapamiętać miejsce,
w którym nastąpiło przerwanie. Odbywa się to poprzez zapisanie zawartości licznika rozkazów do buforu pamięciowego
nazywanym stosem.
W zależności od typu procesora czy mikrokontrolera, w momencie przejścia procesora do obsługi przerwania, na stosie
oprócz zawartości licznika rozkazów mogą być składowane automatycznie również zawartości innych rejestrów. Ale w
rodzinie '51 wywołanie przerwania, albo rozkaz CALL wywołujący podprogram, powoduje, że na stosie jest chowana
tylko zawartość licznika rozkazów. Zawartość pozostałych rejestrów, np. rejestru PSW, DPTR itp. lub komórek pamięci
muszą być chowane programowo.
Również w zależności od typu procesora, adres (interrupt vector) od którego rozpoczyna się podprogram obsługi
przerwania jest określany w różny sposób. W jednych procesorach może być stały, umieszczonym pod ściśle określonym
adresem pamięci programu - tak jest w rodzinie '51, w innych może być określany programowo lub przez urządzenie
zewnętrzne.
Lp. znacznik źródło przerwania adres
1
2
3
4
5
IE0
TF0
IE1
TF1
RI+TI
przerwanie zewnętrzne INT0
przerwanie od licznika T0
przerwanie zewnętrzne INT1
przerwanie od licznika T2
przerwanie od nad. i odb. portu szeregowego
0003h
000Bh
0013h
001Bh
0023h
6
7
8
9
10
11
12
TF2+EXF2
IADC
IEX2
IEX3
IEX4
IEX5
IEX6
przerwanie od licznika T2 i wejścia T2EX
przerwanie od przetwornika A/C
przerwanie zewnętrzne INT2
przerwanie zewnętrzne INT3, komparator CRC
przerwanie zewnętrzne INT4, komparator CC1
przerwanie zewnętrzne INT5, komparator CC2
przerwanie zewnętrzne INT6, komparator CC3
002Bh
0043h
004Bh
0053h
005Bh
0063h
006Bh
12
xtalFF
W mikrokontrolerach rodziny '51 adresy podprogramów obsługi przerwań są umieszczone w początkowym obszarze
pamięci programu.
Do wykrywania przerwań zewnętrznych służą linie INT0 i INT1. Mogą one reagować albo na poziom sygnału („0”) albo
na zbocze opadające. Wykrywanie przez procesor zmiany poziomu sygnału na wejściu przerwań zewnętrznych polega na
testowaniu stanu wejścia w każdym cyklu maszynowym. Jeżeli w jednym cyklu maszynowym występuje jeden stan, a w
drugim drugi stan, to jest to traktowane przez układ przerwań jako zmiana poziomu. Dlatego, by układ poprawnie
zareagował na sygnał przerwania, zarówno stan wysoki jak i niski powinny trwać przynajmniej przez jeden cykl
maszynowy.
Przy przerwaniach zewnętrznych reagujących na poziom, przed zakończeniem podprogramu obsługi przerwania, sygnał
wejściowy powinien przejść do poziomu wysokiego lub należy zablokować to przerwanie, gdyż w przeciwnym przypadku
nastąpi ponowne wejście do obsługi tego przerwania.
Stan znaczników wywołujących przerwania jest sprawdzany w fazie S5P2 każdego cyklu maszynowego. W następnym
cyklu maszynowym po wykryciu sygnału przerwania następuje rozpoznanie źródła przerwania oraz ustalenie kolejności
obsługi przerwania, jeśli wystąpiło kilka sygnałów przerwań równocześnie. W dwóch kolejnych cyklach maszynowych jest
zapamiętywana na stosie zawartość licznika rozkazów, do licznika rozkazów jest wpisywany adres przerwania i jest
ewentualnie zerowany znacznik wywołujący przerwanie, jeżeli jest to znacznik zerowany sprzętowo.
Wejście do procedury obsługi przerwania może być opóźnione jeżeli:
jest obsługiwane przerwanie, które nie może być przerwane. W tej sytuacji musi być ono najpierw zakończone, potem jest
wykonywany jeden rozkaz z przerwanego programu i dopiero wtedy może być obsłużone kolejne przerwanie.
nie został zakończony aktualnie wykonywany rozkaz. Najpierw musi być zakończony rozkaz, by procesor przeszedł do
obsługi przerwania.
Z powyższego wynika wniosek, że czas od momentu nadejścia sygnału przerwania do momentu wejścia do procedury
obsługi przerwania może być różny.
Mikrokontroler nie obsługuje sygnału przerwania, który przyszedł gdy przerwanie było zablokowane.
Jeżeli do trzeciego cyklu maszynowego procedury przerwania nadejdzie następny sygnał przerwania o wyższym
poziomie niż aktualny, to zostanie on obsłużony w pierwszej kolejności. Po wejściu do procedury obsługi przerwania
system przerwań zostaje zablokowany dla innych przerwań, chyba że nadejdzie przerwanie o wyższym priorytecie.
Odblokowanie systemu następuje po rozkazie RETI. Rozkaz ten ponadto powoduje przepisanie dwóch bajtów ze szczytu
stosu do rejestru rozkazów PC. Zakończenie podprogramu obsługi przerwania rozkazem RET również odtworzy zawartość
rejestru rozkazów, czyli nastąpi powrót do wykonywania przerwanego programu, ale nie nastąpi odblokowanie systemu
przerwań dla następnych przerwań !
Gdy równocześnie nadejdzie kilka sygnałów przerwań żądających obsługi, to o kolejności ich obsłużenia decyduje
priorytet ustalony arbitralnie przez producenta. Oznacza to, że przerwanie o wyższym priorytecie zostanie obsłużone przed
przerwaniem o niższym priorytecie.
Lp. Źródło przerwania Priorytet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
IE0
IADC
TF0
IEX2
IE1
IEX3
TF1
IEX4
RI+TI
IEX5
TF2+EXF2
IEX6
najwyższy
najniższy
W mikrokontrolerach rodziny '51 wprowadzono mechanizm umożliwiający nadanie wybranym przerwaniom
bezwzględnego pierwszeństwa, tzn. mają one możliwość przerwania wykonywanego podprogramu obsługi innego
przerwania. Przerwaniom można nadać odpowiedni poziom. Jeżeli w trakcie obsługi przerwania nadejdzie sygnał
przerwania o wyższym poziomie, to procesor przerwie wykonywanie przerwania z poziomu niższego, wykona obsługę
wyższego i ponownie przejdzie do wykonywania obsługi przerwania.
Do ustalania poziomów przerwania służą rejestry poziomu przerwań. W zależności od typu mikrokontrolera mogą
występować jeden lub dwa rejestry.
W mikrokontrolerach 8xC51/52 występuje rejestr IP:
X – zarezerwowane
PT2 – licznik (mikrokontroler 8xC52)
PS – port szeregowy
PT1 – licznik T1
PX1 – przerwanie zewnętrzne INT1
PT0 – licznik T0
PX0 – przerwanie zewnętrzne INT0
Należy zwrócić uwagę, że w mikrokontrolerach 8xC51/51 rejestr IP znajduje się pod adresem, pod którym w
mikrokontrolerach 80C515/535 znajduje się rejestr IEN1.
Ustawienie w rejestrze IP w stan 1 znacznika dla wybranego źródła przerwania powoduje, że przerwanie to osiąga
wyższy poziom od przerwań, których znaczniki mają stan 0. W ten sposób wyróżnione przerwanie będzie obsłużone jako
pierwsze, jeśli zgłosi się kilka przerwań, lub spowoduje przerwanie obsługiwanego przerwania i zostanie samo obsłużone.
Jeśli kilka źródeł przerwań zostanie wyróżnionych wyższym poziomem, to, gdy zgłoszą się równocześnie, o kolejności
obsłużenia zadecyduje priorytet, według podanej wyżej tabeli.
34. Co to jest cykl maszynowy mikrokontrolera 8051? Cykl maszynowy jest podstawową jednostką określającą czas wykonywania instrukcji. Dla rodziny mikrokontrolerów '51
składa się on z sześciu stanów, oznaczonych od S1 do S6, z których każdy dzieli się na dwie fazy P1 i P2. Czas trwania
jednej fazy jest równy okresowi oscylatora. Wynika stąd, że czas trwania cyklu maszynowego jest 12 razy dłuższy od
okresu oscylatora.
W każdym stanie cyklu maszynowego są realizowane pewne podstawowe procedury związane z wykonywaniem
rozkazów.
Rozkazy są pobierane z pamięci wewnętrznej lub zewnętrznej mikrokontrolera spod adresu wskazywanego przez licznik
rozkazów (PC).
Rozkazy mogą być jedno lub wielobajtowe, a czas ich wykonywania może trwać jeden lub kilka cykli maszynowych. W
rodzinie '51 występują rozkazy jedno, dwu i trzyj-bajtowe, które są wykonywane w jednym, dwóch lub czterech cyklach
maszynowych.
35. Scharakteryzuj wykonywanie rozkazu jednobajtowego.
Jeżeli rozkaz jest jednobajtowy, to jest on wykonywany w jednym cyklu maszynowym, a bajt następnego rozkazu jest
pobierany w takcie S1 kolejnego cyklu maszynowego.
36. Scharakteryzuj wykonywanie rozkazu dwubajtowego.
Większość rozkazów dwubajtowych jest wykonywana w jednym cyklu maszynowym, z tym że drugi bajt rozkazu jest
pobierany w takcie S4 cyklu maszynowego.
37. Scharakteryzuj wykonywanie rozkazu trzybajtowego.
Rozkazy trójbajtowe są wykonywane w dwóch cyklach maszynowych. W jednym cyklu maszynowym, w taktach S1 i S4, są
pobierane dwa bajty rozkazu, a w takcie S1 drugiego cyklu maszynowego jest pobierany trzeci bajt rozkazu. Bajt nowego
rozkazu jest pobierany w takcie S1 trzeciego cyklu maszynowego.
38. Scharakteryzuj sposób wykonywania rozkazu jednobajtowego w kilku cyklach maszynowych W rodzinie '51 występują również rozkazy jednobajtowe i dwubajtowe, które są wykonywane w dwóch lub czterech cyklach
maszynowych. W czterech cyklach maszynowych są wykonywane tylko rozkazy mnożenia (MUL AB) i dzielenia (DIV AB).
Po pobraniu każdego bajtu rozkazu następuje automatyczne zwiększenie o jeden licznika rozkazów.
Znajomość liczby cykli maszynowych potrzebnych na wykonanie poszczególnych rozkazów jest konieczna w przypadku
generowania przez mikrokontroler odcinków czasów o dużej dokładności. Sygnały o krótkich czasach uzyskuje się najczęściej
przez wykonanie programu wymagającego odpowiedniej liczby cykli maszynowych.