2001.03 Zabawka sterowana pilotem RC5, Projekty AVT

[ Pobierz całość w formacie PDF ]
HHH
Projekty AVT
Zabawka
sterowana
pilotem RC5
na
procesorze
AT89C2051
2441
Do czego to służy?
Do niedawna odpowiedź na powyższe py−
tanie byłaby prosta i brzmiała: "Do zaba−
wy!". Niestety, a właściwie na szczęście
czasy się zmieniły i nieprędko doczekamy
się w Elektronice dla Wszystkich opisu
projektu wykorzystującego procesor
89C2051, który służyłby tylko i wyłącznie
do zabawy. Naszym głównym celem,
któremu podporządkowaliśmy wszystkie
inne działania, jest nadrobienie wielolet−
nich opóźnień i zapoznanie Czytelników
z tajnikami techniki mikroprocesorowej.
Dlatego też program sterujący pracą naszej
zabawki został bardzo szczegółowo
omówiony i Studenci BASCOM College
mogą traktować ten opis jako dodatkowe
uzupełnienie nauki w College'u.
Proponowany układ jest bardzo prosty do
wykonania i składa się zaledwie z jednego
układu scalonego, oczywiście procesora
AT89C2051 i garstki elementów dyskret−
nych. Jest to kolejny przykład prostego urzą−
dzenia spełniającego dość skomplikowane
funkcje, a którego możliwości zależą od za−
szytego w procesorze programu.
Nasza zabawka jest napędzana dwoma
silnikami pojazdu mechanicznego o kon−
strukcji podobnej do opisywanych niegdyś
w Elektronice dla Wszystkich" słynnych "ra−
abowozów" może być sterowana za pomocą
dowolnego pilota pracującego z kodem RC5.
Poza rodzajem emitowanego kodu nie ma
żadnych ograniczeń co do rodzaju pilota:
może to być urządzenie współpracujące zwy−
kle z telewizorem, magnetowidem, kamerą
wideo lub też pilot wykonany samodzielnie
(np. AVT−849 − uniwersalny pilot umożliwia−
jący wysłanie dowolnego kodu do dowolne−
go odbiornika RC5).
Nie ma też jakichkolwiek ograniczeń co do
klawiszy, za pomocą których będziemy stero−
wać naszym pojazdem. Po prostu, nasza za−
bawka zaraz po uruchomieniu musi "naumieć
się" kodów, jakimi będzie sterowana i dopiero
po podporządkowaniu jej funkcji odpowie−
dnim klawiszom nadaje się do dalszej zabawy.
Zabawka może wykonywać następujące
poruszenia:
1. Jazda do przodu
2. Jazda do tyłu
3. Skręt w lewo
4. Skręt w prawo
5. Skręt to tyłu w lewo
6. Skręt to tyłu w prawo
7. Obrót dookoła osi w lewo
8. Obrót dookoła osi w prawo
9. Zatrzymania silników
10. Funkcja dodatkowa, włączana naprze−
miennie jednym z przycisków.
Nasze pociechy bywają dość roztrzepane
i pozostawianie przez nie zabawek z włączo−
nym zasilaniem należy właściwie do reguły.
Układ został skutecznie zabezpieczony przed
niepotrzebnym rozładowaniem baterii lub
akumulatorów. Jeżeli pojazd przez jakiś czas
nie otrzymuje żadnego polecenia, to po wyda−
niu sygnału ostrzegawczego przechodzi
w "stan spoczynku", czyli wyłącza wszystkie
aktywne odbiorniki energii i wprowadza pro−
cesor w stan IDLE, to jest tryb pracy z obni−
żonym poborem energii. Oczywiście, pierw−
sza ważna komanda wydana z pilota natych−
miast "budzi" zabawkę z chwilowego letargu!
Jedyną trudnością, na jaką napotkacie
podczas konstruowania zabawki będzie jak
zwykle wykonanie części mechanicznej.
Układ prototypowy został wykonany z wy−
korzystaniem przerobionych uszkodzonych
serwomechanizmów modelarskich, które po
usunięciu części elektronicznej i mechanicz−
nych zabezpieczeń doskonale nadają się do
pracy jako układy napędowe. Jednak w prak−
tycznym wykonaniu takie rozwiązanie było−
by ekonomicznym idiotyzmem (chyba że
ktoś posiada na składzie dwa niepotrzebne
serwa z uszko−
dzoną częścią elek−
troniczną). Sądzę jed−
nak, że zdobycie odpowie−
dnich przekładni pochodzących z popsutych,
tandetnych zabawek "Made in Taiwan" nie
powinno nikomu nastręczyć większych trud−
ności. Idealnym rozwiązaniem byłoby wyko−
nanie naszej zabawki na bazie modelu czołgu
i zastosowanie napędu gąsienicowego. Zau−
ważcie, że napęd modelu pojazdu wzorowa−
ny na napędzie gąsienicowym jest najprost−
szą metodą rozwiązania, a właściwie ominię−
cia licznych problemów konstrukcyjnych, na
jakie napotkalibyśmy przy budowaniu me−
chanizmu skręcania kół, podobnego do sto−
sowanego w samochodach.
Jak każdy twór rąk ludzkich, nasz układ
posiada także i wady. Najważniejszą z nich
jest fakt, że po wyłączeniu zasilania zabawka
zapomina wszystko, czego się nauczyła i po
powtórnym jej uruchomieniu musimy od no−
wa instruować procesor, jakim kodom pilota
podporządkować ma wykonywane funkcje.
Nie jest to jednak zaniedbanie konstruktora,
ale świadome działanie mające na celu
zmniejszenie kosztów wykonania układu.
Zresztą, uczenie zabawki to także ... dobra
zabawa!
Jak to działa?
Popatrzmy teraz na schematy, zapoznajmy
się z prostą częścią hardware'ową urządze−
nia, a następnie zastanowimy się, w jaki spo−
sób zmusić martwą jeszcze część sprzętową
układu do działania. Przeanalizujmy naj−
pierw
rysunek 2
, który przedstawia część
wykonawczą układu.
Część wykonawcza naszej zabawki jest ty−
powo skonstruowanym sterownikiem dwóch
silników prądu stałego, sterowanym za pomo−
cą czterech sygnałów cyfrowych. Silniki
włączone (CON1 i CON2) są w przekątne
Elektronika dla Wszystkich
13
Projekty AVT
mostków utworzonych przez tranzystory mo−
cy typu BD139 i BD140. Do złącza CON5 do−
łączony jest układ mikroprocesorowy przed−
stawiony na
rysunku 1
, z którego budową za−
poznamy się za chwilę. Rozpatrzmy teraz, co
się stanie, jeżeli na przykład na wejściu 5
CON5 pojawi się stan wysoki. Łatwo zauwa−
żyć, że konsekwencją tego faktu będzie spola−
ryzowanie bazy tranzystora T1, atakże tranzy−
storów T7 i T11. Prąd elektryczny popłynie na
drodze: + zasilania, tranzystor T11, uzwojenie
silnika dołączonego do złącza CON1, tranzy−
stor T7 i masa zasilania. Silnik przyłączony do
CON1 zacznie obracać się umownie w stronę
obrotu wskazówek zegara. Ponieważ nasz po−
jazd posiada dwa silniki napędowe, zacznie
skręcać (umownie) w lewo. Wyślijmy teraz
stan wysoki na dwa wejścia złącza CON5: 5
i 3. Włączone teraz zostaną dwa tranzystory:
T1 i T4, co spowoduje także przewodzenie
tranzystorów T11, T7, T10 i T8 i obracanie się
dwóch silników w tę samą stronę. Nasz pojazd
zacznie poruszać się do przodu (lub do tyłu,
ponieważ kierunek ruchu zostanie ostatecznie
ustalony doświadczalnie podczas montażu po−
jazdu).
Sądzę, że uważni Czytelnicy zauważyli
już pewne niebezpieczeństwo, tkwiące w na−
szym układzie. Co bowiem się stanie, jeżeli
stan wysoki pojawi się jednocześnie na wej−
ściach 5 i 4 CON5? Ano, będzie to piękne
zwarcie w układzie spowodowane jednocze−
snym przewodzeniem wszystkich tranzysto−
rów mostka! Oczywiście, przy poprawnie na−
pisanym programie taka sytuacja nie powin−
na się przydarzyć, ale ... nie wszystkie pro−
gramy napisane są od razu poprawnie. Musi−
my wziąć także pod uwagę pewną cechę mi−
kroprocesorów '51:
W czasie, kiedy procesor znajduje się
w stanie "RESET", na wszystkich jego
wyjściach pojawia się stan wysoki. Zjawi−
sko to zachodzi zawsze w momencie star−
tu każdego systemu mikroprocesorowego
opartego na procesorze 2051!
Aby więc ustrzec się przed zwarciem i je−
go zwykle przykrymi konsekwencjami, do
części wykonawczej naszej zabawki dobudo−
wany został układ z bramkami NAND zawar−
tymi w strukturze IC1 itranzystorem T14. Za−
uważmy, że warunkiem zasilania silników od
strony minusa zasilania jest przewodzenie
tranzystora T14. Bramki IC2Ai IC2B wykry−
wają stany zakazane, które mogłyby wystąpić
na wyjściach części sterującej. Powstanie sta−
nu niskiego na wyjściu jednej lub obu tych
bramek powoduje natychmiastowe wyłącze−
nie tranzystora T14 i wyeliminowanie niebez−
pieczeństwa totalnej katastrofy.
Układ może być zasilany napięciem sta−
łym o wartości 5 ... 16VDC, uzależnionym
głównie od typu zastosowanych silników.
Z tego też względu stabilizator napięcia IC2
jest elementem opcjonalnym, i w przypadku
korzystania z napięcia zbliżonego do 5V nie
musi być stosowany.
Tranzystor T13 może włączać lub wyłą−
czać układ dodatkowy: sygnalizator optycz−
ny, akustyczny, jakiś silnik realizujący dodat−
kową funkcję, słowem wszystko, co przyj−
dzie Wam do głowy.
Rys. 1 Sterownik
Rys. 2 Część wykonawcza

+
14
Elektronika dla Wszystkich
Projekty AVT
Popatrzmy teraz na rysunek 1, na
którym została pokazana część sterująca
układu. Niewiele jest tu do skomentowa−
nia, aby zrozumieć zasadę działania tego
fragmentu zabawki, musielibyśmy zaj−
rzeć do wnętrza procesora, co za chwilę
uczynimy. Wystarczy tylko zapamiętać,
do których wyjść − wejść procesora dołą−
czone są diody sygnalizacyjne, na
których muszą pojawiać się stany logicz−
ne powodujące określone zachowanie się
pojazdu, i do jakiego wejścia dołączony
jest dekoder RC5. Sądzę, że warto tylko
wspomnieć o roli, jaką spełnia kondensa−
tor C3 dołączony do wejścia RESET pro−
cesora. Kondensator taki występuje
w większości
prostych
systemów mikro−
procesorowych, a jak do tej pory nie
mieliśmy okazji wyjaśnić, do czego wła−
ściwie jest potrzebny.
Otóż każdy procesor po włączeniu za−
silania musi przejść przez stan resetu,
czyli wyzerowania układu, wyczyszcze−
nia zawartości pamięci RAM i rejestrów
wewnętrznych.
Wymuszenie na wejściu RESET
stanu wysokiego przez okres co naj−
mniej dwóch cykli maszynowych po−
woduje wstrzymanie pracy procesora
i
ustawienie wyjść wszystkich
portów w stan wysoki
. Po poja−
wieniu się stanu niskiego na wejściu
RESET procesor podejmuje normalną
pracę, wykonując od początku in−
strukcje zawarte w sterującym nim
programie. W stanie RESET pamięć
RAM procesora zostaje wyczyszczona!
Uwaga: ta zasada dotyczy procesorów
rodziny 'X051. Inne typy procesorów
(np. AVR) zerowane są niskim pozio−
mem logicznym.
Dim Forward As Byte 'deklaracja zmiennej "ruch w przód"
Dim Back As Byte 'deklaracja zmiennej "ruch do tyłu"
Dim Left As Byte 'deklaracja zmiennej "skręt w lewo"
Dim Right As Byte 'deklaracja zmiennej "skręt w prawo"
Dim Backleft As Byte 'deklaracja zmiennej "skręt do tyłu w lewo"
Dim Backright As Byte 'deklaracja zmiennej "skręt do tyłu w prawo"
Dim Turnleft As Byte 'deklaracja zmiennej "obrót w lewo"
Dim Turnright As Byte 'deklaracja zmiennej "obrót w prawo"
Dim Sstop As Byte 'deklaracja zmiennej "stop"
Dim Command As Byte 'deklaracja zmiennej określającej numer wysłanej komendy
Dim Subaddress As Byte 'deklaracja zmiennej określającej adres urządzenia
Dim Aux As Byte
'deklaracja zmiennej określającej funkcję dodatkową
Dim New As Bit
'deklaracja zmiennej zawiadamiającej o odebraniu kodu RC5
Dim Licznik As Byte
'deklaracja zmiennej pomocniczej
Dim Flag As Bit
'deklaracja zmiennej pomocniczej
Dim Count As Long
'deklaracja zmiennej określającej czas oczekiwania na komendę RC5
Dodatkowy komentarz:
przewidując, że zmienna COUNT może mieć dużą wartość, deklarujemy ją jako LONG.
Wartość zmiennej może teraz zawierać się w przedziale od 0 do 2 147 483 647.
Declare Sub Aux 'deklaracja podprogramu obsługującego funkcję dodatkową
P3 = 0 : P1 = 255 : Set P3.2 'ustawienie portów w stanach początkowych
Dodatkowy komentarz:
Podanie polecenia P[x] = Z powoduje wysłanie na wyjścia określonego portu binarnej
reprezentacji liczby Z. A zatem, wszystkie wyjścia portu P3 znalazły się w stanie niskim,
a wszystkie wyjścia portu P3 w stanie wysokim. Spowodowało to wyłączenie wszystkich
urządzeń dołączonych do procesora. Jedynie wejście P3.2 zostało ustawione w stan wy−
soki, aby umożliwić odebranie transmisji z pilota. Polecenie SET ustawia na wybranym
wyjściu stan wysoki, a polecenie RESET − stan niski.
Sound P1.0 , 500 , 1000 'generacja dźwięku sygnalizacyjnego
Dodatkowy komentarz:
Język MCS Basic dysponuje specyficznym poleceniem umożliwiającym generowanie
prostych dźwięków, o niezbyt dokładnie określonej częstotliwości. Wydanie polecenia:
SOUND [pin procesora], [czas trwania], [częstotliwość] powoduje wysłanie na wskazane
wyprowadzenie procesora ciągu impulsów prostokątnych o zadanej częstotliwości. Sze−
rzej omówimy to polecenie na jednej z następnych lekcji, ale już teraz warto wiedzieć, że
nie możemy oczekiwać po nim generowania stabilnej i stałej częstotliwości i może być
ono wykorzystywane jedynie do wytwarzania prostych dźwięków sygnalizacyjnych.
D1 Alias P1.7
'nadanie nowych nazw wyprowadzeniom procesora
D2 Alias P1.6
'nadanie nowych nazw wyprowadzeniom procesora
D3 Alias P1.5
'nadanie nowych nazw wyprowadzeniom procesora
D4 Alias P1.4
'nadanie nowych nazw wyprowadzeniom procesora
D5 Alias P1.3
'nadanie nowych nazw wyprowadzeniom procesora
D6 Alias P1.2
'nadanie nowych nazw wyprowadzeniom procesora
Dodatkowy komentarz:
Polecenie ALIAS jest przejawem iście dekadenckiego zamiłowania do wygody i kom−
fortu pracy. Nie robi ono niczego innego w programie, poza tym, że po jego wydaniu mo−
żemy używać dwóch nazw wyprowadzenia procesora lub zmiennej. A zatem, po wydaniu
polecenia: D1 Alias P1.7 staje się obojętne, czy wyprowadzenie P1.7 procesora nazywać
będziemy nadal P1.7 czy też D1. Natomiast z punktu widzenia programisty jest znacznym
udogodnieniem to, że nie musi już więcej sprawdzać na schemacie, do jakiego wyprowa−
dzenia procesora dołączone jest każde z urządzeń (w naszym przypadku diody LED). Pole−
cenie ALIAS jest tylko instrukcją dla kompilatora i jego stosowanie nie zwiększa długości
kodu wynikowego.
Programowanie
Bierzmy się zatem do pisania programu
obsługującego kolejne wcielenie "raabo−
wozu". Na samym początku musimy, jak
zwykle, zadeklarować wszystkie używane
w programie zmienne. Zacznijmy od war−
tości, których nadanie przez pilota spowo−
duje takie, a nie inne reakcje układu. Będą
to wartości z zakresu od 0 do 63, a zatem
musimy zadeklarować je jako "BYTE"
(maksymalna wartość 255). Takich zmien−
nych będziemy używać 10: 9 dla określe−
nia sposobu poruszania się pojazdu i jed−
ną, odpowiedzialną za włączanie i wyłą−
czanie funkcji dodatkowej. Po deklaracji
zmiennych określimy konfigurację sprzę−
tową układu, zadecydujemy czy i jakie
przerwania będą wykorzystywane przez
program. Tę, pierwszą fazę działania na−
szego programu ukazuje poniższy listing,
którego niektóre fragmenty zostały opa−
trzone dodatkowym komentarzem:
Config Timer1 = Timer , Gate = Internal , Mode = 2 'konfigurowanie timera 1
Dodatkowy komentarz:
Korzystaniu z timerów poświęcona będzie w najbliższej przyszłości cała lekcja. Jest
to bardzo obszerny i bardzo ważny temat, a na razie podaję Wam tylko najważniejsze in−
formacje:
Polecenie Config Timer1 = Timer oznacza, że wewnętrzny licznik zawarty w strukturze
procesora będzie pracował jako timer, czyli zliczał impulsy od zadanej liczby w dół. Po do−
liczeniu do zera timer zgłasza PRZERWANIE, czyli żądanie zaprzestania wykonywania
przez procesor jakichkolwiek czynności i wykonanie instrukcji określonej poleceniem ON
TIMER [0 lub 1].
Dodatkowe plecenie: Gate = Internal instruuje kompilator, że licznik wbudowany w pro−
cesor będzie zliczał impulsy pochodzące z zegara systemowego. Częstotliwość tych impul−
sów będzie równa częstotliwości oscylatora kwarcowego podzielonej przez 12.
Dodatkowe polecenie: Mode = 2 powoduje, że timer po osiągnięciu stanu 0 i wygene−
rowaniu przerwania zostanie natychmiast ponownie uruchomiony i rozpocznie zliczanie
od tej samej, co uprzednio wartości. Tryb Mode = 2 jest wyjątkowo wygodny, ponieważ ti−
mer nie wymaga żadnej dodatkowej obsługi i pracuje niejako w "tle", jedynie zgłaszając
upływ czasu za pomocą przerwań.
Elektronika dla Wszystkich
15
Projekty AVT
On Timer1 Timerint
'podprogram "Timerint" będzie obsługiwał przerwanie z timera
tować, ponieważ zbudowany jest identy−
cznie jak poprzedni i jak 8 następnych.
Load Timer1 , 255
'załadowanie rejestru timera początkową wartością
Dodatkowy komentarz:
Wydanie polecenia: Load timer [0,1] , [wartość] powoduje załadowanie do rejestru ti−
mera zadanej liczby, w przypadku pracy w trybie MODE =2 nie większej niż 255. Po uru−
chomieniu timera jego cykl pracy będzie wynosił 255 impulsów zegara systemowego.
Teoretycznie w przypadku stosowania rezonatora kwarcowego 12MHz jeden taki cykl
powinien trwać 0,000255 sekundy, w praktyce będzie trochę dłuższy. Do tematu time−
rów powrócimy na jednej z najbliższych lekcji.
On Int0 Receiverc5
'podprogram "Receiverc5" będzie obsługiwał przerwanie INT0
Do
If New = 1 Then
Disable Int0
Back = Command
New = 0
P1 = 0
Wait 1
P1 = 255
Enable Int0
Exit Do
End If
Loop
Enable Int0
'zezwolenie na korzystanie z przerwania INT0
Enable Interrupts
'zezwolenie na korzystanie z przerwań jako takich
Enable Timer1
'zezwolenie na korzystanie z przerwania z timera 1
Wtym momencie program kończy przygo−
towania do pracy, polegające na określeniu
konfiguracji sprzętowej i deklaracji stosowa−
nych zmiennych i podprogramów. Następna
część programu będzie składać się z szeregu
małych pętli programowych. W każdej z nich
program będzie starał się uzyskać informację,
jaki kod odebrany z pilota będzie powodował
określoną reakcję pojazdu. Z powodu ogra−
niczonej ilości miejsca omówimy tylko pierw−
szą pętle, pamiętając, że pozostałe zbudowane
są praktycznie identycznie, a różnica polega
tylko na rejestrowaniu za każdym razem innej
komendy. Oczywiście, nie ma najmniejszego
znaczenia, jakiemu klawiszowi pilota podpo−
rządkujemy określoną komendę. Osobiście po−
lecam wykorzystanie do sterowania pojazdem
klawiszy numerycznych (
rysunek 3
), o ile
oczywiście nasz pilot je posiada.
Po uzyskaniu informacji o kodzie, które−
mu podporządkowana jest zmienna FOR−
WARD powodująca ruch pojazdu do przodu,
program przechodzi do następnej pętli,
w której próbuje uzyskać informacje o ko−
dzie pilota, którego wysłanie ma
powodować ruch pojazdu do tyłu. Tego
fragmentu programu nie będziemy komen−
Każde żądanie wysłania określonej ko−
mendy poprzedzone jest włączeniem odpo−
wiadającej jej kombinacji diod LED. Dla uła−
twienia wszystkie te kombinacje zostały po−
kazane na
rysunku 4
.
Rys. 3
Rys. 4
Do
'początek pętli programowej
Reset D4 : Reset D3
'włączenie diod D4 i D3, co jest żądaniem wysłania kodu powodującego
'ruch pojazdu do przodu
If New = 1 Then 'jeżeli odebrany został poprawny kod RC5 to:
Disable Int0 'chwilowe zawieszenie obsługi przerwania INT0
Forward = Command 'odebrane polecenie będzie powodować ruch pojazdu do przodu
New = 0
'wyzerowanie znacznika odebrania kodu
Po zakończeniu zdobywania informacji
o potrzebnych mu kodach, program wycho−
dzi znowu "na prostą" i realizuje kilka
funkcji przed wejściem w kolejną pętlę pro−
gramową, a przede wszystkim 10 błyskami
diod LED zawiadamia o zakończeniu
pierwszego zadania :
P1 = 0
'wymuszenie stanu "0" na wszystkich wyjściach portu P1, a tym
'samym włączenie wszystkich diod LED. Jest to sygnał
potwierdzający 'odebranie żądanej komendy
Wait 1
'czekaj 1 s.
Dodatkowy komentarz:
Plecenie:
WAIT [s.]
For Licznik = 1 To 10 'wykonaj poniższe instruk−
cje 10 razy
P1 = 255 'wyłącz wszystkie diody
LED dołączone do portu 1
Waitms 200 'zaczekaj 200 ok. msek
Sound P1.0 , 100 , 1000
powoduje zwieszenie działania programu na podany okres. Oczekiwanie może zakoń−
czyć się po upływie tego czasu oraz po wystąpieniu sygnału przerwania zewnętrznego
lub pochodzącego z timera. Maksymalny czas może wynosić 255 s.
Podobną rolę pełni dyrektywa:
WAITMS [ms.]
'wygeneruj
krótki dźwięk
P1 = 0
UWAGA. Funkcja WAIT i WAITMS nie odmierzają czasu zbyt precyzyjnie i nie mogą
być stosowane do dokonywania precyzyjnych pomiarów.
' włącz wszystkie diody
dołączone do portu 1
Waitms 200
P1 = 255
'wyłączenie diod LED, których chwilowe włączenie było dla 'użytkownika sygnałem
o odebraniu kodu
'zaczekaj 200 msek
Next Licznik
' powtórz powyższe czyn−
Enable Int0 'ponowne zezwolenie na obsługę przerwania
Exit Do 'wyjście z pętli programowej
Dodatkowy komentarz:
Polecenie:
EXIT DO powoduje natychmiastowe wyjście z pętli programowej określonej polece−
niami DO .... LOOP. Po wyjściu z pętli program rozpoczyna dalszą działalność od pierw−
szej linii występującej po "LOOP"
End If 'koniec uwarunkowania poprawnego odebrania transmisji RC5
Loop
ności
Reset P3.1 : Reset P3.3 : Reset P3.4 : Reset P3.5
: P1 = 255 ' wyłącz diody, wyłącz silniki
Enable Interrupts 'zezwalam na obsługę
przerwań
On Int0 Receiverc5 'w przypadku wystąpienia
zgłoszenia przerwania (odebrania 'RC5 skocz
do podprogramu "Receiverc5"
'zamknięcie pętli
16
Elektronika dla Wszystkich
Projekty AVT
Enable Int0
'zezwolenie na obsługę
Każda odebrana komenda pochodząca
z nadajnika kodu RC5 jest przez program
analizowana. Jeżeli komenda taka odpo−
wiada jednemu z zarejestrowanych pole−
ceń, to program podejmuje określone dzia−
łania, kierując ruchem pojazdu zgodnie
z naszymi życzeniami. Pętla programowa
zbudowana jest z szeregu uwarunkowań
analizujących odebraną komendę i wyko−
nujących odpowiadające jej czynności.
Opiszemy tylko dwa pierwsze uwarunko−
wania, pamiętając, że pozostałe zbudowane
są bardzo podobnie.
Do omówienia pozostały nam już tylko
dwa podprogramy − procedury analizowania
odebranego kodu RC5 i zawieszania pracy
programu po dłuższym okresie bezczynności.
Pierwszy podprogram RECEIVERC5 został
już szczegółowo opisany w ćwiczeniu 2.
Zwróćmy jedynie uwagę na fakt, że przy każ−
dym odebraniu poprawnej transmisji RC5 ze−
rowana jest zmienna COUNT, co ma ogrom−
ne znaczenie dla poprawnej pracy programu.
A następnie:
przerwania INT0
New = 0
'wyzerowanie znacznika
Enable Timer1
odebrania kodu RC5
Command = 255 'zmienna COMMAND ma
mieć jak na razie wartość 255
Priority Set Int0 'przerwanie pochodzące
od odbiornika RC5 ma 'pierwszeństwo przed
przerwaniem pochodzącym z timera.
'uruchomienie timera 1
I po zarejestrowaniu komend:
Load Timer1, 255
Start TIMER1
Od momentu wydania ostatniej instrukcji
zostaje uruchomiony timer sprzętowy proce−
sora, a jego działanie nie będzie już w na−
szym programie zatrzymane. W momencie
osiągnięcia przez timer stanu 0 generowany
jest sygnał przerwania, po czym timer rozpo−
czyna ponowne zliczanie w dół od zadanej
poleceniem LOAD TIMER liczby. Przy każ−
dym zgłoszeniu przerwania wykonywany
jest skok do poniższej procedury, nazwanej
TIMERINT (nie jest to element składni MCS
BASIC, ale po prostu nazwa):
Dodatkowy komentarz:
Stosowanie przerwań jest jednym
z największych udogodnień dla programi−
sty, ale może też być źródłem poważ−
nych kłopotów. W przypadku stosowania
dwóch lub więcej źródeł przerwań, bez−
względnie konieczne jest ustalenie, które
z nich ma pierwszeństwo i które zostanie
pierwsze obsłużone. W naszym przypad−
ku zadecydowaliśmy, że zawsze pierw−
szeństwo ma przerwanie pochodzące
z odbiornika RC5
Start Timer1
Timerint:
Incr Count
'zwiększ wartość zmiennej COUNT
Dodatkowy komentarz:
Pamiętamy, że TIMER0 został skonfi−
gurowany jako licznik zliczający w dół od
liczby 255. Po każdym osiągnięciu przez
timer stanu "0" zgłaszane jest przerwa−
nie, po czym timer automatycznie wpisu−
je do swojego rejestru zadaną uprzednio
wartość i rozpoczyna zliczanie od począt−
ku. Każde przerwanie zgłoszone przez ti−
mer powoduje skok do podprogramu: "TI−
MERINT", z którego działaniem zapozna−
my się za chwilę.
Dodatkowy komentarz:
Polecenie INCR [zmienna] powoduje
zwiększenie wartości zmiennej o 1.
Podobne działanie miałoby polecenie:
Zmienna = zmienna +1,
ale polecenie INCR wykonywane jest
przez procesor znacznie szybciej
Poleceniem o odwrotnym działaniu do
INCR jest DECR, które powoduje zmniej−
szenie wartości zmiennej o 1.
Receiverc5:
Disable Int0
Getrc5(subaddress , Command)
If Command < 63 Then
New = 1
Count = 0
'zerowanie zmiennej COUNT
End If
Enable Int0
Return
If Count = 50000 Then'jeżeli zmienna COUNT
przyjęła 'wartość 50000, to:
P1 = 255
Count = 0 'wyzerowanie licznika CO−
UNT (patrz komentarz dalej)
'wyłącz wszystkie diody LED
Reset P3.1 : Reset P3.3 : Reset P3.4 : Reset P3.5
'wyłącz silniki
For Licznik = 1 To 5 'pięciokrotnie wykonaj po−
niższe 'instrukcje
Po zakończeniu rejestrowania komend
i po wykonaniu czynności przygotowaw−
czych program wchodzi w pętlę, w której
pozostanie aż do momentu wyłączenia zasi−
lania. Jedynym wytchnieniem dla zmęczo−
nych krasnoludków biegających nieustan−
nie we wnętrzu procesora może być ewen−
tualne chwilowe zawieszenie pracy syste−
mu, którego działanie omówimy w dalszej
kolejności.
Ostatnim podprogramem wartym szcze−
gółowego omówienia jest procedura, której
zadaniem jest radykalne zmniejszenie mocy
pobieranej przez naszą zabawkę, w momen−
tach krótkich przerw w zabawie.
Na samym początku działania naszego
programu został wydany ciąg poleceń konfi−
gurujących i uruchamiających timer syste−
mowy TIMER0. Przypomnijmy je sobie:
Sound P1.0 , 500 , 2000
'wygeneruj sygnał akustyczny
Waitms 200
'zaczekaj 200ms.
Next Licznik
Idle
'wprowadź procesor w stan
'ograniczonego poboru mocy
End If
'koniec uwarunkowania
Return 'powrót do programu głównego,
o ile 'warunek nie został spełniony
Config Timer1 = Timer , Gate = Internal , Mode = 2
Podprogram TIMERINT realizuje
następujące zadania:
1.
Po każdorazowym wystąpieniu prze−
rwania timera1 wartość zmiennej COUNT
zwiększana jest o 1. Pamiętajmy jednak, że
każde odebranie transmisji z pilota powoduje
zerowanie tej zmiennej, tak że podczas nor−
malnej eksploatacji zabawki nie może ona
osiągnąć zbyt wielkiej wartości.
2.
O ile jednak przez pewien czas nie
nadajemy jakichkolwiek komend z pilota,
to zmienna COUNT osiągnie zadaną w linii
uwarunkowania wartość: 50000. Konse−
kwencje tego faktu będą następujące:
− zostaną wyłączone wszystkie diody LED
− wyłączone zostaną silniki, o ile przed speł−
nieniem uwarunkowania były włączone
− zostanie wygenerowany pięciokrotny sy−
gnał ostrzegawczy
Do
'początek pętli programowej
If Command = Forward Then 'jeżeli została odebrana komenda "FORWARD", to:
Reset P3.3 : Reset P3.5 'ustaw stan niski na wyjściach powodujących pracę silnika do tyłu
Set P3.1 : Set P3.4 'włącz obydwa silniki w tym samym kierunku: do 'przodu
Reset D3 : Reset D4 : Set D2 : Set D5 'włącz odpowiadającą odebranej komendzie 'kombinację
diod LED
Disable Timer1 'chwilowo zawieś obsługę przerwania timera 1
Sound P1.0 , 100 , 1000 'wygeneruj sygnał akustyczny
Enable Timer1
'ponownie wydaj zezwolenie na obsługę przerwania 'timera 1
Command = 255
'zmień wartość "COMMAND" na nieakceptowaną 'przez programy
analizujące.
End If
'koniec uwarunkowania
If Command = Back Then 'jeżeli została odebrana komenda "FORWARD", to:
Reset P3.1 : Reset P3.4 'ustaw stan niski na wyjściach powodujących pracę 'silnika do przodu
Set P3.3 : Set P3.5 'włącz obydwa silniki w tym samym kierunku: do tyłu
Reset D2 : Reset D5 : Set D3 : Set D4 'włącz odpowiadającą odebranej komendzie 'kombinację
diod LED
Disable Timer1 'chwilowo zawieś obsługę przerwania timera 1
Sound P1.0 , 100 , 1000 'wygeneruj sygnał akustyczny
Enable Timer1
'ponownie wydaj zezwolenie na obsługę przerwania 'timera 1
Command = 255
'zmień wartość "COMMAND" na nieakceptowaną 'przez podprogramy
analizujące.
End If
'koniec uwarunkowania
Elektronika dla Wszystkich
17
[ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • charloteee.keep.pl