Mikrokontrolery To takie proste, cz 14 (opis układów licznikowych oraz układu przerwań 8051 c d )


Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
Dzisiejszy odcinek klasy mikroprocesorowej
to pierwsze  po okrągłym roku spotkanie
z Wami. Tak moi drodzy, spotykamy się już
tak długo. Jak wynika z listów które otrzymu-
ję od Was, materiał z 12-tu miesięczników,
średnio po 10 stron co daj ponad 100 stron
materiałów, większości z Was wystarczył aby
Mikrokontrolery?
do tej pory pochwalić się pierwszymi prosty-
mi, aczkolwiek funkcjonalnymi programikami
na 8051. Mniej więcej połowa jednak ma na-
dal pewne problemy, bÄ…dz to z pisaniem lis-
tingów, bądz ich kompilacją (roczniacy) lub
nawet z poprawnym uruchomieniem kompu-
terka edukacyjnego który opisałem 9 m-cy te-
mu na łamach EdW. Podejrzewam, że gdy-
byśmy wszyscy spotykali się w jednej sali
To takie proste...
(tak jak w szkole) na zajęciach z programowa-
nia, wszyscy z pewnością byliby zadowoleni.
Musimy zdać sobie jednak sprawę, że nauka
programowania mikrokontrolerów (nie tylko
8051) jest tematem dość złożonym, i wyma-
ga nie tylko cierpliwości, lecz także nieco wy-
siłku w samodzielnym myśleniu i sięganiu po
dodatkowÄ… literaturÄ™ zwiÄ…zanÄ… nie tylko z te-
matem mikroprocesorów, ale i techniką cyf-
rową w szczególności.
Namawiam więc wszystkich, was drodzy
Czytelnicy do korzystania takiego sposobu
nauki, w którym przewodnikiem może być
publikowany w EdW cykl, który opracowuję
co miesiÄ…c specjalnie dla Was.
Część 13
A tak na marginesie mam nadzieję, że 13-ty
odcinek szkoły mikroprocesorowej nie będzie
Układ przerwań i układ czasowo-licznikowy
pechowy, i tym optymistycznym akcentem
zapraszam więc do lektury.
W poprzednim odcinku w praktyczny sposób omówiłem port szere- z UART u, procesor automatycznie przerywa wykonywanie programu
gowy mikrokomputera 8051 oraz sposoby transmisji danych poparte i wykonuje skok do tzw.  procedury (podprogramu) obsługi przerwania
prostymi listingami. z portu szeregowego . Po wykonaniu tej procedury  napisanej oczy-
Dzisiaj przypomnimy sobie wiadomości na temat omawianych
wiście przez programistę i kończącej się instrukcją
wcześniej układów czasowo-licznikowych oraz układu przerwań proce-
RETI
R
E
T
I
sora. Teraz kiedy zapoznaliście się z językiem procesora, będzie mi łat-
program powraca do kolejnej instrukcji pętli głównej która następuje po
wiej pokazać w praktycznych przykładach sposób obsługi przerwań
tej przy której nastąpiło przerwanie.
i liczników mikrokontrolera.
A co się dzieje w podprogramie obsługi przerwania? Co nam przyj-
dzie do głowy, czyli przede wszystkim przepisanie danej z rejestru
Układ przerwań
SBUF do innego rejestru, z obszary wewnętrznej pamięci danych pro-
W jednym z pierwszych odcinków szkoły mikroprocesorowej, przy
cesora, aby nie stracić cennego znaku, kiedy przyjdzie następny (i SBUF
okazji omawiania końcówek mikroprocesora, podałem przykład  po-
zostanie ponownie zmieniony).
równanie systemu przerwań mikroprocesora do sytuacji z życia co-
To tylko ilustracja wykorzystania systemu przerwań do wspomożenia
dziennego. Wspominałem że sama nazwa  przerwanie doskonale od-
pracy programu mikroprocesora.
zwierciedla sposób i znaczenie tego układu dla pracy całego mikropro-
Przejdzmy jednak od szczegółowego omówienia zródeł wszystkich
cesora. Jeżeli nie pamiętasz, z czym się  je temat układu przerwań, ra-
przerwań w mikrokontrolerze 8051 i sposobów ich wykorzystania w na-
dzę przypomnieć sobie ten artykuł. Przejdzmy zatem do konkretów.
szych programach.
W układzie mikrokontrolera 8051 istnieje kilka zródeł przerwań.
Układ przerwań procesora może przyjmować zgłoszenia następują-
 yródeł , czyli dosłownie mówiąc podukładów mikroprocesora, które
cych przerwań:
mogą generować przerwania. I tak np. wezmy omawiany w poprzed-
 zewnętrzne: z wejść /INT0 i /INT1 (piny P3.2  12, P3.3  13) (2 prze-
nim odcinku port szeregowy. Opisywałem, jak w prosty sposób można
rwania)
np. odebrać znak z portu szeregowego. Pamiętasz, że podałem dwa
 z portu szeregowego (jedno przerwanie)
przykłady. Pierwszy  mniej doskonały polegał na ciągłym sprawdzaniu
 z układu licznikowego: przepełnienie licznika T0, lub T1 oraz w przy-
flagi RI  odbioru znaku, i jeżeli stwierdzaliśmy, że flaga ta została przez
padku procesora 80C52  z układu licznikowego T2 (dwa przerwania
procesor ustawiona, to znaczy że odebrano znak, który znajduje się
dla 8051)
w rejestrze SBUF i jest gotowy do odczytania. Wadą tego sposobu był
Zanim przejdziemy do omówienia każdego ze zródeł przerwań powin-
fakt niekończącego oczekiwania na nadejście bajtu danych z urządzenia
niśmy sobie uzmysłowić fakt istnienia tzw. znaczników każdego z prze-
zewnętrznego dołączonego do portu szeregowego. Procesor po prostu
rwań. Znacznik fizycznie jest pojedynczym bitem zawartym w kilku re-
nie robił nic innego jak tylko czekał na przyjęcie znaku z portu.
jestrach SFR procesora. W przypadku poczÄ…tkowym znacznik danego
Drugi sposób wprowadzał tzw. błąd przeterminowania, kiedy to np.
przerwania jest wyzerowany  do bitu wpisane jest zero. W przypadku
przy braku nadejścia znaku z portu szeregowego, procesor po określo-
ustawienia znacznika przerwania (wpisania do niego jedynki) następuje
nym w programie przez nas) czasie przerywał wykonywanie procedury
zgłoszenie przerwania. Wyzerowania znacznika to anulowanie zgłosze-
czekania na znak z UART-a, i powracał do programu głównego sygnali-
nia. Każde z wymienionych przerwań posiada własny znacznik zgłosze-
zując błąd przeterminowania.
nia przerwania. Znaczniki przerwań są ustawiane automatycznie przez
A gdyby tak w pewnych przypadkach dało się uniezależnić odbiór
procesor w momencie wystąpienia warunku nadejścia przerwania, i tak
znaków portu szeregowego (szczególnie wtedy gdy nadchodzą one
w nieokreślonych przedziałach czasowych) od wykonywania pętli głów- dla poszczególnych zródeł będą to:
 /INT0, /INT1 : opadające zbocze sygnału na tym wejściu (lub poziom
nej programu?
niski)
Otóż tu z pomocą może przyjść system przerwań mikrokontrolera.
Ano wyobrazmy sobie sytuację, kiedy program główny wykonuje pew-  zakończenie odbioru lub nadawania znaku przez UART
ne określone przez nas czynności, natomiast port szeregowy jest usta-  przepełnienie licznika T0 lub T1 (zmiana zawartości z 0FFFF na
wiony w taki sposób, że w momencie kiedy zostaje odebrany znak 0000h)
ELEKTRONIKA DLA WSZYSTKICH 5/98 37
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
Ponieważ jednocześnie w programie może pracować kilka układów I tak ze względu na to że mamy w procesorze 8051 pięć (w 8052
generujących przerwania, a same przerwania czasem nie są nam po- sześć) zródeł przerwań, każde z nich posiada odpowiedni priorytet, i tak
trzebne, istnieje specjalny rejestr w obszarze SFR o nazwie IE (ang. w kolejności od najmniejszego priorytetu do największego jest:
 Interrupt Enable  zezwolenie na przerwanie), dzięki któremu może- ET2, ES, ET1, EX1, ET0, EX0, czyli
my uaktywniać lub blokować generowanie wybranych przerwań. Po- najmniej uprzywilejowanym jest przerwanie od licznika T2 (w 8052), da-
lej w kolejności (jak w rejestrze IE) większy priorytet ma przerwanie
szczególne bity tego rejestru odpowiadają za generowanie przerwania
z portu szeregowego UART, dalej od licznika T1, z wejścia INT1, wresz-
od określonego podbloku mikrokontrolera, a dodatkowo najstarszy bit
tego rejestru pozwala na bezwarunkowe wyłączenie systemu prze- cie od licznika T0, a najbardziej uprzywilejowanym jest przerwanie z we-
jścia /INT0.
rwań. Bity te często nazywa się maskującymi, co w praktyce oznacza,
że wpisanie do niego jedynki powoduje uaktywnienie danej funkcji bi- Ktoś zapyta, a co się stanie, jeżeli nadchodzi przerwanie np. z wejścia
INT1 i rozpoczęte zostaje wykonywanie procedury obsługi przerwania
tu, wyzerowanie zaÅ›  to zablokowanie.
Oto rejestr IE (adres w SFR A8h) i znaczenie jego poszczególnych bi- dla tego wejścia, a w czasie jej trwania nadchodzi przerwanie o wy-
ższym priorytecie np. z wejścia INT0?. A no wtedy procedura obsługi
tów:
przerwania z INT1 zostaje natychmiast przerwana i procesor skacze do
procedury obsługi przerwania z wejścia INT0. Kiedy ją skończy, powra-
ca (skacze) do miejsca skąd nastąpił skok gdy nadeszło przerwanie
o wyższym priorytecie i program toczy się dalej, prawda że logiczne roz-
wiązanie. Jak nad tym wszystkim zapanować tak, aby program nie
 poszedł w maliny , opowiem za chwilę.
EA (bit IE.7, adres: AFh)  bit aktywacyjny systemu przerwań (=0
E
A
(
b
i
t
I
E
.
7
,
a
d
r
e
s
:
A
F
h
)
 ...No dobrze, już wiem, o co chodzi z tym priorytetem przerwań, ale
wszystkie przerwania sÄ… zablokowane, =1 odblokowane sÄ… te przerwa-
przecież może zajść przypadek, kiedy mam taki układ elektroniczny,
nia, których bit jest ustawiony)
w którym zastosowany procesor musi wykorzystywać przerwania z nie-
bit IE.6 o adresie AEh jest nie wykorzystany
b
i
t
I
E
.
6
co inną kolejnością priorytetów, i co wtedy? Czy jestem skazany na
ET2 (bit IE.5, adres: ADh)  tylko w 80C52 (8052) bit maskujÄ…cy prze-
E
T
2
(
b
i
t
I
E
.
5
,
a
d
r
e
s
:
A
D
h
)
ustaloną kolejność priorytetów przerwań? Odpowiedz brzmi nie. Otóż
rwanie z licznika T2
istnieje dodatkowy specjalny rejestr tzw. priorytetów przerwań o na-
ES (bit IE.4, adres: ACh)  bit maskujÄ…cy przerwanie z portu szeregowego
E
S
(
b
i
t
I
E
.
4
,
a
d
r
e
s
:
A
C
h
)
zwie IP (ang.  Interrupt Priority  priorytet przerwania). Znajduje siÄ™ on
ET1 (bit IE.3, adres: ABh)  bit maskujÄ…cy przerwanie z licznika T1
E
T
1
(
b
i
t
I
E
.
3
,
a
d
r
e
s
:
A
B
h
)
pod adresem B8h jak się zapewne domyślasz w obszarze SFR proce-
EX1 (bit IE.2, adres: AAh)  bit maskujący przerwanie z wejścia /INT1
E
X
1
(
b
i
t
I
E
.
2
,
a
d
r
e
s
:
A
A
h
)
sora. Dzięki niemu można zmieniać priorytety poszczególnych prze-
ET0 (bit IE.1, adres: A9h)  bit maskujÄ…cy przerwanie z licznika T0
E
T
0
(
b
i
t
I
E
.
1
,
a
d
r
e
s
:
A
9
h
)
rwań wymienionych wcześniej, powodując że dane przerwanie mające
EX0 (bit IE.0, adres: A8h)  bit maskujący przerwanie z wejścia /INT0
E
X
0
(
b
i
t
I
E
.
0
,
a
d
r
e
s
:
A
8
h
)
dotąd niższy priorytet może uzyskać wyższy, dzięki odpowiedniemu
ustawieniu bitów w rejestrze priorytetu IP. Oto szczegółowe znaczenie
Czyli jeżeli np. chcemy uaktywnić przerwanie z wejścia zewnętrzne-
poszczególnych bitów tego rejestru:
go INT1, należy wykonać instrukcje:
SETB EX1 ;uaktywnienie przerwania z INT1
SETB EA ;globalne odblokowanie przerwań
W przypadku chęci uaktywnienia kilku przerwań np. z licznika T0
i układu transmisji szeregowej UART, można wykonać następujące ope-
racje:
bity IP.7 i IP.6  nie wykorzystane
b
i
t
y
I
P
.
7
i
I
P
.
6
SETB ET0 ;uaktywnienie przerwania od T0
PT2 (bit IP.5, adres: BDh)  bit priorytetu przerwania z licznika T2 (tylko
P
T
2
(
b
i
t
I
P
.
5
,
a
d
r
e
s
:
B
D
h
)
SETB ES ; uaktywnienie przerwania od UART a
w 80C52,8052
SETB EA ;globalne odblokowanie przerwań
PS (bit IP.4, adres: BCh)  bit priorytetu przerwania z portu szeregowego.
P
S
(
b
i
t
I
P
.
4
,
a
d
r
e
s
:
B
C
h
)
Ponieważ wszystkie bity maskujące przerwania znajdują się w jed-
PT1 (bit IP.3, adres BBh)  bit priorytetu przerwania z licznika T1
P
T
1
(
b
i
t
I
P
.
3
,
a
d
r
e
s
B
B
h
)
nym rejestrze, można w/w instrukcje zapisać jako jedną:
PX1 (bit IP.2, adres BAh)  bit priorytetu przerwania z wejścia /INT1
P
X
1
(
b
i
t
I
P
.
2
,
a
d
r
e
s
B
A
h
)
MOV IE, #10010010b
PT1 (bit IP.3, adres BBh)  bit priorytetu przerwania z licznika T1
P
T
1
(
b
i
t
I
P
.
3
,
a
d
r
e
s
B
B
h
)
prawda, że proste. W praktyce jeżeli chcemy np. na jakiś czas wyłączyć
PX1 (bit IP.2, adres BAh)  bit priorytetu przerwania z wejścia /INT1
P
X
1
(
b
i
t
I
P
.
2
,
a
d
r
e
s
B
A
h
)
jakieś przerwanie np. od licznika T0 wystarczy wykonać instrukcję:
PT0 (bit IP.1, adres B9h)  bit priorytetu przerwania z licznika T0
P
T
0
(
b
i
t
I
P
.
1
,
a
d
r
e
s
B
9
h
)
CLR ET0 ;zablokowanie przerwania od T0
PX0 (bit IP.0, adres B8h)  bit priorytetu przerwania z wejścia /INT0
P
X
0
(
b
i
t
I
P
.
0
,
a
d
r
e
s
B
8
h
)
Jeżeli zaś zachodzi potrzeba zablokowania całego systemu przerwań
można tego dokonać wyzerowując bit EA za pomocą instrukcji :
I tak ustawienie jednego z bitów powoduje ustawienie danego prze-
CLR EA
rwania na wyższym poziomie i odwrotnie, wyzerowanie danego bitu
lub
powoduje ustawienie niższego priorytetu danego przerwania. W przy-
ANL IE, #7Fh ;7Fh = 01111111b
padku kiedy ustawimy wyższy priorytet kilku przerwań na raz, o kolej-
Ten pierwszy sposób, kiedy operujemy na bitach jest bardziej czytel-
ności wykonywania poszczególnych procedur obsługi przerwań decy-
ny, dlatego polecam go w praktyce.
duje ustalona wcześniej kolejność dla przypadku kiedy wszystkie bitu
Ważną informacją jest fakt, że po resecie procesora rejestr IE jest wy-
rejestru IP są równe 0. Warto zatem powiedzieć sobie, że podprogram
zerowany, co oznacza że wszystkie przerwania są zablokowane (EA=0)
(procedura) obsługi przerwania z umieszczonego na najwyższym pozio-
oraz dodatkowo maski wszystkich przerwań są także zablokowane (IE.5
mie jest nieprzerywalna. W przypadku np. kiedy IP=0, będzie to prze-
 IE.0 = 0).
rwanie z wejścia /INT0.
Ze względu na fakt że przerwania nie są przeważnie generowane roz-
Po resecie procesora podobnie jak w przypadku rejestru IE, wszyst-
myślnie poprzez instrukcje programisty (a jak?... to proste przecież po-
kie bity rejestru IP sÄ… wyzerowane (IP=0).
przez ustawienie jednego ze znaczników przerwań  o tym za chwilę)
 ...No dobrze ale co fizycznie zachodzi, kiedy nadchodzi przerwanie,
ale przez podbloki wykonawcze procesora, zatem może się zdarzyć sy-
i o co chodzi z tą procedura obsługi przerwania? Oto wyjaśnienie.
tuacja, kiedy to w jednej chwili nadejdą dwa lub więcej przerwania  np.
Otóż kiedy zajdzie warunek przerwania (kiedy znacznik danego prze-
w tej samej chwili na wejściu INT1 pojawi się stan niski (generując prze-
rwania zostaje ustawiony), np. kiedy nadejdzie zbocze opadajÄ…ce na
rwanie od /INT1) oraz przepełni się licznik T0 (generując przerwanie od
wejściu /INT1, przy ustawionym bicie EX1 oraz uaktywnionym syste-
T0), i co wtedy, czy nie nastąpi zatem jakiś konflikt? Otóż nie. Okazuje
mie przerwań (EA=1) procesor wykona następujące operacje
się bowiem, że projektanci mikrokontrolerów 8051 i pochodnych po-
 po pierwsze: sprawdzi czy nie jest wykonywana akurat procedura
myśleli o takiej sytuacji i ustalili, że każde przerwanie procesor posiada
obsługi przerwania o wyższym priorytecie lub czy jednocześnie nie
p
r
i
o
r
y
t
e
t
odpowiedni priorytet. To bardzo ważne słowo i dlatego warto je dobrze
nadeszło przerwanie o wyższym priorytecie z innego zródła
zapamiętać.
 po drugie (jeżeli nie zdarzy się warunek z pierwszego): wyzeruje
Priorytet danego przerwania nad innym, w praktyce to znaczy, że
znacznik zgłoszenia przyjętego przerwania. I tu wyjątek, nie są bo-
w przypadku kiedy zajdzie przypadek jak przedstawiony powyżej, kiedy
wiem automatycznie zerowane znaczniki przerwań: z portu szerego-
w jednej chwili zachodzą dwa różne przerwania, to w pierwszej kolej- wego TI  przy wysłaniu znaku, RI  przy nadejściu znaku, oraz z licz-
ności zostanie przyjęte przerwanie o wyższym priorytecie i wykonana
nika T2 w przypadku procesora 8052/C52.
zostanie stosowna dla niego procedura obsługi przerwania (czyli nic in-  po trzecie: procesor zapisze na stosie zawartość 16-bitowego liczni-
nego jak kawałek napisanego przez ciebie programu zakończony in- ka rozkazów PC
strukcją RETI). Przerwanie drugie  o niższym priorytecie będzie jak  i po czwarte : procesor automatycznie wpisze do licznika rozka-
gdyby  czekać na swoją kolej , a kiedy ta przyjdzie, zostanie ono przy- zów PC ustalony fabrycznie adres początku programu (procedury)
jęte i wykonana zostanie procedura obsługi tegoż drugiego przerwania obsługi danego przerwania, oto te adresy dla poszczególnych
(także zakończona instrukcją RETI). przerwań:
38 ELEKTRONIKA DLA WSZYSTKICH 5/98
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
0003h  dla przerwania z wejścia /INT0 z przerwań do miejsc w programie gdzie rozpoczynają się właściwe
000Bh  dla przerwania z licznika T0 procedury ich obsługi.
0013h  dla przerwania z wejścia /INT1 W praktyce w zależności od rozmiarów kodu programu można użyć
001Bh  dla przerwania z licznika T1 także instrukcji AJMP ale tylko kiedy wszystkie podprogramy znajdują
0023h  dla przerwania z portu szeregowego siÄ™ w pierwszych 2 kilobajtach kodu programu (czyli o adresach:
0000h....07FFh). Można także umieszczać podprogramy obsługi prze-
oraz dodatkowo w procesorach 8052/C52
rwań w różnych miejscach pamięci programu w stosunku do pętli głów-
002Bh  dla przerwania z licznika T2
nej np. przed nią (w naszym przykładzie przed etykieta START). Czasa-
mi, w przypadku kiedy rozmiar dostępnej pamięci programu jest dość
Jak zauważyliście, przytoczone adresy są ustalone fabrycznie a odda-
krytyczny  (brakuje nam pamięci) aby nie marnować drogocennych baj-
lone od siebie dokładnie o 4 bajty. Dlaczego akurat o cztery, zaraz się
tów, można także zrezygnować ze skoku typu LJMP, i rozpocząć proce-
okaże. W każdym razie zanim to wyjaśnię, spróbuję oswoić Was przy
durę obsługi przerwania od adresu z tabeli wektorów przerwań. Oczy-
tej okazji z określeniem takiej struktury adresów, które obowiązuje nie
wiście dotyczy to przypadku, kiedy wspomniane przerwanie albo jest
tylko w nazewnictwie związanym z 8051, ale wszystkimi układami mik-
jedyne w uaktywnionych w systemie, albo jest na ostatnim miejscu
t
a
b
l
i
c
y
w
e
k
t
o
r
ó
w
p
r
z
e
r
w
a
Å„
roprocesorowymi, a mianowicie nazwą: tablicy wektorów przerwań.
w tabeli wektorów przerwań. W przypadku naszego przykładu listing
Tablicy  bo poszczególne adresy oddalone dodatkowo równo od sie-
T
a
b
l
i
c
y
mógłby wyglądać następująco:
bie (o 4 bajty) mogą kojarzyć się z tablicą
Wektorów  bo ze względu na tylko 4 bajty przeznaczone na podpro-
W
e
k
t
o
r
ó
w
;poczÄ…tek programu
gram, fizycznie nie zapiszemy w tym miejscu podprogramu, a jedynie
ORG 0000h ;poczÄ…tek wykonywania programu
wpiszemy wskaznik (wektor) pokazujÄ…cy gdzie w programie (pod jakim
LJMP START ;skocz do etykiety poczÄ…tku programu
adresem) znajduje się właściwa procedura obsługi danego przerwania.
;głównego
Przerwań  bo oczywiście cały zwrot dotyczy przerwań.
P
r
z
e
r
w
a
Å„
;tablica wektorów przerwań
 ...Co oznaczają te adresy, i jak je wykorzystać? Otóż jak zapewne
ORG 0003h ;pod adresem 0003h umieszczam
pamiętacie po resecie procesora licznik rozkazów jest wyzerowany, co
LJMP intEX0 ;wektor  czyli instrukcjÄ™ skoku do
oznacza że procesor rozpoczyna wykonywanie programu od adresu
;procedury intEX0
0000h.
ORG 001Bh ;a tu zaczyna się procedura obsługi
Z drugiej strony zauważcie, że pomiędzy adresem 0000h a adresami
;przer. od T1
procedur obsługi przerwań znajdują się zawsze 4 bajty na... program,
intT1:
czy to aby nie za mało? Otóż nie!
........... ;instrukcje dotyczÄ…ce
Istnieje przecież w liście rozkazów mikrokontrolera 8051 instrukcja
........... ;procedury w przypadku
skoku bezwzględnego pod wskazany adres. Jest to LJMP, czasem
........... ;nadejścia przerwania z T1
AJMP (SJMP)
reti
Aby zbytnio nie namieszać Wam w głowach posłużę się przykładem.
;właściwy początek pętli głównej programu
Załóżmy że chcemy napisać program, w którym wykorzystamy dwa
START:
zródła przerwań: pierwsze z wejścia /INT0 drugie z licznika T1.
.................. ;instrukcje inicjujÄ…ce (poczÄ…tkowe)
Generalnie zatem program będzie składał się z:
SETB EX0 ;uaktywnienie przerwania z /INT0
 instrukcji pętli głównej programu
SETB ET1 ;uaktywnienie przerwania z T1
 oraz dwóch procedur (podprogramów) obsługi przerwań: pierwsza
SETB EA ;globalne odblokowanie przerwań
dla wejścia /INT0, druga dla licznika T1. Podprogramy z reguły są cią-
........... ;inne instrukcje pętli głównej
giem minimum kilku instrukcji, które przecież nie zmieszczą się
...........
w 4 bajtach! Użyjemy więc wektorów  przekierowujących program
...........
z tablicy wektorów przerwań do właściwego miejsca w programie
;tu początek podprogramu obsługi przerwania z /INT0
gdzie znajduje się właściwy dla danego przerwania podprogram.
intEX0:
........... ;instrukcje dotyczÄ…ce
Przykładowy listing takiego programu mógłby wyglądać następująco:
........... ;procedury w przypadku
;poczÄ…tek programu
........... ;nadejścia przerwania z /INT0
ORG 0000h ;poczÄ…tek wykonywania programu
reti
LJMP START ;skocz do etykiety poczÄ…tku programu
END ;koniec programu
;głównego
;tablica wektorów przerwań
Oczywiście w zasadzie etykieta intT1 jest w tym przypadku zbędna,
ORG 0003h ;pod adresem 0003h umieszczam
informuje jedynie o tym że w tym miejscu zaczyna się procedura obsłu-
LJMP intEX0 ;wektor  czyli instrukcjÄ™ skoku do
gi przerwania od licznika T1.
;procedury intEX0
Można by oczywiście przerzucić procedurę intEX0 w miejsce pomię-
ORG 001Bh ;a pod adresem 001Bh umieszczam
dzy instrukcję kończąca procedurę intT1 a etykietę START, w praktyce
LJMP intT1 ;wektor do procedury obsługi
najczęściej nie ma to żadnego znaczenia.
;przerwania od T1
Program obsługi przerwania musi być zakończony instrukcją RETI. Do
;właściwy początek pętli głównej programu
tej instrukcji nie zostanie przyjęte zgłoszenie żadnego przerwania z po-
START:
ziomu równego (tego samego) lub niższego. Wreszcie kiedy procesor
.................. ;instrukcje inicjujÄ…ce (poczÄ…tkowe)
wykona instrukcję kończącą podprogram przerwania (RETI) odtwarzany
SETB EX0 ;uaktywnienie przerwania z /INT0
jest ze stosu adres powrotu sprzed wywołania i wpisany do licznika roz-
SETB ET1 ;uaktywnienie przerwania z T1
kazów PC procesora, po czym program główny toczy się dalej.
SETB EA ;globalne odblokowanie przerwań
........... ;inne instrukcje pętli głównej
Jeżeli chodzi o znaczniki zgłoszenia przerwań to można je  wyłowić
...........
z wkładki z EdW nr 11/97, gdzie znajduje się skrócony opis wszystkich
...........
rejestrów SFR procesora. Oto one:
;tu początek podprogramu obsługi przerwania z /INT0
intEX0: a) z wejścia /INT0: bit IT0 (adres: 88h) w rejestrze TCON (88h)
........... ;instrukcje dotyczące b) z wejścia /INT1: bit IT1 (adres: 8Ah) w rejestrze TCON (88h)
........... ;procedury w przypadku c) z licznika T0: bit TF0 (adres: 8Dh) w rejestrze TCON (88h)
........... ;nadejścia przerwania z /INT0 d) z licznika T1: bit TF1 (adres: 8Fh) w rejestrze TCON (88h)
reti e) z portu szeregowego: bit TI w przypadku nadania znaku (adres: 99h)
intT1: oraz bit RI w przypadku odbioru znaku z portu (adres: 98h) z rejestru
........... ;instrukcje dotyczÄ…ce SCON (98h)
........... ;procedury w przypadku f) z licznika T2: bit TF2 (adres: CFh)  dla przepełnienia licznika T2 oraz
........... ;nadejścia przerwania z T1 bit EXF2 (adres: CEh)  przy wykryciu opadającego zbocza sygnału
reti na tym wejściu (P1.1 w 8052/C52), oba znaczniki z rejestru sterują-
cego praca licznika T2  T2CON (C8h).
END ;koniec programu Ponieważ sprawą układu czasowo-licznikowego zajmę się w drugiej
części artykułu, pozostaje mi do omówienia kilka dodatkowych informa-
Tak więc jak widać z przytoczonego listingu w tablicy wektorów prze- cji dotyczących obsługi i generowania przerwań zewnętrznych z wejść
rwań umieszczone zostały jedynie skoki bezwzględne dla każdego /INT0 i /INT1.
ELEKTRONIKA DLA WSZYSTKICH 5/98 39
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
I tak na wstępie ważna informacja: przerwania te mogą być zgłasza- Wyobrazmy sobie sytuację, kiedy to procesor spokojnie i  sielan-
ne opadającym zboczem sygnału na tym wejściu (zmiana z poziomu lo- kowo wykonuje napisany przez ciebie program główny i np. w tej
gicznego H na L) lub poziomem niskim sygnału. Wybór należy do pro- chwili próbuje dodać dwie liczby znajdujące się w rejestrach A i B, po
gramisty i może być zmieniany za pomocą odpowiedniego rejestru, ale czym będzie chciał wypisać je na wyświetlaczu naszego komputerka
o tym za chwilÄ™. edukacyjnego korzystajÄ…c ze standardowej procedury A2HEX (dla
W praktyce różnica pomiędzy tymi dwoma typami zgłaszania prze- uproszczenia przyjmujemy wypisanie wyniku bez najstarszego bitu wy-
rwań polega na tym, że: niku umieszczonego w C).
 w przypadku zgłoszenia przerwania opadającym zboczem: procedu- Aby to wykonać zapewne posłuży się instrukcjami:
ra zostanie wywołana tylko jeden raz, nawet jeżeli pierwsze jej wy- MOV A, #składnik1 ;załadowanie składnika (1)
wołanie zostanie zakończone (instrukcja RETI) a stan na wejściu ADD A, #składnik2 ;i dodanie składnika 2 (2)
/INTx po jej zakończeniu nadal jest niski. MOV B, #1 ;na 1-szej pozycji (3)
 w przypadku zgłoszenia przerwania poziomem niskim: poziom na LCALL A2HEX ;wypisz zawartość Acc (4)
wejściu /INTx powinien zmienić się znowu na wysoki przed zakoń- ......... ;i rób cos dalej (5)
czeniem procedury obsługi przerwania (przed instrukcją RETI) W nawiasach podano numery linii.
w przeciwnym przypadku procedura obsługi zostanie wywołana po- Popatrzmy, niech no wykonane zostaną instrukcje z linii (1) i (2) oraz
nownie. (3), w tym momencie, przed wykonaniem linii (4), kiedy wypisany zosta-
A oto wspomniany rejestr kontrolujący przerwania zewnętrzne: je wynik, następuje zgłoszenie jakiegoś przerwania (obojętne jakiego)
TCON (adres: 88h). Starsze 4 bity z tego rejestru obsługują układy cza- o program automatycznie skacze do odpowiedniego wskaznika z tabli-
cy wektorów przerwań, a z tamtą prawdopodobnie w inne miejscy pro-
sowo licznikowe, toteż omówieniem ich zajmę się za chwilę.
gramu, gdzie znajduje się właściwa dla danego zdarzenia procedura ob-
sługi przerwania.
Dla przykładu powiedzmy, że procedura ta wykonuje pewne oblicze-
nia i operacje na rejestrach, w tym m.in. na akumulatorze, np.
intT2:
Bity dotyczące wejść /INT0 i /INT1 procesora:
MOV A, LICZNIK
IE1 (bit TCON.3, adres: 8Bh)  znacznik zgłoszenia przerwania na wejs-
I
E
1
(
b
i
t
T
C
O
N
.
3
,
a
d
r
e
s
:
8
B
h
)
ADD A, #1
ciu /INT1. Jest ustawiany sprzętowo po wykryciu zgłoszenia. Zerowany
DA A
automatycznie przy przyjęciu przerwania (przy wejściu do procedury ob-
MOV LICZNIK, A
sługi)
RETI
IT1 (bit TCON.2, adres: 8Ah)  bit sterujący sposobem zgłoszenia prze-
I
T
1
(
b
i
t
T
C
O
N
.
2
,
a
d
r
e
s
:
8
A
h
)
rwania na wejściu /INT1: opadającym zboczem (IT1=1) lub poziomem
No dobrze, po zgłoszeniu przerwania i wykonaniu instrukcji zawar-
niskim (IT1=0) sygnału zewnętrznego
tych w procedurze procesor po wykonaniu instrukcji RETI powróci do
IE0 (bit TCON.1, adres: 89h)  znacznik zgłoszenia przerwania na wejs-
I
E
0
(
b
i
t
T
C
O
N
.
1
,
a
d
r
e
s
:
8
9
h
)
linii (4) programu głównego i.... no właśnie, wypisana zostanie nie war-
ciu /INT0. Jest ustawiany sprzętowo po wykryciu zgłoszenia. Zerowany
tość sumy dwóch składników, ale zawartość jakiegoś rejestru LICZNIK
automatycznie przy przyjęciu przerwania (przy wejściu do procedury ob-
(zdefiniowanego gdzieś wcześniej w programie przez programistę).
sługi)
W efekcie wyświetlacz pokaże bzdury, a my nie będziemy wiedzieli co
IT0 (bit TCON.0, adres: 88h)  bit sterujący sposobem zgłoszenia prze-
I
T
0
(
b
i
t
T
C
O
N
.
0
,
a
d
r
e
s
:
8
8
h
)
się stało.
rwania na wejściu /INT0: opadającym zboczem (IT0=1) lub poziomem
Takich sytuacji może być bardzo wiele. Jak zatem w prosty sposób
niskim (IT0=0) sygnału zewnętrznego
można się zabezpieczyć przed skutkami modyfikacji rejestrów podczas
wykonywania pojawiających się często  nie stąd ni z owąd procedur
Analizując sposób zgłaszania przerwań zewnętrznych nie sposób nie
obsługujących przerwania? Metoda jest bardzo prosta i polega na zapa-
powiedzieć w jaki sposób fizycznie procesor rejestruje zajście zgłosze- miętywaniu wartości używanych w danej procedurze rejestrów na po-
nia przerwania. Czy np. wejścia /INTx mają na wejściu jakieś przerzut- czątku tej procedury, po czym przed końcem procedury obsługi prze-
niki? Otóż nie. Procesor w pewnych okresach każdego cyklu maszyno- rwania  odtworzenie ich pierwotnej zawartości i wykonaniu standardo-
wego próbkuje stan wejść /INTx, i jeżeli w dwóch kolejnych cyklach
wej już instrukcji powrotu z przerwania RETI.
stwierdzi zmianę stanu z 1 na 0 oznaczało to będzie że nastąpił waru- Najprostszym i zdecydowanie polecanym, a praktycznie jedynym
nek zgłoszenia przerwania. Dokładne zależności czasowe pomiędzy fi- sensownym sposobem zapamiętywania i odtwarzania rejestrów jest
zyczną zmianą poziomu na wejściu przerywającym /INTx a zgłoszeniem
korzystanie ze stosu.
przerwania można znalezć w katalogach procesorów 8051 różnych pro- Oto poprzedni przykład zmodyfikowany w sposób zabezpieczający
ducentów (Philips, Atmel, itp.)
zawartość akumulatora przed przypadkową utrata bieżącej  wartości ,
Ponieważ w praktyce rzadko zachodzi potrzeba takiej analizy, nadmie- intT2:
nię, żeby wobec braku sprzętowych  przerzutników rejestrujących
PUSH Acc ;zapamiętanie akumulatora
opadające zbocza na wejściach /INTx, każdy z sygnałów przerywających
MOV A, LICZNIK
(generowanych na końcówkach /INTx) trwał co najmniej przez 12 tak- ADD A, #1
tów zegarowych procesora.
DA A
W praktyce oznacza to, że np. w przypadku procesora pracującego
MOV LICZNIK, A
z kwarcem 12MHz najkrótsza jedynka i zero generowana na tym we- POP Acc ;odtworzenie akumulatora
jściu (przez układ zewnętrzny) wystarczająca jednakże do wywołania
RETI
przerwania w programie procesora, powinna trwać nie mniej niż 1 us
(mikrosekundę  każdy poziom)
Jak widać stos w tym przypadku oddał nam niesamowitą przysługę,
W sumie wyszło nam, że można już łapać ujemne impulsy o czasie
bowiem za pomocą jednej instrukcji odłożenia na stos a następnie zdję-
trwania 1 us (poziom niski).
cia nie zakłóciliśmy toku wykonywania części głównej programu  aku-
Z pewnością niektórzy z czytelników odwrócą sytuację i stwierdzą, że
mulator pozostał ten sam, a wynik na wyświetlaczu będzie z pewnoś-
przerwanie /INTx można teoretycznie generować przy takim kwarcu cią poprawny.
prawie 500 000 razy na sekundę (500kHz), tylko po co? Ktoś może w tym miejscu powiedzieć, że przecież można by podzie-
Zresztą gdyby ktoś np. uaktywnił przerwanie np. /INT0 i do tego we- lić używane rejestry (w końcu w procesorze jest ich dużo...) na dwie
jścia /INT0 dołączyć generator przebiegu TTL o takiej częstotliwości, to grupy w tym przypadku, jedna byłaby modyfikowana w programie
program procesora w praktyce  zwariowałby , bowiem co chwilę wy- głównym, a druga wykorzystywana by była tylko w procedurze obsługi
woływana był procedura obsługi przerwania z INT0, i nic innego w pro- przerwania. Gdyby dało się tak zrobić w praktyce, byłoby wspaniale,
gramie nie byłoby wykonywane. Dlatego pamiętając o tym należy roz- rzeczywistość jest jednak nieco mniej różowa. Co zrobić bowiem z re-
sądnie wybierać zastosowania układu przerwań zewnętrznych pamięta- jestrami uniwersalnymi np. jednostki arytmetyczno  logicznej ALU?
jąc także o występujących tu ograniczeniach. Przecież jest tylko jeden rejestr Acc oraz np. rejestr B (nie mówiąc
Na koniec omawiania układu przerwań nie można zapomnieć o prak- o wskazniku danych DPTR).
tycznej wskazówce dotyczącej pisania procedur obsługi przerwań. I tak Odpowiedz jest jedna: używać stosu.
przypomnijmy sobie stwierdzenie, mówiące że procedura obsługi prze- W przypadku gdy w procedurze obsługi przerwania modyfikowanych
rwania rozpoczyna się w chwili nadejścia przerwania. Ponieważ gene- jest więcej niż jeden rejestr, należy  odkładać je i  zdejmować ze
rowanie przerwania zazwyczaj zależy od mniej lub bardziej złożonych stosu w sposób zgodny z zasadą działania samego stosu, a mianowicie,

t
o
c
o
p
i
e
r
w
s
z
e
o
d
Å‚
o
ż
y
l
i
Å›
m
y
t
o
o
s
t
a
t
n
i
e
z
d
e
j
m
u
j
e
m
y

czynników zewnętrznych, i nie jest z reguły przewidywalne w progra-  to co pierwsze odłożyliśmy to ostatnie zdejmujemy , czyli np. jeżeli
mie, może nastąpić sytuacja tzw. gubienia zawartości rejestrów robo- w naszym przykładzie procedury intT2 zaprzęgniemy dodatkowy re-
czych (np. akumulatora) po wykonaniu procedury obsługi przerwania. jestr, prawidłowa kolejność instrukcji będzie następująca.
40 ELEKTRONIKA DLA WSZYSTKICH 5/98
Też to potrafisz Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
intT2: w systemie. W przypadku używania np. wszystkich czterech banków
PUSH Acc ;zapamiętanie akumulatora oraz dodatkowo korzystania ze stosu (choć w ograniczonym zakresie)
P
U
S
H
A
c
c
PUSH B ;zapamiętanie rejestru B w procedurach obsługi przerwań, na początku programu należy wyko-
P
U
S
H
B
MOV A, LICZNIK1
nać instrukcję:
ADD A, #1
MOV SP, #1Fh ;przesunięcie wskaznika stosu
DA A
co spowoduje że żaden z 32 rejestrów roboczych (4 banki po
MOV B, #3
8  R0...R7) nie zostanie zamazany w przypadku odłożenia jakiejś
MUL AB
zmiennej w procedurze obsługi przerwania.
MOV LICZNIK1, A
Oczywiście używanie pojęcia banków oraz takiej architektury rejest-
MOV LICZNIK2, B
rów roboczych nie jest wymagane, można przecież adresować każdy
POP B ;odtworzenie rejestru B
P
O
P
B
z nich (32) bezpośrednio za pomocą odpowiednich instrukcji MOV, np.
POP Acc ;odtworzenie akumulatora
MOV adres, #dana
RETI
gdzie adres jest z zakresu <0...31>.
Korzystanie z systemu banków rejestrów roboczych powoduje jed-
Przy okazji omawiania systemu przerwań nie sposób nie wspomnieć
nak, że listing programu, jest bardziej czytelny, a jego pózniejsza anali-
o dwóch głównych, często popełnianych błędach początkujący progra-
za przez programiste szybsza.
mistów podczas pisania pierwszych programów wyposażonych w pro-
cedur obsługi jednego lub kilku przerwań.
Układy czasowo-licznikowe
Pierwszy błąd polega na wykorzystywaniu zbyt dużej liczby rejestrów
W procesorze 8051/C51 mamy do dyspozycji 2 takie układy (T0 i T1),
w procedurze obsługi przerwania, a co za tym idzie konieczności odkła-
a w kości 8052/C52 dodatkowo trzeci (T2). To, czym dokładnie są ukła-
dania na stos zbyt dużej liczby danych. W efekcie często (szczególnie
dy czasowo-licznikowe, dowiedzieliście się drodzy Czytelnicy z jednego
w przypadkach kiedy pracują więcej niż jeden zródła przerwań) stos zo-
z wcześniejszych odcinków klasy mikroprocesorowej. Zamieszczone
staje przepełniony  tzn. że wskaznik stosu zostaje zwiększony do war-
tam informacje były jednak (przy braku znajomości języka asemblera
tości pod którą w pamięci wewnętrznej RAM programista zaplanował
8051) dość teoretyczne. Warto jest jednak je sobie odświeżyć przed
mniej lub bardziej ważne (ale ważne i przewidziane w programie!)
lekturÄ… niniejszego paragrafu.
zmienne programowe. W takim przypadku zmienne te zostanÄ… z pew-
Teraz kiedy opanowaliśmy (choć może nie wszyscy w takim samym
nością zamazane, i nasz program będzie do niczego. O tym jakie są spo-
stopniu) sztukę bodaj prostego programowania procesora, będzie mi
soby omijania takich przypadków, opowiem za chwilę.
łatwiej zilustrować podane wcześniej wiadomości i sprowadzić je do
Drugi błąd polega na tym że programista tworzy  zbyt długi kod pro-
czystej praktyki, wspartej jednak krótkimi, lecz niezbędnymi informacja-
cedury obsługi przerwania. Przecież każda instrukcja zajmuje proceso-
mi na temat układów czasowo licznikowych.
rowi określoną ilość czasu! W efekcie np. w sytuacji kiedy przerwanie
Z układami czasowo licznikowymi procesora 8051 związane są nie-
zewnętrzne (lub z przepełnienia licznika) nadchodzi odpowiednio często
T
C
O
N
T
M
O
D
rozłącznie dwa rejestry specjalne: TCON i TMOD
 czyli w określonych przedziałach czasu, może dojść do sytuacji, kiedy
T
M
O
D
Rejestr TMOD określa tryby pracy układu czasowo licznikowego  za-
to w trakcie trwania nie zakończonej jeszcze procedury obsługi prze-
równo dla T0 jak i T1. Rejestr ten nie jest adresowany bitowo. Wszyst-
rwania zajdzie ponowny warunek zgłoszenia przerwania. W większości
kie bity rejestru TMOD moga być zmieniane wyłącznie programowo
takich przypadków procesor po prostu  zwariuje a cały program albo
czyli przez użytkownika.
się zawiesi, albo pójdzie w przysłowiowe  maliny .
Unikajmy więc takich przypadków, i piszmy procedury obsługi prze-
rwań w taki sposób aby nie powodować krytycznych błędów czaso-
wych, a przynajmniej zabezpieczajmy siÄ™ przed nimi.
Oczywiście nie w każdym przypadku obowiązuje zasada pisania krót-
kich procedur obsługi przerwań. Bywają przypadki (z doświadczenia po-
Połowa rejestru (młodsze 4 bity) określa parametry układu licznika T0,
wiem Wam że należy do nich kompleksowa procedura obsługi sygnału
natomiast 4 starsze bity określają to samo lecz dla układu licznikowego
DCF77 i dekodowanie aktualnych danych o dacie i czasie), kiedy proce-
T1. Z tego względu przy opisie będę kierował się tylko jednym z liczni-
dura jest na pierwszy rzut oka dość długa. Lecz sposób jej działania oraz
ków.
maksymalny czas niezależnie od cyklu, jest przemyślany w taki sposób,
GATE  bit uaktywnienia zewnętrznego bramkowania licznika Tx
G
A
T
E
aby pozostawić bezpieczny margines czasowy i co najważniejsze dać
(x=0,1). Kiedy GATE=0 to licznik pracuje wtedy kiedy bit TRx w słowie
czas procesorowi także na wykonywanie procedur obsługi innych prze-
TCON jest ustawiony. Kiedy GATE=1 to licznik pracuje gdy TRx = 1 oraz
rwań, a co najważniejsze, na wykonanie instrukcji części głównej pro-
wejście INTx (x:1 to INT1, x:0, to INT0) jest w stanie wysokim (INTx=1).
gramu. Wszystko to w warunkach kiedy mamy do czynienia z małymi
C/T  bit określający funkcję jaka pełni podczas pracy dany układ liczni-
C
/
T
wartościami częstotliwości pracy procesora przy dość często zachodzą-
kowy, i tak gdy bit =0 to układ pracuje jako czasomierz taktowany we-
cy przerwaniach tak zewnętrznych jak i wewnętrznych.
wnętrznym sygnałem zegarowym o częstotliwości Fxtal / 12. Gdy zaś
Na koniec omawiania systemu przerwań warto wspomnieć o przewi-
bit = 1, to układ pracuje jako licznika impulsów zewnętrznych z wejścia
dzianym w zasadzie do obsługi podprogramów przerwań systemie blo-
Tx (T1 lub T0). Temat maksymalnej częstotliwości zliczanych impulsów
ków rejestrów roboczych : R0, R1, R2...R7. I tak w przestrzeni adreso-
zewnętrznych poruszany był w części 5 szkoły mikroprocesorowej.
wej wewnętrznej RAM procesora (adresy 0...127) w pierwszych 32 re-
jestrach (adresy: 0...31) przewidziano cztery  banki rejestrów R0...R7.
M1, M0  bity określające wybór trybu pracy układu czasowo-liczniko-
M
1
,
M
0
Dostęp do nich za pomocą operowania instrukcjami wykorzystującymi
wego, i tak:
nazwy rejestrów roboczych R0...R7, jest możliwy za pomocą odpo-
wiedniego ustawienia dwóch bitów w omawianym już w naszym cyklu
słowie PSW (ang.  Program Status Word , SFR adres: D0h). Są to bity
RS0 (adres: D3h) i RS1 (adres: D4h). I tak w zależności od kombinacji
tych bitów uzyskujemy dostęp poprzez nazwy robocze R0...R7 do na-
stępujących rejestrów w wewn. RAM procesora:
Zajmiemy się teraz rejestrem TCON, w którym 4 najstarsze bity są
bezpośrednio powiązane z układami czasowo licznikowymi procesora.
Oto on.
W przypadku korzystania z tej cechy adresowania rejestrów robo-
czych procesora, należy pamiętać o odpowiednim przesunięciu wskaz-
T
F
1
(
b
i
t
T
C
O
N
.
7
,
a
d
r
e
s
:
8
F
h
)
nika stosu (który na początku po resecie procesora zawsze wskazuje na TF1 (bit TCON.7, adres: 8Fh)  znacznik przepełnienia licznika T1, jest
adres 07h) w zależności od ilości wykorzystywanych banków rejestrów sygnałem zgłoszenia przerwania. Ustawiany jest automatycznie 
R0...R7, która to ilość często wiąże się z ilością używanych przerwań sprzętowo, zerowany także automatycznie przy przyjęciu przerwania.
ELEKTRONIKA DLA WSZYSTKICH 5/98 41
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
TR1 (bit TCON.6, adres: 8Eh)  bit sterujący zliczaniem licznika T1. Gdy Zatem do rejestrów: TH0.TL0 należy wpisać wartość FC18h, np. za
T
R
1
(
b
i
t
T
C
O
N
.
6
,
a
d
r
e
s
:
8
E
h
)
wyzerujemy go (TR1=0) to licznik siÄ™ zatrzyma. Ustawienie (TR1=1) pomocÄ… instrukcji:
uruchamia licznik. MOV TH0, #FCh
TF0 (bit TCON.5, adres: 8Dh)  znacznik przepełnienia licznika T0, jest MOV TL0, #18h
T
F
0
(
b
i
t
T
C
O
N
.
5
,
a
d
r
e
s
:
8
D
h
)
sygnałem zgłoszenia przerwania. Ustawiany jest automatycznie  w przykładzie a) były to słowa wartośćH i wartośćL.
sprzętowo, zerowany także automatycznie przy przyjęciu przerwania.
TR0 (bit TCON.4, adres: 8Ch)  bit sterujący zliczaniem licznika T0. Gdy Sprawdzmy w teorii jak zadziałają instrukcje i kiedy licznik się przepeł-
T
R
0
(
b
i
t
T
C
O
N
.
4
,
a
d
r
e
s
:
8
C
h
)
wyzerujemy go (TR0=0) to licznik siÄ™ zatrzyma. Ustawienie (TR0=1) ni, zapiszmy zatem:
uruchamia licznik. MOV TMOD, #0001b ;ustawienie trybu
Tak oto za pomocą dwóch rejestrów TOMD i TCON można sterować MOV TH0, #FCh ;wpisanie wartości
trybami i zachowaniem się liczników T0 jak i T1. MOV TL0, #18h ;początkowej
Jak w praktyce wykorzystuje się liczniki? Otóż podam kilka wskazó- SETB TR0 ;i start licznika
wek i podpowiedzi które wynikają z codziennego  użytkowania proce-
sorów 8051 oraz różnorodności ich zastosowań. Dla ułatwienia będę Kiedy licznik startuje jego wartość wynosi FC18h, czyli dziesiętnie
operował symboliką związaną z licznikiem T0, pamiętając o tym że licz- 64536. Teraz licznik z każdą mikrosekundą będzie zwiększał zawartość
nik T1 można traktować tak samo. aż do przepełnienia, czyli przekroczenia FFFFh. Stanie się to po dokład-
o
b
a
l
i
c
z
n
i
k
i
T
0
i
T
1
z
l
i
c
z
a
j
Ä…
t
y
l
k
o
Na wstępie jedna ważna uwaga: oba liczniki T0 i T1 zliczają tylko nie 3E8h (1000 dziesiętnie) cyklach zliczania czyli mikrosekundach.
w górę! A przecież 1000 mikrosekund to 1 milisekunda, czyli wszystko jest
w
g
ó
r
Ä™
!
Tryb 16-bitowy licznika (tryb nr 1) wykorzystuje się często np. przy ge- w porządku. Nie należy tylko w przypadku chęci cyklicznego powtarza-
nerowaniu przerwań związanych z odmierzaniem czasu. nia odmierzania takich samych odstępów czasu, zapomnieć o koniecz-
Jak wykorzystać licznik do generowania opóznień w systemie lub do ności ponownego wpisywania wartość początkowej do liczników TH0
zmusić go do odmierzania stałych dłuższych odcinków czasu? Ano na- i TL0, zaraz po wejściu do procedury obsługi przerwania. Licznik bo-
leży wraz z licznikiem, wykorzystać związane z nim przerwanie  poja- wiem po przepełnieniu nadal pracuje (zależy to tylko od stanu bitu TR0
wiające się w momencie przepełnienia licznika. w rejestrze TCON).
W jaki sposób i dlaczego? Wspomniana procedura może wyglądać następująco:
Popatrzmy. Skoro licznik ustawiony do pracy np. w trybie 16-bitowym intT0:
(zliczanie impulsów wewnętrznych Fxtal / 12) to od jednego przepełnie- MOV TH0, #FCh ;wpisanie wartości
nia licznika do drugiego przepełnienia licznika minie czas określony za- MOV TL0, #18h ;początkowej
leżnością: PUSH ...... ;dalsze instrukcje
T = (10000h  wartość początkowa TH0.TL0 ) x 12 / Fxtal .............. ;procedury obsługi przerwania
gdzie Fxtal to częstotliwość rezonatora kwarcowego procesora. ..............
Toteż przed uruchomieniem do rejestrów licznika T0 wpisujemy np. za ..............
pomocÄ… instrukcji POP ......
MOV TH0, #.... reti
MOV TH1, #....
wartość początkową. I tu powstaje pewna nieścisłość, otóż zauważmy, że od czasu prze-
pełnienia licznika do rozpoczęcia procedury obsługi przerwania oraz
Dzięki temu np. przy kwarcu 12MHz wartość 12 / Fxtal będzie równa przeładowania zawartości TH0 i TL0 licznika, upływa zawsze trochę cza-
1 us (mikrosekundzie), co przy 16-bitowym liczniku da możliwość gene- su procesora, a licznik bezustannie zlicza, tym razem od zera. Zatem
rowania opóznień czasowych z przedziału od kilku mikrosekund do aby uzyskane interwały czasowe pokrywały się z naszymi założeniami,
65535 us, czyli prawie 65,5 milisekundy, z rastrem 1 us. należy uwzględnić zliczone do czasu przeładowania rejestrów TH0
A co w przypadku chęci generowania większyć niż 65 ms odstępów i TL0, impulsy, korzystając z instrukcji ORL i przeładowywać rejestry
czasowych? Można oczywiście zmniejszyć częstotliwość procesora, licznika w sposób następujący:
ale w praktyce robi się to zupełnie inaczej. Otóż w procedurze obsługi intT0:
przerwania z danego licznika, który przecież co pewien, ustalony przez ORL TL0, #18h ;dodanie logiczne kilku
programistę czas, przepełnia się, należy umieścić instrukcje rozszerza- ;impulsów początkowych
jące zakres danego licznika o np. dodatkowe 8 bitów (jeden bajt). Wte- MOV TH0, #FCh ;wpisanie wartości starszego
dy uzyskamy licznik 24-bitowy, a to już daje spore możliwości. Jak to się ;bajtu licznika
robi praktycznie, przeczytacie w lekcji nr 8 w tym numerze.
Do generowania nadaje się także doskonale tryb z 8-bitowym liczni- PUSH ...... ;dalsze instrukcje
kiem taktowanym za pośrednictwem 5-bitowego preskalera  tryb nr 0. .............. ;procedury obsługi przerwania
W trybach 0, 1 i 3 liczniki zarówno T0 jak i T1 po przepełnieniu nale- ..............
ży ponownie załadować wartością początkową, w przeciwnym przypad- ..............
ku będą zliczały o zera. POP ......
Wyjątkiem jest tryb nr 2 z automatycznym ładowaniem wartości po- reti
czÄ…tkowej z rejestru TH0 do 8-bitowego licznika TL0 (to samo dotyczy
licznika T1). Jednak i w tym przypadku błąd będzie wyeliminowany w przypadku,
Tryb ten oprócz odmierzania bardzo krótkich odcinków czasu (w try- jeżeli od czasu przepełnienia do zgłoszenia przerwania nie upłynie wię-
bie pracy licznika  jako czasomierza) ma dodatkowe zastosowanie do cej niż 7 cykli maszynowych procesora. Zauważmy, bowiem że instruk-
taktowania portu szeregowego w trybach: 1 i 3 (-> patrz artykuł w po- cja ORL (dodawania logicznego) sumuje poszczególne bity, a nie doda-
przednim numerze EdW). je arytmetycznie dwie liczby. Zatem w przypadku liczby 18h, która mo-
Oto przykłady programowania wstępnego rejestrów układów czaso- że być zapisana binarnie jako:
wo-licznikowych dla różnych trybów pracy liczników. Wszystkie ozna- 00011000b
czenia odnoszą się do licznika T0 ale można je także stosować dla licz- trzy najmłodsze bity są różne zero i dlatego zsumowanie będzie popra-
nika T1 w ten sam sposób. wne tylko z liczbą z zakresu 1...7. Dlatego przy programowaniu należy
o tym pamiętać i ewentualnie tak definiować wartość początkową, aby
a) licznik T0 16-bitowy pracujący jako czasomierz (T1, nie używany) wyeliminować błąd tzw.  pierwszych impulsów . Ktoś powie, no dob-
MOV TMOD, #0001b ;ustawienie trybu licznika rze, ale przecież można by dodać te liczby arytmetycznie używając in-
MOV TH0, #wartośćH ;wpisanie wartości strukcji dodawania np. ADD, no tak ale po pierwsze angażujemy w to
MOV TL0, #wartośćL ;początkowych akumulator Acc, po drugie operacja dodawania ADD też trwa przed
SETB TR0 ;i start licznika określoną liczbę cykli zegarowych, toteż niewiele to zmieni.
W każdym razie dłuższa praktyka i testowania generowanych przez
Jak obliczyć wartości początkowe? Posłużę się przykładem. Otóż za- was procedur pozwoli na dokładne zgłębienie problemu i znalezienie na
łóżmy że pracujemy z kwarcem 12MHz, czyli licznik zwiększa swoja za- niego niejednego rozwiązania. Przykłady takich rozwiązań podam przy
wartość co 1 µs. najbliższej okazji w jednym z kolejnych odcinków szkoÅ‚y mikroproceso-
Jeżeli zatem chcemy odmierzać np. 1 ms odstępy czasu (od jednego rowej.
przepełnienia do drugiego przepełnienia ma upłynąć dokładnie 1 ms), to
obliczamy wartość początkowa licznika w sposób: b) licznik zlicza impulsy określoną przez nas liczbę impulsów zewnę-
wartość początkowa = 65536  (1 ms / 1 us) = 65536  1000 = 64536 trznych z zakresu 1...255 a następnie sygnalizuje koniec zliczania wyge-
= FC18h (szesnastkowo) nerowaniem przerwania. Wykorzystamy tryb 2 licznika gdzie TL0 pra-
42 ELEKTRONIKA DLA WSZYSTKICH 5/98
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
nerowaniem przerwania. Wykorzystamy tryb 2 licznika gdzie TL0 pra- I tak elegancki zapis modyfikacji np. z przykładu c) będzie wyglądał
cuje z automatycznym wpisywaniem wartości początkowej z TH0. następująco:
MOV TMOD, #0110b ;ustawienie trybu licznika
ANL TMOD, #0Fh ;licznika T0 nie ruszamy
MOV TH0, #liczba ;wpisanie wart. poczÄ…tkowej
ORL TMOD, #00100000b ;ustawienie trybu licznika T1,
MOV TL0, TH0 ;konieczne !
;T0 bez zmian
SETB TR0 ;rozpoczęcie zliczania
MOV TH1, #baud ;wpisanie prędkości transmisji
MOV TL1, TH1 ;tu nie jest konieczne
przy czym wartość liczba jest równa:
SETB TR1 ;i start taktowania
liczba = 256  liczba impulsów zewnętrznych do zliczenia
W pierwszej komendzie listingu po prostu wyczyściliśmy najpierw
c) Tak na marginesie w podobny sposób można przystosować licznik T1
4 bardziej znaczące bajty rejestru TMOD (pamiętajmy że nie można ad-
do taktowania portu szeregowego, oto sposób
resować go bitowo), a następnie zapisaliśmy do nich odpowiedni tryb
MOV TMOD, #00100000b ;ustawienie trybu licznika T1
pracy licznika T1.
;(T0 stoi)
W taki sam sposób należy postępować z licznikiem T0, maskując
MOV TH1, #baud ;wpisanie prędkości transmisji
wtedy bity licznika T1.
MOV TL1, TH1 ;tu nie jest konieczne
Pozostała nam jeszcze układ czasowo-licznikowy T2, który ze wzglę-
SETB TR1 ;i start taktowania
du na wiele ciekawych funckji dodatkowych (w porównaniu z T0 lub
T12) omówię w kolejnym odcinku szkoły mikroprocesorowej.
W miejsce  baud należy wpisać liczbę określająca szybkość trans-
misji portu szeregowego. Wartości przykładowe oraz sposób obliczania
Na razie zapraszam do lektury kolejnej lekcji nr 8.
znajduje siÄ™ w poprzednim odcinku klasy mikroprocesorowej.
Dzisiaj połączymy wiedzę z zakresu przerwań sprzętowych i liczni-
W każdym z przypadków zapisywaliśmy bezpośrednio rejestr TMOD
ków i przeanalizujemy procedurę realizująca funkcje zegara  czyli od-
określając sposób pracy układu czasoso-licznikowego T0 i T1. Jednak
mierzania czasu rzeczywistego: sekundy, minuty, godziny, dni, miesiÄ…-
w pewnych przypadkach, w programie może zajść potrzeba modyfika-
ce a nawet lata.
cji trybu jednego licznika przy niezmienionym i niezakłóconej pracy dru-
Sławomir Surowiński
S
Å‚
a
w
o
m
i
r
S
u
r
o
w
i
Å„
s
k
i
giego licznika. Wtedy użycie komendy
MOV TMOD, #wartość
Od redakcji. Ze względu na ograniczona objętość rubryki, a jedno-
O
d
r
e
d
a
k
c
j
i
.
może okazać się dość ryzykowne.
cześnie chęć zamieszczenia całego artykułu serii  Mikrokontrolery, to
Prostym rozwiązaniem jest maskowanie tej części bajtu TMOD która takie proste... , kącik pocztowy w podwójnej objętości znajdzie się
odpowiada za danych licznika, a którego nie chcemy zmieniać. w następnym numerze EdW.
Lekcja 8
8
W dzisiejszej lekcji zbierzemy nasze wiadomości dotyczące układu czyli w komórce wew. RAM procesora o adresie 62h będą zliczane
sekundy czasu rzeczywistego z wykorzystaniem instrukcji korekty
przerwań mikroprocesora oraz informacje przedstawione w dzi-
dziesiętnej akumulatora:
siejszym numerze EdW o układach czasowo licznikowych.
DA A
Tematem lekcji będzie napisanie i wspólne przeanalizowanie pro-
czyli np. jeżeli licznik sekund będzie zawierał np.
cedury zliczania czasu rzeczywistego (sekund, minut i godzin) wy-
09 (heksadecymalnie)
korzystującą przerwanie pochodzące od jednego z dwóch ukła-
to po inkrementacji  zwiększeniu o jeden
dów czasowo-licznikowych procesora 8051.
powinien wskazywać (zgodnie z zapisem BCD)
Połączenie właściwości zliczania wewnętrznych impulsów zegaro-
10 (heksadecymalnie)
wych przez układ licznikowy wraz z odpowiednim generowaniem
Wtedy przy użyciu procedury Bios a komputerka A2HEX (patrz opis
przepełnienia tego licznika  czyli generowania przerwania pozwoli na z poprzednich lekcji klasy mikroprocesorowej) będzie można łatwo
wyświetlić w czytelnej postaci aktualną wartość sekund. Podobnie
dokładne odmierzanie sekund, a co za tym idzie minut oraz godzin.
postąpimy z minutami i godzinami. Wystarczy bowiem wydać ko-
mendy, np.:
Oprócz wspomnianej procedury, pracującej  w przerwaniu (czyli
mov A, SEK
okresowo) utworzymy także prościutki fragment programu pozwalający
mov B, #7
na wprowadzenie przez użytkownika czasu : godzin, minut i sekund, po
czym po wciśnięciu dowolnego klawisza, uruchomienie zegara i rozpo- lcall A2HEX
aby na DL7 i DL8 pojawiła się aktualna wartość sekund  aktualna za-
częcie zliczania czasu wraz z jego wyświetlaniem.
Tak powstały program można będzie załadować do komputerka i uru- wartość licznika sekund SEK.
A co (lub kto) zajmie siÄ™ inkrementacjÄ… sekund, minut i godzin?
chomić. Ponieważ problem odmierzania czasu spotykany jest bardzo
często przy okazji układów mikroprocesorowych, niniejsza lekcję nale- Właśnie procedura obsługi przerwania od jednego układu czasowo-
licznikowego. W pętli głównej programu my będziemy troszczyć się
ży przestudiować bardzo uważnie, analizując wszystkie zawarte w niej
jedynie o wyświetlanie na displeju komputerka wartości godzin mi-
komentarze oraz zamieszczony listing programu zegara.
nut i sekund. W prosty sposób także wyświetlimy tzw.  migający
Zrozumienie problemu implementacji zegara czasu rzeczywistego
dwukropek w postaci kresek (myślników) pomiędzy pozycjami go-
oraz właściwego generowania przerwań systemowych jest bowiem
podstawą do dalszych, często przeprowadzanych samodzielnie ekspe- dzin i minut oraz minut i sekund w postaci:
rymentów.
DL 1 2 3 4 5 6 7 8
         -------
A oto założenia do programu:
A
o
t
o
z
a
Å‚
o
ż
e
n
i
a
d
o
p
r
o
g
r
a
m
u
:
1. W programie rezerwujemy 3 komórki w wew. pamięci RAM proce- G G  M M  S S
sora,jedna będzie zliczać sekundy, druga minuty, trzecia godziny.
2. Zliczanie będzie odbywać się w kodzie BCD, czyli każdej pozycji licz- gdzie: GG  pozycje godzin
MM  pozycje minut
by np. sekund będą odpowiadać 4 bity danej komórki pamięci, oto
SS  pozycje sekund
wyjaśnienie:
 niech bajt zliczajÄ…cy sekundy nazywa siÄ™ SEK, zdefiniujemy go ja-
Np. godzina 12:34 i 57 sekund będzie wyświetlana jako:
ko np.
SEK equ 62h 1 2  3 4  5 7
ELEKTRONIKA DLA WSZYSTKICH 5/98 43
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
z migającymi znakami  - (myślnika). Zauważcie że 8 pozycji wy- Pod tym adresem powinien znajdować się skok do właściwej proce-
świetlacza komputerka akurat wystarcza na wyświetlenie czasu dury obsługi przerwania w postaci instrukcji np. :
w takiej właśnie formie (którą oczywiście należy traktować jako przy- ljmp intT1
kładową. no tak ale gdzie fizycznie jest ta etykieta  ten adres?
Korekta dziesiętna akumulatora po inkrementacji danej jednostki Przecież nie możne znajdować się w obszarze zewnętrznej pamięci
czasu (sekund, minut lub godzin) jest niezbędna, bowiem w przeciw- RAM procesora, w którym znajduje się zawarty w EPROM-ie monitor
nym przypadku po sekundach równych  09 nastąpiło by wyświet- komputerka AVT-2250. Nie można bowiem  w miejsce w którym zna-
lenie wartości  0A , a tego byśmy nie chcieli.
jduje się Bios zawarty w EPROM ie wpisać instrukcji naszego progra-
3. Do wygenerowania okresowo powtarzającej się procedury obsługi
mu obsługi zegara. Co zatem zrobić, czyżby nie dało się nijako ujarzmić
przerwania, w której będą odpowiednio inkrementowane komórki
przerwania i przekazać jego wektora w obszar zewnętrznej pamięci
sekund, minut i godzin wykorzystamy układ czasowo  licznikowy T1
operacyjnej komputerka  czyli w miejsce gdzie Å‚adowany jest kod pro-
komputerka. Użycie licznika T0 jest niemożliwe, a przynajmniej nie
gramu użytkownika  pamięć SRAM? Można.
na tym etapie nauki, ze względu na to że jest on już zajęty multiplek-
Konstruktor komputerka, czyli Ja przewidziałem taka możliwość i po-
sowym wyświetlaniem informacji na wyświetlaczu DL1...8 kompu-
stanowiłem w prosty sposób  wyprowadzić wszystkie wektory prze-
terka, dajmy więc mu spokój.
rwań z pamięci Bios a komputerka w obszar pamięci SRAM, w miejsce
4. Dodatkowo w pętli głównej programu przed uruchomieniem zegara, do-
ustalone dodatkowo przez użytkownika, a to ci dopiero gratka!
damy kilka instrukcji dzięki którym będzie można wpisać aktualny czas
Aby wyjaśnić to przypomnę że tabela wektorów przerwań dla 8051
 czyli po prostu  nastawić nasz zegarek , a następnie go uruchomić.
przedstawia się następująco:
Wstępne obliczenia  wariant 1
W
s
t
Ä™
p
n
e
o
b
l
i
c
z
e
n
i
a

w
a
r
i
a
n
t
1
Adres Opis
W komputerku AVT-2250 procesor 8051 pracuje z częstotliwością re-
                         -------------
zonatora kwarcowego o wartości 11,0592 MHz, czyli
0
3
0003h przerwanie z wejścia /INT0
1
1
0
5
9
2
0
0
Fxtal = 11059200 Hz.
0
B
000Bh przerwanie z licznika T0
Zatem 1 cykl maszynowy procesora będzie trwał dokładnie:
1
3
0013h przerwanie z wejścia /INT1
1
,
0
8
5
0
6
9
4
4
4
Tm = 12 / Fxtal = 12 / 11059200 = 1,085069444 µs (mikrosekundy)
1
B
001Bh przerwanie z licznika T1
Jak już wiesz, każdy z liczników procesora (T0, lub T1) pracując w try-
2
3
0023h przerwanie z portu szeregowego
bie czasomierza zlicza wewnętrzne impulsy zegarowe w częstotliwością
9
2
1
6
0
0
Fxtal / 12 = 11059200 / 12 = 921600 Hz
W programie Bios a komputerka w miejscu każdego wektora znajdu-
co jest dokładnie odwrotnością obliczonego wcześniej okresu cyklu ma-
je się skok typu LJMP do tzw.  procedury inicjującej przerwanie z któ-
szynowego procesora Tm.
rej to dopiero następuje skok do właściwego miejsca w zewnętrznej
Zatem można powiedzieć żeby np. przepełniać licznik T1 co 1 sekun-
pamięci SRAM  operacyjnej.
dę i generować przez to przerwanie, trzeba by licznik ten zliczył:
Wspomniana procedura inicjujÄ…ca (nie dotyczy to licznika T0) jest tak
9
2
1
6
0
0
n = 1 / Tm = Fxtal / 12 = 921600 impulsów
zbudowana, że powoduje ona skok pod adres w zewn. SRAM kompu-
Niestety, nawet w trybie 1, kiedy licznik pracuje jako 16-bitowy
terka pod adres, którego:
(tryb 1), jest w stanie zliczyć jedynie 216-1 impulsów, czyli 65535. Moż-
 młodszy bajt (pogrubione w tabeli) nie zmienia się
na zatem powiedzieć że licznik może się przepełniać najrzadziej co:
 starszy bajt jest  brany z komórki w wew. RAM procesora o adre-
t = 65536 x Tm = 71,111(1) ms (milisekund)
sie 72h  (patrz opis Bios a komputerka)
a to stanowczo za mało. Cóż więc w tej sytuacji należy zrobić?
Komputerowcy mogą w tym miejscu zajrzeć do zbioru  CONST.INC
Odpowiedz na to pytanie jest prosta. Należy przepełniać licznik częś-
na dyskietce AVT-2250/D i sprawdzić deklarację
2
5
6
r
a
z
y
n
a
s
e
k
u
n
d
Ä™
ciej niż co sekundę  np. 256 razy na sekundę (z częstotl. 256 Hz),
intvec equ 72h
a w procedurze obsługi przerwania licznika wprowadzić dodatkową
która potwierdza te założenie.
zmienną  licznik (bajt w wew. RAM procesora), który będzie inkremen-
Zatem reasumując jeżeli na początku naszego przykładowego progra-
towany (już bez korekcji dziesiętnej) za każdym razem kiedy, nastąpi
mu przed uruchomieniem układu przerwania od licznika T1 wpiszemy
przepełnienie licznika. W ten sposób, w przypadku kiedy licznik ten bę-
do tej komórki (wew. RAM!) liczbę np. 80h, to tabel wektorów prze-
dzie osiągał np. wartość maksymalną  255 będzie to sygnałem że mi-
rwań procesora 8051 zostanie niejako  wyprowadzona do obszaru
2
5
6
o
k
r
e
s
ó
w
p
o
1
/
2
5
6
s
e
k
u
n
d
y
nęło właśnie 256 okresów po 1/256 sekundy, co w efekcie oznacza że
o adresach jak poniżej:
minęła dokładnie 1 sekunda i czas wobec tego zwiększyć licznik sekund
m
i
n
Ä™
Å‚
a
d
o
k
Å‚
a
d
n
i
e
1
s
e
k
u
n
d
a
(a co za tym idzie w razie potrzeby licznik minut i godzin). Prawda że lo-
Adres Opis
giczne, i tak też zrobimy!
                         ------------
Dlaczego wybrałem wartość 256 Hz do zliczania nazwijmy to  pod-
8003h przerwanie z wejścia /INT0
8
0
sekund , a nie np. 100 (to by było super zliczać także setne sekundy!).
800Bh przerwanie z licznika T0
8
0
Tak to logiczne pytanie, tylko że w przypadku wartości rezonatora kwar-
8013h przerwanie z wejścia /INT1
8
0
cowego 11059200 Hz zliczanie 1/100 sekundy było by dość kłopotliwe,
801Bh przerwanie z licznika T1
8
0
ze względu że ta wartość Fxtal nie dzieli się przez 12 i przez liczbę cał-
8023h przerwanie z portu szeregowego
8
0
kowitą aby dać właśnie 100.
Za to dzieli siÄ™ przez 12 i przez 256 co w efekcie daje war-
Bardziej zaawansowani i wnikliwi czytelnicy zauważą w tym miejscu
3
6
0
0
tość: T1imp=3600 (dziesiętnie) co w efekcie wyznaczy nam z podanej
ciekawy fakt, mianowicie, że takie postępowanie Bios a komputerka
niżej zależności wartość początkowa licznika T1, która spowoduje że
umożliwia kontrolowanie wszystkich zródeł przerwań a nawet zabloko-
przepełnienie licznika nastąpi dokładnie po 1/256 sekundy.
wanie wyświetlacza (który pracuje na przerwaniu od licznika T0) i wyko-
F
1
F
0
h
TH1.TL1 = T1max  T1imp + 1 = 65535  3600 + 1 = 61936 = F1F0h
rzystanie go do własnych celów, czego na razie stanowczo odradzam.
(hexadec.)
8
0
h
Podałem liczbę 80h nie przypadkowo, bowiem od tego adresu 
Zatem wartością początkowa licznika przy rezonatorze 11059200 Hz
8000h na płytce komputerka (przy założeniu że zwora JP3 jest w pozycji
i przy założonym okresie przepełniania równym 1/ 256 sek. jest liczba
8000h) zaczyna się pamięć operacyjna gdzie ładowany będzie program.
F1F0h, którą można zapisać do rejestrów SFR licznika za pomocą in-
Podsumowując prześledzmy co fizycznie się stanie w przypadku
strukcji np.
przepełnienia licznika T1:
mov TH1, #0F1h
 zgłoszone zostaje przerwanie
mov TL1, #0F0h
 procesor skacze do  pierwotnej tablicy wektorów przerwań, czyli
Wszystko było by dobrze, ale nie możemy zapomnieć o drobnym,
pod adres 001Bh; jest to jednakże obszar pamięci EPROM  Bios-u,
aczkolwiek istotnym fakcie, a mianowicie, że od przyjęcia przerwania
do każdorazowego przeładowania licznika w procedurze przyjęcia prze- gdzie zawarta jest instrukcja:
LJMP intT1
rwania mija bliżej nieokreślona liczba cykli maszynowych, w których
czyli skoku do etykiety intT1, która to znowu etykieta znajduje się tak-
licznik ciągle zlicza impulsy po przepełnieniu  czyli od wartości 0000h.
że w obszarze Bios a komputerka a za nią znajdują się instrukcje
Wprawdzie można policzyć ile cykli maszynowych przez ten czas, ale
servT1:
trzeba znać wszystkie rozkazy które znajdują się  po drodze , czyli:
push Acc
a) cykle od przepełnienia licznika do przyjęcia przerwania  w praktyce
push DPH
jest ich 2 (w przypadku kiedy przerwanie ma najwyższy priorytet, lub
nie trwa obsługa przerwania o wyższym priorytecie); push DPL
b) cykle potrzebne na skok do tablicy wektorów przerwań  w przypad- clr A
ku licznika T1 procesor automatycznie wykona skok pod adres poda- mov DPH,intvec ;pobranie zewn. wektora T1
ny w artykule: mov DPL,#1Bh
001Bh jmp @A+DPTR
44 ELEKTRONIKA DLA WSZYSTKICH 5/98
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
Zadaniem tych instrukcji jest zapamiętanie modyfikowanych w proce- Pozostaje jeszcze jeden drobiazg, mianowicie obliczenie wartości po-
durze przerwania rejestrów  są to Akumulator i rejestr DPTR (DPH czątkowej licznika T1 na podstawie obliczonej liczby impulsów które po-
i DPL), a następnie wykonanie skoku bezwarunkowego (ostatnia instruk- winien zliczyć do przepełnienia, będzie to zatem:
cja) pod adres będący sumą zawartości akumulatora (równy 0) oraz TH1pocz = TH1max  TH1imp + 1 = 256  225 + 1 = 31
wskaznika DPTR. Zanim to jednak następuje, wskaznika DPTR jest łado- I taką właśnie wartość należy wpisywać do licznika TH1 za każdym
wany wspomnianym wcześniej adresem będącym  złożeniem starsze- razem po jego przepełnieniu. Wnikliwy czytelnik może szybko przeana-
go bajtu (DPH) równego zmiennej  intvec (adres 72h), którą modyfiku- lizować obliczenia z odwrotnej strony na podstawie formuły:
(
2
5
6

T
H
1
p
o
c
z
)
x
1
2
8
x
3
2
x
(
1
2
/
F
x
t
a
l
)
=
1
s
e
k
u
n
d
a
je użytkownik  w naszym przypadku będzie to 80h, oraz młodszego baj- (256  TH1pocz) x 128 x 32 x (12 / Fxtal) = 1 sekunda
tu będącego odpowiednikiem pierwotnej tabeli wektorów przerwań, nie mniej nie więcej! (pamiętaj: Fxtal = 11059200 Hz)
czyli 1Bh. W sumie procesor wykona skok pod adres: 801Bh, gdzie po- Na podstawie tych rozważań, można zabrać się do pisania programu.
winna znajdować się napisana przez nas procedura obsługi przerwania Listing poniżej przedstawia cały program wraz z procedurą obsługi prze-
od licznika T1, a obsługująca zliczanie czasu rzeczywistego. rwania. Każda linia, znana już zarówno komputerowcom jak i ręcznia-
Uff, trochę to skomplikowane, ale niestety niezbędne, bowiem kom, jest poprzedzona numerem linii, dzięki czemu będzie mi łatwiej
w przypadku korzystania z zestawów edukacyjnych często z zawartym tłumaczyć po krótce każdą z nich. Uwaga, linie komentarzy będę pomi-
w nich mniej lub bardziej skomplikowanym Bios-em (a do takich należy jał, a więc zaczynamy (ręczniacy mogą zacząć równocześnie wklepy-
AVT-2250) tak procedura jest konieczna. W przyszłości w autonomicz- wać kod programu umieszczony w kolumnie trzeciej).
nych układach opartych o 8051 i podobne, a nie wykorzystujących na- Linie 18...20 : na początku definiuję adresy komórek zliczających se-
szego Bios-a komputerka, przedstawione kroki są do pominięcia. Pro- kundy, minuty i godziny, ot tak sobie zająłem wolne komórki od adresu
cesora po prostu skoczy do pierwotnej tabeli wektorów przerwań a na- 60h do 62h.
stępnie wykona skok do właściwego miejsca w Twoim programie, tam Dodatkowo z linii 22 definiuję wspomniany pośredni licznik, którego
gdzie znajduje się procedura obsługi danego przerwania. zadaniem będzie zliczanie przepełnień licznika TH1.
Wracając do tematu zauważmy jednak, że procesor na tych kilku eta- W linii 26 definiuję wartość początkową licznika TH1 jako wyrażenie
pach od przepełnienia licznika do skoku wreszcie do właściwej proce-  Czest .
k
i
l
k
u
n
a
s
dury obsługi przerwania potrzebować będzie prawdopodobnie kilkunas- Program zaczyna się w linii 30 deklaracją  ORG 8000h , czyli że pro-
tu cykli procesora, podczas (jeszcze raz powtarzam) pracuje licznik T1! gram jak zwykle umieszczamy od adresu podanego po tej deklaracji.
t
u
c
y
k
l
i
p
r
o
c
e
s
o
r
a
p
r
a
c
u
j
e
l
i
c
z
n
i
k
T
1
I to właśnie może stać się powodem błędu w dokładnym okresowym Aby ominąć występującą za  kilka adresów zewnętrzną tabelę wek-
(co 1/256 sek) generowaniu przepełnienia licznika T1  i co za tym idzie torów przerwań, w linii 31 umieszczam skok bezwzględny do etykiety
powstania przerwania. START, gdzie rozpoczyna się właściwy program.
Z grubsza można policzyć, (na podstawie tabeli instrukcji z wkładki No i wreszcie dyrektywa  ORG 801Bh w linii 35 definiuje mi adres
EdW) że zanim procesor przeładuje licznik w procedurze przerwania, to od którego spokojnie będę pisał procedurę obsługi przerwania od liczni-
licznik zdąży już zliczyć od 0000h mniej więcej 17 impulsów  można to ka T1.
i
n
t
T
1
policzyć analizując instrukcje z ostatniego listingu od etykiety  intT1 . W linii 36 zaczyna się procedur obsługi przerwania  intT1. Pierwsze
Mogą nie pomóc instrukcje uwzględniający ten fakt, o których wspo- co należy koniecznie zrobić, to (w linii 37) przeładować zawartość liczni-
minałem w artykule przed niniejszą lekcją typu: ka T1  TH1, co czynię.
orlTL1, #... Dalej jak widać brak postulowanych instrukcji odkładania na stos mo-
orlTL1, #.... dyfikowanych rejestrów, bowiem zostały one już zapamiętane na stosie
mov TH1, #.... podczas przyjęcia przerwania w procedurze pośredniej w obszarze
pomóc jedynie może i to z doskonałym skutkiem inny tryb pracy liczn- Bios-a komputerka (listing wcześniej) > Dla przypomnienia powiem że
t
r
y
b
0
ka T1 a mianowicie tryb 0. odłożono w kolejności rejestry:
Jak pamiętasz w trybie tym licznik pracuje jako 8-bitowy (liczy push Acc
TH1), a sygnał zegarowy (Fxtal / 12) jest dzielony dodatkowo przez 5-bi- push DPH
towy preskaler (czyli w praktyce przez 32) czyli rejestr TL1. push DPL
Dla nas i naszych kłopotów oznacza to tylko jedno  wybawienie, bo- W liniach 39...42 inkrementuję komórkę zliczającą ilość przepełnień
wiem fakt, że do licznika TH1  trafia co trzydziesty drugi impuls (przez licznika TH1, a następnie porównuję jej zawartość z zerem (w końcu
preskaler dzielnik TL1) pozwoli nam na uniknięcie wspomnianego błę- obojętne czy jest to zero, czy 255, bo i tak każda z wartości pojawia się
du kilkunastu cykli zegarowych od zgłoszenia przerwania do jego przy- raz na 128). Jeżeli warunek jest spełniony, to znaczy że minęło 128
jęcia i przeładowania licznika T1. przepełnień licznika TH1, czyli w praktyce minęła 1 sekunda. Jeżeli tak
Po prostu w czasie kiedy będą wykonywane te  wszystkie skoki się stanie to dzięki instrukcji w linii 42 program procesor skoczy do linii
z jednej tablicy wektorów do drugiej a potem do właściwej procedury 44, w przeciwnym przypadku do na koniec procedury obsługi przerwa-
obsługi przerwania (o których mówiłem wcześniej) licznik nie zdąży zli- nia  linia 65, etykieta  koniecT1 .
czyć ani jednego impulsu  i oto chodzi. Załóżmy więc że minęła sekunda, program kontynuowany jest od li-
I choć w teorii wydaje się to niepotrzebną komplikacją, to w prakty- nii 44, gdzie do akumulatora ładowana jest zawartość licznika sekund.
ce tryb 0 licznika jest najbardziej wygodnym i pewnym, jeżeli chodzi Następnie w linii 45 jest ona inkrementowana, a w linii 456 zgodnie
o generowanie opóznień niezbędnych do odmierzania czasu  szczegól- z naszym założeniem zliczania z kodzie BCD następuje korekta dziesięt-
nie rzeczywistego. Niestety musimy w tym celu zmienić nieco nasze na akumulatora (uwaga, w tym miejscu  linia 45  nie można zastoso-
obliczenia. wać instrukcji  INC bowiem nie  współpracuje ona z instrukcją ko-
rekty dziesiętnej  DA A ).
Wstępne obliczenia  wariant 2 W linii 47 powiększona zawartość sekund zostaje przepisana z Acc
W
s
t
Ä™
p
n
e
o
b
l
i
c
z
e
n
i
a

w
a
r
i
a
n
t
2
Korzystamy z trybu 0 licznika T1. W tym trybie pracuje połowa liczni- do SEK, a następnie w linii 48 następuje porównanie, czy aby licznik se-
ka a mianowicie TH1, który może zliczyć maksymalnie 255 impulsów. kund nie przekroczył wartości 59h (59 sekund?). Jeżeli tak nie jest pro-
Jednak częstotliwość tych impulsów będzie mniejsza niż w wariancie cedura kończy się i następuje skok na jej koniec  do etykiety
1, bowiem przed licznikiem TH1 znajduje siÄ™ 5-bitowy preskaler czyli nic  koniecT1 .
innego jak dzielnik przez 32. Wobec tego częstotliwość impulsów zli- W przeciwnym przypadku w linii 49 licznik sekund jest zerowany,
czanych przez nasz licznik TH1 będzie wynosiła: a dalej w liniach 51...54 następuje korekta licznika minut w sposób iden-
2
8
0
0
0
fz = Fxtal / 12 / 32 = 28000 Hz tyczny jak w przypadku sekund.
Ponieważ podobnie jak w wariancie 1, liczba ta przekracza aktualną W linii 55 licznik minut jest sprawdzany i w przypadku przekroczenia
pojemność licznika  tym razem 8-bitowego TH1, należy zastosować wartości 59 minut, następuje w linii 56 jego wyzerowanie i zostaje wy-
licznik pośredni na zasadach takich jak poprzednio. Załóżmy że stopień konana korekta licznika godzin  linie 58...61.
podziału będzie taki sam czyli 256, ale wtedy fz nie podzieli się przez Podobnie dzieje się z licznikiem godzin, z tym że w linii 62 porównu-
256, bowiem : je się jego zawartość z liczbą 24h. Jeżeli godzina 23-cia został przekro-
fz / 256 = 28800 / 256 = 112,5 czona, to licznik godzin zeruje siÄ™ w linii 63, i zaczyna siÄ™ nowa doba.
czyli nie jest liczbą całkowitą, a to jest niedopuszczalne. Przyjmijmy za- W tym miejscy za linią 63 można by dopisać zliczanie dni tygodnia,
tem podział pośredni jako mniejszy o rząd (w kodzie dwójkowym dni, miesięcy a nawet lat. To ciekawy temat na zadanie dla Was drodzy
o 2), będzie to zatem 128. Czytelnicy. Przypominam tylko o fakcie istnienia nieregularnej ilości dni
Wtedy : w kolejnych miesiącach roku, oraz istnieniu lat przestępnych.
fz / 128 = 28800 / 256 = 225 ( = TH1imp ) Procedura obsługi przerwania ma się ku końcowi w lini-
Podsumowując, można powiedzieć, że jeżeli licznik TH1 zliczy za każ- i 65, gdzie dalej w liniach 66...68 następuje odtworzenie zmodyfikowa-
dym razem 225 impulsów o częstotliwości fz (28800 Hz) to zajmie mu nych wcześniej rejestrów Acc i DPTR w odwrotnej kolejności niż przy od-
to dokładnie 1/128 sekundy. Jeżeli do tego dodatkowy  pośredni licz- kładaniu na stos (zgodnie z zasadą przechowywania danych na stosie!).
nik zliczy te 128  ułamków sekundy to w sumie będziemy mieli od- Na koniec w linii 69 występuje instrukcja RETI, która jest konieczna
mierzoną pełną sekundę! I o to właśnie chodzi. do prawidłowego zakończenia przyjęcia przerwania.
ELEKTRONIKA DLA WSZYSTKICH 5/98 45
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
Od linii 71 zaczyna się część główna programu.
Zadanie 3
Z
a
d
a
n
i
e
3
Analizę tej, dość prostej, części programu, pozostawiam Wam jako
Bardziej zaawansowanym i cierpliwym polecam uzupełnienie proce-
prace domowÄ….
dury obsługi przerwania (zegara) o obliczanie daty : dzień  miesiąc  rok
(bez uwzględniania lat przestępnych) oraz umożliwienie wyświetlania
Zadanie 1
Z
a
d
a
n
i
e
1
tej daty na wyświetlaczu z możliwością przełączenia na czas i odwrot-
Przeanalizować teoretycznej przebieg części głównej programu na
nie za pomocÄ… klawisza.
podstawie linii
72...125, a następnie sprawdzić to w praktyce ładują program do
Rozwiązania zadań 1 i 2 w kolejnej lekcji szkoły mikroprocesorowej.
komputerka i uruchamiajÄ…c go.
Najciekawsze a co najważniejsze poprawne propozycje rozwiązania za-
dania 3 przedstawiÄ™ na Å‚amach EdW w ramach  Skrzynki porad 8051 .
Zadanie 2
Z
a
d
a
n
i
e
2
Zmodyfikować wyświetlanie czasu do postaci np. dla godziny 12:34
Sławomir Surowiński
S
Å‚
a
w
o
m
i
r
S
u
r
o
w
i
Å„
s
k
i
i 58 sekund
1 2  3 4.5 8
Listing
1 CPU  8052.DEF 68 8051 D0E0 pop Acc
2 ;**************************************************** 69 8053 32 reti
3 ;Klasa mikroprocesorowa  LEKCJA 8 70 ;***********************************************
4 ;Program obslugi zegara czasu rzeczywistego 71 8054 START:
5 ;na komputerek edukacyjny AVT-2250 72 8054 C28E clr TR1 ;licznik T1 stop
6 ;**************************************************** 73 8056 53890F anl TMOD,#0Fh ;wyczyszczenie
7 ;procedura korzysta z przerwania licznika T1 (tryb 0) ;bitow T1
8 ;wykorzystywane sa 3 komorki wewn.RAM procesora 74 8059 438900 orl TMOD,#00h ;T1 jako 16-bitowy
9 ;zegar liczy: godziny, minuty i sekundy ;(tryb 1)
10 ;w trybie 24-godzinnym 75 805C 758D1F mov TH1,#Czest ;zaladowanie
11 ;**************************************************** ;licznika
12 include  const.inc 76 805F 756300 mov licz128,#0 ;wyzerowanie
13 include  bios.inc ;licznika 1/256 sek.
14 77 8062 757280 mov intvec,#80h ;zaladowanie MSB
15 ;Definicje komorek w wewn.RAM procesora ;wektora przerwan
16 ;zajmowane przez dane zegara 78 8065 D2AB setb ET1 ;odblokowanie
17 ;przerwania od T1
18 0060 GODZ equ 60h ;licznik godzin 79 8067 D2BB setb PT1 ;priorytet na to
19 0061 MIN equ 61h ;licznik minut ;przerwanie
20 0062 SEK equ 62h ;licznik sekund 80
21 81 8069 120274 lcall CLS ;wyczyszczenie
22 0063 licz128 equ 63h ;licznik 1/128 sek ;displeja
23 82 806C 757840 mov DL1,#_minus
24 ;Definicje stalych wykorzystywanych w programie 83 806F 757940 mov DL2,#_minus
25 84 8072 75F001 mov B,#1
26 001F Czest equ 31 ;watosc pocz. 85 8075 1203A7 lcall GETACC ;pobranie
;licznika TH1 ;poczatkowej
27 ;godziny
28 ;*********************************************** 86 8078 F560 mov GODZ,A
29 ;Poczatek kodu programu 87
30 8000 org 8000h 88 807A 757B40 mov DL4,#_minus
31 8000 028054 ljmp START ;petla glowna od 89 807D 757C40 mov DL5,#_minus
;etyk. START 90 8080 75F004 mov B,#4
32 91 8083 1203A7 lcall GETACC ;pobranie
33 ;*********************************************** ;poczatkowej
34 ;Wektor przerwania od licznika T1 ;minuty
35 801B org 801Bh 92 8086 F561 mov MIN,A
36 801B intT1: ;poczatek proc.przer.T1 93
37 801B 758D1F mov TH1,#Czest ;przeladowanie 94 8088 757E40 mov DL7,#_minus
;licznika T1 95 808B 757F40 mov DL8,#_minus
38 801E 96 808E 75F007 mov B,#7
39 801E 0563 inc licz128 ;zwiekszenie 97 8091 1203A7 lcall GETACC ;pobranie
;licznika 1/128sek. ;poczatkowej
40 8020 E563 mov A,licz128 ;sekundy
41 8022 C2E7 clr Acc.7 98 8094 F562 mov SEK,A
42 8024 7027 jnz koniecT1 99 8096
43 100 8096 757A40 mov DL3,#_minus ;zapalenie kresek
44 8026 E562 mov A,SEK ;w postaci
45 8028 2401 add A,#1 ;zwiekszenie 101 8099 757D40 mov DL6,#_minus ;GG-MM-SS
;licznika sekund ;(godzina
46 802A D4 da A ;z korekcja ;wprowadzona !)
;dziesietna 102 809C 74FA mov A,#250
47 802B F562 mov SEK,A 103 809E 120295 lcall DELAY ;odczekanie
48 802D B4601D cjne A,#60h,koniecT1 ;czy SEK > 59?, ;ok. 0,5 sekundy
;nie to skocz 104 80A1 1202C5 lcall CONIN ;czekanie na start
49 8030 756200 mov SEK,#0 ;tak to wyzeruj ;zegara (klawisz)
;sekundy 105 80A4 D28E setb TR1 ;start licznika
50 8033 ;i koryguj minuty ;(zegara)
51 8033 E561 mov A,MIN 106
52 8035 2401 add A,#1 ;zwiekszenie 107 80A6 pokaz:
;licznika minut 108 80A6 E563 mov A,licz128
53 8037 D4 da A ;z korekcja 109 80A8 30E608 jnb Acc.6,pelne ;co 1/2 sekundy
;dziesietna ;pokazuj na zmiane
54 8038 F561 mov MIN,A 110 80AB 757A00 mov DL3,#0 ;puste DL3 i DL6
55 803A B46010 cjne A,#60h,koniecT1 ;czy MIN > 59?, 111 80AE 757D00 mov DL6,#0
;nie to skocz 112 80B1 8006 sjmp czas
56 803D 756100 mov MIN,#0 ;tak to zeruj minuty 113 80B3 757A40 pelne: mov DL3,#_minus ;i kreski na DL3
57 8040 ;i koryguj godziny ;i DL6
58 8040 E560 mov A,GODZ 114 80B6 757D40 mov DL6,#_minus
59 8042 2401 add A,#1 ;zwiekszenie 115 80B9 czas:
;licznika minut 116 80B9 E560 mov A,GODZ
60 8044 D4 da A ;z korekcja 117 80BB 75F001 mov B,#1 ;na DL1.DL2
;dziesietna 118 80BE 12024E lcall A2HEX ;wypisz godziny
61 8045 F560 mov GODZ,A 119 80C1 E561 mov A,MIN
62 8047 B42403 cjne A,#24h,koniecT1 ;czy GODZ > 23 ?, 120 80C3 75F004 mov B,#4 ;na DL4.DL5
;nie to skocz 121 80C6 12024E lcall A2HEX ;wypisz minuty
63 804A 756000 mov GODZ,#0 ;tak to zeruj 122 80C9 E562 mov A,SEK
;godziny 123 80CB 75F007 mov B,#7 ;na DL6.DL7
64 124 80CE 12024E lcall A2HEX ;wypisz sekundy
65 804D koniecT1: 125 80D1 80D3 sjmp pokaz ;i od poczatku
66 804D D082 pop DPL ;odtworzenie 126
;rejestrow 127 80D3 END
67 804F D083 pop DPH ;ze stosu
46 ELEKTRONIKA DLA WSZYSTKICH 5/98


Wyszukiwarka

Podobne podstrony:
Mikrokontrolery To takie proste, cz 11 (opis podprogramów komputerka edukacyjnego)
Mikrokontrolery To takie proste, cz 11 (opis podprogramów komputerka edukacyjnego)
Mikrokontrolery To takie proste, cz 15 (układ licznikowy w 8052C & specjalne tryby pracy 8051)
Mikrokontrolery to takie proste cz 03
Mikrokontrolery to takie proste cz 02a
Mikrokontrolery To takie proste calosc

więcej podobnych podstron