K U R S

W trzeciej czÍúci kursu autor pokazuje jak

część 3

w wygodny i przejrzysty sposÛb budowaÊ programy

sk³adaj¹ce siÍ z wielu fragmentÛw, ktÛre spe³niaj¹ rolÍ biblioteki

najczÍúciej stosowanych funkcji.

Budujemy program z klocków, czyli co to jest „project file”

W†poprzedniej czÍúci artyku³u

go rodzaju ³¹cznikiem pomiÍdzy pro-

wspomina³em o†zbiorach nag³Ûwko-

gramem g³Ûwnym a†bibliotek¹. Nasz

wych oraz tak zwanych project file.

zbiÛr LCD4B.H moøe mieÊ postaÊ, jak

MyúlÍ, øe zarÛwno jedne, jak i†dru-

poniøej:

gie bÍd¹ dla nas bardzo uøyteczne

#include <reg51.h>

pod nazw¹ LCD4B.H. Bardziej w³aú-

i†wymagaj¹ kilku s³Ûw wyjaúnienia.

// port, do którego podłączono

ciwym wydaje siÍ jednak pozostawie-

Co to jest zatem project file?

// wyświetlacz LCD

nie tylko tych funkcji i†procedur,

Pod t¹ tajemnicz¹ nazw¹ kryje siÍ

#define PORT

P2

ktÛre bÍd¹ nam potrzebne.

po prostu lista zbiorÛw sk³adaj¹cych

// bity sterujące LCD

Teraz kolej na w³aúciw¹ imple-

siÍ na nasz program. Wracaj¹c do

#define ENABLE

PORT^0

mentacjÍ LCD4B.C. Na pocz¹tku mo-

przyk³adu z†poprzedniego odcinka -

#define READ

PORT^3

du³u umieszczamy dyrektywÍ #inclu-

jeúli na podstawie programu do ob-

#define REGISTER

PORT^2

de LCD4B.H. W†ten sposÛb wszystkie

s³ugi wyúwietlacza LCD utworzymy

// opóźnienie wielokrotności około

definicje z†pliku nag³Ûwkowego do-

bibliotekÍ, to musimy j¹ w†jakiú spo-

// 1 milisekundy dla kwarcu

stÍpne bÍd¹ rÛwnieø w†pliku ürÛd³o-

sÛb do³¹czyÊ do programu g³Ûwnego.

// 7,3728MHz

wym. W†kolejnym kroku usuwamy

Ten zbiÛr zawieraj¹cy listÍ wspÛ³pra-

void Delay (unsigned int k);

segment main(). W†zasadzie bibliote-cuj¹cych ze sob¹ modu³Ûw, poddawa-

// zapis bajtu do LCD

ka jest juø gotowa. Naleøy jeszcze

nych dzia³aniu kompilatora i†linkera,

void WriteByteToLcd(char X);

sprÛbowaÊ skompilowaÊ LCD4B.C, aby

stanowi tak zwany projekt (z angiel-

// zapis bajtu do rejestru

sprawdziÊ, czy ktÛreú z†definicji nie

skiego project). Czyli project file to

// kontrolnego LCD

powtarzaj¹ siÍ i†czy nie ma w†nich

po prostu lista zbiorÛw uwzglÍdnia-

void WriteToLcdCtrlRegister(char X);

b³ÍdÛw.

nych przez kompilator i†linker przy

// zapis bajtu do pamięci obrazu

translacji kodu ürÛd³owego na kod

void LcdWrite(char X);

£¹czymy bibliotekÍ

wynikowy. Na tej liúcie mog¹ siÍ

// czyszczenie ekranu LCD

z†programem g³Ûwnym

znaleüÊ nie tylko programy w†jÍzyku

void LcdClrScr(void);

Program g³Ûwny to program w†jÍ-

C, ale rÛwnieø w†jÍzyku asemblera.

// inicjalizacja wyświetlacza LCD

zyku C. Stanowi on jeden ze sk³ad-

Dla nas jest to bardzo uøyteczna in-

// w trybie 4 bity

nikÛw projektu. Podobnie, sk³adni-

formacja. Jest to sygna³, øe nasz pro-

void LcdInitialize(void);

kiem projektu musi byÊ postaÊ ürÛd-

gram nie musi byÊ przygotowany wy-

// ustawia kursor na współrzędnych

³owa biblioteki funkcji wyúwietlacza

³¹cznie w†jÍzyku C. Po utworzeniu

// x, y

oraz plik nag³Ûwka. Pos³uømy siÍ

nowego projektu warto jest zajrzeÊ

void GotoXY(char x, char y);

przyk³adem z†poprzedniego odcinka

do zak³adki menu Project Options.

// wyświetla tekst na współrzędnych

i†napiszmy ten sam program, ale ko-

Moøna tam znaleüÊ szereg opcji kom-

// x, y

rzystaj¹c z†utworzonej biblioteki.

pilatorÛw C†i†asemblera, ktÛre mog¹

void WriteTextXY(char x, char y,

Po uruchomieniu RIDE, w†pasku

wymagaÊ ustawienia. Na przyk³ad,

char *S);

menu na gÛrze ekranu odnajdziemy

j e ø e l i s t o s u j e m y m i k r o k o n t r o l e r

// wyświetla tekst od rozpoczynając

Project. Wybierzmy tÍ opcjÍ, a†nastÍp-AT89S8252, to moøna w³¹czyÊ opcjÍ

// od pozycji kursora

nie New. UtwÛrzmy nowy zbiÛr pro-

Dual DPTR. Pomaga ona przy pew-

void WriteText(char *S);

jektu i†nazwijmy go Pierwszy. Pro-nych operacjach 16-bitowych. Podob-

// definiowanie znaków z tablicy

gram sam nada mu domyúlne rozsze-

nie moøna post¹piÊ z†definicj¹ rejes-

// wskazywanej przez ptr

rzenie. PRJ, a†na dole ekranu zostanie trÛw 8051 dla modu³Ûw jÍzyka asem-void DefineSpecialCharacters(char

otwarte okienko projektu. NastÍpnie

bler tak, øe nie trzeba bÍdzie ich do-

*ptr);

wybierzmy File New i†utwÛrzmy

³¹czaÊ.

Jak ³atwo zauwaøyÊ, jest to do-

zbiÛr o†rozszerzeniu. C - to bÍdzie k³adne powtÛrzenie definicji nag³Ûw-nasz program g³Ûwny. Jego treúÊ po-

Budujemy pierwsz¹ bibliotekÍ

kÛw funkcji oraz sta³ych i†zmiennych,

winna byÊ nastÍpuj¹ca:

LCD4B.H

ktÛre maj¹ byÊ dostÍpne rÛwnieø

#include “lcd4b.h”

StwÛrzmy na podstawie programu

w†innych modu³ach tego samego pro-

// program główny

do obs³ugi wyúwietlacza nasz¹ pierw-

gramu. Plik nag³Ûwkowy naj³atwiej

void main(void)

sz¹ bibliotekÍ funkcji dla jÍzyka C.

jest w†tym przypadku utworzyÊ, ot-

{

Po pierwsze, musimy zdefiniowaÊ

wieraj¹c zbiÛr LCD4B.C i†kasuj¹c

char ix = 1, iy = 1, x, y, i = 0;

zbiÛr nag³Ûwka, ktÛry bÍdzie zawie-

wszystkie cia³a funkcji, zostawiaj¹c

ra³ wszystkie istotne dla pracy mo-

tylko ich nag³Ûwki. PozostawiÊ lub

LcdInitialize();

du³u parametry tak, aby nie trzeba

d o p i s a Ê m o ø e m y r Û w n i e ø r Û ø n e DefineSpecialCharacters(&CGRom);

by³o ich szukaÊ w†kodzie ürÛd³owym

zmienne i†sta³e, ktÛrych bÍdziemy

LcdClrScr();

biblioteki. Ten zbiÛr bÍdzie teø swe-

uøywaÊ. ZbiÛr po edycji zapisujemy

while (1)

Elektronika Praktyczna 8/2002

85

K U R S

{

Tabela 2. Lokalizacja parametrów przekazywanych do funkcji WriteTextXY(x, y, “ “);

Numer

char lub wskaźnik

int lub wskaźnik

long lub

wskaźnik typu

if (ix == 1) x++; else x-;

argumentu

1−bajtowy

2−bajtowy

float

generic

if (iy == 1) y++; else y-;

1

R7

R6:R7

R4:R5:R6:R7

R1:R2:R3

if (x == 19) ix = 0;

if (x == 0) ix = 1;

2

R5

R4:R5

R4:R5:R6:R7

R1:R2:R3

if (y == 3) iy = 0;

3

R3

R2:R3

R1:R2:R3

if (y == 0) iy = 1;

WriteTextXY(x, y, 0x01);

ci liczb szesnastkowych w†pliku ürÛd-

mentÛw przez bank rejestrÛw jest do-

Delay(50);

³owym programu. Znajdzie siÍ on pod

myúln¹ dla kompilatora. Moøna j¹ jed-

}

adresem wynikaj¹cym z†bieø¹cego sta-

nak zmieniÊ, stosuj¹c polecenie #prag-

}

nu kodu. Spodziewane s¹ wartoúci

ma NOREGPARMS. WÛwczas argu-

jednobajtowe obiektÛw, za wyj¹tkiem

menty funkcji przekazywane s¹ przez

Uwaga: wybranie File Open lub Fi-adresÛw zmiennych zewnÍtrznych ( co-

stos lub zapamiÍtywane w†segmencie

le New nie powoduje dodania otwar-

de lub xdata), ktÛre wymagaj¹ 2 baj-zmiennych pseudostatycznych. Po³oøe-

tego lub nowego zbioru do projektu.

tÛw. Nie jest to metoda zbyt wygod-

nie tego segmentu zaleøy od wybra-

Po wpisaniu tych kilku linijek in-

na. Sami musimy bowiem spe³niÊ ro-

nego modelu pamiÍci (jeúli wybrany

strukcji, zapisujemy program g³Ûwny

lÍ asemblera t³umacz¹c mnemoniki na

zosta³ model SMALL, LARGE lub

poprzez File Save As pod nazw¹

kody szesnastkowe.

COMPACT, wÛwczas znajduje siÍ on

TEST.C . ZapamiÍtaliúmy program

2. Za pomoc¹ dyrektywy #pragma

odpowiednio w†obszarze DATA, XDA-

g³Ûwny, teraz musi siÍ on staÊ czÍú-

ASM.

TA lub PDATA). Nie polecam jednak

ci¹ projektu. W†tym celu naciskamy

Dyrektywa ta pozwala na umiesz-

uøywania tego polecenia, poniewaø

k l a w i s z e s k r Û t u A L T + I N S E R T

czenie kodu w†postaci mnemonikÛw

wÛwczas lokalizacja argumentÛw mo-

i†w†otwartym okienku wskazujemy

asemblera w†pliku ürÛd³owym progra-

øe byÊ dosyÊ trudna.

zbiÛr TEST.C. ZbiÛr powinien siÍ po-

mu. Blok ten powinien siÍ zaczynaÊ

jawiÊ w†okienku Project na dole ek-

od #pragma ASM i†koÒczyÊ #pragma Nazwy funkcji jÍzyka C

ranu. BÍdzie on widoczny po wska-

ENDASM. Metoda ta, podobnie jak

a†asembler

zaniu symbolu ì+î. W†ten sam spo-

powyøsza, polecana jest jednak do

W†celu u³atwienia analizy progra-

sÛb musimy do³¹czyÊ zbiÛr LCD4B.C,

niewielkich procedur.

mu w†jÍzyku asembler oraz unikniÍ-

poniewaø musi on byÊ kompilowany

3. Za pomoc¹ modu³u w†jÍzyku

cia b³ÍdÛw tak zwanych runtime, na-

rÛwnoczeúnie z†programem g³Ûwnym.

asmeblera.

zwy funkcji podczas kompilowania

Zbioru LCD4B.H nie trzeba do³¹czaÊ.

Moim zdaniem jest to najlepsza

programu s¹ nieco modyfikowane.

Zostanie on do³¹czony automatycznie

i†najbardziej efektywna metoda zarÛwno

- void func1(void) wygeneruje symbol

w†czasie kompilacji, poniewaø jest

do ma³ych, jak i†duøych procedur

FUNC1. Nazwa funkcji bez para-

wymieniony jak parametr dyrektywy

w†jÍzyku asembler. Pozbawiona jest

metrÛw lub z†parametrami nieprze-

#include. Po naciúniÍciu klawisza F9, wad poprzednikÛw -†wymaga jednak

kazywanymi przez rejestry jest

co odpowiada wywo³aniu Make All,

opanowania kilku podstawowych regu³

przenoszona do zbioru. OBJ bez

nasz projekt powinien skompilowaÊ

przekazywania parametrÛw. MetodÍ tÍ

zmian. Ma³e litery w†nazwie funk-

siÍ bezb³Ídnie, a†rezultat w†postaci

omÛwimy najszerzej. BÍdziemy teø

cji zamieniane s¹ na duøe.

zbioru wynikowego ìPierwszy.hexî

stosowaÊ j¹ we wszystkich przyk³adach

- void func2(char) wygeneruje symbol

powinien zostaÊ zapisany na dysku.

³¹czenia modu³Ûw asemblera z†modu-

_FUNC2. Dla funkcji z†argumentami

³ami w†jÍzyku C.

przekazywanymi w†rejestrach, na

£¹czymy modu³ jÍzyka C

pocz¹tku nazwy dodawany jest

z†asemblerem

Jak przekazywane s¹

znak podkreúlenia. Znak ten jest

Podobnir jak ³¹czyliúmy modu³y

parametry funkcji?

identyfikatorem funkcji pobieraj¹-

napisane w†jÍzyku C, moøemy do³¹-

Parametry funkcji moøemy podzie-

cych argumenty z†rejestrÛw. Ma³e

czyÊ do programu g³Ûwnego w†C†mo-

liÊ na dwie grupy. Pierwsz¹ z†nich

litery w†nazwie funkcji zamieniane

du³y napisane w†jÍzyku asembler.

bÍd¹ stanowiÊ parametry zwracane ja-

s¹ na duøe.

Kompilator RC-51 oferuje nam 3†spo-

ko rezultat dzia³ania funkcji, drug¹

- void func3 (void) reentrant wyge-soby do³¹czania funkcji napisanych

pobierane przez ni¹ z†zewn¹trz (argu-

neruje symbol ?FUNC3. Funkcje ty-

w†jÍzyku asembler:

menty). Oba rodzaje parametrÛw prze-

pu reentrant (to znaczy takie, ktÛ-

1. Za pomoc¹ instrukcji ASM.

kazywane s¹ przez bank rejestrÛw.

re mog¹ byÊ wywo³ywane jedno-

Instrukcja asm pozwala na umiesz-

Trzeba byÊ wiÍc ostroønym, wyko-

czeúnie przez wiele innych funkcji)

czenie kodu jÍzyka asembler w†posta-

rzystuj¹c go do innych celÛw.

maj¹ nazwÍ poprzedzon¹ znakiem

W†przypadku wartoúci zwracanych

zapytania. Okreúla on funkcjÍ typu

Tabela 1. Lokalizacja wartości

przez funkcjÍ sytuacja jest bardzo

reentrant.

zwracanych przez funkcje

prosta, poniewaø funkcja moøe zwra-

Na dysku powstaje co najmniej

Rozmiar

Lokalizacja

caÊ tylko jedn¹ wartoúÊ. Wystarczy

trzy rodzaje zbiorÛw. Pierwszy z†nich

(typ parametru)

wiÍc znajomoúÊ tab. 1. Chyba øe

to przet³umaczony na jÍzyk asemble-

wartoúÊ zwracana nie mieúci siÍ

ra program ürÛd³owy (.LST), drugi to

bit (1 bit)

flaga Carry

w†banku rejestrÛw. WÛwczas jest ona

mapa zmiennych i†sta³ych (adresy ich

char (1 byte)

R7

umieszczana na stosie mikrokontrole-

rozmieszczenia w†pamiÍci 'M51), trze-

int (2 bajty)

R6:R7

ra. Inaczej jest w†przypadku, gdy za-

ci to zbiÛr wynikowy.HEX lub.BIN

generic pointer

R1:R2:R3

chodzi koniecznoúÊ przekazania argu-

(albo oba te zbiory). Jeúli mamy w¹t-

(3 bajty)

mentÛw do funkcji.

pliwoúci co do sposobu, w†jaki wy-

float (4 bajty)

R4:R5:R6:R7

Przez bank rejestrÛw moøe byÊ

konany zostanie nasz program napi-

double (6 bajtów)

R2:R3:R4:R5:R6:R7

przekazane do trzech argumentÛw. Jeú-

sany w†jÍzyku C, to wÛwczas analiza

long double

R1:R2:R3:R4:R5:R6:R7

li jest ich wiÍcej, wÛwczas uøywany

kodu wynikowego w†jÍzyku asembler

(7 bajtów)

jest stos. Metoda przekazywania argu-

moøe je wyjaúniÊ.

86

Elektronika Praktyczna 8/2002

K U R S

Nareszcie coú dla praktykÛw

deklarujÍ w†programie g³Ûwnym w†jÍ-

najpierw przetworzy zbiÛr PCKBD.C

Spoøytkujmy nowo zdobyt¹ wiedzÍ.

zyku C. Czasami zmiennych moøna

i†utworzy z†niego zbiÛr PCKBD.AOF, Przyda nam siÍ zarÛwno ta o†tworze-uøywaÊ zamiennie albo w†asemblerze,

a†nastÍpnie to samo zrobi ze zbiorem

niu zbiorÛw nag³Ûwkowych typu . H, albo w†C. OszczÍdzamy w†ten sposÛb

PCKBD.A51. Nietrudno zauwaøyÊ, øe jak i†o†³¹czeniu modu³Ûw i†przekazywa-pamiÍÊ mikrokontrolera, ktÛrej i†tak

ostatni kompilowany zbiÛr na³oøy siÍ

niu argumentÛw do funkcji w†jÍzyku

nie ma zbyt wiele.

na juø istniej¹cy. Linker prÛbuj¹c zbu-

C†oraz pobieraniu rezultatÛw ich dzia-

Aby poinformowaÊ kompilator jÍ-

dowaÊ z†obiektÛw zbiÛr wynikowy,

³ania. Za przyk³ad niech pos³uøy nam

zyka C, øe dana funkcja jest zewnÍ-

nie znajdzie potrzebnych danych i†wy-

program do odczytywania standardowej

trzn¹, czyli pochodzi z†innego modu-

úwietli komunikat o†brakuj¹cych funk-

klawiatury PC. Jeszcze drobna uwaga.

³u, uøywa siÍ s³owa kluczowego ex-

cjach czy zmiennych, mimo iø teore-

Bez wdawania siÍ w†szczegÛ³y funkcjo-

tern. Oto przyk³adowe deklaracje fun-tycznie wszystko jest w†porz¹dku.

nowania kompilatora jÍzyka asembler,

kcji zewnÍtrznych:

modu³ z†tego przyk³adu moøna potrak-

extern void TX_byte(char x);

Program do odczytu

towaÊ jako pewnego rodzaju szablon.

extern char RX_byte(void);

klawiatury PC

W†skrÛcie struktura takiego pliku jest

Kaøda funkcja i†zmienna w†jÍzyku

Program sk³ada siÍ z†dwÛch czÍú-

nastÍpuj¹ca:

C, jeøeli nie jest poprzedzona s³o-

ci. G³Ûwny napisany jest w†jÍzyku C,

<nazwa segmentu> SEGMENT CODE

wem static, ma zasiÍg globalny, to a†funkcje do komunikacji z†klawiatu-EXTRN DATA (<nazwa zmiennej> ) znaczy moøe byÊ wykorzystywana

r¹ napisane s¹ w†asemblerze. S¹ to

EXTRN CODE (<nazwa funkcji w C> ) przez inne modu³y. Upraszcza to ko-d w a o d r Í b n e m o d u ³ y . P i e r w s z y PUBLIC <nazwa udostępnianej funkcji rzystanie z†nich z†poziomu modu³u

z†nich nazywa siÍ PCKBD-C.C, a†dru-

w asemblerze>

przygotowanego w†jÍzyku asembler.

gi PCKBD-ASM.A51. Oba pliki sk³a-RSEG <nazwa segmentu >

Wystarczy bowiem tylko poinformo-

daj¹ siÍ na projekt o†nazwie PCKBD

.....implementacja....

waÊ kompilator, øe dana funkcja czy

( .PRJ). Do projektu do³¹czy³em rÛw-END

zmienna jest zewnÍtrzna. Inaczej jest

nieø wczeúniej utworzon¹ przez nas

Kiedy warto stosowaÊ modu³y napi-

w†przypadku modu³Ûw w†asemblerze.

bibliotekÍ zawieraj¹c¹ funkcje obs³ugi

sane w†asemblerze? Po pierwsze wtedy,

Kaøda funkcja musi zostaÊ zadeklaro-

wyúwietlacza LCD. MyúlÍ, øe przyda

gdy zaleøy nam na szybkoúci dzia³ania.

wana jako dostÍpna z†zewnÍtrz. S³u-

nam siÍ jeszcze niejednokrotnie.

Drugi powÛd moøe zaprzeczyÊ idei sto-

øy do tego s³owo PUBLIC. Do pobra-

Oczywiúcie program g³Ûwny jest

sowania jÍzykÛw wysokiego poziomu,

nia natomiast danych z†modu³Ûw

tylko przyk³adowym. Wyúwietla kody

do ktÛrych naleøy rÛwnieø C, jednak

w†jÍzyku C, s³owo EXTRN. Oto przy-

naciúniÍtych klawiszy, podczas gdy

niektÛre funkcje jest znacznie ³atwiej

k³ady deklaracji dostÍpu na poziomie

w†praktyce moøna je wykorzystaÊ

zaimplementowaÊ w†asemblerze niø

modu³u napisanego w†asmeblerze:

w†zupe³nie inny sposÛb do wprowa-

w†C. Tak jest na przyk³ad z†odczytywa-

- zmienna pobierana z†modu³u napi-

dzania danych czy sterowania w³as-

niem klawiatury PC. Dane z†niej wpro-

sanego w†jÍzyku C:

nym urz¹dzeniem. Funkcja main() za-

wadzane s¹ szeregowo, wiÍc konieczne

EXTRN DATA (temp)

wiera dosyÊ rozbudowany warunek

jest uøycie instrukcji przesuwania za-

- deklaracja dostÍpu do funkcji zaim-

switch. Jest to po³¹czenie tej instruk-wartoúci rejestru roboczego w†prawo lub

plementowanej w†module w†jÍzyku

cji z†konstrukcj¹ if....else.

w†lewo. Najproúciej jest to zrobiÊ, za-

C, niezbÍdne jest przekazanie para-

ZwrÛÊmy uwagÍ na wywo³anie

pamiÍtuj¹c wartoúÊ bitu portu, do ktÛ-

metrÛw do funkcji, st¹d teø kompi-

funkcji _Delay w†module w†jÍzyku

rego pod³¹czone jest wejúcie/wyjúcie da-

lator jÍzyka C†dodaje znak podkreú-

asembler. Jako argument funkcji wy-

nych klawiatury w†fladze przeniesienia

lenia przed jej nazw¹ zgodnie

magana jest liczba typu unsigned int.

C (na przyk³ad C†= P1^0 lub w†asem-

z†wczeúniej opisywanymi regu³ami:

Jest ona wpisywana do rejestrÛw

blerze MOV C,P1.0). PÛüniej wystarczy

EXTRN CODE (_Delay)

R6:R7 tuø przed poleceniem ACALL

juø tylko instrukcja przesuniÍcia w†pr-

- deklaracje funkcji udostÍpnianych

_Delay. Funkcjami wymieniaj¹cymi

awo lub w†lewo danych w†rejestrze A

przez modu³ w†jÍzyku asembler -

dane z†modu³em w†jÍzyku C s¹ rÛw-

z†uwzglÍdnieniem flagi C - wykonana

zwrÛÊmy uwagÍ na zmianÍ nazw

nieø RX_byte i† TX_byte. Poniewaø za-oúmiokrotnie - aby odczytaÊ ca³y bajt

w † s t o s u n k u d o t y c h , u ø y t y c h rÛwno argument dla TX_byte, jak

danych. W†jÍzyku C pojawia siÍ pe-

w†C†(podobnie jak _Delay):

i†liczba zwracana przez RX_byte s¹

wien problem. OtÛø zmienne bez zna-

PUBLIC _TX_byte

typu char, przekazywane s¹ one

ku (unsigned) i†ze znakiem (signed) s¹

PUBLIC RX_byte

przez rejestr R7 (patrz tab. 1†i†2).

rÛønie przez kompilator przesuwane.

Deklaracja obiektÛw zewnÍtrznych

Uk³ad elektryczny jest bardzo

RÛønica polega na uwzglÍdnianiu flagi

sk³ada siÍ z†trzech cz³onÛw: s³owa

prosty. Wystarczy w†zasadzie dowol-

przeniesienia w†przypadku zmiennych

kluczowego EXTRN, okreúlenia miejsca ny p³ytka testowa z†mikroprocesorem

typu signed. Co innego w†asemblerze,

w†obszarze adresowym mikrokontrole-

z†rodziny 8051. Klawiatura wymaga

mamy pe³n¹ kontrolÍ nad postaci¹

ra, gdzie umieszczony jest obiekt ( CO-

rezystorÛw pull-up o†wartoúci oko³o ürÛd³ow¹ programu i†sposobem jego wy-DE, DATA itp.) oraz nazwy obiektu 5,1kΩ. W†uk³adzie modelowym uøy-konywania, niezaleønie od typu dekla-

w†nawiasach. Deklaracja obiektÛw udo-

wa³em AVR Starter Kit firmy Atmel

rowanych zmiennych.

stÍpnianych na zewn¹trz zawiera tyl-

Corp. z†mikrokontrolerem AT89S8252.

£¹cz¹c modu³ napisany w†jÍzyku

ko s³owo kluczowe PUBLIC.

Program po skompilowaniu zajmuje

C†z†modu³em w†asemblerze, staram siÍ

Na koniec bardzo waøna uwaga.

nieco wiÍcej niø 1,5kB. Z†powodze-

zachowaÊ pewien styl programowania.

Modu³ napisany w†jÍzyku C musi

niem moøna go wiÍc zmieúciÊ rÛw-

Oczywiúcie moøesz sobie wybraÊ

mieÊ inn¹ nazwÍ niø napisany w†jÍ-

nieø w†malutkim AT89C2051.

w³asny. Moja propozycja jest jednak

zyku asembler. Dlaczego? Podczas

Jacek Bogusz, AVT

nastÍpuj¹ca:

kompilowania tworzone s¹ rÛøne zbio-

jacek.bogusz@ep.com.pl

1. Program g³Ûwny zawsze napi-

ry tymczasowe. Maj¹ one tak¹ sam¹

sany jest w†jÍzyku C†i†do niego do³¹-

nazwÍ jak zbiÛr ürÛd³owy, lecz inne

Dodatkowe informacje

czane s¹ modu³y w†jÍzyku asembler.

rozszerzenie (na przyk³ad. AOF). Gdy Ewaluacyjn¹ wersjê pakietu firmy Raisonance

2. Kaød¹ zmienn¹ (kaød¹ komÛr-

oba modu³y, w†C†i†asemblerze, bÍd¹

oraz postaæ Ÿród³ow¹ programu prezentowanego kÍ pamiÍci uøywan¹ przez asembler)

mia³y tÍ sam¹ nazwÍ, to kompilator

w artykule zamieœciliœmy na CD-EP8/2002B.

Elektronika Praktyczna 8/2002

87