wyklad 3.pdf

(219 KB) Pobierz
54841871 UNPDF
Hit roku 2000
BASCOM College
Wykład 3
Do redagowania kolejnego wykładu BA−
SCOM College przystępuję w zupełnie no−
wym, lepszym nastroju niż do pisania po−
przednich artykułów! Nareszcie przestałem
się poruszać po omacku i uzyskałem dane
potrzebne mi do nadania kolejnym wykła−
dom właściwej treści i formy. Przyczyniła się
do tego analiza listów e−mailowych nadesła−
nych mi przez Czytelników. I tu od razu
chciałbym przeprosić tych, którym nie zdą−
żyłem indywidualnie odpowiedzieć na listy.
Nie oznacza to bynajmniej, że zostały one
wrzucone do kosza. Wprost przeciwnie, każ−
dy list został przeczytany i przeanalizowany,
a indywidualne odpowiedzi wysłane tylko
tym Czytelnikom, którzy zadawali konkretne
pytania. Jeżeli o kimś zapomniałem, to raz
jeszcze przepraszam.
Ogólnie mówiąc, jestem więcej niż zado−
wolony. Oczywiście nie z siebie, ale z Was,
Drodzy Studenci BASCOM College.
W nadesłanych listach przeważały wypo−
wiedzi osób może nie zawsze biegłych
w sztuce programowania (w końcu, co mie−
liby oni do roboty w szkole), ale prawie za−
wsze MYŚLĄCYCH, co przy doskonaleniu
umiejętności polegającej wyłącznie na kon−
sekwentnym i popartym żelazną logiką my−
śleniu, ma kapitalne znaczenie. Nadesłane li−
stingi nieraz aż roiły się od błędów, ale wy−
nikały one najczęściej z pośpiechu i niecier−
pliwości oraz niezbyt dokładnej znajomości
składni języka, a nie z błędów w rozumowa−
niu. Właśnie: niecierpliwość to chyba naj−
częstszy błąd, jaki popełniacie! Czego jak
czego, ale cierpliwości programista musi
mieć pod dostatkiem. Zawsze musicie pa−
miętać, że błąd może kryć się w każdej napi−
sanej linijce, w jednym źle postawionym
przecinku czy innym znaku. Oczywiście,
kompilator wychwytuje i zgłasza wszelkie
błędy w składni, ale nawet najmądrzejszy
program komputerowy nie jest w stanie wy−
kryć błędów w logice programu. Pisanie pro−
gramów to przede wszystkim uwaga, cierpli−
wość, nieprzespane noce i hektolitry wypija−
nej podczas pracy szatańsko mocnej kawy.
No i oczywiście “iskra Boża”, bez tego też
niewiele można zdziałać!
W kilku listach pojawiły się doniesienia
o niesprawnym działaniu kompilatora, a na−
wet zarzuty o promowaniu nieudanego pro−
duktu. Niestety, po przeanalizowaniu frag−
mentów listingu zawsze okazywało się, że
wina leżała po stronie niezbyt doświadczone−
go lub zadufanego we własne umiejętności
programisty. Pakiet BASCOM używany jest
przez tysiące elektroników na całym świecie
i zdecydowana większość błędów została
z niego dawno usunięta. Pamiętajcie zatem,
że zanim zaczniecie podejrzewać kompilator
o błędy, najpierw sprawdźcie sto razy, czy sa−
mi ich nie popełniacie. W 99 przypadkach na
100 “rację” ma kompilator, słusznie “czepia−
jąc” się niezrozumiałej dla niego składni ję−
zyka.
Analizując Wasze listy e−mailowe dosze−
dłem do wniosku, że największe problemy
stwarzają Wam następujące tematy:
A zatem te trzy wymienione sprawy będą
tematem dzisiejszej lekcji. Pomęczymy się
trochę z teorią, co nie oznacza, że nie wyko−
namy nowych, praktycznych ćwiczeń. Przy
okazji omawiania posługiwania się timerami
zaprojektujemy sobie pierwszy, wykonany
w technice mikroprocesorowej, w pełni funk−
cjonalny zegarek.
Zanim jednak przejdziemy do konkretów,
chciałbym wyczerpać do końca sprawę po−
mocy w Waszej pracy i rozwiązywania pro−
blemów, na jakie napotykacie. Nie jestem
żadnym najwyższym autorytetem w tych
sprawach (jak niesłusznie nazwał mnie jeden
z Was). Najwyższym autorytetem jest mój
Przyjaciel, pan Mark Alberts z Holandii,
który o programowaniu procesorów wie
wszystko . Zawsze możecie zwrócić się do
niego o pomoc, oczywiście tylko w bardzo
trudnych sprawach lub gdy jesteście prawie
pewni, że znaleźliście pluskwę w programie.
Możecie wysłać maila bezpośrednio do MCS
Electronics, ale najlepszą metodą uzyskania
pomocy i Marka, i setek ludzi z całego świa−
ta jest zapisanie się na listę dyskusyjną BA−
SCOMMALIST (www.mcselec.com.) Rzecz
jasna, korespondencja może być prowadzona
wyłącznie w języku międzynarodowym, ale
mam nadzieję, że na biurkach Kolegów nie
władających do tej pory językiem amery−
kańskim leżą już stosowne podręczniki
i chociażby bierne opanowanie tego języka
jest już dla nich tylko kwestią czasu. Jeszcze
raz zapraszam Was do dołączenia się do tej
listy, jest wspaniała, tam nikt nie poszukuje
cracków do kradzionego oprogramowania i
nie zamieszcza ogłoszeń o “uruchamianiu”
kodowanych odbiorników radiowych. Trwa
tam nieustanna burza mózgów i wymiana do−
świadczeń, bez uwarunkowań typu “wiem,
ale nikomu nie powiem”, tak częstego na na−
szych listach.
Koledzy, którzy zaczęli już pisać własne
programy, na największe trudności napotkali
podczas pisania tych ich fragmentów, które
zajmują się obsługą timerów i przerwań. To
oczywiste: znają oni najprawdopodobniej
całkiem nieźle język BASIC, ale wyłącznie
jego dialekty “komputerowe”, w których ob−
sługa timerów raczej nie występuje!
Problemy z emulatorem sprzętowym, wy−
nikające często z niezbyt dokładnego opisania
jego działania w 3/00 Elektroniki dla Wszyst−
kich. Cóż, mea culpa, jeżeli starczy nam cza−
su, to za chwilę poruszymy jeszcze ten temat.
Elektronika dla Wszystkich
19
Problemy z obsługą programatora, nie−
znajomość zasad jego konfigurowania.
54841871.051.png 54841871.058.png 54841871.059.png
 
BASCOM
Obsługa programatorów
pakietu BASCOM8051
Fragment pakietu BASCOM, obsługujący
programatory, jest jedną z najbardziej uży−
tecznych i ciekawych części tego programu.
Bez najmniejszej przesady mogę powiedzieć,
że jest to “państwo w państwie”, odrębne śro−
dowisko, które może być wykorzystywane
łącznie z kompilatorem, ale także jako samo−
dzielne oprogramowanie. Sądzę, że pełne
opisanie tego fragmentu BASCOM−a jest
obecnie sprawą najwyższej wagi, tym bar−
dziej, że wiedza ta może być niezwykle uży−
teczna także dla Kolegów piszących progra−
my w językach innych niż MCS BASIC.
A więc, zaczynamy!
W poprzedniej lekcji napisałem, że najprost−
szą metodą posługiwania się programatorem
jest zaznaczenie w menu OPTIONS PRO−
GRAMMER opcji AUTO FLASH i po wybra−
niu typu programatora (najczęściej MCS Flash−
programmer, będący w Waszym posiadaniu)
przechodzenie do programowania procesora za
pomocą naciskania klawisza F4. Rzeczywiście,
jest to metoda najprostsza, ale jak każe upro−
szczenie, nieco ograniczająca oferowane przez
BASCOM możliwości. Przede wszystkim za−
myka ona drogę do możliwości programowania
procesorów za pomocą plików skompilowa−
nych w innym niż BASCOM środowisku. Jed−
nak nie tylko o to
chodzi: prędzej czy
później po naciśnię−
ciu klawisza F4 po−
jawi się na ekranie
komunikat o błędzie
( rys. 1 ). I co wtedy?
Musimy zatem “dobrać się” do wszyst−
kich, bogatych możliwości oferowanych nam
przez obsługę programatora. Zakładam, że
do komputera macie dołączony programator
MCS Flashprogrammer opisany w Elektroni−
ce dla Wszystkich i że w podstawce progra−
matora umieszczony jest jeden z procesorów
rodziny ‘X051. Nie ma przy tym znaczenia,
czy jest to procesor “fabrycznie nowy”, czy
też zapisany jest już w nim jakiś program.
Zakładam także, że napisaliście uprzednio
i skompilowaliście jakiś program, przy czym
także bez znaczenia jest jego treść.
Otwieramy zatem ponownie panel
OPTIONS PROGRAMMER i tym razem
“odznaczamy” opcję AUTO FLASH ( rys. 2 )
i po zamknięciu tego okna naciskamy po−
nownie F4 ....
... Wow, ale bogactwo! Na ekranie pokazał
nam się nowy, nieznany dotąd panel ( rys. 3 ),
a na nim cała masa przycisków i opcji. Za−
czniemy od otwarcia okienka CHIP słusznie
przypuszczając, że uzyskamy w ten sposób do−
stęp do operacji wykonywanych bezpośrednio
na procesorze. Zanim jednak to uczynimy, wy−
jaśnijmy sobie, co właściwie znajduje się
w największym oknie panelu. Otóż, w “białej”
części środkowego panelu znajduje się treść
skompilowanego uprzednio (lub, jak dowiemy
się za chwilę, wczytanego) programu, zapisana
w kodzie heksa−
decymalnym,
a w części “nie−
bieskiej” to samo,
ale w kodzie bi−
narnym.
Są to informacje, z których w obecnej
chwili nie będziemy mieli większego pożyt−
ku, tak więc tylko przyjmujemy ich istnienie
do wiadomości, a także zapamiętujemy że,
w tym okienku możemy także dokonywać
edycji programu w formacie HEX i naciska−
my przycisk CHIP . Na ekranie pojawia się
natychmiast kolejne okienko, a w nim nastę−
pujące funkcje:
GET TYPE (określ typ procesora). Jest to bar−
dzo pożyteczna funkcja, pozwalająca określić
nie tylko typ procesora włożonego w pod−
stawkę, lecz nawet jego producenta. Powyż−
sze informacje “zaszyte” są wewnątrz każde−
go procesora, ale ponieważ nie mają żadnego
wpływu na jego działanie, także tylko przyj−
mujemy ich istnienie do wiadomości. Czy
jednak aby na pewno BASCOM jest taki mą−
dry i potrafi jednoznacznie oznaczyć typ
układu w podstawce programatora? Sprawdź−
my to: zamknijmy na chwilę okienko CHIP
i panelu głównym programatora zaznaczmy
typ procesora inny, niż ten na którym dyspo−
nujemy (np. 89C1051). Ponownie otwieramy
pasek CHIP i klikamy GET TYPE. Natych−
miast powinna wyświetlić się informacja ta−
ka, jaką widzimy na rysunku 3, o ile oczywi−
ście w podstawce znajduje się chip 89C2051.
Tu bardzo ważna uwaga: identyfikacja ty−
pu procesora jest zawsze (?) niezawodna,
czego nie można powiedzieć o identyfikacji
producenta. Niekiedy zdarza się, że pro−
gram nie jest w stanie określić tej informa−
cji i na ekranie pojawia się napis: MANU−
FACTURER UNKNOWN. Nie ma to naj−
mniejszego znaczenia dla pracy programa−
tora , ale jest dość ciekawe. Kilkakrotnie na−
potykałem na to zjawisko wkładając w pod−
stawkę nowiutkie procesory z napisem
ATMEL, widocznym ze stu metrów, a pro−
gram podawał, że nie może określić produ−
centa chipa. Może podróbki?
ERASE (skasuj zawartość pamięci EEPROM
procesora). Wykonanie tego polecenia spo−
woduje wymazanie CAŁEJ zawartości pa−
mięci programu, a także skasowanie bitów
zabezpieczających . Jest to bardzo ważne po−
lecenie, a o jego użyteczności przekonamy
się za chwilę.
SET LOCKBIT1 i SET LOCKBIT2 (ustaw bit za−
bezpieczający 1 i 2, rys. 4 ). Jest to także nie−
zwykle ważna funkcja, za pomocą której
w przyszłości będziemy mogli ... zabezpieczyć
nie co innego, jak
nasze interesy
i korzyści finanso−
we, jakie będzie−
my mogli czerpać
z naszej pracy.
Każdy progra−
mista jest wyłącznym właścicielem napisa−
nego przez siebie programu i może nim
dysponować w całkowicie dowolny sposób,
także sprzedając dowolną liczbę jego kopii.
Niestety, nie wszyscy, szczególnie w Polsce,
rozumieją to prawo i respektują prawo autor−
skie. Ustawienie bitów zabezpieczających
jest dokładnie tym samym, co założenie moc−
nych zamków w drzwiach domu: chroni nas
przed, nazwijmy to po imieniu, złodziejami.
3
5
1
Kliknięcie na przycisk SET LOCKBIT 2
spowoduje, że zawartości pamięci programu
nie będzie już można nigdy w żaden sposób
odczytać. Nikt już teraz nie skopiuje Waszej
pracy i nie “podzieli się” z Wami korzyścia−
mi z niej płynącymi. Natomiast kliknięcie
SET LOCKBIT1 chroni Was nie tyle przed
naruszeniem praw autorskich, ile raczej
przed ... własnym roztargnieniem. Po usta−
wieniu tego bitu zabezpieczającego można
wprawdzie odczytać zawartość pamięci pro−
cesora, ale nie można do niej niczego zapi−
sać, chyba że pamięć EEPROM zostanie
przedtem świadomie skasowana. Bardzo
użyteczne, przekonałem się kilka razy! Czy
jednak to co napisałem, znajduje odbicie
w praktyce? Sprawdźmy zatem empirycznie
działanie zabezpieczeń. Wybiegając w na−
szych rozważaniach nieco naprzód, otwórz−
my panel BUFFER i kliknijmy przycisk
PROGRAM CHIP. Dioda LED w programa−
torze zapali się na chwilę i zgaśnie po zapro−
gramowaniu procesora. Wróćmy teraz znowu
do panelu CHIP i kliknijmy SET LOCKBIT
2. Tym razem dioda w programatorze tylko
błyśnie i pozornie nic wielkiego się nie wyda−
rzyło. Na pewno? Skoczmy zatem ponownie
do panelu BUFFER i kliknijmy funkcję RE−
AD FROM CHIP (odczytaj zawartość pamię−
ci programu procesora). Po kilku sekundach
2
20
Elektronika dla Wszystkich
4
54841871.001.png 54841871.002.png 54841871.003.png 54841871.004.png 54841871.005.png 54841871.006.png 54841871.007.png
BASCOM
w głównej części panelu pojawi się odczyta−
na z pamięci procesora informacja ( rys. 5 ).
Jednak z pewnością nie jest to napisany przez
nas i skompilowany program! Na ekranie po−
jawiły się same “FFki”, co świadczy o tym,
że pamięć procesora jest obecnie widziana
jako czysta, nie zaprogramowana, i odczyty−
wanie jej zawartości nie ma najmniejszego
sensu.
Zajmijmy się
teraz następnym
panelem dostęp−
nym z okienka
programatora:
BUFFER (rys.
6). W tym wła−
śnie okienku znajdziemy najpotrzebniejsze
w dalszej pracy narzędzia:
CLEAR (wyczyść bufor). Kliknięcie tej funk−
cji powoduje wyczyszczenie zawartości bu−
fora programatora, która zostanie zapełniona
samymi FFkami. Ta akurat funkcja jest sto−
sunkowo mało użyteczna, ale jeżeli już jest...
READ FROM DISK (wczytaj dane z dysku do
bufora). To chyba jedna z najważniejszych
opcji programatora! Umożliwia ona wczy−
tanie do bufora, a następnie zaprogramo−
wanie procesora dowolnym programem
na ‘X051 (a także kilka innych typów pro−
cesorów, m. in. na 8052), zapisanym w ko−
dzie binarnym, czyli praktycznie każdego
pliku binarnego wygenerowanego przez
dowolny kompilator obsługujący dowolny
język programowania. Nie obowiązują tu
żadne ograniczenia wersji DEMO: wczy−
tywany plik binarny może mieć dowolną
wielkość, oczywiście mieszczącą się w wy−
branym typie procesora .
Dane do bufora programatora wczytywane
są zgodnie z ogólnie przyjętymi w systemie
WINDOWS zasadami, możemy przechodzić
z jednego katalo−
gu do drugiego,
a wyświetlane są
wyłącznie pliki
typu *.BIN
( rys.7 ).
WRITE TO DISK
(zapisz zawartość bufora programatora na
dysku). Ta opcja pozwala na zapisanie na
dysku, w dowolnym katalogu i pod dowolną
nazwą pliku znajdującego się aktualnie w bu−
forze programatora. Może mieć ona zastoso−
wanie przy zapisywaniu plików odczytanych
z pamięci procesora poleceniem:
READ FROM CHIP (odczytaj plik z pamięci
EEPROM procesora). Klikniecie tego
przycisku spowoduje wczytanie do bufora
programatora zawartości pamięci progra−
mu procesora, o ile ta nie została zabezpie−
czona lock bitami i posiadamy na to zgodę
autora programu. Odczytanymi danymi
możemy następnie zaprogramować dowol−
ną liczbę procesorów (widzimy tu właśnie
sens stosowania zabezpieczeń) lub zapisać
je na dysku.
WRITE TO CHIP (zapisz zawartość bufora
w pamięci procesora). Wydanie tego polece−
nia spowoduje przeniesienie zawartości bu−
fora do pamięci EEPROM procesora. Uwa−
ga: wydając to i tylko to polecenie można
wpuścić się w niezłe maliny i należy stoso−
wać je z dużą ostrożnością. Programator
po wydaniu tego polecenia kopiuje zawar−
tość bufora do procesora, nie zwracając
uwagi, czy w pamięci programu nie pozo−
stały jakieś zbędne dane! Nic jednak tak
nie przekonuje, jak celowy i sprawnie prze−
prowadzony eksperyment:
a) Zaprogramujmy procesor jakimkol−
wiek programem, najlepiej o znacznej obję−
tości. Możemy tu wykorzystać przycisk
PROGRAM CHIP, którego działanie omówi−
my za chwilę.
b) Napiszmy sobie dowolny krótki pro−
gramik, byle co, może robić np. “ LCD
“TEST” ” i skompilujmy go.
c) Wejdźmy z powrotem do panelu pro−
gramatora, wybierzmy CHIP i WRITE TO
CHIP. Zapalenie się diody w programatorze
mogłoby świadczyć, że operacja programo−
wania przebiegła pomyślnie. Nie radzę jed−
nak wkładać tak zaprogramowanego proce−
sora w podstawkę płytki testowej i spraw−
dzać jego działania. Powróćmy zatem do opi−
su panelu BUFFER, aby dowiedzieć się, czy
procesor został na pewno zaprogramowany
poprawnie!
VERIFY (sprawdź
zgodność zawarto−
ści pamięci bufora
z zawartością pa−
mięci EEPROM
procesora). Przycisk ten pozwala na weryfi−
kację poprawności programowania i po jego
naciśnięciu z pewnością pojawi się przed na−
szymi oczami napis taki, jak na rysunku 8 .
Co to oznacza, dlaczego programowanie pro−
cesora się nie udało? To proste: przed progra−
mowaniem z pamięci procesora nie został
usunięty poprzedni program i w EEPROM−ie
powstał przysłowiowy “groch z kapustą”!
Programowanie pamięci EEPROM mi−
kroprocesorów ‘X051 możliwe jest tylko
wtedy, kiedy każdy bajt, który ma zostać
zaprogramowany ma wartość FF . W prak−
tyce oznacza to, że pamięć używanego już
procesora musi zostać skasowana przed roz−
poczęciem ponownego programowania. Zo−
stawmy zatem polecenie WRITE TO CHIP
do celów specjalnych i zwykle używajmy:
PROGRAM CHIP (zaprogramuj procesor). Wy−
danie tego polecenia spowoduje wykonanie
przez programator dwóch kolejno następują−
cych po sobie czynności: skasowania pamięci
procesora i zapełnienie jej samymi FFkami,
a następnie wpisanie do tej pamięci nowego
programu. Sprawdźmy działanie tego polece−
nia, naciskając kolejno PROGRAM CHIP,
a po zaprogramowaniu procesora: VERIFY.
Tym razem wyświetlony w dolnej części pane−
lu komunikat “Buffer and chip are identical
8
6
7
9
Elektronika dla Wszystkich
21
54841871.008.png 54841871.009.png 54841871.010.png 54841871.011.png 54841871.012.png 54841871.013.png 54841871.014.png 54841871.015.png 54841871.016.png 54841871.017.png 54841871.018.png 54841871.019.png 54841871.020.png 54841871.021.png 54841871.022.png 54841871.023.png 54841871.024.png 54841871.025.png 54841871.026.png 54841871.027.png 54841871.028.png 54841871.029.png 54841871.030.png 54841871.031.png 54841871.032.png 54841871.033.png 54841871.034.png 54841871.035.png 54841871.036.png 54841871.037.png 54841871.038.png 54841871.039.png 54841871.040.png 54841871.041.png 54841871.042.png 54841871.043.png 54841871.044.png 54841871.045.png 54841871.046.png 54841871.047.png
BASCOM
(bufor i zawartość pamięci procesora są iden−
tyczne) oznajmił nam o poprawnym przepro−
wadzeniu operacji programowania procesora.
W panelu programatora pozostał nam już
tylko jeden przycisk do naciśnięcia: EXIT.
Zróbmy to zatem, a działanie tego ostatniego
polecenia pozwoli nam, po chwili odpoczyn−
ku i wypiciu filiżanki dobrej kawy, zabrać się
za kolejny temat:
Tryb 0
Tryb pracy 0 jest identyczny dla licznika
TO i licznika TL. W trybie tym układ pracu−
je jako 13−bitowy czasomierz / licznik. Stan
licznika określany jest zawartością rejestru
TH[0,1] oraz pięciu młodszych bitów reje−
stru TL[0,1]. Stan trzech starszych bitów re−
jestru TL[0,1] jest nieokreślony. Przepełnie−
nie licznika, czyli zliczenie impulsu, wskutek
którego stan wszystkich bitów zmienia się
z 1 na 0. Przepełnienie licznika może być sy−
gnalizowane zgłoszeniem przerwania TI−
MER[0,1].
Zliczanie ma miejsce tylko wtedy, gdy
wydane zostało na to zezwolenie za pomocą
plecenia START TIMER[0,1]. I może być za−
trzymane poleceniem STOP TIMER[0,1].
CONFIG TIMER0= COUNTER/TI−
MER, GATE=INTERNAL/EXTERNAL,
MODE=0−3
Musimy zatem określić wstępnie trzy naj−
ważniejsze parametry decydujące o sposobie
pracy każdego z timerów.
1. TIMER[0,1] = TIMER
− wskazany timer zlicza impulsy pochodzące
z wewnętrznego oscylatora
TIMER[0,1] = COUNTER
− wskazany timer zlicza impulsy
dostarczane na wejście T0 lub T1
Timery
Bloki timerów − liczników umieszczo−
ne wewnątrz struktury procesorów ’51 są
jednymi z najbardziej użytecznych ukła−
dów, jakie możemy wykorzystywać w na−
szej pracy. Umożliwiają one dokonywanie
wszelkich operacji rozgrywających się
w czasie rzeczywistym, budowanie zega−
rów, timerów, stoperów oraz innych ukła−
dów, których działanie uzależnione jest od
upływu czasu. Jednocześnie, obsługa ti−
merów sprawia zwykle wiele problemów
początkującym programistom. Utarło się
nawet przekonanie, że operacje związane
z timerami i przerwaniami to przysłowio−
wa “czarna magia” i że lepiej się za nią nie
zabierać. Cóż, przy odrobinie uwagi pora−
dzimy sobie z pewnością tak z timerami,
jak i na następnej lekcji z przerwaniami,
a “zabierać się” za te tematy musimy, bo
inaczej nie będziemy w stanie napisać
większości potrzebnych nam programów.
Mam zresztą zamiar udowodnić Wam, że
wykorzystywanie timerów jest naprawdę
banalnie proste (no chyba, że używamy
kilku timerów i przerwań jednocześnie,
wtedy trzeba się trochę pomęczyć). Do−
wód przeprowadzimy w najbardziej spek−
takularny sposób: zbudujemy wspólnie
nasz pierwszy zegar mikroprocesorowy:
prosty, lecz w pełni funkcjonalny układ
czasomierza, mogący znaleźć liczne zasto−
sowania praktyczne. Najpierw jednak za−
poznajmy się z niezbędnymi informacjami
teoretycznymi.
Procesory podrodziny ‘X051 wyposażone
są w dwa umieszczone w ich strukturze 2 x 8−
bitowe timery: Timer0 i Timer1. Timery mo−
żemy traktować trochę jako osobne układy,
jedynie sterowane z procesora i potrafiące
zgłaszać mikrokontrolerowi fakt przepełnie−
nia ich zawartości. Do rejestru timera może−
my w każdej chwili zapisać dowolną liczbę
(oczywiście, z dozwolonego aktualnie sto−
sownym trybem zakresu), zatrzymać lub uru−
chomić liczniki. Impulsy zliczane przez time−
ry mogą być równie dobrze pobierane z wnę−
trza procesora, jak i z zewnętrznego źródła.
Możliwości jest wiele i najwyższy czas tro−
chę uporządkować nasze wiadomości na te−
mat timerów − liczników.
Każdy timer składa się z dwóch rejestrów
− liczników TL[numer timera] i TH[numer ti−
mera]. Timer może pracować w jednym
z czterech, określonych programowo trybów:
2. GATE = EXTERNAL − timer, do
którego odnosi się to polecenie będzie uru−
chamiany i zatrzymywany stanem na wejściu
przerwania INT0 lub INT1
GATE = INTERNAL − timer, do
którego odnosi się to polecenie będzie uru−
chamiany i zatrzymywany poleceniami pro−
gramowymi
Tryb 1
Tryb 1 pracy liczników TO i T1 jest nie−
mal identyczny z trybem 0. Jedyną różnicą
jest wykorzystywanie pełnej pojemności re−
jestrów TL[0,1], a tym samym zwiększenie
pojemności licznika z 13 do 16 bitów.
Tryb 2
W trybie 2 liczniki pracują jako 8−bitowe
liczniki (TL[0,1]), z automatycznym przeła−
dowaniem. Przepełnienie TL[0,1] nie tylko
powoduje wygenerowanie przerwania, ale
jednocześnie ładuje TL[0,1] zawartością
TH[0,1]. Zawartość TH[0,1] może być w do−
wolnej chwili zmieniana programowo. Ope−
racja przeładowania nie powoduje zmiany
zawartości rejestru TH[0,1].
3. MODE − określenie trybu pracy wska−
zanego timera (omówione powyżej)
Każdy z timerów, niezależnie od wybra−
nego trybu pracy, może być wstępnie “zała−
dowany” wartością, od której po uruchomie−
niu rozpocznie zliczanie. Ładowania timera
dokonujemy za pomocą następujących pole−
ceń programowych:
LOAD TIMER[0,1] , [wartość]
gdzie wartość jest liczbą z przedziału 0−
255 dla trybu 2, lub 0 − 65535 dla trybu 1
lub
COUNTER[0,1] = [wartość]
gdzie wartość jest liczbą z przedziału 0−
255 dla trybu 2, lub 0 − 65535 dla trybu 1
Tryb 3
Tryb 3 jest jedynym trybem, w którym
sposób działania licznika T1 różni się od
licznika T0. Wprowadzenie licznika T1
w tryb 3 pracy powoduje jego zatrzymanie,
czyli daje ten sam efekt, co wydanie polece−
nia STOP TIMER1 w którymkolwiek z pozo−
stałych trybów pracy licznika T1. Licznik T0
w trybie 3 wykorzystuje swoje obydwie po−
łówki (THO i TLO) jako dwa niezależne
liczniki 8−bitowe. Jeden z nich (utworzony
z TLO) funkcjonuje, podobnie jak cały licz−
nik T0, w trybie 0 lub 1, przy czym jedyną
różnicą jest pojemność licznika wynosząca 8
bitów. Druga część (THO) tworzy 8−bitowy
czasomierz zliczający cykle maszynowe.
Włączanie i wyłączanie czasomierza odbywa
się za pomocą polecenia START TIMER0,
natomiast jego przepełnienie powoduje wy−
generowanie przerwania TIMER0.
Zanim rozpoczniemy jakiekolwiek do−
świadczenia z timerami, zbierzmy razem
wszystkie polecenia języka MCS BASIC,
służące ich sterowaniu, i wyjaśnijmy sobie
ich znaczenie. Najważniejszym poleceniem,
jakie należy wydać przed rozpoczęciem pra−
cy timerów jest określenie ich konfiguracji.
Ogólna postać tego polecenia wygląda na−
stępująco:
Tu bardzo ważna uwaga:
Timer zlicza impulsy od zadanej (załado−
wanej) liczby w górę, aż do osiągnięcia stanu
11111111 (w trybie2) lub 11111111 11111111
(w trybie 1). A zatem, aby otrzymać sygnał
przerwania np. po 10 impulsach, należałoby
do timera załadować wartość równą 256 − 10
czyli 246. Na szczęście język MCS BASIC
zwalnia nas od konieczności dokonywania
nawet tak prostego obliczenia (odnoszę cza−
sami wrażenie, że dewizą Marka jest ”Co tu
wymyślić, aby inni nie musieli myśleć”)
i sam wykonuje potrzebne kalkulacje.
A zatem, wydanie polecenia:
LOAD TIMER0, 10
Spowoduje wystąpienie przerwania po 10
cyklach maszynowych procesora.
Następujące polecenia służą uruchamia−
niu i zatrzymywaniu timerów:
22
Elektronika dla Wszystkich
54841871.048.png 54841871.049.png
BASCOM
START TIMER[0,1] − włącza wska−
zany timer. Równoważne mu jest polecenie:
START COUNTER[0,1]
nuje specjalną procedurę określaną mianem
procedury obsługi przerwania. Po zakończe−
niu tej procedury mikrokontroler wraca do
wykonywania programu głównego, począw−
szy od miejsca, w którym zostało ono zawie−
szone.
Podstawową funkcją przerwań jest umoż−
liwienie szybkiego reagowania na wydarze−
nia zewnętrzne. Zaletą wykorzystywania
przerwań jest też uproszczenie oprogramo−
wania. Wynika ono m.in. stąd, że program
główny jest uwalniany od konieczności testo−
wania stanu wybranych układów peryferyj−
nych lub linii sygnałowych, ponieważ w ra−
zie stosowania przerwań operacje te są reali−
zowane sprzętowo.
jeszcze raz, zmieniając wartość czasu oczeki−
wania na np. 250. Po powtórnym skompilo−
waniu i uruchomieniu w symulacji okazało
się, że tym razem czekaliśmy na wystąpienie
przerwania znacznie dłużej! Bingo, ekspery−
ment potwierdził przewidywania teoretyczne!
Jeżeli jednak to doświadczenie się udało, to
przeprowadźmy jeszcze kilka innych, także
w symulacji programowej.
Usuńmy teraz polecenie END kończące
działanie programu po wystąpieniu przerwa−
nia i uruchommy nasz programik jeszcze raz.
Oczywiście, nie zapominajmy o kompilowa−
niu go po wprowadzeniu każdej zmiany!
Okazało się, że tym razem program nie za−
trzymuje się, ale po każdym przerwaniu wy−
syła na ekran komunikat o jego wystąpieniu.
STOP TIMER[0,1] − zatrzymuje
wskazany timer. Równoważne mu jest pole−
cenie:
STOP COUNTER[0,1]
Trudno sobie wyobrazić sytuację,
w której uruchomiony timer działałby sobie,
a muzom, nie wywierając jakiegokolwiek
wpływu na program sterujący pracą proceso−
ra. Musimy zatem poinstruować procesor, ja−
kie czynności mają zostać wykonane w przy−
padku wystąpienia przerwania (przepełnie−
nia) pracującego timera. Służy temu polece−
nie programowe:
ON TIMER[0,1] [nazwa pod−
programu]
Config Timer0 = Timer , Gate = Internal , Mode = 2 'konfiguracja
timera 0
Load Timer0 , 5
'załadowanie do
timera wartości 256−5
On Timer0 Timerinterrupt
Gdzie podprogram powinien mieć nastę−
pującą postać:
'po wystąpieniu
przerwania skocz do podprogramu timerinterrupt
Enable Timer0
'zezwalam na
obsługę przerwania z timera 0
Enable Interrupts
Nazwa podprogramu:
Czynności do wykonania
...
...
...
RETURN
'globalne zezwolenie na obsługę przerwań
Start Timer0
'start timera 0
Do
'program wpętli
oczekuje na przerwanie
Loop
Timerinterrupt: 'podprogram obsługi przerwania
Print "Timer interrupt!" 'po wystąpieniu przerwania napisz ten tekst
End 'koniec programu
Return 'dodane
"dla porządku", po poleceniu END nie ma właściwie sensu
Bardzo często zdarza się, że nie mamy za−
miaru wykorzystywać przerwań przez cały
czas pracy programu. Dlatego też na obsługę
przerwań muszą zostać wydane specjalne ze−
zwolenia, które w każdym momencie mogą
zostać cofnięte.
W niektórych mikroprocesorach jedynym
rodzajem przerwań są przerwania zewnętrz−
ne. W mikrokontrolerach, oprócz przerwań
zewnętrznych, występują też z reguły prze−
rwania od wewnętrznych układów peryferyj−
nych (np. timerów, dod. Z.R.).”
Na obecnym etapie nauki ta definicja po−
winna nam wystarczyć.
Najwyższy czas przejść od teorii do prak−
tyki i wypróbujmy działanie timerów w kon−
kretnych przykładach. Posłużymy się w tym
celu emulacją programową, której główna
wada − ślimacze tempo pracy, stanie się
w tym momencie zaletą. Operacje wykony−
wane “w rzeczywistym świecie” przez time−
ry rozgrywają się w takim tempie, że obser−
wacja ich byłaby praktycznie niemożliwa.
Napiszmy sobie zatem następujący, prosty
programik:
Skompilujmy go i uruchommy w symula−
cji programowej. Jeszcze raz przypominam,
że podawane przykłady odnoszą się do trybu
„symulacji procesora“ i „żywcem“ przenie−
sione do „rzeczywistego układu“ nie będą
pracować poprawnie. Po naciśnięciu przyci−
sku START w symulatorze prawie natych−
miast w okienku emulatora terminala pojawił
się napis “Timer interrupt!”. Chyba wszystko
jest OK, ale na wszelki wypadek sprawdźmy
Ciekawe, to może mieć już jakieś zastosowa−
nie praktyczne! Wiemy przecież, że oscylator
kwarcowy procesora charakteryzuje się dość
dobrą stabilnością i to “kółko”, które utwo−
rzyliśmy, będzie “kręcić” się z w miarę stałą
prędkością, niezależnie od innych czynności
wykonywanych przez program. Dopiszmy
zatem jeszcze kilka linijek do podprogramu
obsługi przerwania, który po tych przerób−
kach będzie miał następującą postać:
ENABLE INTERRUPTS − globalne ze−
zwolenie na obsługiwanie przerwań
ENABLE TIMER[0,1] − zezwolenie na
obsługę przerwania wskazanego timera
i analogicznie:
DISABLE INTERRUPTS − globalny
zakaz obsługi przerwań
10
DISABLE TIMER[0,1] − zakaz obsługi
przerwania wskazanego timera
Przerwania, ich obsługa i problemy wyni−
kające z ich stosowania będą tematem jed−
nego z następnych wykładów. Zagadnieniu
temu poświęcimy szczególnie dużo czasu,
ponieważ umiejętne stosowanie przerwań
jest problemem nie tylko dla początkujących
programistów. Wyjątkowo trafną i precyzyj−
ną definicję przerwania zamieścił we wspo−
mnianej na początku tego artykułu książce
pan Tomasz Starecki:
“Idea przerwań polega na tym, że w od−
powiedzi na określony sygnał (sygnał prze−
rwania) mikrokontroler zawiesza chwilowo
wykonywanie programu głównego i wyko−
Elektronika dla Wszystkich
23
54841871.050.png 54841871.052.png 54841871.053.png 54841871.054.png 54841871.055.png 54841871.056.png 54841871.057.png
Zgłoś jeśli naruszono regulamin