101
Elektronika Praktyczna 10/2003
B A S C O M O W E P O R A D Y
W†pierwszym odcinku cyklu
przedstawimy proste i†zasadnicze
dla pos³ugiwania siÍ mikrokontro-
lerami zagadnienie, jakim jest spo-
sÛb konfiguracji portÛw mikrokont-
rolerÛw AVR. Ze wzglÍdu na od-
mienn¹ od '51 budowÍ mikrokont-
rolerÛw AVR, konfigurowanie por-
tÛw w†Bascom AVR rÛøni siÍ od
konfiguracji portÛw w†Bascom 51,
w†ktÛrym liniÍ portu - aby praco-
wa³a jako wejúcie - wystarczy³o
ustawiÊ w†stan logicznej ì1î. Prob-
lemy z†konfiguracj¹ portÛw mikro-
kontrolerÛw AVR przez pocz¹tkuj¹-
cych wynikaj¹ zazwyczaj
z†braku wiedzy o†dzia³aniu,
budowie i†konfiguracji mikro-
kontrolerÛw AVR, ktÛre fun-
kcjonalnie rÛøni¹ siÍ znacz-
nie od popularnych '51.
Mikrokontrolery AVR, ze
wzglÍdu na swoj¹ budowÍ
wymagaj¹ aby linie portÛw,
ktÛre bÍd¹ wykorzystywane
w†urz¹dzeniu by³y odpowiednio
skonfigurowane - musi to zrobiÊ
programista, najlepiej na pocz¹tku
programu. Na rys. 1 przedstawio-
no jako przyk³ad budowÍ jednej li-
nii portu mikrokontrolera AVR. Na
rysunku widaÊ, øe do konfiguracji
portu przeznaczono dwa rejestry:
DDRx oraz PORTx, ktÛre umoøli-
wiaj¹ konfiguracjÍ oraz obs³ugÍ li-
nii I/O. Naleøy mieÊ na uwadze,
øe linie portÛw mikrokontrolera
mog¹ pe³niÊ takøe alternatywne
funkcje - np. mog¹ byÊ wejúciem
przetwornika A/C, analogowego
komparatora, timera itd.
Na pocz¹tku programu (choÊ
takøe w†jego dowolnej czÍúci moø-
na zmieniÊ konfiguracjÍ linii portu)
naleøy zadeklarowaÊ czy uøywane
wyprowadzenie (port) bÍdzie pe³niÊ
funkcjÍ wejúcia czy teø wyjúcia
mikrokontrolera. S³uøy do tego spe-
cjalny rejestr DDRx, ktÛry moøemy
oprogramowaÊ ìwprostî (wpisuj¹c
bezpoúrednio do niego wartoúÊ) lub
w†sposÛb ìbascomowyî, ktÛry jest
bardziej czytelny i†³atwiejszy do
opanowania dla pocz¹tkuj¹cego.
W†Bascom AVR uøywamy do tego
celu nastÍpuj¹cych instrukcji:
CONFIG PORTx = [INPUT/OUTPUT]
CONFIG PINx.y = [INPUT/OUTPUT]
gdzie: x†- numer portu, y†- numer
koÒcÛwki
Jeúli podamy parametr INPUT,
wtedy koÒcÛwka bÍdzie wejúciem,
analogicznie OUTPUT - skonfiguru-
je port lub dan¹ liniÍ jako wyj-
úcie. ProszÍ o†zwrÛcenie uwagi na
rÛønice w†sk³adni: polecenie CON-
FIG PORTx konfiguruje ca³y 8-bi-
towy port jako wejúcie lub wyj-
úcie czyli CONFIG PORTB=INPUT
ustawi wszystkie 8†koÒcÛwek por-
tu B†jako wejúcia. Jeúli natomiast
chcemy ustawiÊ pojedyncze nÛøki
jako wejúcia/wyjúcia naleøy uøyÊ
drugiej sk³adni: CONFIG PINx.y.
Czyli aby ustawiÊ liniÍ B.2 jako
wyjúcie, polecenie konfiguracyjne
jest nastÍpuj¹ce: CONFIG
PortB.2 = OUTPUT. Jeúli
linia B.1 ma pracowaÊ ja-
ko wejúcie, to polecenie
konfiguracyjne bÍdzie na-
stÍpuj¹ce: CONFIG PortB.1
= INPUT. Jak widaÊ, moø-
liwe s¹ dwie opcje: IN-
PUT - gdy linia ma byÊ
wejúciem lub OUTPUT,
gdy linia ma byÊ wyj-
úciem. Moøna takøe uøyÊ
wartoúci bitowej (0 lub 1)
aby szybko skonfigurowaÊ
poszczegÛlne linie portu.
W†Bascomie do usta-
wiania oraz zerowania
danych linii mikrokontro-
l e r a u s t a w i o n y c h j a k o
wyjúcie mog¹ byÊ wyko-
rzystane dwie instrukcje: SET oraz
RESET. Jeúli np. nÛøka portu mik-
rokontrolera skonfigurowana jest
jako wyjúcie, wtedy stan wysoki
ustawiamy instrukcj¹ SET PortX.Y.
Stan niski wymuszamy instrukcj¹
RESET PortX.Y. Na przyk³ad, aby
ustawiÊ liniÍ B.2 mikrokontrolera
n a l e ø y u ø y Ê i n s t r u k c j a : S E T
PortB.2, a†jeúli chcemy zmieniÊ
stan linii B.0 na niski, to naleøy
uøyÊ instrukcji RESET PortB.0.
Bascom udostÍpnia takøe instruk-
cjÍ TOGGLE, ktÛra zmienia stan
danej koÒcÛwki portu na przeciw-
ny. Na przyk³ad instrukcja
TOGGLE PortB.0 zmieni na
przeciwny stan linii B.0
mikrokontrolera.
Pozornie bardziej skompli-
kowana wydawaÊ siÍ moøe
obs³uga wejúcia, ale tak
w†praktyce nie jest. Jeúli li-
nia jest skonfigurowana jako
wejúciowa, wtedy (wynika to
z†wewnÍtrznej budowy mikrokont-
rolera) powinniúmy zadeklarowaÊ:
czy linia jest wejúciem ìpodci¹g-
niÍtymî do VCC czy teø ìp³ywaj¹-
cymî. Jeúli stan linii portu usta-
wimy poleceniem SET PortX.Y,
wtedy na linii X.Y w†stanie spo-
czynku pojawi siÍ napiÍcie VCC
W bascomowym „kąciku” będziemy się starać w miarę przystępnie przedstawiać rozwiązania problemów
napotykanych przez naszych Czytelników podczas pisania programów w Bascomie. Rubryka ta powstała
z myślą o rozwiązywaniu problemów, na jakie najczęściej napotykają programiści, zatem zachęcamy
wszystkich Czytelników do zgłaszania problemów na jakie się natknęli podczas tworzenia własnych
programów.
Konfiguracja portów mikrokontrolera AVR
Stosowanie aliasów
Rys. 1. Przykład budowy jednej z linii portu
mikrokontrolera AVR
AVR−y od środka
Szczegółowe informacje o budowie rdzenia
mikrokontrolerów AVR oraz opisy ich
wybranych bloków funkcjonalnych można
znaleźć w książce „Mikrokontrolery AVR
w praktyce”, dostępnej w ofercie
handlowej AVT pod symbolem
KS−230929.
B A S C O M O W E P O R A D Y
Elektronika Praktyczna 10/2003
102
(wewnÍtrzny rezystor podci¹gaj¹cy
zostanie do³¹czony do danej linii).
Natomiast, jeúli nie skonfigurujemy
wejúcia, do³¹czaj¹c do niego we-
wnÍtrzny rezystor podci¹gaj¹cy (np.
poprzez ustawienie danego bitu
w†rejestrze portx) lub wydamy po-
lecenie RESET PortX.Y, wtedy na
linii wejúciowej nie bÍdzie (tak jak
w†wypadku wyjúcia) ìpewnejî ma-
sy, lecz wejúcie bÍdzie ìwisieÊî
w†powietrzu. Na takiej koÒcÛwce
wejúciowej nie bÍdzie stabilnego,
jednoznacznie okreúlonego stanu
logicznego. Tak¹ konfiguracjÍ linii
moøna wykorzystaÊ np. gdy z†ja-
kichú przyczyn wejúcie musi byÊ
ìúci¹gniÍteî przez zewnÍtrzny re-
zystor do masy. Rezystory ìpodci¹-
gaj¹ceî ustalaj¹ stan spoczynkowy
linii wejúciowych i†uodparniaj¹ je
takøe - w†pewnym stopniu - na
zak³Ûcenia. Dlatego teø zaleca siÍ,
aby podczas korzystania z†wejúÊ
konfigurowaÊ je jako linie z†aktyw-
nymi rezystorami ìpodci¹gaj¹cymiî
lub zastosowaÊ zewnÍtrzne rezys-
tory ìpodci¹gaj¹ceî (lub ìúci¹-
gaj¹ceî, zaleønie od aplikacji).
Oczywiúcie rezystory podci¹gaj¹ce
naleøy uøywaÊ, gdy na wejúciach
portÛw bÍdzie zewnÍtrznie podawa-
ny tylko jeden z†dwÛch moøliwych
stanÛw logicznych, co bÍdzie mieÊ
miejsce np. w†przypadku do³¹cze-
nia przyciskÛw do linii I/O mikro-
kontrolera. W†przypadku sterowania
wejúcia z†uk³adu cyfrowego, na
ktÛrego wyjúciu pojawiaÊ siÍ bÍ-
dzie na zmianÍ stan wysoki i†nis-
ki, rezystory podci¹gaj¹ce nie s¹
potrzebne.
Tak wiÍc, jeúli chcemy zapew-
niÊ zawsze stabilny stan na wej-
úciu mikrokontrolera, naleøy po
skonfigurowaniu portu ustawiÊ je-
go stan na wysoki, najlepiej in-
strukcj¹ SET PortX.Y, co powodu-
je do³¹czenie rezystora ìpodci¹ga-
j¹cegoî.
Aby odczytaÊ stan na wejúciu
mikrokontrolera pos³ugujemy siÍ
poleceniem: zmienna = PinX.Y (na
przyk³ad odczyt linii D.5: zmien-
na=PinD.5). Naleøy pamiÍtaÊ, øe
do odczytu stanu danej linii wej-
úciowej nie s³uøy rejestr portx,
lecz rejestr pinx.
Pozbierajmy zatem wszystko
w†jakiú konkretny przyk³ad: mikro-
kontroler ma sterowaÊ diodÍ LED
w³¹czon¹ miÍdzy ì+î zasilania
(VCC) a†B.2, w†zaleønoúci od sta-
nu wejúcia D.5 (linia PD5 jest
wiÍc wejúciem, natomiast PB2
wyjúciem). Na rys. 2 przedstawio-
no schemat elektryczny takiego
uk³adu z†wykorzystaniem mikro-
kontrolera ATmega8, ktÛrym czÍs-
t o b Í d z i e m y s i Í p o s ³ u g i w a Ê
w†przyk³adach przedstawianych
w†tej rubryce.
Program przedstawiony na list.
1 na czas naciúniÍcia przycisku
bÍdzie zapala³ diodÍ LED.
W†przyk³adzie, w†nieskoÒczonej
pÍtli, ca³y czas jest sprawdzany
przy pomocy warunku if stan li-
nii wejúciowej, do ktÛrej do³¹czo-
no przycisk. Jeúli zostanie on na-
ciúniÍty, stan linii wejúciowej
zmieni siÍ na niski, co spowodu-
je zapalenie diody LED. Puszcze-
nie przycisku bÍdzie rÛwnowaøne
z†podaniem przez wewnÍtrzny re-
zystor podci¹gaj¹cy dodatniego na-
piÍcia zasilania, czyli stanu wyso-
List. 1. Program sterujący diodą LED w zależności od stanu na
wejściu D.5
CONFIG PinB.2= OUTPUT
'wyjście do którego podłączona jest dioda
CONFIG PinD.5 = INPUT
'wejście do którego podłączony jest mikroswitch
'teraz ustawiamy na obydwu linach stan wysoki
Set Portb.2
'tu żeby dioda po włączeniu nie świeciła
Set Portd.5
'a tu podciągamy port
Do
'pętla główna programu
If Pind.5 = 0 Then
'porównujemy czy na końcówkę D.5 podano masę
'(naciśniety przycisk)
Reset Portb.2
'ustaw stan niski na Portb.2 - co spowoduje zapalenie
'diody
Else
'w przeciwnym wypadku
set PortB.2
'ustaw na portB.2 z powrotem na stan wysoki
'czyli zgaś diodę
End if
LOOP
'koniec nieskończonej pętli
kiego, przy ktÛrym dioda LED bÍ-
dzie wy³¹czona.
Na koniec jeszcze s³owo na te-
mat tzw. aliasÛw, czyli alternatyw-
nych nazw dla zmiennych, sta³ych,
itd. Poniewaø ludzka pamiÍÊ jest za-
wodna i†wygodniej nam zapamiÍty-
waÊ nazwy w³asne niø nazwy na-
rzucone przez producentÛw uk³adÛw,
Mark Alberts zadba³ takøe o†wygodÍ
programistÛw. Aliasy umoøliwiaj¹ na-
danie standardowym nazwom por-
tÛw, rejestrÛw, zmiennym itp. nazw
przyjaznych uøytkownikowi. Sk³adnia
instrukcji aliasu jest nastÍpuj¹ca:
Nazwa_przyjazna ALIAS Nazwa_trud-
na_do_zapamiętania
Co w†przyk³adzie przedstawio-
nym na list. 1†mog³oby mieÊ po-
staÊ:
Dioda Alias PortB.2 'przypisanie
'aliasu “dioda” do nazwy portb.2
Nazwie PortB.2 zostanie przy-
pisana alternatywna nazwa dioda,
ktÛra jednoznacznie identyfikuje
liniÍ portu. Na przyk³ad instruk-
cja RESET DIODA spowoduje za-
palenie diody do³¹czonej do linii
B.2 mikrokontrolera. Podobny alias
moøna stworzyÊ dla do³¹czonego
do linii wejúciowej przycisku. Na
przyk³ad:
Przycisk alias pind.5
'przypisanie aliasu “przycisk”
'do nazwy pind.5
W†tym przypadku nazwie przy-
cisk przypisano bit 5†rejestru
pind, ktÛry jest rejestrem wejúcio-
wym portu D. Jak to wczeúniej
wyjaúniono, nie moøna do odczy-
tu stanÛw linii wejúciowych np.
portu D†wykorzystaÊ rejestru portd.
Mamy nadziejÍ, øe w†tym krÛt-
k i m a r t y k u l e p r z e d s t a w i l i ú m y
w†sposÛb jasny i†wyczerpuj¹co za-
gadnienia zwi¹zane z†konfiguracj¹
linii portÛw mikrokontrolerÛw
AVR, a†takøe rozwialiúmy najczÍú-
ciej zg³aszane w¹tpliwoúci.
Za miesi¹c przedstawimy zagad-
nienia zwi¹zane z†obs³ug¹ sprzÍto-
wego interfejsu RS232, w†ktÛry wy-
posaøony jest niemal kaødy mikro-
kontroler AVR.
Artur Starz,
artur.starz@ep.com.pl
Marcin Wi¹zania,
marcin.wiazania@ep.com.pl
Rys. 2. Schemat ideowy układu
dla przedstawionego przykładu