Išči po prispevkih:

Home | Izobraževanje, Znanost


Mikrokrmilniški učni sistem (diplomska naloga)

By: Aleš Hribar


Univerza v Ljubljani
Fakulteta za elektrotehniko
Aleš Hribar
Mikrokrmilniški učni sistem
Univerzitetno diplomsko delo
Mentor: doc. dr. Roman Kamnik
Somentor: prof. dr. Marko Munih
V Ljubljani, avgusta 2006

Povzetek
Diplomska naloga obravnava mikrokrmilni?ski razvojni sistem, ki je zgrajen na
osnovi mikrokrmilnika Philips LPC2138. Delo predstavlja uporabo sistema v
praksi. V ta namen je pripravljenih deset primerov, ki uporabnika uvedejo v
delozmikrokrmilnikomternazorno prika?zejouporabnost mikrokrmilnikaoziroma
celotnega razvojnega sistema.
Delo je razdeljeno na?sest poglavij. Po uvodnem poglavju je predstavljena cen-
tralno procesna enota mikrokrmilnika. Ta je obravnavana zgo?s?ceno, saj podrobno
poznavanje za uporabnika ni klju?cnega pomena.
V naslednjem poglavju sledi predstavitev mikrokrmilnika. Najprej sta obrav-
navani RAM in Flash pomnilni?ski enoti. Za tem so v dveh lo?cenih podpoglavjih
obravnavne sistemske in vhodno-izhodne enote.
?Cetrto poglavje obravnava razvojno plo?s?co ITLPC2138 in razvojno program-
sko okolje WinIDEA. Opisani so konektorji, mosti?ci in vsa ostala periferija, ki se
nahaja na tiskanem vezju razvojne plo?s?ce. Predstavljene so tudi osnovne funkcije
razvojnega okolja.
V petem poglavju so opisana dodatna raz?siritvena tiskana vezja. Ta so bila
razvita z namenom demonstracije nekaterih zna?cilnosti mikrokrmilnika, ki se jih
samo z razvojno plo?s?co ITLPC2138 ne da pokazati.
Zadnje poglavje vklju?cuje deset primerov prakti?cne uporabe mikrokr-
milni?skega razvojnega sistema. Primeri si sledijo po te?zavnosti od la?zjega
proti te?zjem in jih je tako smiselno tudi obravnavati. Prvi primer je napisan v
zbirnem jeziku, vsi ostali pa v programskem jeziku C/C++. Prva dva primera
se ukvarjata s splo?snonamenskimi vhodno izhodnimi-linijami. Tretji primer
predstavi uporabo prikazovalnika na teko?ce kristale. Sledi primer uporabe
notranjega A/D pretvornika. Z modulom realnega ?casa se spoznamo v petem
primeru. ?Sesti in sedmi primer obravnavata modul za generiranje pulzno-?sirinsko
moduliranih signalov. Zadnji trije primeri se ukvarjajo s serijskim prenosom
podatkov. Uporabljeni so UART, I2C in SPI serijski vmesniki.
klju?cne besede: LPC2138, ARM7, mikrokrmilnik, PWM, I2C, SPI, UART
1
Abstract
The thesis describes ARM7 based development board. The heart of development
board is Philips?s LPC2138 microcontroller. Thesis tries to show how to use
development system in practical applications. The best way to do that is to
guide the user step by step trough small applications which can at the end be
put together in a bigger project.
The thesis consists of six chapters. The flrst is a short introduction into the
world of microcontrollers.
Second chapter describes the key features of the ARM7 core along with its
programmers? model. It also discuses the instruction set used to program it. This
is intended to give a reader a good feel for the CPU used in the LPC2000 family.
Next chapter is divided in three sections and presents LPC2138 microcontrol-
ler. First section describes memory mapping scheme, RAM and Flash memory.
Second section summarizes system control block functions. The end of the third
chapter describes user peripherals.
In fourth chapter there is a description of a ITLPC2138 development board
and WinIDEA integrated development environment. Here all connectors and
jumpers located on development board are described. Chapter also describes key
features of the WinIDEA environment.
Fifth chapter describes additional printed circuit boards. These boards are:
Motor control PCB; I2C, SPI and CAN serial interface demonstrational PCB and
matrix keyboard PCB. Boards were developed to demonstrate the use of some
additional features of LPC2138 microcontroller which can not be displayed by
using only ITLPC2138 target board.
Last chapter consists of ten sections. Each section is an example on how to
use difierent user?s peripherals integrated in LPC2138 microcontroller. Code
for flrst example is written in assembler. All other examples code is written in
C/C++ language. Di?culty level increases trough examples so it is advised to
treat them in presented order.
key words: LPC2138, ARM7, microcontroller, PWM, I2C, SPI, UART
2
1.
Uvod
Mikrokrmilnik je zaklju?cena enota vgrajena v integrirano vezje, ki poleg mikro-
procesorja vklju?cuje ?se pomnilni?ske enote in druge periferne naprave. Namenjen
je vodenju elektronskih naprav. V zadnjih letih je razvoj mikrokrmilnikov dosegel
nesluten napredek. Danes na trgu skoraj ni mogo?ce najti elektronske naprave, ki
ne bi vsebovala mikrokrmilnika. Podro?cje uporabe je ?siroko: od medicine do mo-
bilne telefonije preko avtomobilske industrije do vesoljske tehnike. V avtomobil
srednjega razreda je danes vgrajenih ve?c deset raznovrstnih mikrokrmilnikov. Ti
skrbijo za pravilno delovanje motorja, zavornega in pogonskega sistema, zra?cnih
blazin in ?se bi lahko na?stevali.
Prednosti uporabe mikrokrmilnikov, pred klasi?cnimi logi?cnimi vezji, so v ve-
liki eksibilnosti v smislu nadgradnje in spremembe funkcionalnosti, saj je mar-
sikaj mo?zno izbolj?sati le s spremembo programske kode. Poleg tega je razvoj
strojne in programske opreme cenej?si in enostavnej?si, kot pri uporabi klasi?cnega
splo?snonamenskega procesorja.
Zaradi strogih zahtev po nizki porabi energije in visoki integriranosti, je k ra-
zvoju mikrokrmilnikov najve?c pripomogel razmah izdelkov ?siroke potro?snje, kot
so mobilni telefoni in prenosni organizatorji (ang. Personal Digital Assistant
- PDA). Zaradi potreb trga so se za?celi pojavljati proizvajalci, ki se ukvarjajo
samo z na?crtovanjem jeder mikrokrmilnikov; vse ostale komponente: pomnil-
nik?ske enote, A/D pretvornike in ostale vmesnike pa razvije in skupaj z jedrom
integrira drugo podjetje. Med najbolj raz?sirjenimi mikrokrmilni?skimi jedri so je-
dra proizvajalca ARM. Jedra ARM uporabljajo podjetja Philips, Sharp, OKI in
mnogi drugi svetovno znani proizvajalci mikrokrmilni?skih sistemov.
Glede na ?siroko uporabnost in raz?sirjenost je smiselno, ?ce ne ?ze nujno, delo z
mikrokrmilniki vklju?citi v izobra?zevalni proces bodo?cih tehni?skih kadrov. Dan-
danes si je skorajda nemogo?ce zamisliti in?zinerja elektrotehnike brez poznavanja
delovanja mikrokrmilnika.
Diplomsko delo obravnava sodoben mikrokrmilnik Philips LPC2138. Ta je
3
Uvod Ale?s Hribar
?clan Philipsove dru?zine mikrokrmilnikov z imenom LPC2000. Srce mikrokrmil-
nika predstavlja ARM7TDMI-Sr jedro, ki je 16/32 bitna RISC (ang. Reduced
Instruction Set Computer) CPE (Centralno Procesna Enota). Maksimalni takt
ure je 60 MHz. Mikrokrmilnik LPC2138 vsebuje 512 kB Flash in 32 kB SRAM
(Static Random Acess Memory) pomnilnika. Odlikuje se z mnogimi vhodno-
izhodnimi enotami, razli?cnimi serijskimi vmesniki in nizko porabo energije.
Poudarekdela jenarazvojuu?cnihprogramskih primerov, kiuporabnikasezna-
nijo z delovanjem in programiranjem mikrokrmilnika. Primeri, ki so predstavljeni,
so namenjeni ?studentom drugega letnika avtomatike visoko?solskega strokovnega
?studija. Uporabni pa so za vsakogar, ki bi se rad seznanil z delovanjem in uporabo
Philipsovega mikrokrmilnika. Uporabnik je v delo z mikrokrmilnikom uveden s
preprostim primerom krmiljenja svetle?ce (LED) diode. Programska koda tega
primera je napisana v zbirniku. Naslednji primer je nadgradnja prvega. V tem
primeru zaporedno pri?zigamo ?stiri svetle?ce diode. Tako, kot tudi vsi naslednji,
je ta program napisan v programskem jeziku C/C++. Pri tretjem primeru se
spoznamo z delovanjem alfa numeri?cnega prikazovalnika na teko?ce kristale (v na-
daljevanju LCD). Poleg inicializacije je potrebnih ?se nekaj dodatnih funkcij za
pravilno delovanje prikazovalnika. Z uporabo 10-bitnega integriranega A/D pre-
tvornika in LCD prikazovalnika uporabnik v ?cetrtem primeru razvije preprost
voltmeter. Peti primer opisuje uporabo notranjega ?casovnika oz. RTC (Real
Time Clock). V tem primeru se uporabnik prvi?c sre?ca s prekinitvami. Nasle-
dnja primera se ukvarjata z generiranjem pulzno-?sirinskega signala (ang. Pulse
Width Modulation - PWM). Tako ?sesti primer uvaja v krmiljenje enosmernega
krta?cnega motorja. Medtem ko s pomo?cjo enkoderskega inkrementalnega dajal-
nika in povratne zanke v sedmem primeru spoznavamo zaprtozan?cno regulacijo,
ki se izvaja na istem motorju. Sledi primer uporabe zunanjega vhodno-izhodnega
raz?siritvenega modula povezanega z mikrokrmilnikom preko I2C serijskega vme-
snika. V zadnjem primeru uporabnik spozna uporabo SPI (Serial Peripheral
Interface) serijskega vmesnika na katerega je priklju?cen zunanji 12-bitni A/D
pretvornik.
Razvoj programske opreme je potekal s pomo?cjo razvojnega okolja WinIDEA,
ki ga je razvilo podjetje iSYSTEMS. Prvih pet primerov je bilo realiziranih na
razvojni plo?s?ci ITLPC2138. Za potrebe ostalih primerov, ki vklju?cujejo doda-
tno periferijo, pa sta bili razviti posebni tiskani vezji. Na prvem vezju, ki se
uporablja pri ?sestem in sedmem primeru, se nahajajo mo?cnostni mosti?ci za po-
gon enosmernega motorja in dekoder enkoderskega inkrementalnega dajalnika za
potrebe regulacijske zanke. Drugo tiskano vezje pa vklju?cuje 12-bitni A/D pre-
tvornik z zaporednim pribli?zevanjem povezan s SPI vodilom, dva vhodno-izhodno
raz?siritvena modula povezana z I2C vodilom ter vmesnik in gonilnik za CAN vo-
dilo.
Diplomsko delo sestavlja ?sest poglavji. Po uvodnem poglavju je najprej pred-
4
Uvod Ale?s Hribar
stavljena centralno procesna enota ARM7TDMI-Sr. Tretje poglavje opisuje mi-
krokrmilnik Philips LPC2138. V ?cetrtem poglavju je predstavljena razvojna
plo?s?ca ITLPC2138 in razvojno programsko okolje WinIDEATM. Peto poglavje
predstavlja raz?siritvena tiskana vezja. V zadnjem poglavju so predstavljeni u?cni
primeri uporabe mikrokrmilnika LPC2138.
5
2.
Centralno procesna enota
ARM7TDMI-Sr
2.1 Uvod
Srce Philipsove dru?zine LPC2000, v katero sodi tudi obravnavani mikrokrmilnik
LPC2138, predstavlja ARM7TDMI-Sr centralno procesna enota. Ker je da-
nes ve?cina programske kode napisane v vi?sjenivojskih programskih jezikih, npr.
C/C++, detaljno poznavanje centralno procesne enote ni potrebno. Za pravilno
izvajanje programske kode poskrbi prevajalnik. Ker pa je zanesljivo delovanje
najve?ckrat na prvem mestu, je potrebno vsaj osnovno znanje o delovanju cen-
tralno procesne enote.
ARM7TDMI-Sr spada med tako imenovane RISC (Reduced Instruction Set
Computer) procesorje, kar pomeni, da je njegov nabor ukazov majhen. To ima za
posledico tudi manj?se?stevilo vrat oz. tranzistorjev potrebnih za njegovo izdelavo.
Take vrste procesorji so zaradi tega lahko zelo majhni, za svoje delovanje rabijo
malo energije in so zato idealni za vgradnjo v mikrokrmilnike in podobne sisteme.
2.2 Zgradba in delovanje
2.2.1 Cevovod
Za svoje delovanje procesor ARM7TDMI-Sr uporablja ti. cevovod (ang. pipe-
line). Ta je sestavljen iz treh stopenj. Prva stopnja izvaja trenutni ukaz, druga
stopnja dekodira ukaz, ki se bo izvr?sil v naslednjem urinem ciklu, tretja pa bere
ukaz, ki se bo v naslednjem ciklu dekodiral. Tak princip delovanja omogo?ca, da
se ve?cina ukazov navidezno izvr?si v enem samem urinem ciklu. Vendar pa se
moramo zavedati, da tak sistem deluje najbolje na lilnearni kodi. To je koda brez
skokov oz. vejitev. Takoj, ko pride do vejitve je potrebno cevovod izprazniti in
6
Centralno procesna enota ARM7TDMI-Sr Ale?s Hribar
ga na novo napolniti.
Slika 2.1: Prikaz delovanja cevovoda
2.2.2 Registri
Obdelava podatkov v centralno procesni enoti poteka na naslednji na?cin: najprej
se podatek nalo?zi iz pomnilnika v enega od ?sestnajstih uporabniku dostopnih
registrov, po obdelavi pa se podatek prenese nazaj na ?zeleno mesto v pomnilniku.
Arhitektura, ki omogo?ca delovanje te vrste, je v angle?s?cini imenovana load-and-
store.
Kot ?ze omenjeno ima uporabnik na voljo ?sestnajst 32-bitnih registrov R0
do R15. Registri R0 do R12 so splo?snonamenski in nimajo dolo?cene funkcije.
Preostali trije R13 do R15 pa imajo posebno vlogo. Register R13 je kazalec sklada
(ang. Stack Pointer - SP). R14 se imenuje povezovalni register (Link Register -
LR). Kadar v programu kli?cemo funkcijo se povratni naslov (ang. return adress)
avtomati?cno shrani v LR. To omogo?ca hiter povratek iz klicane funkcije. Vendar
to samo v primeru kadar je klicana funkcija brez vejitev. ?Ce se klicana funkcija
veji je potrebno vrednost povezovalnega registra R14 shraniti na sklad. Register
R15 predstavlja programski ?stevec (ang. Program Counter - PC).
Poleg omenjenih ?sestnajstih obstaja ?se dodaten 32-biten register z imenom
CPRS. Kratica v angle?s?cini pomeni Current Program Status Register. To bi
lahko prevedli kot register trenutnega stanja programa, ki je neke vrste kontrolni
register. Slika 2.2 prikazuje razporeditev bitov v CPRS registru. Zgornji ?stirje
biti predstavljajo zastavice (ang. ags), ki jih postavlja CPE pri operacijah nad
podatki. Te so: negativen rezultat (ang. negativ), rezultat ni?c (ang. zero), pre-
nos (ang. carry) in preliv (ang. over ow). Spodnjih osem bitov lahko neposredno
postavlja ali bri?se programska koda. Sedmi in ?sesti bit omogo?cata vklop in izklop
uporabe dveh zunanjih virov prekinitve. Vse periferne enote integrirane v mi-
krokrmilniku uporabljajo ti dve liniji. Potrebna je pazljivost pri dolo?canju stanja
teh dveh bitov, saj pomeni logi?cna ?1? maskiranje prekinitev. Ostali biti v tem
registru so rezervirani in jih ni dovoljeno spreminjati.
7
Centralno procesna enota ARM7TDMI-Sr Ale?s Hribar
Slika 2.2: Razporeditev bitov v CPRS registru
Peti bit se imenuje THUMB. ARM7TDMI-Sr CPE lahko izvaja 32 bitni ARM
ali 16 bitni Thumbr nabor ukazov. Peti bit omogo?ca preklop med njima.
Spodnjih pet bitov dolo?ca na?cin delovanja centralno procesne enote. Ta lahko
deluje v enem izmed sedmih na?cinov. Programska koda se normalno izvaja v
uporabni?skem na?cinu delovanja (ang. User mode), z dostopom do zgoraj opisnih
registrov. Pri vstopu v poseben na?cin delovanja se vloga nekaterih registrov
spremeni. Detaljnej?sa razlaga sledi v naslednjem podpoglavju.
V vseh na?cinih delovanja, razen v uporabni?skem, se pojavi dodatni register z
imenom SPRS. Ko preidemo iz uporabni?skega v enega izmed posebnih na?cinov
delovanja se vsebina CPRS shrani v SPRS, po kon?canju pa se zopet vzpostavi pr-
votno stanje CPRS registra. Slika 2.3 prikazuje nabor registrov v mo?znih na?cinih
delovanja procesorja ARM7.
2.2.3 Posebni na?cini delovanja
Ob posebnih pogojih, ko se pojavi izjema, CPE preide v posebni na?cin pri ?cemer
se v programski ?stevec nalo?zi ustrezen vektor. Tabela 2.1 prikazuje vektorje, ki
pripadajo izjemam.
Dogajanje si je najlep?se ogledati na primeru. Recimo, da se v uporabni?skem
na?cinu pojavi zahteva po prekinitvi (IRQ). Potek dogodkov, ki sledijo, se zgodi v
naslednjem vrstnem redu. Najprej se naslov naslednjega ukaza (PC + 4), shrani
v LR. Nato se vsebina CPRS registra shrani v SPRS register. Sledi polnjenje
PC z ustreznim vektorjem, ki ima za primer IRQ vrednost 0x0000 0018. V istem
trenutku CPE preide v na?cin IRQ. Registra R13 in R14 sta nadome?s?cena z IRQ
R13 in R14 (glej sliko 2.3). Poleg tega se v CPRS registru postavi I bit in
onemogo?ci nadaljno IRQ prekinitev. ?Ce ?zelimo izvajati vgnezdene prekinitve, je
potrebno ta bit programsko pobrisati, hkrati pa je potrebno LR register shraniti
8
Centralno procesna enota ARM7TDMI-Sr Ale?s Hribar
Slika 2.3: Registri v razli?cnih na?cinih delovanja
Tabela 2.1: Izjeme in njihovi vektorji
Izjema Na?cin Naslov
Reset Nadzorni 0x0000 0000
Nedeflniran ukaz Nedeflniran 0x0000 0004
Programska prekinitev Nadzorni 0x0000 0008
Prefetch abort Abort 0x0000 000C
Data abort Abort 0x0000 0010
IRQ prekinitev IRQ 0x0000 0018
FIQ pekinitev FIQ 0x0000 001C
na sklad, da shranimo izvirni povratni naslov. Sledi skok na prekinitveno servisno
rutino. V tem trenutku je potrebno na sklad shraniti vse registre od R0 do R12,
kateribodouporabljenivservisnirutini. Zatemseizvedeprekinitvenarutina. Ob
kon?canem servisiranju prekinitve se CPE povrne v uporabni?ski na?cin in nadaljuje
z izvajanjem programske kode tam kjer je bilo to prekinjeno. Ker ARM nabor ne
vklju?cuje posebnega ukaza za vrnitev iz prekinitve, kot je to obi?cajno pri drugih
procesorjih, je to potrebno izvesti z uporabo navadnih ukazov. V razli?cnih na?cinih
9
Centralno procesna enota ARM7TDMI-Sr Ale?s Hribar
delovanja imajo nekateri splo?snonamenski registri od R7 do R14 posebne funkcije.
Na sliki 2.3 so registri s posebnimi funkcijami obarvani. Ve?c o posebnih na?cinih
delovanja je mogo?ce prebrati v dokumentaciji procesorja1.
2.3 Nabor ukazov
Kot je ?ze bilo omenjeno lahko ARM7TDMI-Sr procesor izvaja tako 32-bitni
ARM kot 16-bitni Thumbr nabor ukazov. Uporaba kraj?sih Thumbr ukazov je
smiselna, kjer je obseg kode kriti?cen. Poraba pomnilni?skega prostora se namre?c v
tem primeru zmanj?sa za 30 %, pri?cemer je hitrost izvajanja v popre?cju zmanj?sana
za 40 %.
Za razvoj programske kode v programskem jeziku C/C++ nam ni potrebno
podrobno poznati ukazov zbirnika. Kljub temu pa je razumevanje le teh klju?cnega
pomena za vsakogar, ki ?zeli dose?ci optimalno delovanje CPE.
ARM7TDMI-Sr je na?crtan tako, da lahko deluje kot ?big-endian? ali ?little-
endian? procesor. Besedni zvezi v angle?s?cini pomenita dve razli?cni ureditvi bitov
v registrih. Prva ureditev ima bit z najve?cjo te?zo postavljen na enaintrideseto me-
sto, bit z najmanj?so te?zo pa na ni?cto mesto. Pri drugi ureditvi je ravno obratno,
tako da bit z najmanj?so te?zo zaseda ni?cto mesto, bit z najve?cjo te?zo pa enaintri-
deseto mesto. V celotni dru?zini mikrokrmilnikov LPC2000 je mo?zno uporabljati
samo ?little-endian? ureditev bitov, zaradi ?cesar odpade skrb pri programiranju.
Potrebna je le nastavitev prevajalnika, ki ga uporabljamo, za ?little-endian? ure-
ditev. Slika 2.4 prikazuje obe ureditvi.
2.3.1 ARM nabor ukazov
Zanimiva lastnost ARM nabora ukazov je ta, da je lahko vsak ukaz pogojno
izvr?sen. Za starej?se mikrokrmilnike velja, da obstaja samo nekaj posebnih po-
gojnih ukazov. V ARM ukaznem naboru se zgornji ?stirje biti ukaza primerjajo s
pogojnimi zastavicami (N, Z, C, V) v CPRS registru. ?Ce se biti ne ujemajo, se
namesto ukaza v cevovod prenese ukaz, ki ne naredi ni?cesar (ang. no operation
- NOP). Tako na primer izvedemo operacijo nad podatkom in v odvisnosti od
rezultata se, ali pa ne, izvr?si naslednji ukaz. Vsakemu ukazu zbirnika lahko do-
damo eno od ?sestnajstih predpon, ki deflnirajo pogoj se bo naslednji ukaz izvr?sil.
Tabela 2.2 prikazuje te predpone.
ARM nabor ukazov lahko razdelimo v ?sest skupin:
? Vejitve (ang. Branching)
1ARM7TDMI-S Technical Reference Manual
10
Centralno procesna enota ARM7TDMI-Sr Ale?s Hribar
(a) little-endian
(b) big-endian
Slika 2.4: Dve razli?cni ureditvi bitov v registru
Tabela 2.2: Pogojne predpone ukazov
Predpona Zastavice Pomen
EQ Z postavljena na ?1? enakost
NE Z postavljena na ?0? neenakost
CS C postavljena na ?1? prenos
CC C postavljena na ?0? ni prenosa
MI N postavljena na ?1? rezultat negativen
PL N postavljena na ?0? rezultat 0 ali pozitiven
VS V postavljena na ?1? preliv
VC V postavljena na ?0? ni preliva
HI C postavljena na ?1? Z na ?0? ve?cje (za nepredzna?cena ?st.)
LS C postavljena na ?0? Z na ?1? manj?se ali enako (za nepredzna?cena ?st.)
GE N = V ve?cje ali enako
LT N 6= V manj kot
GT Z na ?0? in hkrati N = V ve?c kot
LE Z na ?1? ali N 6= V manj kot ali enako
AL nima vpliva ukaz se izvr?si vedno
? Obdelava podatkov (ang. Data Processing)
? Prenos podatkov (ang. Data Transfer)
11
Centralno procesna enota ARM7TDMI-Sr Ale?s Hribar
? Prenos bloka podatkov (ang. Block Transfer)
? Mno?zenje (ang. Multiply)
? Programska prekinitev (ang. Software Interrupt)
2.3.2 Thumbr nabor ukazov
?Ceprav je ARM7TDMI-Sr 32 bitni procesor, zna izvajati tudi 16 bitini nabor
ukazov imenovan Thumbr. Pravzaprav je Thumbr nabor samo skr?cena oblika
ARM ukaznega nabora. ARM omogo?ca shranjevanje programske kode v 16-
bitnem formatu, pri izvajanju pa raz?siritev v 32-bitni ARM format. Slika 2.5
prikazuje dogajanje pri izvajanju skr?cene 16-bitne Thumbr kode.
Slika 2.5: Raz?siritev THUMB v ARM ukaz
Thumbr ukazni nabor je podoben ukaznim naborom tradicionalnih mikro-
krmilnikov. V tem primeru Thumbr ukazi niso izvajani pogojno kot so to pri
ARM naboru. Poleg tega Thumbr ukazi ne omogo?cajo dostopa do vseh registrov.
Ukazi za obdelavo podatkov imajo dostop le do registrov R0 do R7 (ti registri se
angle?sko imenjejo ?low registers?). Kadar pride do reseta ali katere druge izjeme,
CPE avtomati?cno preide iz Thumbr v ARM ukazni nabor.
12
3.
Mikrokrmilnik Philips LPC2138
3.1 Uvod
Jedro mikrokrmilnika LPC2138 predstavlja 16/32 bitna ARM7TDMI-Sr RISC
centralno procesna enota, 512 kB hitrega Flash pomnilika in 32 kB stati?cnega
RAM pomnilnika. Kadar je velikost programske kode kriti?cna je poleg 32-bitnih
ukazov na voljo tudi 16-bitni Thumbr nabor. V Thumbr na?cinu se velikost
programske kode zgosti, hitrost izvajanja pa se zmanj?sa.
Odlika mikrokrmilnika LPC2138 sta majhnost in nizka poraba energije. Po-
leg 47 programabilnih vhodno-izhodnih linij mikrokrmilnik vsebuje tudi 10-bitni
8-kanalni analogno/digitalni pretvornik, 10-bitni digitalno/analogni pretvornik,
pulzno ?sirinski modulator in druge periferne module. Na sliki 3.1 je prikazan
blokovni diagram mikrokrmilnika z vsemi moduli.
Centralno procesna enota ARM7TDMI-Sr v osnovi lahko deluje s taktom 80
MHz, vendar jo pri tem omejuje dostopni ?cas Flash pomnilnika, ki zna?sa 50 ns.
To takt delovanja mikrokrmilnika upo?casni na 20 MHz. Te?zavo so pri Philipsu
re?silizuporabopospe?sevalnikadostopadopomnilnika(ang. MemoryAccelerator
Modul - MAM). Ta omogo?ca delovni takt mikrokrmilnika do 60 MHz.
Zna?cilnosti mikrokrmilnika Philips LPC2138:
? 16/32-bitna ARM7TDMI-Sr centralno procesna enota,
? majhno LQFP64 ohi?sje dimenzij 12x12 mm,
? 512 kB Flash pomnilnika (dostopni ?cas 50 ns),
? 32 kB stati?cnega RAM pomnilnika,
? ISP/IAP mo?znost programiranja Flash pomnilnika,
13
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
Slika 3.1: Blokovni diagram mikrokrmilnika LPC2138
? integrirani emulator in sledilnik (EmbeddedICEr and Embedded Trace)
omogo?cata razhro?s?cevanje v realnem ?casu,
? dva 8-kanalna 10-bitna A/D pretvornika (?cas pretvorbe 2.44 us),
? 10-bitni D/A pretvornik,
? dva 32-bitna ?casovnika/?stevca,
? pulzno-?sirinski modulator (PWM) s ?sestimi izhodi,
14
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
? ve?c serijskih vodil:
{ dva serijska UART vmesnika,
{ dva hitra I2C vmesnika (400 kbit/s),
{ SPITM in SSP vmesnika,
? vektoriziran prekinitveni krmilnik z nastavljivo prioriteto prekinitev,
? modul realnega ?casa z mo?znostjo zunanjega baterijskega napajanja in vho-
dnim taktom 32 kHz,
? do skupno 47 splo?sno namenskih vhodno-izhodnih linij,
? 9 na nivo ali prehod ob?cutljivih vhodnih prekinitvenih linij,
? maksimalni takt delovanja CPE 60 MHz, dose?zen z integrirano fazno zakle-
njeno zanko PLL,
? enojno napajanje v obmo?cju od 3.0 V do 3.6 V in do 5 V tolerantne vhodno
izhodne linije.
3.2 Naslavljanje in notranji pomnilnik
Naslovni prostor mikrokrmilnika je razdeljen na ve?c obmo?cij. Obmo?cja so pri-
kazana na sliki 3.2. Naslovni prostor med 0xF000 0000 in 0xFFFF FFFF je
namenjen vhodno-izhodnim modulom. Sistemske enote se nahajajo med naslo-
voma 0xE000 0000 in 0xF000 0000. Za Flash pomnilnik je namenjenega 512 kB
naslovnega prostora med 0x0000 0000 in 0x0008 0000.
3.2.1 Flash pomnilnik
Flash pomnilnik v velikosti 512 kB je lahko uporabljen za trajno shranjeva-
nje programske kode kot tudi podatkov. Programirati ga je mogo?ce na ve?c
na?cinov: preko vgrajenega serijskega JTAG vodila, z uporabo ISP na?cina (In
System Programming) in UART0 vodila ali z IAP na?cinom (In Application
Programming). Flash pomnilnik zagotavlja najmanj 10,000 brisalno/pisalnih ci-
klov z desetletnim hranjenjem podatkov.
3.2.2 Stati?cni RAM pomnilnik - SRAM
Prav tako kot Flash pomnilnik je mogo?ce tudi SRAM uporabiti tako za shranjeva-
nje tako podatkov kot tudi za shranjevanje programske kode. V mikrokrmilniku
15
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
Slika 3.2: Osnovna razdelitev naslovnega prostora mikrokrmilnika LPC2138
je integriranega 32 kB stati?cnega RAM pomnilnika, ki se nahaja med naslovoma
0x4000 0000 in 0x4000 8000.
3.3 Sistemske enote mikrokrmilnika LPC2138
3.3.1 Kvar?cni oscilator in fazno zaklenjena zanka - PLL
Za svoje delovanje mikrokrmilnik potrebuje zunanji urin takt. Tega zagotovimo
preko linije XTAL1 ali pa z vgrajenim oscilatorjem. Frekvenca zunanjega signala
se lahko giblje v obmo?cju od 1 MHz do 50 MHz. Kadar je v uporabi v mikrokr-
milnik vgrajeni oscilator je resonan?cna frekvenca kvar?cnega kristala omejena na
obmo?cje med 1 MHz in 30 Mhz. Slika 3.3 prikazuje obe mo?znosti priklju?citve.
Frekvenca signala, ki prihaja iz oscilatorja se imenuje FOSC. Frekvenco s katero
te?ce ARM centralno procesna enota imenujemo CCLK.
Za doseganje najvi?sjih hitrosti delovanja je v mikrokrmilnik integrirana fazno
zaklenjena zanka (ang. Phase Locked Loop - PLL). Ta omogo?ca, da se frekvenca
vhodnega signala pomno?zi za dolo?cen faktor. Vhodna frekvenca v PLL mora biti
med 10 MHz in 25 MHz. Izhodna pa zna?sa od 10 MHz do 60 MHz.
16
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
Slika 3.3: Mo?znosti priklopa urinega takta
3.3.2 Modul za nadzor naslovnega prostora - MMC
Z modulom MMC je mogo?ce preslikati prekinitvene naslove, ki se za?cnejo na na-
slovu 0x0000 0000, na druge lokacije. Preslikava omogo?ca izvajanje prekinitvene
programske kode na drugi lokaciji. Z MAP bitoma v MEMMAP registru se dolo?ci
lokacijo prekinitvenih vektorjev. Tabela 3.1 prikazuje MEMMAP register.
Tabela 3.1: Register MEMMAP
bit kratica vrednost opis
1:0 MAP 00 Prekinitveni vektorji so relocirani v
Boot blok.
01 Prekinitveni vektorji so relocirani v
Flash pomnilnik.
10 Prekinitveni vektorji so relocirani v
RAM pomnilnik.
11 Kombinacija je rezervirana in se je ne
uporablja.
7:2 - Biti so rezervirani in se jih ne sme
uporabljati.
17
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
3.3.3 Delilnik urinega takta perifernih enot - VPB delilnik
Delilnik dolo?ca razmerje med urinim taktom CCLK s katerim deluje ARM7 cen-
tralno procesna enota in taktom PCLK s katerim delujejo periferne enote. Tabela
3.2 prikazuje VPBDIV kontrolni register v katerem bita 0 in 1 dolo?cata delilno
razmerje.
Tabela 3.2: Register VPBDIV
bit kratica vrednost opis
1:0 VPBDIV 00 PCLK je enak ?cetrtini CCLK.
01 PCLK in CCLK sta enaka.
10 PCLK je enak polovici CCLK.
11 Kombinacija je rezervirana in se je ne
uporablja.
7:2 - Biti so rezervirani in se jih ne sme
uporabljati.
3.3.4 Modul za nadzor prekinitev - VIC
VIC je angle?ska kratica za Vectored Interrupt Controller. To je modul, ki nadzo-
ruje izvajanje prekinitev glede na njihovo prioriteto. Vsak od 32 virov prekinitev
je lahko razvr?s?cen v eno od treh prekinitvenih skupin: FIQ, IRQ ali nevektorizi-
rana IRQ prekinitev. Uporabnik ima mo?znost sam nastaviti prioriteto posame-
znim prekinitvam.
FIQ (ang. Fast Interrupt reQuest) je skupina prekinitev z najvi?sjo prioriteto.
Za najhitrej?se izvajanje prekinitvene rutine je v to kategorijo priporo?ceno pripisati
samo eno prekinitev.
Vmesno prioriteto servisiranja prekinitve ima skupina IRQ. V to skupino je
mo?zno razvrstiti do 16 prekinitev. Katerokoli od dvaintridesetih prekinitev lahko
razvrstimo v eno od ?sestnajstih praznih mest. Prekinitev razvr?s?cena na mesto 0
ima najvi?sjo prioriteto, tista razvr?s?cena na mesto 15 pa najni?zjo.
Nevektorizirana IRQ prekinitev ima najni?zjo prioriteto izvajanja. Podrobnej?si
opis VIC krmilnika in ostalih sistemskih enot je mogo?ce najti v dokumentaciji
proizvajalca1.
1LPC213x Users Manual, Rev. 01 - 24 June 2005
18
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
3.4 Vhodno-izhodne enote
V tem podpoglavju bodo podrobneje predstavljene vhodno-izhodne enote, upo-
rabljene v primerih, ki so opisani v naslednjih poglavjih.
3.4.1 Splo?sno namenske vhodno-izhodne linije
Mikrokrmilnik LPC2138 ima na razpolago dvoje 32-bitnih splo?sno namenskih
vhodno-izhodnihvrat. NavratihPORT0jeskupnodostopnih30vhodnoizhodnih
in ena izhodna linija. Na vratih PORT1 je dostopnih 16 vhodno-izhodnih linij. Za
nadzor vhodno-izhodnih vrat sta namenjeni dve skupini ?stirih registrov: IOPIN,
IOSET, IODIR, IOCLR.
IOPIN register 0 in 1 (IOPIN0 - 0xE002 8000 in IOPIN1 - 0xE002 8010)
hranita vrednosti prisotne na vhodno-izhodnihlinijah. Z njih lahko beremo tre-
nutno stanje na linijah neglede na to ali gre za vhodno ali izhodno linijo. Vendar
to velja samo za primer kadar so linije konflgurirane kot splo?sno namenske (ang.
General Purpose Input Output - GPIO). ?Ce linije postavimo v katerikoli drug
na?cin delovanja, vrednosti v teh registrih niso veljavne.
IOSET register 0 in 1 (IOSET0 - 0xE002 8004 in IOSET1 - 0xE002 8014)
Registra se uporabljata za dolo?canje stanja izhodnih linij. V primeru ko je linija
konflgurirana kot GPIO izhod, bo pisanje logi?cne ?1? v register postavilo ustrezno
linijo na visok nivo. Pisanje logi?cne ?0? nima nikakr?snega vpliva na dogajanje na
izhodu. Kadar je linija konflgurirana kot GPIO vhod ali ima dodeljeno kak?sno
drugo funkcijo, je pisanje v IOSET register brez pomena.
IOCLR register 0 in 1 (IOCLR0 - 0xE002 800C in IOCLR1 - 0xE002
801C) Kadar so linije na vratih nastavljene kot GPIO izhodi, jih je mogo?ce v
nizko logi?cno stanje postaviti s pisanjem v ta dva registra. Z vpisom logi?cne ?1? v
IOCLR register resetiramo pripadajo?ci bit v IOSET registru in postavimo izhod
v nizko stanje. ?Ce je linija konflgurirana kot GPIO vhod ali ima dodeljeno kak?sno
drugo funkcijo je pisanje v IOCLR register brez pomena.
IODIR register 0 in 1 (IODIR0 - 0xE002 8008 in IODIR1 - 0xE002 8018)
Registra se uporabljata za dolo?citev smeri vhodno-izhodne linije, kadar je ta
konflgurirana kot GPIO. Logi?cna ?0? pomeni, da je linija konflgurirana kot vhod;
logi?cna ?1? pa nastavi linijo kot izhod.
Napetostni nivo na liniji vrat dolo?camo s pisanjem v registra IOSET in
IOCLR. Stanje na vratih je rezultat zadnjega vpisa. Naslednji primer prikazuje
uporabo:
19
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
IODIR0 = 0x0000 0080 // Pin P0.7 nastavljen kot izhod
IOCLR0 = 0x0000 0080 // Pin P0.7 postavljen v nizko stanje
IOSET0 = 0x0000 0080 // Pin P0.7 postavljen v visoko stanje
IOCLR0 = 0x0000 0080 // Pin P0.7 postavljen v nizko stanje
Podobno lahko storimo z uporabo IOPIN registra:
IODIR0 = 0x0000 0080 // Pin P0.7 nastavljen kot izhod
IOPIN0 = 0x0000 0000 // Pin P0.7 postavljen v nizko stanje
IOPIN0 = 0x0000 0080 // Pin P0.7 postavljen v visoko stanje
IOPIN0 = 0x0000 0000 // Pin P0.7 postavljen v nizko stanje
3.4.2 A/D pretvornik
V mikrokrmilnik LPC2138 sta integrirana dva Analogno/Digitalna - A/D pre-
tvornika. Pretvornika delujeta na principu zaporednega pribli?zevanja (sukcesivna
aproksimacija). Njuna najve?cja lo?cljivost je deset bitov. Hitrost vzor?cenja je
410 tiso?c vzorcev na sekundo pri maksimalni lo?cljivosti. Napetostno obmo?cje
v katerem lahko merita je od 0 do 3 V. Vhod v vsakega od njiju predstavlja
ena od osmih multipleksiranih linij. Kot skoraj vse periferne enote tudi A/D
pretvornika delujeta s taktom PCLK. Ta mora biti ustrezno deljen na najbli?zjo
vrednost okoli 4.5 MHz. Vrednost delilnega razmerja je shranjena v PCLKDIV,
to pa izra?cunamo po (3.1).
CLKDIV = PCLKADclk ˇ 1 = PCLK4:5MHz ˇ 1 (3.1)
Delilno razmerje, kot tudi ostale kontrolne funkcije A/D pretvornika, se nahajajo
v kontrolnem registru. Poleg mo?znosti izklopa ure imamo mo?znost tudi popolnega
odklopa napajanja. To zmanj?sa porabo energije in ?sum, ki ga sicer povzro?ca
A/D pretvornik. Po resetu ima A/D pretvornik odklopljeno napajanje in urin
takt. Liniji za vklop urinega takta in napajanja nadzirata bita PDN in ADCR
v kontrolnem registru. Za vklop A/D pretvornika ju je potrebno postaviti na
logi?cno ?1?. Za razliko od ostalih perifernih modulov lahko A/D pretvornik zajema
tudi kadar so njegove vhodne linije v PINSEL registru konflgurirane kot GPIO.
Vendar pa je natan?cnost A/D pretvorbe ve?cja, kadar so linije konflgurirane kot
linije A/D pretvornika.
V kontrolnem registru je mogo?ce nastaviti tudi lo?cljivost A/D pretvornika. Ta
je lahko med tremi in desetimi biti. ?Cas pretvorbe pri nastavljeni tri-bitni reso-
luciji so ?stirje takti ADclk. Pri deset-bitni lo?cljivosti zajemanja se ?cas pretvorbe
pove?ca na enajst taktov takta ADclk.
20
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
3.4.3 Modul realnega ?casa - RTC
Modul realnega ?casa je (ang. Real Time Clock - RTC) uporabljen pri aplika-
cijah, kjer je potreba prikaza oz. uporabe trenutnega ?casa ali koledarja. Prikaz
datuma je mogo?c do leta 2099. RTC modul lahko poganjata dva razli?cna izvora
ure. Ta je lahko notranji takt PCLK ali poseben zunanji takt dodatnega osci-
latorja. Prav tako je mo?zno modul posebaj napajati z zunanjo baterijo in tako
omogo?citi njegovo delovanje tudi kadar je mikrokrmilnik v mirovanju. Zaradi
tega je modul na?crtan tako, da za svoje delovanje porablja minimalno energijo.
Slika 3.4 prikazuje blokovno shemo RTC modula.
Slika 3.4: Blokovni diagram RTC modula
Za upravljanje z modulom skrbi ve?cje ?stevilo registrov. Ti so razdeljeni v ?stiri
skupine:
? me?sana skupina registrov,
? skupina registrov za nadzor ?casa,
? registri za upravljanje z alarmi in
? registri za nadzor delilnika vhodnega takta v modul.
Kadar ?zelimo uporabljati RTC modul mora biti zunanja linija mikrokrmil-
nika VBAT priklju?cena na linijo V3 ali na neodvisen zunanji vir napajanja. V
nasprotnem primeru mora biti linija VBAT vezana na maso.
21
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
3.4.4 Modul za pulzno-?sirinsko modulacijo
Na prvi pogled je modul za pulzno-?sirinsko modulacijo (Pulse Width Modulation
- PWM) bolj kompliciran kot splo?sno namenski ?stevci/?casovniki. Pravzaprav pa
je to le dodatni?casovnik s posebnim nadzornim vezjem. Z njim lahko krmilimo ali
6 pulzno ?sirinsko moduliranih kanalov, ki jih pro?zimo na en prehod, ali 3 kanale,
ki jih pro?zimo na dva prehoda. Slika 3.5 prikazuje blokovno shemo PWM modula.
Upozoriti je potrebno, da blokovna shema ne prikazuje dejanske izvedbe, ampak
le diagram za enostavnej?so razlago delovanja.
Slika 3.5: Prikaz blokovnega diagrama PWM modula
22
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
Pri splo?sno namenskem ?casovniku/?stevcu novo vpisana izena?citvena vrednost
postane aktivna takoj. Za pravilno delovanje PWM izhodov pa to ni sprejemljivo,
zato ima PWM modul dodaten register (ang. Shadow Latch), ki na novo vpisano
vrednost zadr?zi do za?cetka naslednjega PWM cikla in jo ?sele nato postavi kot
aktivno. Tako lahko ?zelene vrednosti PWM izhodov v registre pi?semo kadarkoli,
te pa bodo osve?zene na za?cetku cikla. Ta sistem olaj?sa delo zlasti, kadar upo-
rabljamo ve?c PWM izhodov hkrati. Poleg tega avtomatsko izvajanje razbremeni
centralno procesno enoto.
Slika 3.6: Primer signalov generiranih s PWM modulom
Delovanje PWM modula si je najbolje ogledati na sliki. ?Ce ?zelimo na izhodu
generirati signale kot jih prikazuje slika 3.6 je potrebno v registre PWM modula
vpisati naslednje vrednosti:
? MR0 = 100
? MR1 = 41 (izhod PWM2)
? MR2 = 78 (izhod PWM2)
? MR3 = 53 (izhod PWM4)
? MR4 = 27 (izhod PWM4)
? MR5 = 65 (izhod PWM5)
Vrednost registra MR0 deflnira reset ?stevca oz. cikel. To je hkrati tudi dol?zina
PWM cikla. Izhoda PWM2 in PWM4 sta pro?zena na oba prehoda. Medtem ko je
izhod PWM5 pro?zen samo na padajo?ci prehod. Tako naprimer za izhod PWM2
z vrednostjo v registru MR1 dolo?cimo nara?s?cajo?ci prehod z MR2 pa padajo?ci
prehod. Cikel se ponovi vsakih 100 ?stevcevih impulzov. ?Ce ?zelimo lahko ob
zaklju?cku cikla modul spro?zi prekinitev.
Glavne zna?cilnosti PWM modula:
23
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
? Sedem primerjalnih registrov (ang. Match Register - MR), ki omogo?cajo
krmiljenje ali?sestih izhodov pro?zenih na en prehod, ali tri izhode pro?zene na
dva prehoda ali pa kombinacijo obeh na?stetih mo?znosti. Poleg tega modul
omogo?ca ?se:
{ neprekinjeno delovanje z mo?znostjo pro?zitve prekinitve ob izena?citvi,
{ ustavitev ?stevca z mo?znostjo pro?zitve prekinitve ob izena?citvi,
{ reset ?stevca z mo?znostjo pro?zitve prekinitve ob izena?citvi.
? Izhod vsakega od primerjalnih registrov ima mo?znost da se:
{ ob izena?citvi postavi v visoko stanje,
{ ob izena?citvi postavi v nizko stanje,
{ ob izena?citvi spremeni stanje nasprotno prej?snemu,
{ ob izena?citvi ne zgodi ni?c.
? Izhodi pro?zeni na en prehod so ob pri?cetku cikla na visokem nivoju, razen
v primeru ko so stalno nizki. Izhodom pro?zenim na oba prehoda pa lahko
prehoda postavljamo na poljubno mesto v ciklu. Na tak na?cin je mogo?ce
generirati tako pozitivne kot negativne impulze.
? Perioda in ?sirina pulza je lahko katerakoli nastavljena vrednost ?stevca.
? Obnavljanje izena?citvenih registrov je sinhronizirano, kar prepre?ci da na
izhodu dobimo ne?zelene impulze ali ?spice.
? ?Stevec lahko uporabljamo tudi kot splo?snonamenski, ?ce izklju?cimo PWM
delovanje.
? 32-biten ?stevec/?casovnik z 32-bitnim delilnikom.
24
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
3.4.5 UART serijski vmesnik
Mikrokrmilnik LPC2138 ima integrirana dva vmesni?ska modula tipa UART. Ra-
zen tega, da ima modul UART1 podporo za modem, sta modula identi?cna. Vgra-
jena imata ?Baud rate? generator in dva 16 bajtov velika FIFO sklada, sprejemni
in oddajni. Inicializacija UART modula poteka na naslednji na?cin:
void __UART_init(void)
{
/* Inicializiramo pina P0.0 in P0.1 kot Tx in Rx */
PINSEL0=0x05;
/* Vklopimo FIFO sklada in ju resetiramo */
U0FCR=0x07;
/* Nastavimo DLAB in dol?zino besede na 8 bitov */
U0LCR=0x83;
/* Baud rate nastavimo na 9600 */
U0DLL=0x14;
U0DLM=0x00;
/* Zbri?semo DLAB */
U0LCR=0x03;
}
Najprej v PINSLE0 registru konflguriramo pina P0.0 in P0.1 za delovanje v
UART na?cinu. Nato vklopimo in resetiramo UART FIFO sklada. Sledi nastavlja-
nje dol?zine besede na osem bitov. V istem registru nastavimo ?se uporabo enega
stop bita in delovanje brez preverjanja paritete. Sedaj je potrebno nastaviti ?se
hitrost prenosa. Tega najprej izra?cunamo po (3.2).
UART0baudrate = PCLK16˘(16˘U0DLM +U0DLL) (3.2)
Ker sistem te?ce na 12 MHz in imamo VPDIV nastavljen na delilno razmerje
4 zna?sa PCLK 3 MHz. ?Ce ?zelimo dobiti hitrost prenosa 9600 bit/s moramo
v register U0DLL vpisati vrednost 0x14, v U0DLM pa 0x00. Vrednost, ki jo
izra?cunamo po (3.2) je 9375. Najve?ckrat ni mo?zno natan?cno nastaviti vrednosti
hitrosti prenosa. Vendar pa je najve?cja dovoljena napaka do pet procentov.
Ko je modul inicializiran, lahko za?cnemo s prenosom podatkov. To omogo?cata
naslednji funkciji:
/* Funkcija, ki pi?se na serijska vrata. */
unsigned long UART_send(unsigned long ch)
{
if (ch == ?\n?)
25
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
{
while (!(U0LSR & 0x20));
U0THR = ch;
}
while (!(U0LSR & 0x20));
return (U0THR= ch);
}
/* Funkcija, ki bere iz serijskih vrat. */
UART_read(void)
{
while (!(U0LSR & 0x01));
return (U0RBR);
}
S prvo lahko pi?semo z drugo pa beremo s serijskih vrat. Obe funkciji bereta
povezovalni statusni register (ang. LSR -LinkStatusRegister) in tako preverjata
napake na vodilu, kot tudi oba FIFO sklada.
UART modul ima en prekinitveni kanal in tri mo?zne izvore. Prekinitev lahko
spro?zi sprememba v LSR registru. Tako lahko v primeru napake na serijskem
vodilu v prekinitveni rutini preberemo LSR register in ustrezno ukrepamo. Drugi
dve mo?zni prekinitvi lahko spro?zita spremembi v FIFO skladih.
26
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
3.4.6 I2C serijski vmesnik
Standard za serijsko vodilo I2C je nastal prav v podjetju Philips, zato ni presene-
tljivo, da je dru?zina mikrokrmilnikov LPC2000 opremljena z dvema I2C serijskima
moduloma. Modula lahko delujeta v nadzornem (ang. master) ali podrejenem
(ang. slave) na?cinu. Maksimalna hitrost prenosa podatkov je 400 kbit/s. Slika
3.7 prikazuje tipi?cno postavitev blokov povezanih z I2C vodilom.
Slika 3.7: Tipi?cna I2C konflguracija: ena nadrejena ?master? in ve?c podrejenih
?slave? naprav priklopljenih na liniji I2C vodila.
Za sinhroni prenos podatkov sta potrebni dve liniji. SDA je podatkovna linija,
SLC linija prena?sa urin takt. Omeniti velja, da sta obe liniji tipa odprt kolektor
(ang. open collector), zato ju je potrebno z ustreznimi upori vezati na napajnje
VCC. Vrednosti uporov je mogo?ce izra?cunati po formuli (3.3), kjer je N ?stevilo
priklopljenih naprav na I2C vodilo.
Rp ? 50 k?N (3.3)
Za nadzor I2C modula v mikrokrmilniku LPC2138 skrbi sedem registrov. Bite v
kontrolnem registru postavljamo s pisanjem logi?cnih enic v I2CONSET register,
bri?semo pa jih s pisanjem v I2CONCLR register. Za nastavitev hitrosti prenosa
sta na voljo dva registra. To sta I2SCLH in I2SCLL. V statusnem registru se
nahajaj stanje, ki signalizira dogajanje na vodilu. Podatek, ki ga ?zelimo poslati,
oziroma smo ga prejeli se nahaja v podatkovnem registru I2CDAT. Kadar modul
konflguriramo za delovanje v podrejenem na?cinu, v register I2ADR vpi?semo?zeleni
naslov na?sega mikrokrmilnika, ki ga uporablja nadrejena naprava za naslavljanje.
Za inicializacijo I2C modula poskrbi nekaj naslednjih vrstic programske kode:
27
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
void __I2C_init(void)
{
/* Inicializiramo pina P0.2 in P0.3 kot SCL in SDA */
PINSEL0 = 0x50;
/* Pobri?semo vse zastavice */
I2C0CONCLR = 0x6c;
/* Dolo?cimo hitrost prenosa */
I2C0SCLH = 0x1f;
I2C0SCLL = 0x1f;
/* Inicializiramo VIC za I2C */
/* Izberemo IRQ na?cin prekinitve */
VICIntSelect = 0x0;
/* Dolo?cimo najvi?sjo prioriteto */
VICVectCntl0 = 0x29;
/* Dolo?cimo naslov izvajanja prekinitvene rutine */
VICVectAddr0 = (unsigned long) I2C_ISR;
/* Vklopimo I2C prekinitev */
VICIntEnable = 0x200;
}
Na za?cetku v PINSEL0 dolo?cimo pinoma P0.2 in P0.3 funkciji SCL in SDA.
Sledi brisanje zastavic v kontrolnem registru. Za pravilno delovanje vodila v
naslednjem koraku nastavimo hitrost prenosa podatkov. ?Zeleno hitrost najprej
izra?cunamo po (3.4):
I2Cbitfrequency = fPCLKI2CSCLH +I2CSCLL (3.4)
Na vsak dogodek, ki se zgodi na vodilu, se mora I2C modul ustrezno odzvati. Do-
gajanje na vodilu je mikrokrmilniku signalizirano s prekinitvami. Zato je najprej
potrebno pravilno konflgurirati modul za nadzor prekinitev - VIC (glej poglavje
3.3.4). Za servisiranje I2C vodila izberemo IRQ na?cin prekinitve z najvi?sjo prio-
riteto. Nato dolo?cimo naslov izvajanja prekinitvene rutine in omogo?cimo preki-
nitev.
Podatke lahko beremo in po?siljamo samo kadar je modul konflguriran kot
nadrejeni ?master?. Ko je I2C modul v podrejenem ?slave? na?cinu lahko podatke
samo beremo in odgovarjamo na zahteve glavnega na vodilu.
Prenos se dogaja na naslednji na?cin. Nadrejeni na vodilu ?master? mora naj-
prej signalizirati za?cetek prenosa. To se zgodi tako, da linija SCL ostane na
visokem nivoju linija SDA pa gre na nizek nivo. Nato se po podatkovni liniji
po?slje naslov podrejene naprave s katero ?zeli komunicirati nadrejeni. ?Ce je po-
drejena naprava sprejela naslov in bit, ki dolo?ca zahtevo po branju ali pisanju,
28
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
po?slje potrditev. Sedaj se lahko za?cne prenos podatkov v paketih dol?zine enega
bajta. Vsakemu od paketov sledi potrditev (ang. acknowledgement). Prenos se
ne zaklju?ci dokler ga s posebnim (Stop) stanjem ne prekine nadzornik na vodilu.
Slika 3.8 prikazuje signale na vodilu.
Slika 3.8: Dogajanje na I2C vodilu med prenosom podatkov
Funkcija , ki omogo?ca prenos je naslednja:
void I2C_Transfer(unsigned Addr,unsigned Data)
{
I2CAddress = Addr;
I2CData = Data;
I2CONCLR = 0x000000FF; // Izbri?semo vse I2C nastavitve
I2CONSET = 0x00000040; // Vklopimo I2C prenos
I2CONSET = 0x00000020; // Po?sljemo start signal
}
V globalni spremenljivki I2CAddress in I2CData shranimo naslov in podatke,
ki jih bo med prenosom potrebovala prekinitvena servisna rutina. Nato pobri?semo
vse nastavitve, vklopimo modul in po?sljemo signal za za?cetek prenosa. Nadaljnje
dogajanje se preseli v prekinitveno servisno rutino, ki v okrnjeni verziji izgleda
takole:
void I2C_ISR(void)
{
switch (I2CSTAT) // Preberemo rezultat kode in ustrezno ukrepamo
{
case ( 0x08): // Start bit je bil poslan
I2CONCLR = 0x20; // Resetiramo start bit
I2DAT = I2CAddress; // Po?sljemo naslov in W bit
break;
29
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
case (0x18): // Po?sljemo naslov in W bit, potrditev
I2DAT = I2Cdata; // Vpi?semo podatke v TX register
break;
case (0x20): // Po?sljemo naslov in W bit, brez potrditev
I2DAT = I2CAddress; // Ponovno po?sljemo naslov
break;
case (0x28): // Podatek je bil poslan, potrditev
I2CONSET = 0x10; // Po?sljemo stop signal
break;
default:
break;
}
I2CONCLR = 0x08; // Zbri?semo I2C prekinitveno zastavico
VICVectAddr = 0x00000000; // Osve?zimo VIC
}
Programska koda v servisni rutini mora glede na vrednost v statusnem registru
ustrezno nastavljati kontrolni register in vpisovati vrednosti v podatkovni register
I2C modula. Zgornji primer obravnava samo najpomembnej?sa stanja na vodilu.
Ta so opisana v tabeli 3.3 in veljajo kadar je mikrokrmilnik konflguriran kot
nadzornik. Podrobnej?si opis delovanja I2C vodila je mogo?ce najti v [2].
Tabela 3.3: Pomen vrednosti v I2C statusnem registru
I2CSTAT Stanje na vodilu Naslednja operacija modula
0x08 Poslano je bilo START stanje. Po?siljanje naslova in W bita.
0x18 Poslan je bil naslov in W bit in podrejena Po?siljanje podatkov.
naprava je potrdila sprejem.
0x20 Poslan je bil naslov in W bit in podrejena Ponovno po?siljanje podatkov.
naprava ni potrdila sprejema.
0x28 Poslan je bil podatkovni bajt in podrejena Po?siljanje podatkov.
naprava je potrdila sprejem.
30
Mikrokrmilnik Philips LPC2138 Ale?s Hribar
3.4.7 SPI serijski vmesnik
Podobno kot I2C vmesnik je tudi SPI modul namenjen komunikaciji po SPI serij-
skem vodilu. SPI vodilo je namenjeno predvsem prenosu podatkov med mikrokr-
milnikom in raznimi spominskimi moduli, LCD prikazovalniki, A/D pretvorniki,
itd.. Zunanjo povezavo z ostalimi enotami predstavljajo ?stiri linije. Te so SCK,
SS, MISO in MOSI. Po liniji SCK se prena?sa urin takt. Z linijo SS (ang. Slave
Select) izberemo podrejeno napravo na SPI vodilu. MISO (ang. Master Input
Slave Output) in MOSI (ang. Master Output Slave Input) liniji skrbita za pre-
nos podatkov. SPI vodilo je v prvi vrsti namenjeno hitremu prenosu podatkov
in v nasprotju z I2C vodilom nima vgrajene naslovne sheme. Zunanja naprava
je izbrana s posebnim pinom, v angle?s?cini imenovanim ?slave select?. Podatkovni
liniji sta priklju?ceni na zunanjo napravo in njuna orientacija je odvisna od na?cina
v katerem naprava deluje, v nadrejenem ali v podrejenem. Maksimalna hitrost
prenosa podatkov je 400 kbit/s.
Uporabnik ima dostop do petih SPI registrov. V ?casovnem registru nastavimo
vrednost delilnega razmerja PCLK in takta ure na SPI vodilu. V kontrolnem re-
gistru nastavimo ?zeleni na?cin delovanja vodila. Ker je prenos po serijskem SPI
vmesniku relativno enostaven, obstaja mnogo naprav, ki jih lahko nanj priklo-
pimo. Zato je potrebno tako podatkovno, kot tudi SCK linijo pravilno nastaviti.
Najprej je potrebno poskrbeti za pravilno polariteto in fazo urinih impulzev na
vodilu. Polariteta je lahko aktivna v visokem ali nizkem stanju. Na sliki 3.9 je
nazorno prikazana vrednost konflguracijskih bitov in njihov vpliv.
Slika 3.9: Nastavitev polaritete in faze urinih impulzov na SPI vodilu
Faza urinih impulzov je lahko naravnana na rob ali sredino podatkovnih im-
pulzov. Pred prenosom je potrebno nastaviti?se orientacijo podatkov, ki prihajajo
po vodilu. Izberemo lahko prenos, ki se za?cne z najpomembnej?sim in kon?ca z naj-
manj pomembnim, ali pa prenos z ravno obratno orientacijo. Vse zgoraj opisane
nastavitve so odvisne od naprave s katero ?zelimo komunicirati, kar si je potrebno
ogledati v dokumentaciji same naprave.
31
4.
Razvojna plo?s?ca ITLPC2138 in
programsko razvojno okolje
WinIDEATM
4.1 Predstavitev
ITLPC2138 je mikrokrmilni?ski razvojni sistem zasnovan na osnovi Philipsovega
mikrokrmilnika LPC2138. Namenjen je razvoju, testiranju in razhro?s?cevanju pro-
gramske opreme. Poleg integriranega USB razhro?s?cevalnika iSYSTEM sta na vo-
ljo tudi JTAG in ETM trace konektorja kot alternativna na?cina razhro?s?cevanja.
Razvojna plo?s?ca je napajanja preko USB povezave, tako da ni potreb po zunanjem
napajanju.
Slika 4.1: Razvojna plo?s?ca ITPLC2138
Za razvoj programske opreme, nalaganje in razhro?s?cevanje skrbi programsko
okolje winIDEATM, ki te?ce na operacijskem sistemu Windows.
32
Razvojna plo?s?ca ITLPC2138 in okolje WinIDEATM Ale?s Hribar
4.2 Opis ITLPC2138
Za preizku?sanje in razhro?s?cevanje programske kode se na plo?s?ci nahaja nekaj ele-
mentov, na katere so priklju?cene nekatere izmed vhodno izhodnih enot. Razvojna
plo?s?ca vsebuje naslednje elemente:
? mikrokrmilnik LPC2138,
? analogni vhod za uporabo notranjega A/D pretvornika,
? 4 tipke priklju?cene na vhodno izhodne linije (od P0.12 do P0.15),
? reset tipka,
? baterijsko napajanje za notranjo uro (RTC),
? analogni izhod priklju?cen na linijo D/A pretvornika,
? dva RS232 komunikacijska vmesnika,
? RS232 DB9 konektor,
? mesto pripravljeno za priklop prikazovalnika na teko?ce kristale,
? ?stiri svetle?ce diode priklopljene na vhodno izhodne linije (od P0.8 do P0.11),
? konektorji za dostop do vseh vhodno-izhodnih linij mikrokrmilnika,
? ETM trace konektor,
? JTAG razhro?s?cevalni konektor,
? USB konektor,
? stabilizirani napetostni napajalnik z vhodom preko USB; izhodi: 5 V, 3.3
V in 2.5 V,
? iONE - USB/JTAG vmesnik,
? mosti?ci za nastavitve delovanja mikrokrmilnika.
Slika 4.2 prikazuje blokovno shemo razvojne plo?s?ce. Postavitev konektorjev
in drugih elementov na tiskanem vezju pa je prikazana na sliki 4.3.
33
Razvojna plo?s?ca ITLPC2138 in okolje WinIDEATM Ale?s Hribar
Slika 4.2: Blokovni diagram ITPLC2138
Seznam konektorjev in mosti?cev na razvojni plo?s?ci, kot jih prikazuje slika 4.3:
? J1 do J6: Raz?siritveni konektorji: Konektorji za dostop do vseh
vhodno-izhodnih (vrata PORT0 in PORT1) linij mikrokrmilnika.
? J7: ETM Trace vrata: Z J7 nastavimo linije P1.16 do P1.25, da po
resetu delujejo kot ETM Trace vrata. Privzeta pozicija je izklopljena.
? J8: JTAG razhro?s?cevalna vrata: J8 vklaplja linije P1.26 do P1.31, da
po resetu delujejo kot JTAG vrata. Privzeta pozicija je vklopljena.
? J9: Vklop razhro?s?cevalnega na?cina: Z J9 izbiramo med uporabo
iSYSTEM-ovega USB razhro?s?cevalnika in zunanjim razhro?s?cevalnim orod-
jem. Privzeta postavitev je na 1-2.
34
Razvojna plo?s?ca ITLPC2138 in okolje WinIDEATM Ale?s Hribar
Slika 4.3: Pogled na tiskano vezje
? J10: Izbira napajanja notranje ure (RTC): Z J10 priklju?cimo 3.3 V
na mikrokrmilni?sko Vbat linijo.
? J11: Napajanje notranje ure (RTC): Priklju?cek za zunanje baterijsko
napajanje notranje ure (RTC). ?Ce je priklopljena zunanja baterija moramo
odklopiti J10.
? J12: Rezerviran za proizvajalca
? J13: Analogni izhod: J13 je analogni izhod iz operacijskega oja?cevalnika,
katerega vhod je priklju?cen na izhod internega D/A pretvornika.
? J14: Serijska vrata: Tripolni konektor serijskih vrat UART0.
35
Razvojna plo?s?ca ITLPC2138 in okolje WinIDEATM Ale?s Hribar
? J15: Vklop LED diod: Z J15 vklopimo gonilnik, ki preko linij P0.8 do
P0.11 krmili svetle?ce diode.
? J16: Vklop tipk: J16 vklopi gonilnik ?stirih tipk, ki je priklju?cen na P0.12
do P0.15. S pritiskom tipke generiramo nizek nivo na vhodno-izhodni liniji.
? J17: LCD E signal: J17 pove?ze P0.21 z LCD E linijo.
? J18: LCD R/W signal: J18 pove?ze P0.22 z LCD R/W linijo.
? J19: Vklop analognega izhoda: J19 pove?ze izhod D/A pretvornika (na
liniji P0.25) in vhod operacijskega oja?cevalnika.
? J20: Vklop analognega vhoda: J20 ve?ze trierm potenciometer na ana-
logni vhod AD0.0 (linija P0.27).
? J21: 16 pinski LCD konektor
? J22: Vklop osvetlitve LCD-ja: S postavitvijo J22 vklopimo osvetlitev
prikazovalnika na teko?ce kristale (LCD).
? J25: Na?cin zagona: (name?s?cen na spodnji strani tiskanega vezja): Z
J25 dolo?cimo na?cin zagona mikrokrmilnika. Kadar ve?zemo P0.14 visoko
postavimo mikrokrmilnik v Uporabni?ski na?cin (User mode), kadar pa nizko
pa v ?BOOT-loader? na?cinu. Privzeta je prva postavitev J25. Kadar ?zelimo
preklop v ?BOOT-loader? na?cin moramo hkrati odstraniti J16.
4.3 Programsko razvojno okolje WinIDEATM
WinIDEATM je kratica za Windows Integrated Development Environment Ad-
vance. Okolje je uporabno skozi celotni razvojni cikel programske kode. Tako
je v enem programskem paketu zdru?zeno ve?c orodij, ki pomagajo pri pisanju,
prevajanju, nalaganju in rezhro?s?cevanju programov. Ta orodja so:
? Upravitelj projektov (ang. Project Manager)
? Urejevalnik C datotek (ang. Multi-File C Source Editor)
? Prevajalni?ski upravitelj (ang. Build Manager)
? Visoko nivojski razhro?s?cevalnik (ang. High Level Source Debugger)
? Ob?sirna pomo?c (ang. Extensive Help)
36
Razvojna plo?s?ca ITLPC2138 in okolje WinIDEATM Ale?s Hribar
Slika 4.4: Uporabni?sko delovno okno razvojnega okloja WinIDEATM
Slika 4.4 prikazuje uporabni?sko okno programskega okolja WinIDEATM. Osrednje
okno predstavlja urejevalnik datotek. V njem imamo lahko hkrati odprtih po-
ljubno ?stevilo datotek. Za prevajanje projektov nam okolje ponuja ?siroko izbiro
razli?cnih proizvajalcev prevajalnikov. Primeri, ki jih opisuje diplomska naloga,
so bili prevedeni z GNU prevajalnikom. Ta se po kakovosti uvr?s?ca sicer v ni?zji
razred ARM7 prevajalnikov, vendar pa je brezpla?cen.
Pri razhro?s?cevanju nam je v veliko pomo?c razhro?s?cevalnik, s katerim te-
stno izvajamo C/C++ programsko kodo (ang. High Level Source Debugger).
Omogo?ceno nam je tudi postavljanje ustavitvenih to?ck (ang. Break Point). V
desnem oknu lahko spremljamo vrednosti vseh registrov mikrokrmilnika. Kadar
?zelimo spremljati vrednost katere od funkcij ali spremenljivko, jo enostavno po-
stavimo v ogledno okno (ang. Watch window), ki se na sliki 4.4 nahaja levo
spodaj.
37
5.
Raz?siritvena tiskana vezja
5.1 Uvod
Za celovito predstavitev zmogljivosti mikrokrmilnika LPC2138 so bila razvita do-
datna raz?siritvena tiskana vezja, ki vsebujejo dodatne periferne enote. Razvoj je
potekal s pomo?cjo programskega paketa P-CAD 2004. Izdelana so bila tri tiskana
vezja. Prvo tiskano vezje slu?zi kot vmesnik za vodenje enosmernega elektri?cnega
motorja. S pomo?cjo drugega vezja je prikazano delovanje razli?cnih serijskih vodil.
Na tretjem vezju se nahaja matri?cna tipkovnivnica velikosti 4x4 tipke.
5.2 Tiskano vezje za vodenje enosmernega elektri?cnega
motorja
Vezje za vodenje enosmernega elektri?cnega motroja je namenjeno predstavitvi
krmiljenja in regulacije enosmernega motorja s pomo?cjo pulzno?sirinskega modula
vgrajenega v mikrokrmilnik LPC2138. Vezje sestavljajo naslednji elementi:
? L298N: mo?cnostni H mosti?c za pogon motorja,
? HCTL2022: dekoder/?stevec namenjen ?stetju impulzov enkoderskega dajal-
nika, ki se nahaja na motorju,
? LM339 in 74LS14: sta namenjena pretvorbi sinusnega signala iz enkoder-
skega dajalnika v vlak pravokotnih impulzov,
? 74LS244: linijski gonilnik za napetostno oja?canje signalov iz mikrokrmilnika
LPC2138 (iz 3.3 V na 5 V),
? L7805: pet voltni napetostni stabilizator.
38
Raz?siritvena tiskana vezja Ale?s Hribar
Slika 5.1: Blokovni diagram tiskanega vezja za vodenje enosmernega elektri?cnega
motroja
Slika 5.1 prikazuje blokovno shemo tiskanega vezja. Na konektor CON1 se pri-
klju?cita motor in inkrementalni dajalnik impulzov, ki se nahaja na motorju.
Tri sinusne signala (signal A, signal B in indeksni signal) se s pomo?cjo pri-
lagodilnega vezja pretvori v pravokotne signale. Pravokotne impulze ?steje 32-
bitni ?stevec/dekodirnik HCTL-2022. Branje ?stevca/dekodirnika poteka preko 8-
bitnega podatkovnega vodila. ?Stevec/dekodirnik se konflgurira preko kontrolnega
vodila. Obe vodili sta povezani s konektorjem CON3, preko katerega se tiskano
vezje za vodenje enosmernega elektri?cnega motorja s plo?s?catim kablom pove?ze na
razvojno plo?s?co ITLPC2138. Delovanje integriranega vezja HCTL-2022 je opi-
sano v dokumentaciji1. Na konektor CON3 sta vezani tudi signalni liniji (PWM
in smer), ki krmilita mo?cnostni H mosti?c L298N. Mo?cnostni liniji iz H mosti?ca,
ki poganjata enosmerni motor, sta vezani na konektor CON1. Elektri?cna shema
in shema tiskanega vezja za vodenje enosmernega motorja sta prilo?zeni v prilogi.
1HCTL-2022 Quadrature Decoder/Counter Interface ICs Data Sheet
39
Raz?siritvena tiskana vezja Ale?s Hribar
5.3 Tiskano vezje za demonstracijo uporabe I2C, SPI in
CAN serijskih vodil
Tiskano vezje je bilo razvito z namenom demonstracije delovanja I2C, SPI in CAN
serijskih vodil. Plo?s?ca tiskanega vezja se pove?ze s plo?s?catim kablom na razvojno
plo?s?co ITLPC2138 preko konektorjev CON1 in CON2. Na sliki 5.2 je prikazana
blokovna shema raz?siritvenega tiskanega vezja za demonstracijo uporabe serijskih
vodil. Na vezju so naslednji elementi:
? dva vhodno-izhodno raz?siritvena modula Philips PCF8574T priklju?cena na
I2C vodilo, ki omogo?cata uporabo dodatnih vhodno-izhodnih linij,
? 12-bitni A/D pretvornik Analog Devices AD7928 priklju?cen na SPI vodilo,
? CAN krmilnik Philips SJA1000T,
? CAN gonilnik PCA82C251,
? LM4040 2.5 V napetostna referenca za A/D pretvornik,
? dva L7805 in LP317 tvorijo stabiliziran napetostni napajalnik (z izhodi 2x
5 V in 3.3 V),
? potenciometer vezan na vhod A/D pretvornika.
Za predstavitev delovanja I2C vodila se na tiskanem vezju nahajata dva vhodno-
izhodna raz?siritvena modula PCF8574T. Naslov se vsakemu raz?siritvenemu mo-
dulu nastavi s pomo


Ta prispevek je na portalu publikacije.net objavil/a Aleš Hribar dne 2006-09-16.

Aleš Hribar, fak. za elektrotehniko


Ocenite prispevek:

 

# of Ratings = 22 | Rating = 2.6/5

Kliknite na XML znak in spremljajte kategorijo [Izobraževanje, znanost] preko RSS!



publikacije.net - portal svobodnega znanja









Powered by Article Dashboard