cwiczenie.pdf

(947 KB) Pobierz
54838429 UNPDF
Hit roku 2000
BASCOM College
Pierwsze programy
Ćwiczenie
Witam ponownie Studentów BASCOM
College. W wykładzie wchłonęliśmy już spo−
rą dawkę teorii dotyczącej wyświetlaczy
LCD, wypróbowaliśmy wbudowany w pa−
kiet BASCOM symulator programowy i naj−
wyższa już pora na bliższe zapoznanie się
z jednym z najważniejszych elementów na−
szego systemu edukacyjnego − płytką testo−
wą. Podczas tego ćwiczenia poznamy także
praktycznie podstawowe polecenia odnoszą−
ce się do operacji dokonywanych na portach
i pojedynczych wyprowadzeniach procesora
89C2051. Jeżeli zostanie nam dość czasu, to
spróbujemy także emulacji sprzętowej wy−
świetlacza LCD.
Zacznijmy od bliższego zapoznania się
z płytką testową AVT−2500. Zanim jednak
przejdziemy do tej części ćwiczenia, chciał−
bym wyjaśnić pewne nieporozumienie, które
powstało w związku z konstrukcją naszej
płytki. Od kilku dociekliwych Czytelników
otrzymałem e−maile informujące o błędach
na płytce testowej! Błędy te miały polegać
na nieumieszczeniu na schemacie złącza
oznaczonego jako ISP oraz jumpera JP7.
Rzeczywiście, elementy te zostały celowo
pominięte na schemacie, ponieważ nie
chciałem bez potrzeby komplikować rysun−
ku przez wprowadzanie do niego dodatko−
wych, potrzebnych dopiero w dalekiej przy−
szłości składników.Zakładam, że przeszli−
ście już przez męki związane z wlutowa−
niem w płytkę testową blisko 100 kołecz−
ków, że nie poparzyliście się podczas pod−
grzewania izolacji termokurczliwej na prze−
wodach montażowych i że gotowa płytka te−
stowa leży przed Wami na biurku. Pozosta−
je więc już tylko dołączyć ją do komputera
oraz zasilania i rozpocząć pracę.
Uwaga! Dołączanie płytki do kompute−
ra może odbywać się wyłącznie przy odłą−
czonym zasilaniu obydwóch urządzeń. Nie−
spełnienie tego warunku może doprowa−
dzić do uszkodzenia portu równoległego,
a tym samym płyty głównej nowoczesnego
komputera!
dowanego w procesor, a jego stan, a tym sa−
mym informację o relacji pomiędzy napięcia−
PORT P1
Pin portu Pin układu Funkcja
Funkcja dodatkowa
Uwagi
P1.0
12
IN/OUT Wejście „+” komparatora analogowego Brak rezystora podciągającego
P1.1
13
IN/OUT Wejście „−” komparatora analogowego Brak rezystora podciągającego
P1.2
14
IN/OUT Brak
P1.3
15
IN/OUT Brak
P1.4
16
IN/OUT Brak
P1.5
17
IN/OUT Brak
P1.6
18
IN/OUT Brak
P1.7
19
IN/OUT Brak
Operacje na portach i po−
jedynczych pinach proce−
sora 89C2051
W struktury procesorów podrodziny
89CX051 wbudowane są dwa ośmiobitowe
porty wejściowo−wyjściowe nazwane, P1
i P3. Zapewnia
to procesorowi
możliwość ko−
munikacji ze
światem zewnę−
trznym, przyj−
mowanie z nie−
go potrzebnych
informacji,
a także wysyła−
nie danych do układów peryferyjnych i stero−
wanie urządzeniami podporządkowanymi.
Do dyspozycji mamy piętnaście wejść
i wyjść, które możemy wykorzystywać zgo−
dnie z aktualnymi potrzebami. Z pewnością
wielu Czytelników zwróciło uwagę na drob−
ną nieścisłość w poprzednim zdaniu. Naj−
pierw mówiliśmy o dwóch ośmiobitowych
portach, a następnie o piętnastu wejściach!
Na szczęście nie była to pomyłka: procesor
89C2051 rzeczywiście posiada dwa pełne
porty ośmiobitowe, z tym jednak, że wyjście
6 portu P3 nie jest dostępne z zewnątrz. Jest
to wyjście komparatora analogowego wbu−
mi dołączonymi do wejść komparatora, mo−
żemy odczytać na drodze programowej.
Sądzę, że warto uporządkować sobie
informacje na temat portów procesora
‘2051, tym bardziej, że wiele ich pinów
spełnia dodatkowe, niekiedy bardzo uży−
teczne funkcje.
PORT P3
Pin
portu
Pin
układu
Funkcja
Funkcja dodatkowa
Uwagi
P3.0
2
IN/OUT Wejście RXD toru transmisji RS232
P3.1
3
IN/OUT Wejście TXD toru transmisji RS232
Aktywne opadającym
zboczem lub poziomem
P3.2
6
IN/OUT Wejście przerwania zewnętrznego INT0
Aktywne opadającym
zboczem lub poziomem
P3.3
7
IN/OUT Wejście przerwania zewnętrznego INT1
P3.4
8
IN/OUT Wejście timera 0
P3.5
9
IN/OUT Wejście timera 1
Odczyt stanu tego
wyjścia jest możliwy
tylko na drodze programowej
P3.6
IN/OUT Wewnętrzne wyjście komparatora analogowego
P3.7
11
IN/OUT Brak
Bardzo ważna uwaga!
Dwa wejścia portu P1: P1.0 i P1.1 nie zo−
stały wyposażone w wewnętrzne rezystory
podciągające! Jeżeli jedno z tych wyjść
ustawimy w stan niski, to będzie ono zacho−
wywać się dokładnie tak, jak pozostałe ak−
tywne wyprowadzenia procesora: wewnę−
trzny rezystor wymusi na nim stan wysoki.
Jeżeli jednak ustawimy P1.0 lub P1.1 w stan
wysoki, to wyjście to bez stosowania elemen−
tów zewnętrznych będzie “wisieć w powie−
trzu” i nie będzie mogło być wykorzystane
np. do sterowania bazy tranzystora lub in−
nego wejścia bez rezystora podciągającego.
Elektronika dla Wszystkich
23
54838429.040.png 54838429.041.png 54838429.042.png 54838429.043.png 54838429.001.png 54838429.002.png 54838429.003.png 54838429.004.png
BASCOM
Na razie zajmiemy się tylko podstawowy−
mi funkcjami pełnionymi przez porty proce−
sora 89C2051. Funkcje dodatkowe będziemy
poznawać stopniowo, w miarę zdobywania
kolejnych porcji wiedzy o programowaniu
w języku MCS BASIC.
Na rysunku 1 został pokazany schemat
połączeń, jakie będziemy musieli wykonać
w celu przerobienia materiału dzisiejszych
ćwiczeń, a rysunek 2 pokazuje schemat mon−
tażowy: połączenia, które będziemy musieli
wykonać na płytce testowej w celu wykona−
nia pierwszych ćwiczeń.
Wszystkie ćwiczenia będziemy mogli
przerobić na trzech “poziomach”: za pomocą
emulatora programowego, emulatora sprzę−
towego oraz wykorzystując zaprogramowa−
ny procesor.
Operacje na portach procesora ‘2051 mo−
żemy przeprowadzać wykorzystując polece−
nia programowe odnoszące się bądź do całe−
go portu, bądź do pojedynczych pinów. Naj−
prostszymi poleceniami, za pomocą których
możemy zmienić stan pojedynczego wypro−
wadzenia są:
Rys. 1
To chyba najkrótszy program, jaki kiedy−
kolwiek został napisany, ale jego działanie nie
jest pozbawione sensu. Kompilujemy nasz
program (za pomocą naciśnięcia klawisza F7
możemy podać dowolną nazwę pliku lub po−
zostawić “NONAME”), a następnie naciska−
my klawisz F2 wywołując w ten sposób panel
symulatora sprzętowego i programowego.
Klawiszem oznaczonym strzałką uruchamia−
my nasz program i pilnie obserwujemy okien−
ko emulacji programowej, w którym zobrazo−
wane są stany wyjść wszystkich portów proce−
sora (także portów P0 i P2, które nie istnieją
wprawdzie w procesorze ‘2051, ale których
emulacja jest potrzebna przy korzystaniu
z “większych” ’51).
Zgodnie z przewidywaniami, po wykona−
niu naszego programu wszystkie wyjścia po−
rtu P3 znalazły się w stanie niskim, co sygnali−
zowane jest wyłączeniem wszystkich symbo−
lizujących je lampek (rys. 3). Powtórzmy na−
sze doświadczenie kilkakrotnie, cały czas ob−
serwując ekran emulatora programowego. Są−
dzę, że wszyscy z Was zauważyli już pewne
dziwne zjawisko, występujące po każdorazo−
wym uruchomieniu naszego programu. Otóż,
lampki obrazujące stan wyjść portu P3 zapala−
ją się na moment, aby następnie, zgodnie z po−
leceniem programowym zgasnąć. Oznacza to,
że po uruchomieniu wszystkie wyjścia portu
P3 przyjmują na moment stan wysoki, a dopie−
ro po chwili, zgodnie z wydanym poleceniem,
stan niski. Co jest, czyżby błąd w programie
emulatora? Nic podobnego, emulator oddaje
SET [port.pin] oraz RESET [port.pin]
wiernie wszystkie czynności wykonywane
przez procesor, a nie tylko te, których wykona−
nie zostało przewidziane w testowanym pro−
gramie. Aby wykonywanie programu mogło
się rozpocząć, procesor przez okres co naj−
mniej dwóch taktów zegarowych musi znajdo−
wać się w stanie RESET, co połączone jest
z wystąpieniem na wszystkich wyjściach po−
rtów stanu wysokiego. Dopiero po ustąpieniu
stanu wysokiego z wejścia RESET procesora,
może on rozpocząć normalną pracę.
Uruchommy teraz jeszcze raz nasz progra−
mik obserwując tym razem płytkę testową.
Aha, zapomniałem powiedzieć, że symulator
sprzętowy i programowy mogą działać jedno−
cześnie. Spowalnia to trochę pracę programu
i nie zawsze ma sens, ale w przypadku pro−
stych ćwiczeń nie ma to większego znaczenia.
Od razu zauważymy, że zaszły na niej zjawi−
ska z pozoru odwrotne do tych, jaki obserwo−
waliśmy w okienku emulatora programowe−
go. Wszystkie diody LED najpierw zgasły na
moment, a potem zapaliły się ponownie. Jed−
nak i tym razem wszystko jest w porządku:
Diody LED na naszej płytce testowej
włączone są pomiędzy wyjścia procesora
(lub emulatora sprzętowego) a plus zasila−
nia i świecą przy stanie niskim dołączonego
do nich wyjścia.
Poćwiczmy jeszcze trochę wysyłanie da−
nych do portów procesora i ożywmy trochę
naszą płytkę testową. Piszemy kolejny,
króciutki programik:
Wydanie polecenia SETpowoduje ustawie−
nie wyznaczonego pinu w stan wysoki.
Wydanie polecenia RESET powoduje
ustawienie wyznaczonego pinu w stan niski.
Np.:
SET P3.0 spowoduje wystąpienie stanu
wysokiego na wyprowadzeniu 0 portu P3
RESET P3.1 spowoduje wystąpienie
stanu niskiego na wyprowadzeniu 1
portu P3
Jeszcze prościej możemy dokonywać ope−
racji odnoszących się do całego portu.
P[1,3] = [ X (liczba z zakresu 0 ...255)]
Wydanie tego polecenia powoduje
wysłanie binarnej reprezentacji liczby X
na wyjścia wskazanego portu
Np.
P3 = 0 spowoduje ustawienie wszystkich
wyjść portu P3 w stan niski
P3 = 255 spowoduje ustawienie wszyst−
kich wyjść portu P3 w stan wysoki.
P3 = 3 spowoduje wysłanie na wyjścia
portu P3 liczby "3", czyli ustawienie w
stan wysoki wyjść P3.0 i P3.1.
Sprawdźmy teraz w praktyce, czy rzeczywi−
ście podane polecenia funkcjonują poprawnie.
Uruchamiamy program BASCOM i w okienku
edytora piszemy sobie następujący programik:
$sim 'zawiadomienie kompilatora, że program będzie testowany w symulacji 'sprzętowej lub
programowej
Dim R As Byte 'deklaracja zmiennej R
For R = 1 To 255 'od wartości R = 1 do osiągnięcia wartości R=255 powtarzaj:
P3 = R
'wyślij do portu P3 aktualną wartość R
P3= 0
End
Next R
'powtórz powyższą instrukcję
End
'po wyjściu z pętli FOR .... NEXT koniec programu
24
Elektronika dla Wszystkich
54838429.005.png 54838429.006.png 54838429.007.png 54838429.008.png 54838429.009.png 54838429.010.png 54838429.011.png 54838429.012.png 54838429.013.png 54838429.014.png 54838429.015.png 54838429.016.png 54838429.017.png 54838429.018.png 54838429.019.png 54838429.020.png 54838429.021.png 54838429.022.png 54838429.023.png 54838429.024.png
BASCOM
i po skompilowaniu uruchamiamy go w sy−
mulacji programowej i sprzętowej. Efekt jest
nawet ładny: wszystkie diody zapalają się
i gasną, wyczerpując wszystkie możliwe
kombinacje kodu dwójkowego z zakresu od
1 do 255 w okienku emulatora sprzętowego
i od 1 do 32 na płytce testowej, na której nie
zmieściła się już większa liczba diod.
Jak jednak będziemy musieli postąpić, je−
żeli naszym zamiarem będzie zmiana stanu
tylko jednego wyprowadzenia któregoś z po−
rtów, bez ingerowania w stan pozostałych
wejść lub wyjść? To bardzo proste, napiszmy
sobie mały program:
włączenie segmentów “b” i “c” wyświetla−
cza, a pozostałe segmenty muszą być wyłą−
czone. Segment “b” sterowany jest z wyjścia
P3.1, a segment “c” z wyjścia P3.2 proceso−
ra. A zatem liczba, której podanie na wyjścia
portu P3 spowoduje ukazanie się na wyświe−
tlaczu upragnionej jedynki to binarnie:
0X00 0110
gdzie X − bit nieznaczący (pamiętajmy, że
wyjście P3.6 nie może być w jakikolwiek spo−
sób sterowane od “strony” procesora i nie jest
wyprowadzone na zewnątrz kostki. Liczba bi−
narna 0000 0110 to w kodzie dziesiętnym po
prostu “6”. A zatem piszemy:
w tabelkę zawartą w tym okienku odpowie−
dnie wartości, zgodnie z ta belą:
Klikamy “OK”
w okienku konfigura−
cyjnym i uruchamiamy
program. BINGO! Na
wyświetlaczu ukazała
się cyfra “1” i wszystko
wskazuje na to, że do−
kładnie tak samo za−
chowa się wyświetlacz na naszej płytce testo−
wej, oczywiście po włączeniu symulacji sprzę−
towej i ponownym uruchomieniu programu!
Zajmijmy się teraz określeniem, jakie
wartości należy wysłać do portu P3, aby uzy−
skać wyświetlanie pozostałych dziewięciu
cyfr. Wykonałem tę pracę za Was, a jej wy−
nik pokazany został w poniższej tabeli.
Pozostaje nam zatem praktyczne sprawdze−
nie poprawności moich obliczeń (wykona−
nych dla przyśpieszenia pracy w arkuszu
kalkulacyjnym MS EXCELL). Bierzmy się
zatem do napisania pierwszego nieco bar−
dziej rozbudowanego programu.
Segment Pin
AP3.0
B P3.1
C P3.2
DP3.3
E P3.4
F P3.5
GP3.7
P3 = 0
'wyślij na wyjścia portu P3 liczbę "0"
p3= 6
End
Do
Set P3.1 'ustaw stan wysoki na zadanym wyjściu portu (P3.1)
Reset P3.1'ustawia stan niski na zadanym wyjściu portu (P3.1)
Loop
i kompilujemy ten wyjątko−
wo „rozbudowany“ pro−
gram. Następnie możemy uruchomić go w sy−
mulacji sprzętowej i/lub programowej, ale naj−
pierw musimy wykonać jeszcze jedną czyn−
ność. Z pewnością zauważyliście rysunek wy−
świetlacza siedmiosegmentowego
w okienku symulatora programowego.
Nie jest to bynajmniej ozdoba, ale ko−
lejny “fajerwerk” pakietu BASCOM,
ułatwiający programistom życie. Jed−
nak aby z niego skorzystać, musimy go
najpierw odpowiednio skonfigurować,
czyli przypisać odpowiednie segmenty
emulowanego wyświetlacza odpowia−
dającym im wyprowadzeniom portu
procesora. Naprowadzamy zatem kur−
sor na rysunek wyświetlacza i klikamy
PRAWYM klawiszkiem myszki. Na−
stępstwem tego odważnego kroku jest
rozwinięcie się okienka konfiguracyj−
nego wyświetlacza, pokazanego na
rysunku 5 . Następnie wpisujemy
I jak zwykle: F7, F2 i już możemy oglądać
rezultaty działania poleceń SET i RESET.
Zgodnie z naszymi oczekiwaniami dioda do−
łączona do wyjścia 1 portu P3 migocze, a po−
zostałe pozostają wyłączone. Możliwość do−
konywania operacji na pojedynczych wyj−
ściach portów ma ogromne znaczenia prak−
tyczne i upraszcza pisanie programów, o czym
przekonacie się w najbliższej przyszłości.
Jak dotąd, wszystkie wykonane ćwiczenia
nie miały większego zastosowania użytkowe−
go i służyły wyłącznie celom poznawczym.
Spróbujmy teraz zrobić coś, co nie tylko bę−
dzie ćwiczeniem szkoleniowym, ale znajdzie
praktyczne zastosowanie: uruchommy wy−
świetlacz siedmiosegmentowy na płytce te−
stowej i w emulacji programowej.
Popatrzmy przez chwilę na schemat naszej
płytki testowej zamieszczony w numerze
3/2000 Elektroniki dla Wszystkich i na samą
płytkę. W układzie został zastosowany wy−
świetlacz siedmiosegmentowy ze wspólną
anodą, a do wejść każdego z segmentów zo−
stał dołączony tranzystor NPN, który po spo−
laryzowaniu bazy będzie zwierał odpowiada−
jący mu segment do masy, włączając go.
A więc, podając na odpowiednie wejścia,
oznaczone na płytce jako a ... g, stan wysoki
możemy uzyskać włączanie odpowiednich
segmentów wyświetlacza i obrazować na nim
cyfry, a także inne znaki możliwe do zdefinio−
wania za pomocą siedmiu świecących seg−
mentów. Jeżeli zatem dołączymy wejścia a ....
g do wyjść jednego z portów procesora, to wy−
starczy wysyłać do tego portu odpowiednie
liczby, odpowiadające kodowi wyświetlacza
siedmiosegmentowego, aby uzyskać wyświe−
tlanie żądanych cyfr. A więc, do dzieła: zmon−
tujmy na płytce testowej układ przedstawiony
na rysunku 1 − 2 i na schemacie montażowym
z rysunku 4 i zastanówmy się, jakie liczby bę−
dziemy musieli wysyłać do portu P3 proceso−
ra, aby uzyskać wyświetlanie cyfr od 0 do 9.
Przeanalizujmy najprostszy przypadek:
cyfrę “1”. Do jej wyświetlenia niezbędne jest
Segment G F E D C B A Wartość
Cyfra                
0
0
1
1
1
1
1
1
63
1
0
0
0
0
1
1
0
6
2
1
0
1
1
0
1
1
155
3
1
0
0
1
1
1
1
143
4
1
1
0
0
1
1
0
166
5
1
1
0
1
1
0
1
173
6
1
1
1
1
1
0
1
189
7
0
0
0
0
1
1
1
7
8
1
1
1
1
1
1
1
191
9
1
1
0
1
1
1
1
175
Rys. 2
Elektronika dla Wszystkich
25
54838429.025.png 54838429.026.png 54838429.027.png 54838429.028.png 54838429.029.png 54838429.030.png 54838429.031.png 54838429.032.png 54838429.033.png
BASCOM
Pierwszym problemem, jaki będziemy mu−
sieli rozwiązać, będzie z pewnością sprawa
uporządkowania obliczonych wartości tak,
abyśmy mogli z nich korzystać w możliwie
wygodny sposób. Zastanówmy się, w jakich
programach będziemy musieli korzystać z wy−
świetlania cyfr? Ano, przede wszystkim we
wszelkiego rodzaju licznikach, zegarach,
miernikach częstotliwości i innych podobnych
urządzeniach. W większości wypadków bę−
dziemy zatem mieli do czynienia z cyklicz−
nym wyświetlaniem cyfr. Oczywiście, może−
my każdej z wartości nadać indywidualne na−
zwy, np. Cyfra1, Cyfra2 itd. Wątpię jednak,
czy korzystanie z tak określonych stałych by−
łoby wygodne! Postąpimy zatem inaczej:
umieścimy nasze wartości w tabeli, czyli
mówiąc językiem programistów zadeklaruje−
my tablicę danych. Sposób deklaracji tablicy
jest bardzo podobny do deklarowania poje−
dynczej zmiennej, a różnica polega na tym, że
tym razem powiadamiamy kompilator o ko−
nieczności zarezerwowania w pamięci RAM
procesora miejsca jednorazowo na więcej niż
jedną wartość. Mówiąc ściślej, deklaracja ta−
blicy polega na zadeklarowaniu kilku zmien−
nych o tej samej nazwie, ale o innym “nume−
rze porządkowym”. Jak wygodnym posunię−
ciem jest zadeklarowanie tablicy danych,
przekonamy się za chwilę, ale pamiętajcie
o jednej sprawie:
Każda zmienna typu "BYTE" zajmuje
w pamięci procesora dokładnie jeden bajt,
których do dyspozycji mamy zaledwie 128.
Inne zmienne zajmują (z wyjątkiem zmien−
nej typu "BIT") jeszcze więcej miejsca. De−
klarowanie tablic powoduje drastyczne
zwiększenie obszaru zajmowanej pamięci
i dlatego musimy stosować je z rozwagą, de−
klarując tablice o minimalnych dopuszczal−
nych rozmiarach.
Pomimo powyższego ostrzeżenia, docho−
dzimy jednak do wniosku, że zadeklarowania
tablicy jest niezbędne i czynimy to za pomo−
cą polecenia:
Po wydaniu tego polecenia kompilator zare−
zerwuje sobie w pamięci już nie pojedynczą
komórkę, ale jakby malutką szafkę z dziesię−
cioma (pierwsza szafka ma numer “0”) szuflad−
kami, w których umieścimy liczby potrzebne
do wyświetlenia wszystkich dziesięciu cyfr.
No dobrze, mamy już tablicę danych, ale
niewielki z niej pożytek, tak jak z każdej pustej
szafki. A zatem zapełnijmy naszą tablicę po−
trzebnymi nam danymi. Czynność tę możemy
wykonać w najrozmaitszy sposób, ale na razie
wybierzemy metodę najprostszą, wręcz intui−
cyjną. Piszemy:
i po uruchomieniu programu nasza szafka zo−
stanie zapełniona aż
po same brzegi! Pa−
miętajmy jednak,
że zużyliśmy już 10
bajtów cennej pa−
mięci RAM proce−
sora. Nie obawiaj−
cie się jednak, to co
zostało wystarczy
jeszcze na potrzeby
nawet dość rozbu−
dowanego progra−
mu, a w najbliższej
przyszłości dowiemy się, jak można usunąć nie−
potrzebne już zmienne z pamięci RAM i uwol−
nić zajmowaną przez nie pamięć.
Podprogram, który napisaliśmy przed
chwilą warto zapisać sobie w osobnym pliku.
Z pewnością przyda się on nam w przyszło−
ści. Tu na marginesie drobna uwaga: dobrą
praktyką jest zapisywanie w osobnym katalo−
gu szczególnie cennych fragmentów progra−
mów i ciekawych procedur. Po jakimś czasie
uzbieramy sobie pokaźną bibliotekę, a pisa−
nie kolejnego programu często będzie spro−
wadzać się do “sklejania” ze sobą zarchiwi−
zowanych uprzednio podprogramów.
Jednak jak na razie nie mamy zbyt wiel−
kiego pożytku z napisanego programu. Po
skompilowaniu i uruchomieniu załaduje on
wprawdzie potrzebne dane do pamięci i nic
więcej. A więc, musimy jeszcze chwilę po−
pracować, aby wreszcie ujrzeć wszystkie cy−
fry ukazujące się na wyświetlaczu. Zakłada−
my, ze wystarczy nam jednorazowe spraw−
dzenie poprawności przeprowadzonych
uprzednio operacji. Piszemy zatem kolejne li−
nijki programu:
For R = 0 To 9
P3 = Cyfra(r)
Next R
P3= 0
End
A na początku, zaraz po poleceniu Dim
Cyfra(9) As Byte dopisujemy:
Cyfra(0) = 63
Cyfra(1) = 6
Cyfra(2) = 155
Cyfra(3) = 143
Cyfra(4) = 166
Cyfra(5) = 173
Cyfra(6) = 189
Cyfra(7) = 7
Cyfra(8) = 191
Cyfra(9) = 175
Dim R as Byte
Działanie polecenia Dim jest już dla Was
oczywiste, ale zastanówmy się, jakie czynno−
ści mają wykonywać ostanie cztery linijki
programu.
For R = 0 To 9 oznacza, że wszystkie
czynności zawarte pomiędzy tym poleceniem
a NEXT mają być wykonane dziesięć razy,
a po każdym ich wykonaniu wartość R zosta−
nie powiększona o 1.
Polecenie P3 = Cyfra(r) wykonane zosta−
nie dziesięć razy, a za każdym razem do portu
P3 zostanie wysłana liczba przyporządkowana
aktualnej wartości zmiennej R, czyli kolejno
wszystkie umieszczone w tablicy liczby.
Polecenie NEXT zamyka pętlę programową
Polecenie P3=0 sprawia, że po wyświetle−
niu wszystkich cyfr wyświetlacz siedmioseg−
mentowy zostanie wyłączony (na wyjściach
portu P3 pojawią się same zera).
End − koniec programu.
Wygląda na to, że wszystko powinno dzia−
łać zgodnie z przewidywaniami. Kompiluje−
my więc nasz program i włączamy symulację
Rys. 4
DIM [zmienna] ([ilość stosowanych zmien−
nych]) As [typ zmiennej]
W naszym, konkretnym przypadku pole−
cenie to będzie miało postać:
DIM Cyfra(9) As Byte
Rys. 3
26
Elektronika dla Wszystkich
Dim Cyfra(9) As byte
54838429.034.png 54838429.035.png 54838429.036.png
BASCOM
programową. Tym razem jednak nie bardzo
mamy ochotę zakrzyknąć “BINGO!”. Na sy−
mulowanym wyświetlaczu coś się wprawdzie
pokazało, ale wyświetlanie cyfr przebiegło
tak szybko, że nawet nie zdążyliśmy zaobser−
wować jego ewentualnej poprawności. W sy−
mulacji sprzętowej, na płytce testowej sytua−
cja wygląda równie źle: wyświetlacz zamigo−
tał i wszystkie segmenty wyłączyły się. Gdzie
więc tkwi błąd?
Błąd tkwi w zbyt dużej szybkości pracy
programu, nawet podczas powolnej emulacji
sprzętowej czy programowej. Gdybyśmy te−
raz tak napisany program załadowali do pro−
cesora i uruchomili, to zobaczylibyśmy co
najwyżej krótki błysk segmentów wyświetla−
cza. Na szczęście rozwiązania problemu są
bardzo proste: wystarczy w jakiś sposób
zmusić program, aby po wyświetleniu każdej
cyfry zaczekał trochę na powolnego człowie−
ka i umożliwił mu odczytanie pokazanej cy−
fry. Celowo napisałem “rozwiązania”, ponie−
waż żądane opóźnienie zrealizujemy dwoma
różnymi metodami, odpowiednimi dla symu−
lacji i pracy programu w zaprogramowanym
procesorze.
wa zostaną przed zaprogramowaniem proce−
sora usunięte z program, tak więc nie musi−
my martwić się zwiększeniem zajmowanej
powierzchni pamięci RAM.
Ostateczna, gotowa do uruchomienia we−
rsja naszego programu wygląda następująco:
Waitms 255: Waitms 100
Gdybyśmy chcieli teraz zaprogramować
procesor i sprawdzić w “real world” jego
działanie, to musimy pamiętać o bezwzględ−
nym usunięciu z niego opóźnień realizowa−
nych w formie pętli programowej i zastąpie−
'Deklaracje Zmiennych
Dim Cyfra(9) As Byte 'deklaracja tablicy zmiennych
Dim R As Byte 'deklaracja zmiennej pomocniczej (licznik instrukcji FOR ...NEXT)
Dim X As Byte 'deklaracja zmiennej pomocniczej opóźnienia
'Ładowanie danych do tablicy
Cyfra(0) = 63 'umieszczenie w tablicy kodu cyfry "0"
Cyfra(1) = 6 'umieszczenie w tablicy kodu cyfry "1"
Cyfra(2) = 155 'umieszczenie w tablicy kodu cyfry "2"
Cyfra(3) = 143 'umieszczenie w tablicy kodu cyfry "3"
Cyfra(4) = 166 'umieszczenie w tablicy kodu cyfry "4"
Cyfra(5) = 173 'umieszczenie w tablicy kodu cyfry "5"
Cyfra(6) = 189 'umieszczenie w tablicy kodu cyfry "6"
Cyfra(7) = 7 'umieszczenie w tablicy kodu cyfry "7"
Cyfra(8) = 191 'umieszczenie w tablicy kodu cyfry "8"
Cyfra(9) = 175 'umieszczenie w tablicy kodu cyfry "9"
'Właściwy program
Do 'wykonaj wszystko, co poniżej
For R = 0 To 9 'początek pętli głównej programu
P3 = Cyfra(r) 'wysłanie do portu P3 wartości odpowiadającej cyfrze
For X = 1 To 100 'pętla opóźnienia
Next X
Realizowanie opóźnienia
w symulacji sprzętowej
i/lub programowej
Next R
'zamknięcie pętli głównej
Loop
'wykonaj jeszcze raz
End
W symulacji najprościej jest zrealizować
opóźnienie za pomocą dodatkowej pętli
programowej wstawionej w odpowiednim
miejscu programu. Pętla może być pusta,
nie musi wykonywać jakichkolwiek czyn−
ności, wystarczy, że wykonanie jej samej
zajmuje trochę czasu. Najprościej zrealizo−
wać taką pętlę za pomocą znanej już Wam
instrukcji NEXT ... FOR. Ilość powtórzeń
pętli zależy od szybkości działania proce−
sora w komputerze i najlepiej ustalić ją do−
świadczalnie. Przykładowo: wykonanie
instrukcji:
For X = 1 to 100
Next X
zajmuje na komputerze z procesorem
PENTIUM 133 około 2 sekund.
Dopisujemy więc do naszego programu
pętlę opóźniającą, nie zapominając o zade−
klarowaniu kolejnej zmiennej: X. Zarówno
deklaracja tej zmiennej, jak i pętla programo−
Zauważyliście pewnie, że dodałem do
programu jeszcze jeden element: niekończą−
cą się pętlę DO .... LOOP. W związku z tym
nasz program będzie wykonywany w nie−
skończoność, wyświetlając na wyświetlaczu
siedmiosegmentowym kolejne cyfry.
nie ich jednym z wyżej opisanych poleceń.
Tak więc zamiast:
For X = 1 To 100
Next X
Wstawimy np.:
Realizacja opóźnienia
w programie przeznaczo−
nym do umieszczenia
w procesorze
WAIT 1
co da nam opóźnienie 1 sekundy.
Nie wyczerpaliśmy bynajmniej tematu
wysyłania danych do portów procesora ’51,
ale pozostało już niewiele czasu z tej godzi−
ny lekcyjnej. W opisywaniu głównego te−
matu ćwiczenia przeszkadzały nam liczne
dygresje, ale także dzięki nim wypełniali−
śmy postawione przed nami zadania: uczy−
liśmy się języka MCS BASIC i obsługi pa−
kietu BASCOM. Chciałbym wspomnieć
Wam jeszcze, chociażby w największym
skrócie, o odczytywaniu danych z portów
procesora.
Odczytanie jakichkolwiek danych z po−
rtu procesora ‘2051 lub z pojedynczego pinu
takiego portu jest możliwe dopiero po pro−
gramowym ustawieniu na całym porcie lub
wybranym pionie STANU WYSOKIEGO.
Wyprowadzenia portów procesora ‘2051
możemy z pewnym przybliżeniem traktować
jako wyjścia typu OPEN DRAIN wyposażo−
ne w bufory, w których zatrzaskuje się poda−
na z wewnątrz informacja. Jeżeli np. po po−
daniu polecenia:
Język MCS BASIC oferuje nam wiele możli−
wości realizacji opóźnień czasowych, zwal−
niając nas na razie od konieczności poznawa−
nia obsługi timerów systemowych. Do dys−
pozycji mamy dwie podstawowe instrukcje,
pozwalające na wnoszenie opóźnień z zakre−
su od 1 ms do 255 sekund, czyli do ponad 4
minut. Są to instrukcje:
WAIT [liczba sekund, liczba z zakresu
1 do 255)
Rys. 5
WAITMS [liczba milisekund, liczba
z zakresu od 1 do 255]
Po wydaniu jednaj z tych dwóch instrukcji
program wstrzymuje swoje działanie aż do
momentu upłynięcia oznaczonego czasu.
Oczywiście, zawsze możliwe jest wydanie
kolejno kilku instrukcji opóźnienia, chociaż−
by w celu “załatania dziury” pomiędzy
255msek za 1 s. Np.:
Wait 1: Waitms 125
lub
Elektronika dla Wszystkich
27
'pętla opóźnienia
54838429.037.png 54838429.038.png 54838429.039.png
Zgłoś jeśli naruszono regulamin