your guide to jade - uni-lj.si

99
Vsebina 1 Uvod 3 2 Jedro operacijskega sistema 9 2.1 ˇ Casovno rezinjenje ....................... 10 2.2 Sistemska ura realnega ˇ casa .................. 14 2.3 Problem hkratnega dostopa do skupnih enot ......... 16 2.4 Problem usklajene komunikacije med opravili ........ 18 3 Sistemski gonilniki zunanjih enot 23 3.1 Tipkovnica ........................... 23 3.2 Sedemsegmentni prikazovalnik ................. 27 3.3 Serijska komunikacija ...................... 29 3.4 A/D pretvornik ......................... 31 4 Knjiˇ znica podprogramov 33 4.1 Aritmetiˇ cni podprogrami ................... 33 4.2 Podprogrami za pretvorbo podatkovnih tipov ........ 33 4.3 Vhodno izhodni podprogrami ................. 36 5 Aplikativni programi 41 5.1 Poskusna aplikacija ....................... 46 5.2 Seminarski projekti ....................... 50 6 Dodatek - razvojno okolje za MC68HC11 51 6.1 Uvod ............................... 51 6.2 Mikrokrmilniˇ ska enota ..................... 55 6.2.1 Notranjost razvojne enote - obdukcija ........ 55 6.2.2 Mikrokrmilnik MC68HC11A1 ............. 58 6.2.3 Programabilna sistemska enota ............ 61 6.2.4 RS-232 zaporedni vmesnik ............... 64 6.2.5 Napajalno vezje ..................... 65 1

Upload: others

Post on 21-Feb-2022

2 views

Category:

Documents


0 download

TRANSCRIPT

Vsebina

1 Uvod 3

2 Jedro operacijskega sistema 92.1 Casovno rezinjenje . . . . . . . . . . . . . . . . . . . . . . . 102.2 Sistemska ura realnega casa . . . . . . . . . . . . . . . . . . 142.3 Problem hkratnega dostopa do skupnih enot . . . . . . . . . 162.4 Problem usklajene komunikacije med opravili . . . . . . . . 18

3 Sistemski gonilniki zunanjih enot 233.1 Tipkovnica . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.2 Sedemsegmentni prikazovalnik . . . . . . . . . . . . . . . . . 273.3 Serijska komunikacija . . . . . . . . . . . . . . . . . . . . . . 293.4 A/D pretvornik . . . . . . . . . . . . . . . . . . . . . . . . . 31

4 Knjiznica podprogramov 334.1 Aritmeticni podprogrami . . . . . . . . . . . . . . . . . . . 334.2 Podprogrami za pretvorbo podatkovnih tipov . . . . . . . . 334.3 Vhodno izhodni podprogrami . . . . . . . . . . . . . . . . . 36

5 Aplikativni programi 415.1 Poskusna aplikacija . . . . . . . . . . . . . . . . . . . . . . . 465.2 Seminarski projekti . . . . . . . . . . . . . . . . . . . . . . . 50

6 Dodatek - razvojno okolje za MC68HC11 516.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.2 Mikrokrmilniska enota . . . . . . . . . . . . . . . . . . . . . 55

6.2.1 Notranjost razvojne enote - obdukcija . . . . . . . . 556.2.2 Mikrokrmilnik MC68HC11A1 . . . . . . . . . . . . . 586.2.3 Programabilna sistemska enota . . . . . . . . . . . . 616.2.4 RS-232 zaporedni vmesnik . . . . . . . . . . . . . . . 646.2.5 Napajalno vezje . . . . . . . . . . . . . . . . . . . . . 65

1

2 VSEBINA

6.2.6 Vhodno/izhodni prikljucek . . . . . . . . . . . . . . 676.2.7 Razsiritveni prikljucek . . . . . . . . . . . . . . . . . 686.2.8 Povezava z osebnim racunalnikom . . . . . . . . . . 696.2.9 Sestavljanje in odstreljevanje tezav . . . . . . . . . . 70

6.3 BIOS - Basic Input Output System . . . . . . . . . . . . . . 746.3.1 Prenos podatkov . . . . . . . . . . . . . . . . . . . . 746.3.2 Strategija korakanja . . . . . . . . . . . . . . . . . . 756.3.3 Osnovni pojmi BIOSa . . . . . . . . . . . . . . . . . 766.3.4 Ukazi, ki jih BIOS razume . . . . . . . . . . . . . . . 776.3.5 Telovadba ob resetu . . . . . . . . . . . . . . . . . . 796.3.6 Prekinitve . . . . . . . . . . . . . . . . . . . . . . . . 796.3.7 Omejitve . . . . . . . . . . . . . . . . . . . . . . . . 79

6.4 Programsko razvojno okolje JADE . . . . . . . . . . . . . . 806.4.1 Namescanje na osebni racunalnik . . . . . . . . . . . 806.4.2 Osnovne znacilnosti . . . . . . . . . . . . . . . . . . 806.4.3 Graficni uporabniski vmesnik . . . . . . . . . . . . . 816.4.4 Datoteke povezane z razvojnim okoljem . . . . . . . 826.4.5 Okno Editor . . . . . . . . . . . . . . . . . . . . . . 836.4.6 Prevajalnik . . . . . . . . . . . . . . . . . . . . . . . 846.4.7 Modul Download . . . . . . . . . . . . . . . . . . . . 856.4.8 Razhroscevalnik - dezinsekcija . . . . . . . . . . . . . 856.4.9 Serijski terminal . . . . . . . . . . . . . . . . . . . . 95

6.5 Zakljucki . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976.6 Viri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

7 Datasheet 99

Poglavje 1

Uvod

V okviru univerzitetnega oziroma visokosolskega strokovnega programa po-slusajo studentje smeri Elektronika predmeta Mikroprocesorji v elektron-iki in Osnove mikroprocesorskih sistemov. Oba predmeta sta posvecenagradnji kompaktnih industrijskih racunalniskih sistemov. Ceprav je namenpredmetov v prvi vrsti podajati osnovna nacela industrijskih mikroproce-sorskih sistemov ne glede na proizvajalca, temeljijo vsi konkretni zgledina Motorolini mikroprocesorski druzini MC68HC11. Pri obeh predmetihsmo se odlocili za inacico MC68HC11A1, ki vsebuje poleg mikroprocesorskeenote se casovnik, dva serijska komunikacijska vmesnika, notranji dinamicniRAM, EEPROM in 8 kanalni A/D pretvornik. Originalna procesorskadokumentacija se nahaja v dodatku 7.

Sestavni del obeh predmetov so tudi laboratorijske vaje, katerih cilj jeomogociti prakticno delo z industrijskimi mikrokrmilniskimi sistemi. Lab-oratorij je opremljen z industrijskim razvojnim sistemom JADE, ki vse-buje poleg mikrokrmilnika MC68HC11A1 se integrirani periferni vmesnikPSD834F2. Slednji nudi v skupnem ohisju med drugim 8KB programskegapomnilnika, 8KB dinamicnega pomnilnika in dvoje 8 bitnih vhodno izhod-nih vrat (glej sliko 1).

Poleg osnovne plosce je vsako delovno mesto v laboratoriju opremljenotudi z osnovnim vhodno izhodnim modulom, ki vsebuje polje 16 tipk instirimestni LED prikazovalnik. Prototipni sistem je bil v celoti razvit naFakulteti v okviru vecih magistrskih in diplomskih nalog ter je podrobnoopisan v poglavju 6.

Delo v laboratoriju poteka v treh delih. Prvi del je posvecen spoz-navanju strojne opreme in programskega dostopa do posameznih zunan-jih enot. Predviden je tudi cas za spoznavanje integriranega razvojnegaokolja na osebnem racunalniku, t.j. znakovni urejevalnik, krizni zbirnik terrazhroscevalnik, ki omogoca prenos in preizkusanje strojne kode na ciljnem

3

4 POGLAVJE 1. UVOD

� � � � � � � � � � � �

� �

� � � � � � � �� �

� �� �

� �� � �

� � � � � � � � � !

� " � � � � � �# # � $ !

0&��+&��$�

� $ � % �

% & � �� � � � � &

' ( ) * + , - - ( . ( ) / 0 1 2

� � 3 4 � � 5� � 6 4 � � 7� � 7 4 � � 6

� � 5 4 8 � 9 4 8 � 6� � : 4 8 � : 4 8 � 6� � 9 4 8 � 5 4 8 � 6� � ; 4 8 � 7 4 8 � 6

� � < 4 � � � 4 8 � 6

= >� � � ? � � � � �

� @ 3 4 � A 3� @ 6 4 � A 6� @ 7 4 � A 7� @ 5 4 � A 5� @ : 4 � A :� @ 9 4 � A 9� @ ; 4 � A ;� @ < 4 � A <

B �� C 7 4 D � � 8� C 5 4 D 8 � �

� C : 4 � � E� C 9 4 � �

B � �F � C� � C� B G � H �

� I J I K � � � L� � L

� = $ � � � �

M N � O K I J P Q R J S� � 8 �

M N � O K I J P Q R J S� T U V T R W W I W U T O

M N � O K I J � � DC R K R W I W U T O

36'���)�

D U X I Y Z F � [ � U T K

� U T K �\ M ] ^ K _

� U T K �\ M ] ^ K _

� X X T I J J ] ` J \ � M Z � 6 9 _C R K R 4 � X X T I J J ] ` J\ C 3 Z C < a � 3 Z � < _

@� 4 b

� �� � \ c ; 3 3 3 Z c < P P P _

Slika 1: Maticna plosca mikrokrmilniskega sistema HC11

sistemu.Drugi del je namenjen studiju osnovnih nacel hkratnega in sprotnega

programiranja. Pri tem se uporabljajo dolocene ze vnaprej napisane in pre-verjene rutine. Koncni cilj tega dela je, da vsak student samostojno napisein preizkusi gonilnik za tipkovnico in LED prikazovalnik, ki sproti vzorcitipke oziroma skrbi za osvezevanje prikazovalnika. Pri tem mora resiti tudiproblem usklajene komunikacije med gonilniki in ostalimi opravili, ki hkratipotekajo v sistemu.

V tretjem delu studentje v obliki skupinskega dela resujejo konkretneprobleme. Koncni cilj vsake skupine je izdelava celovite programske opremeza povsem realen projekt. Zelo pomembno je poudariti, da projekti niso”akademske” narave, temvec so vzeti iz vsakdanjega zivljenja. Kot primerlahko navedemo programsko opremo za digitalni telefonski aparat, dvigalo,semaforiziran prehod za pesce, zapornice, metronom, pralni stroj, analognivzorcevalnik, generator periodicnega signala, infrardec oddajnik/sprejemnik,itd. Delo v skupinah naj bi bilo cim bolj podobno razmeram kakrsnevladajo v resnicnem industrijskem okolju. Vsaka skupina ima svojega vodjoin svoj koncni cilj. Posamezni clani skupine si nato razdelijo naloge (pod-programe), ter v medsebojnem sodelovanju sistematsko gradijo programskoopremo.

Po uspesnem preizkusanju koncnega izdelka napisejo porocilo. Labora-

5

torijsko delo studentov se ocenjuje, pri cemer se za ocenjevanje uporabljajopodobni kriteriji kot v profesionalnem okolju za napredovanje. Koncnaocena posameznika torej ne zrcali le njegovega individualnega dela, temvecuposteva tudi njegovo sodelovanje v skupini. Ocena laboratorijskih vajvelja kot pismeni del izpita.

Za razvoj programske opreme je zelo pomembno, kako se strojna opremana sliki 1 preslika v procesorski naslovni prostor. Oglejmo si razdelitevnaslovnega prostora in sicer kar v obliki zbirniske kode na izpisu 1. Pravza-prav gre za seznam globalnih oznak (label), katerim so prirejeni fizicninaslovi posameznih strojnih enot. Prav tak seznam bomo postavljali na celovsakega zbirniskega programa. Ceprav bi lahko vsak sam izbral poljubneoznake, se bomo strogo drzali oznak v izpisu 1 in sicer iz dveh razlogov:(i) oznake so izbrane tako, da se ujemajo s kraticami registrov, kakrsneuporabljajo proizvajalci in (ii) uporaba standardnih imen za naslove nambo olajsala odkrivanje napak v aplikacijah.

************************* GLOBAL LABELS *****************************

_IRAM EQU $0000 Internal RAM $0000..$00FF (256byte).

_PORTA EQU $1000 Port A Data register.

_PIOC EQU $1002 Parallel I/O Control Register.

_PORTC EQU $1003 Port C Data register.

_PORTB EQU $1004 Port B Data register.

_PORTCL EQU $1005 PPort C Alternate Latched.

_DDRC EQU $1007 Port C Data Direction Register.

_PORTD EQU $1008 Port D Data Register.

_DDRD EQU $1009 Port D Data Direction Register.

_PORTE EQU $100A Port E Data Register.

_CFROC EQU $100B Timer: Compare Force.

_OC1M EQU $100C Timer: Output Compare 1 Mask.

_OC1D EQU $100D Timer: Output Compare 2 Data.

_TCNT EQU $100E Timer: 16 bit free running counter.

_TIC1 EQU $1010 Timer: Input Capture Register 1.

_TIC2 EQU $1012 Timer: Input Capture Register 2.

_TIC3 EQU $1014 Timer: Input Capture Register 3.

_TOC1 EQU $1016 Timer: Output Compare Register 1.

_TOC2 EQU $1018 Timer: Output Compare Register 2.

_TOC3 EQU $101A Timer: Output Compare Register 3.

_TOC4 EQU $101C Timer: Output Compare Register 4.

_TOC5 EQU $101E Timer: Output Compare Register 5.

_TCTL1 EQU $1020 Timer: Control Register 1.

_TCTL2 EQU $1021 Timer: Control Register 2.

_TMSK1 EQU $1022 Timer: Interrupt Mask Register 1.

_TFLG1 EQU $1023 Timer: Interrupt Flag Register 1.

_TMSK2 EQU $1024 Timer: Interrupt Mask Register 2.

_TFLG2 EQU $1025 Timer: Interrupt Flag Register 2.

_PACTL EQU $1026 Timer: Pulse Accumulator Control.

_PACNT EQU $1027 Timer: Pulse Accumulator Count Register.

6 POGLAVJE 1. UVOD

_SPCR EQU $1028 SPI: Control Register.

_SPSR EQU $1029 SPI: Status Register.

_SPDR EQU $102A SPI: Data Register.

_BAUD EQU $102B SCI: Baud Rate Register.

_SCCR1 EQU $102C SCI: Control Register 1.

_SCCR2 EQU $102D SCI: Control Register 2.

_SCSR EQU $102E SCI: Status Register.

_SCDR EQU $102F SCI: Data Register.

_ADCTL EQU $1030 A/D: Control Register.

_ADR1 EQU $1031 A/D: Result Register 1.

_ADR2 EQU $1032 A/D: Result Register 2.

_ADR3 EQU $1033 A/D: Result Register 3.

_ADR4 EQU $1034 A/D: Result Register 4.

_OPTION EQU $1039 System Configuration Option.

_COPRST EQU $103A Arm/Reset COP Timer Circuitry.

_PPROG EQU $103B EEPROM Programming Register.

_HPRIO EQU $103C Highest Priority I bit.

_INIT EQU $103D RAM and I/O Mapping Register.

_TEST1 EQU $103E Testing Functions Control Register.

_CONFIG EQU $103F System Configuration.

_PAIN EQU $1800 PIA: Port A Data In.

_PBIN EQU $1801 PIA: Port B Data In.

_PAOUT EQU $1804 PIA: Port A Data Out.

_PBOUT EQU $1805 PIA: Port B Data Out.

_PADIR EQU $1806 PIA: Port A Data Direction.

_PBDIR EQU $1807 PIA: Port B Data Direction.

_XRAM EQU $2000 External RAM $2000..$3FFF (8192byte).

_EEPROM EQU $B600 Internal EEPROM $B600..$B7FF (512byte).

_EPROM EQU $E000 User program memory $E000..$FFFF (8192byte).

************************* HC11 INTERRUPT VECTORS ********************

_ISCI EQU $FFD6 Serial Communication Interface (SCI)

_ISPI EQU $FFD8 Serial Peripherial Interface (SPI)

_IPAIE EQU $FFDA Pulse Accumulator Input Edge

_IPAO EQU $FFDC Pulse Accumulator Overflow

_ITOF EQU $FFDE Timer Overflow

_ITOC5 EQU $FFE0 Timer Output Compare 5

_ITOC4 EQU $FFE2 Timer Output Compare 4

_ITOC3 EQU $FFE4 Timer Output Compare 3

_ITOC2 EQU $FFE6 Timer Output Compare 2

_ITOC1 EQU $FFE8 Timer Output Compare 1

_ITIC3 EQU $FFEA Timer Input Capture 3

_ITIC2 EQU $FFEC Timer Input Capture 2

_ITIC1 EQU $FFEE Timer Input Capture 1

_IRTI EQU $FFF0 Real Time Interrupt (RTI)

_IIRQ EQU $FFF2 IRQ Pin

_IXIRQ EQU $FFF4 XIRQ Pin (Pseudo Non-Maskable Interrupt)

_ISWI EQU $FFF6 Software Interrupt (SWI)

_IILLOP EQU $FFF8 Illegal Opcode Trap

_ICOP EQU $FFFA COP Failure (Reset)

7

_ICLKM EQU $FFFC Clock Monitor Fail (Reset)

_IRESET EQU $FFFE Reset

************************* INTERRUPT VECTOR TABLE ********************

ORG _ITOC1 Set Output Compare 1 interrupt

FDB _SCHINT to the scheduler interrupt rutine.

ORG _IRESET Upon reset

FDB _START go to START.

Izpis 1: Razdelitev naslovnega prostora

Naslovni prostor $0000..$103F je ze vnaprej dolocen, saj je zaseden znotranjim dinamicnim pomnilnikom in registri notranjih mikrokrmilniskihenot. Naslove $1800..$1803 zavzema zunanji paralelni vmesnik PIA6821.Sledijo naslovi $2000..$3FFF, ki so zasedeni z uporabniskim dinamicnimpomnilnikom RAM. Tukaj bomo hranili nase globalne spremenljivke in nassklad. Naslovni interval $B600..$B7FF je zaseden z notranjim EEPROMpomnilnikom, ki se vpisuje s pomocjo posebnega registra PPROG na naslovu$103B. Natancnejsi opis najdemo v Motorolinem prirocniku v poglavju 7.Na koncu naslovnega prostora $E000..$FFFF najdemo programski pomnil-nik. Vanj bomo shranjevali programsko strojno kodo, konstantne podatkein seveda tabelo prekinitvenih vektorjev, ki se mora nahajati na naslovih$FFD6..$FFFF. Kot vidimo v zadnjem razdelku izpisa 1, bomo uporabl-jali le dva prekinitvena vektorja, namrec reset vektor, ki povzroci skok naSTART in prekinitev casovnika 1, ki sprozi rutino SCHINT.

Seveda smo opazili, da naslovni prostor ni v celoti zaseden. Med posa-meznimi intervali je mnogo lukenj, ki pa niso vedno brez ucinka! Pisanjein branje iz nezasedenih naslovov ima lahko nezazeljene posledice, zato sebomo strogo drzali pomnilniskega nacrta!

8 POGLAVJE 1. UVOD

Poglavje 2

Jedro operacijskega sistema

Programska oprema industrijskih mikrokrmilniskih sistemov se bistveno ra-zlikuje od obicajnih casovno neodvisnih programov, kot jih poznamo naprimer z osebnih racunalnikov. Za programe na PC-jih si navadno zelimo,da so cim hitrejsi. Najbolje bi bilo, ce bi racunalnik vse naloge opravil vcasu nic. Programska sled v racunalniskih krmilnih sistemih pa je casovnonatancno opredeljena. Za take programe recemo, da potekajo “v realnemcasu” in s tem mislimo predvsem na casovno uskladitev z vecimi zunanjimiprocesi. Kot primer vzemimom digitalen telefonski aparat. Mikrokrmil-nik mora pri izbiranju telefonske stevilke proizvesti vlak impulzov, katerihsirina je natanko 50ms. Na prvi pogled to ni zelo zahtevna naloga, sajlahko v program vedno vgradimo zakasnilne zanke, ki “pocakajo”, da minedolocen cas. Problemi pa nastopijo v trenutku, ko se zavemo, da moramikrokrmilnik medtem ko posilja impulze se sprejemati in shranjevati vsecifre, ki prihajajo s tipkovnice.

Programska oprema mora torej hkrati in sproti skrbeti za vecje steviloopravil! Veliki industrijski racunalniki so v ta namen opremljeni s posebn-imi operacijskimi sistemi (na primer OS-9), ki uporabniku mocno olajsajoprogramiranje v realnem casu. Taka sistemska podpora je zelo ucinkovita,vendar izredno zapletena in predvsem prostorsko prezahtevna za majhnesisteme, ki morajo shajati z nekaj kilobajti programskega pomnilnika. Kljubtemu pa so vsa nacela programiranja v realnem casu uporabna tudi na ma-jhnih sistemih.

Osnovni princip je sila preprost in naraven. Opazujmo gospodinjo, ki“hkrati” kuha juho in golaz, lika perilo in pazi na otroka, ne da bi karkolivedela o hkratnem in sprotnem procesiranju. Juha v loncu zahteva zelomalo pozornosti: vsake pol ure je potrebno doliti malo vode ali dodatikako zacimbo. Golaz je ze bolj zahteven, saj se utegne prismoditi, zatoga mora gospodinja pomesati vsakih deset minut. Otrok se sam zabava,

9

10 POGLAVJE 2. JEDRO OPERACIJSKEGA SISTEMA

vendar potrebuje vsake toliko casa nujno pomoc. Seveda gospodinja nemore dobesedno hkrati opravljati vseh teh opravil, pac pa je dovolj marljiva,da uspe svojo pozornost casovno smotrno razdeliti med vse procese. Tako jicelo ostanejo casovni intervali, ki pa jih koristno zapolni z likanjem perila.Nasa gospodinja torej na osnovi svoje marljivosti in intuicije uspeva hkratiin casovno usklajeno skrbeti za stiri procese.

Mikrokrmilnik je v marsicem zelo podoben gospodinji. V primerjaviz zunajimi enotami je po svoji strojni naravi zelo hiter (marljiv). Za in-teligentno razporejanje pozornosti med razlicnimi opravili pa poskrbi us-trezna sistemska programska oprema, ki stoji v srediscu pozornosti nasegalaboratorijskega praktikuma. V nadaljevanju bomo zgradili jedro miniatur-nega operacijskega sistema za hkratno in sprotno programiranje.

2.1 Casovno rezinjenje

Temelj vsake sistematicne obdelave vecjega stevila casovno vzporednih do-godkov je casovno rezinjenje. Pri tem se casovna os razreze na posamezneintervale, v katerih se procesor posveca razlicnim opravilom. Takoj sepostavi vprasanje, kaksni naj bodo kriteriji, po katerih se posameznimopravilom dodeljujejo casovne rezine.

Operacijski sistemi za delo v realnem casu vsebujejo v svojem najozjemjedru razvrscevalni programski sklop imenovan “scheduler”, ki je odgovorenza logistiko casovnega rezinjenja. Pri majhnih sistemih kot je nas HC11 pamoramo sami poskrbeti za ucinkovito casovno rezinjenje. Pri nacrtovanjunasega nadzornega programa bomo upostevali naslednje stiri poenostavitve:

1. vse casovne rezine so natanko enako velike (1200 strojnih cikov),2. vsa opravila se vedno zakljucijo se pred iztekom casovne rezine,3. urnik opravil obsega natanko 16 opravil in se izvaja ciklicno ter4. zunanje enote ne povzrocajo prekinitev procesorja.

S stalisca velikih sistemov so te stiri omejitve zelo radikalne, vendarna ta nacin pridemo do izredno kompaktnega nadzornega programa, ki jeprimeren tudi za najmanjse mikrokrmilniske sisteme. Nas razvrscevalnikna izpisu 2 je pregleden in razumljiv tudi za manj izkusene (navdusene)studente. Kljub temu je prakticno uporaben in v dolocenih primerih celozelo ucinkovit.

************************* TASK SCHEDULE *****************************

SCHTAB FDB TIM Real time clock ~ <= 77

FDB LED LED display driver ~ <= 58

FDB KBD Keyboard scanning task ~ <=214

2.1. CASOVNO REZINJENJE 11

FDB SCI Serial communication ~ <= 76

FDB TIM Real time clock ~ <= 77

FDB LED LED display driver ~ <= 58

FDB SCHRTS Void task. ~ = 5

FDB SCHRTS Void task. ~ = 5

FDB TIM Real time clock ~ <= 77

FDB LED LED display driver ~ <= 58

FDB SCHRTS Void task. ~ = 5

FDB SCHRTS Void task. ~ = 5

FDB TIM Real time clock ~ <= 77

FDB LED LED display driver ~ <= 58

FDB SCHRTS Void task. ~ = 5

FDB SCHRTS Void task. ~ = 5

SCHRTS rts Void task.

************************* THE SCHEDULER INTERRUPT RUTINE (~=81) *****

_SCHINT ldaa SCHTST 4 Test for previous interrupt

beq SCHOK 3 and continue if not pending.

SCHERR bra SCHERR Halt execution otherwise!

SCHOK inc SCHTST 6 Set test bit to indicate running interrupt.

ldd _TOC1 5 Load timer output compare register 1,

addd #1200 4 increment it by time slice

std _TOC1 5 and restore it to TOC1.

ldx SCHPTR 5 Get pointer to current 1/64s period task.

ldx 0,X 5 Get the task’s entry address.

ldaa #$80 2 Clear currently pending

staa _TFLG1 4 OC1F interrupt and

cli 2 allow interrupts.

jsr 0,X 6 EXECUTE THE TASK.

ldaa SCHPTR+1 4 Get high byte of SCHPTR,

adda #2 2 increment it,

anda #%00011110 2 overlay 0’s

staa SCHPTR+1 4 and restore it to SCHPTR.

clr SCHTST 6 Reset test bit to indicate end of interrupt.

rti 12 Return from OC1 interrupt

Izpis 2: Urnik opravil in razvrscevalnik

Prvi del nadzornega programa je konstantna podatkovna struktura imen-ovana urnik opravil. Dejansko gre za polje sestnajstih naslovov oziromakazalcev. Vsak naslov v urniku oznacuje zacetek navadnega podprograma,ki predstavlja eno opravilo. Seveda ni nujno, da imamo tocno sestnajstopravil. Luknje v urniku enostavno zapolnimo s praznim opravilom (voidtask). V nasem konkretnem primeru imamo stiri opravila v urniku, pricemer nastopata dve opravili kar stirikrat. Preostalih sest mest v urnikusmo zapolnili z naslovom praznega opravila.

12 POGLAVJE 2. JEDRO OPERACIJSKEGA SISTEMA

Sledi zbirniska koda razvrscevalnega programa, ki je odgovoren za iz-vajanje casovnih rezin. Le-ta se naslanja na casovnik (timer), ki je zevsebovan v mikrokrmilniku (glej poglavje 7). Casovne rezine se oblikujejos pomocjo ITOC1 prekinitve (timer output compare 1). Hkrati je to ed-ina prekinitev v nasem sistemu, saj smo ze dejali, da ne bomo uporabljalizunanjih prekinitev.

Jedro casovnika je 16 bitni prostotekoci stevec TCNT, ki se vrti s cetrtinourine frekvence. V nasem primeru se njegova vrednost poveca 1228800-kratv sekundi. Poleg tega casovnik vsebuje tudi 16 bitni primerjalni registerTOC1 (timer output compare register), ki doloca vrednost prostotekocegastevca pri kateri naj se sprozi ITOC1 prekinitev. Opisani mehanizem mocnospominja na budilko z dvema kazalcema:

Slika 2: Dolocanje casovne rezine z “budilko”

Daljsega poganja urin mehanizem, medtem ko krajsega rocno nastavimona trenutek, ko zelimo bujenje. Ko prostotekoci kazalec ( TCNT register)pride do lege krajsega kazalca ( TOC1 register), se sprozi zvonec ( ITOC1prekinitev).

Ob prekinitvi se pozene razvrscevalnik v izpisu 2. Najprej s pomocjoglobalne spremenljivke SCHTST preveri, ali morda predhodno opravilo seni koncano. Ce je temu tako, potem se ujame v neskoncni zanki SCHERRv kateri program obstane dokler ga uporabnik ne prekine. V nasprotnemprimeru s SCHTST oznaci zacetek novega opravila, ter takoj prestavi kazalecbujenja za 1200 ciklov. Naslednja ITOC1 prekinitev se bo tako sprozilanatanko 1/1024s po pricetku tekoce prekinitve. Nato razvrscevalnik pre-bere globalno spremenljivko SCHPTR, ki doloca katero opravilo v urniku je

2.1. CASOVNO REZINJENJE 13

na vrsti. Iz urnika prepise naslov opravila v indeksni register ter pozeneopravilo. Razvrscevalnik po koncanem opravilu krozno poveca kazalecopravil SCHPTR, oznaci konec opravila s SCHTST ter se z rti vrne k izvajanjuglavnega programa.

Razvrscevalnik porabi ob vsaki prekinitvi natanko 81 strojnih ciklov,kar predstavlja dobrih 7% casovne rezine. To so takorekoc rezijski stroskicasovnega rezinjenja. Tudi nasa gospodinja izgubi nekaj casa, ko odlozilikalnik, naredi nekaj korakov do stedilnika in pograbi kuhalnico. Sele tedajpricne z dejanskim opravilom (mesanjem golaza). Prav tako porabi nekajcasa, da se vrne h glavnemu programu (likanju). Zelo pomembno je, da jeizgubljen cas kratek v primerjavi s trajanjem opravil! V nasem primeru smosi zagotovili zelo ugoden odstotek rezije, saj znasa le 7% procesorskega casa.Nas razvrscevalnik je tudi v prostorskem smislu zelo skromen. Iz izpisa 2vidimo, da potrebuje za svojo kodo vkljucno z urnikom le 73 pomnilniskihlokacij!

Povzemimo delovanje nadzornega programa z graficno predstavitvijo nasliki 3. Izvajanje glavega programa se prekine v trenutku ko je TCNT enakTOC1. Zazene se razvrscevalnik, ki potrebuje 50 strojnih ciklov zase, natopa poklice ustrezno opravilo, v nasem primeru na sliki 3 je na vrsti opraviloSCI. Po koncanem opravilu potrebuje razvrscevalnik se 30 ciklov, nato pa senadaljuje izvajanje glavnega programa. Vse skupaj se ponovi ob naslednjiprekinitvi.

Slika 3: Nacelo casovnega rezinjenja. Stevilke oznacujejo trajanje izrazenov strojnih ciklih.

Na tem mestu moramo omeniti se zagon nadzornega programa. Nacel-oma pomeni zagon le zacetno nastavitev spremenljivk SCHTST in SCHPTRter casovnikovih registrov TOC1, TFLG1 in TMSK1. Poleg tega je potrebnoizbrisati prekinitveno zastavico cli. Vsa potrebna opravila so zbrana vSCHON v izpisu 3.

14 POGLAVJE 2. JEDRO OPERACIJSKEGA SISTEMA

************************* ENABLE THE SCHEDULER **********************

SCHON clr SCHTST 6 Reset test bit to indicate no interrupt running.

ldx #SCHTAB 3 Initialize pointer

stx SCHPTR 5 to first 1/64s period tasks.

ldd _TCNT 5 Load free running counter

addd #1200 4 increment it by time slice

std _TOC1 5 and store it to output compare register 1.

ldaa #$80 2 Select OC1,

staa _TFLG1 4 clear any pending OC1F,

staa _TMSK1 4 enable OC1 interrupt and

cli 2 start interrupts.

rts 5 Return(Scheduler running).

Izpis 3: Zagon nadzornega programa

2.2 Sistemska ura realnega casa

Da bi utrdili razumevanje casovnega rezinjenja, si bomo ogledali primerzelo preprostega opravila, t.j. uro realnega casa. Hkrati bo to sistemskoopravilo zelo koristno in ga bomo uporabljali tudi kasneje, saj igra casodlocilno vlogo pri sprotnem krmiljenju.

Mikrokrmilnik sicer ze vsebuje casovnik, vendar se le-ta obrne 18.75-krat v sekundi (glej sliko 2). Potrebujemo torej opravilo, ki bo sproti skrbeloza stiri osembitne spremenljivke: ure TIMH, minute TIMM, sekunde TIMS in256-inke sekunde TIMF. V izpisu 4 vidimo ustrezno zbirnisko kodo.

************************* TIMER TASK (~<=77) ************************

* This is a real-time clock driver. TIM should be placed into the

* task schedule at a 1/256 second duty cycle. TIM updates four

* global variables TIMH (Hours 0..23), TIMM (minutes 0..59), TIMS

* (seconds 0..59) and TIMF (second fractions 0..255).

*********************************************************************

TIM inc TIMF 6 Increment fraction counter,

bne TIMRTS 3 Branch down if no overflow

inc TIMS 6 Increment second counter,

ldaa TIMS 4 load it to A

cmpa #60 2 and compare with 60.

bcs TIMRTS 3 Branch down if no overflow

clr TIMS 6 and reset second counter otherwise.

inc TIMM 6 Increment minute counter,

ldaa TIMM 4 load it to A

cmpa #60 2 and compare with 60.

bcs TIMRTS 3 Branch down if no overflow

2.2. SISTEMSKA URA REALNEGA CASA 15

clr TIMM 6 and reset minute counter otherwise.

inc TIMH 6 Increment hour counter,

ldaa TIMH 4 load it to A

cmpa #24 2 and compare with 24.

bcs TIMRTS 3 Branch down if no overflow

clr TIMH 6 and reset hour counter otherwise.

TIMRTS rts 5 Return().

Izpis 4: Ura realnega casa kot sistemsko opravilo

Opravilo TIM vstavimo v urnik tako, da dobi vsako cetrto casovnorezino. Tako dosezemo, da bo rutina TIM pognana natanko 256-krat vsekundi. Opravilo ob vsakem zagonu najprej poveca stevec 256-ink inpogleda ali je morda ze napolnjena sekunda. Ce ni, je opravilo ze koncano.Sicer pa se poveca TIMS in preveri ali je ze dosezena nova minuta, itd.

Iz izpisa 4 ni tezko razbrati, da potrebuje TIM v najslabsem primeru 77strojnih ciklov, v povprecju pa zadostuje samo 15 ciklov! Vsi ostali pro-gramski sklopi lahko sedaj v vsakem trenutku “pogledajo na uro” enostavnotako, da nalozijo vsebino ustrezne casovne spremenljivke.

Pozoren bralec se je v tem trenutku zavedel hude tezave. Oglejmo sijo na primeru. Glavni program na nekem mestu potrebuje ure, minute insekunde:

************************* TIMH TIMM TIMS TIMF Sklad ***************

* .... 9 59 59 255 x,y

ldaa TIMH 9 59 59 255 x,y

* Prekinitev: izvede se opravilo

psha 10 0 0 0 x,y,9

ldaa TIMM 10 0 0 0 x,y,9

psha 10 0 0 0 x,y,9,0

ldaa TIMS 10 0 0 0 x,y,9,0

psha 10 0 0 0 x,y,9,0,0

* .... 10 0 0 0 x,y,9,0,0

Izpis 5: Izsek glavnega programa, ki pospravi trenuten cas na sklad

Zgodi se, da je ura ob zacetku branja natanko 9:59:59 in 255/256s. Polegtega imamo to smolo, da se pricne nova casovna rezina takoj po nalaganju urv akumulator in kot zakleto je na vrsti opravilo TIM. Verjetnost za tak spletokoliscin je resda zelo majhna, vendar so posledice katastrofalne. Programje najprej nalozil ure v akumulator, torej 9. Potem je bil prekinjen, cas je

16 POGLAVJE 2. JEDRO OPERACIJSKEGA SISTEMA

preskocil na 10:00:00 in 0/256s. Po koncani prekinitvi program nadaljujein odlozi vrednost akumulatorja na sklad, nato nalozi se minute in sekundena sklad, torej 00:00. Na skladu je ura 9:00:00 namesto 9:59:59 ali 10:00:00!Pri prakticnem delu tovrstnih napak zlepa ne odkrijemo, saj se pokazejozelo redko in niso ponovljive! Naleteli smo na znan problem hkratnegadostopa.

2.3 Problem hkratnega dostopa do skupnih enot

Vedno, kadar imamo opravka s hkratnim izvajanjem vecih opravil, se po-javita dve poglavitni tezavi, ki neposredno sledita iz interakcij med opravili.To je problem hkratnega dostopa in problem usklajene komunikacije. V temrazdelku se bomo lotili prvega.

Situacijo vsi dobro poznamo iz vsakdanjega zivljenja. Dva olikana stu-denta zelita v tretjem nadstropju izstopiti iz dvigala. Hkrati naredita ko-rak proti vratom, vendar so le-ta preozka za oba. Zopet oba hkrati opazitanamero drugega in drug drugemu odstopita prednost. Ce nastala pat pozi-cija traja predolgo, se vrata zapro in dvigalo odpelje.

Dva neodvisna procesa (studenta) skusata hkrati uporabiti neko skupnonapravo (vrata). Pri tem sta se prisiljena sporazumeti o tem, kdo bo selprvi in kdo kot drugi skozi vrata. Resitev je vedno v tem, da mora nekdoza hipec pocakati!

Problem je torej (i) prepoznati situacijo, ko vec procesov hkrati zelidostop do neke skupne enote in (ii) dolociti vrstni red dostopa. Velikisistemi poznajo najrazlicnejse arbitrazne tehnike, ki so lahko tudi zelozapletene. V nasem primeru pa si lahko oddahnemo, saj smo se odlociliza tako preprost model casovnega rezinjenja, da sploh ne more priti do zelozapletenih konfliktov pri dostopu do skupnih naprav!

Probleme pricakujemo lahko le med opravili v urniku in glavnim pro-gramom, medtem ko si opravila med seboj sploh ne morejo hoditi v zelje, sajsmo zahtevali, da se vedno koncajo se pred iztekom svoje casovne rezine. Vkonfliktih torej nastopata samo dve stranki, pri cemer je ena vedno glavniprogram. Na dlani je, da bo moral glavni program v primeru konfliktapocakati. Prepoznavanje konfliktnih situacij pa bomo enostavno prelozili naprogramerja. Slednji mora pri nacrtovanju glavnega programa predvidetimesta potencialne nevarnosti in jih zavarovati z naslednjo sinhronizacijskorutino:

************************* SYNCHRONIZE WITH SCHEDULER ****************

* Call this subroutine from any non-realtime routine to request

* D<1100 uninterrupted subsequent maschine cycles. Upon return, you

2.3. PROBLEM HKRATNEGA DOSTOPA DO SKUPNIH ENOT 17

* have the requested number of uninterrupted cycles, plus D extra

* cycles. Use D=0 to find out the number of cycles left until next

* scheduler interrupt.

*********************************************************************

SCHSYN pshx 4 Push X.

addd #$0020 4 Add the system overhead of 32 machine cycles.

pshb 3 Push number of machine cycles

psha 3 from D to stack

tsx 3 and make X point to it.

SCHWAI ldd _TOC1 4 Load output compare register,

subd _TCNT 5 subtract free running counter

subd 0,X 6 and number of cycles.

bmi SCHWAI 3 Loop back if not enough cycles until interrupt.

pulx 5 Dummy pull X to clear D from stack.

pulx 5 Restore X.

rts 5 Return(D=extra cycles left).

Izpis 6: Sinhronizacija glavnega programa s prekinitvami razvrscevalnika

Podprogram je sila preprost in zelo ucinkovit. Neposredno pred vsakimkriticnim odsekom glavnega programa poklicemo podprogram SCHSYN inmu v D registru sporocimo stevilo kriticnih strojnih ciklov, ki neposrednosledijo. Rutina SCHSYN nato primerja TCNT in TOC1 ter ugotovi, glede naD, ali je se dovolj casa pred naslednjo prekinitvijo za nemoteno izvajanjekriticnega odseka. Ce temu ni tako, potem se rutina v izpisu 6 ujame vzanko SCHWAI in pocaka, da prekinitev v celoti mine.

Poglejmo, kako zavarujemo programski odsek iz izpisa 5 z uporabo pod-programa SCHSYN. Kriticni programski kos traja 21 strojnih ciklov. Torejdodamo ustrezen klic sinhronizacijske rutine:

************************* TIMH TIMM TIMS TIMF Sklad ***************

* .... 9 59 59 255 x,y

ldd #21 9 59 59 255 x,y

jsr SCHSYN 9 59 59 255 x,y

* Prekinitev: izvede se opravilo TIM

ldaa TIMH 10 0 0 0 x,y

psha 10 0 0 0 x,y,10

ldaa TIMM 10 0 0 0 x,y,10

psha 10 0 0 0 x,y,10,0

ldaa TIMS 10 0 0 0 x,y,10,0

psha 10 0 0 0 x,y,10,0,0

* .... 10 0 0 0 x,y,10,0,0

Izpis 7: Zavarovan izsek glavnega programa

18 POGLAVJE 2. JEDRO OPERACIJSKEGA SISTEMA

Kadar nastopijo okoliscine, kot smo si jih zamislili na koncu prejsnegarazdelka, bo podprogram SCHSYN prepoznal blizajoco se prekinitev in bov zanki SCHWAI pocakal, da le-ta mine. Seveda se lahko zgodi, da rutinaSCHSYN po nepotrebnem caka prekinitev, ce po urniku sledi opravilo, ki sesploh ne vtika v casovne spremenljivke. Vendar je verjetnost za tak dogodekzelo majhna, saj so zavarovana mesta praviloma zelo kratka v primerjavi scasovno rezino in je tako izgubljen procesorski cas zanemarljivo kratek.

V obravnavanem primeru so bile stiri 8-bitne spremenljivke v pomilnikujabolko spora pri dostopu. Bolj pogosto kot programske enote pa nastan-jejo konfliktne situacije okoli dostopa do strojnih enot. Kot primer lahkonavedemo tipkovnico. Ni si tezko zamisliti zmede, ki nastane, ce glavniprogram in neko opravilo hkrati naslavljata stolpce ter bereta vrstice v ma-triki tipk. Nasa naloga v laboratoriju je predvideti vse mozne konfiktnesituacije jih zavarovati z uporabo podprograma SCHSYN.

2.4 Problem usklajene komunikacije med opravili

Doslej smo obravnavali le sozitje med razlicnimi medsebojno neodvisnimiopravili. V tem razdelku se bomo posvetili se z vprasanjem njihovega med-sebojnega sodelovanja. Ceprav je naceloma vsako opravilo tako v casovnemkot tudi v funkcijskem smislu precej neodvisno od ostalega dogajanja v sis-temu, morajo obstajati neka pravila medsebojne komunikacije.

Pravzaprav smo v predhodnem razdelku ze naceli problem komunikacijemed casovnim opravilom TIM, ki poganja uro realnega casa v obliki stirihspremenljivk, in glavnim programom, ki z branjem prav teh spremenjivkpridobi informacijo o trenutnem casu. V slednjem primeru prenosa informa-cij ni bilo potrebno casovno uskladiti, saj nas zanima izkljucno le trenutnicas.

Ponazorimo si problem s primerom iz vsakodnevnega zivljenja. Opazu-jmo dogajanje na blagajni samopostrezne trgovine. Kupci prinasajo blagov kosarah in vozickih ter ga zlagajo na konec tekocega traku pred blagajno.Blagajnicarka jemlje posamezne kose blaga z zacetka traku in jih registrirastrogo po nacelu “kdor prej pride, prej melje”. Z vsakim registriranjem setekoci trak pomakne naprej. Tako sproti nastaja prostor v zadnjem delu.Takoci trak s cakalno vrsto je potreben zato, ker prispevanje artiklov ni inne more biti usklajeno z njihovo obdelavo. Pri tem so mozne tri razlicnesituacije:

1. Starejsa gospa tako pocasi zlaga blago na trak, da ga blagajnicarkauspeva sproti obdelati, torej je tekoci trak prazen - blagajnicarka sedolgocasi.

2. Zivcna gospodinja pripelje vozicek in ga hitro zlozi na trak, saj je tam

2.4. PROBLEM USKLAJENE KOMUNIKACIJE MED OPRAVILI 19

dovolj prostora za vse njeno blago. Seveda blagajnicarka takoj zacnez delom, ceprav je jasno, da ne more dohajati nestrpne gospodinje.

3. V casu prednovoletne nakupovalne mrzlice je obupana zena mobi-lizirala celo svojega moza, tako da sta skupaj nabrala dva zvrhanavozicka blaga. Ceprav se blagajnicarka trudi, je trak do konca zapol-njen z blagom. Zakonca ne moreta vec polagati blaga v vrsto, torejmora del blaga pocaki v vozicku.

Prvi dve situaciji sta normalni, saj je tekoci trak dovolj velik, da sprejmeblago povprecnega kupca. Zadnji primer pa je nenacrtovana izjema, kipomeni preobremenjen sistem.

V programskem svetu se tak tekoci trak imenuje medpomnilnik ali an-glesko ”buffer”, medtem ko se je v strojnem svetu uveljavil izraz pomikalniregister ali anglesko ”shift register”. V laboratoriju bomo vse podatkovnetokove med razlicnimi opravili dosledno speljali preko razlicno velikih pro-gramskih medpomnilnikov.

Poznamo celo vrsto razlicnih pristopov k programski realizaciji med-pomnilnikov. Najpreprostejsa nastane, ce se neposredno zgledujemo potekocem traku, vendar je taka realizacija neucinkovita. Vsako branje izmedpomnilnika zahteva pomik vseh ostalih podatkov za en bajt, kar je zelozamudno. Odlocili smo se raje za nekoliko ucinkovitejso pot: Uporabljalibomo staticne ciklicne medpomnilnike, kot jih prikazuje slika 4.

Zamudnemu premikanju podatkov po pomnilniku smo se izognili tako,da smo uvedli dva 16-bitna kazalca, ki oznacujeta zacetek BUFB in konecBUFE podatkovnega toka. Namesto, da bi premikali podatke, sedaj ciklicnopremikamo vrednosti kazalcev, kar je neprimerno hitrejse.

Vsak medpomnilnik je dolocen z dvema kazalcema, katerih naslov ozna-cuje fizicni zacetek medpomnilnika #BUFB+2 ter njegov fizicni konec #BUFE-1.Vsebine kazalcev pa oznacujejo prvi bajt vsebine medpomnilnika BUFBter prvi prosti bajt za zadnjim podatkom. Lahko recemo, da BUFB kazena mesto praznenja, medtem ko BUFE oznacuje mesto polnjenja. Ce obakazalca kazeta na isto mesto, potem je medpomnilnik prazen. Poln med-pomnilnik pa prepoznamo tako, da je BUFE v ciklicnem smislu za en naslovmanjsi od BUFB. Ocitno ne smemo zapolniti zadnjega prostega mesta, saj bisicer zopet veljalo BUFB=BUFE in se stelo kot prazen medpomnilnik. Logicnadolzina medpomnilnika je torej #BUFE-BUFB-1.

Podkrepimo povedano s konkretnim primerom. Denimo, da se je nekoopravilo odlocilo izpisati preko serijskega vmesnika stavek Dobro jutro. nazaslon osebnega racunalnika. Opravilo (stranka) iz niza znakov (nakupoval-nega vozicka) zlozi crke (blago) v ustreznem vrstnem redu v medpomnilnikTRAB-TRAE (tekoci trak pred blagajno) ter se takoj posveti drugim oprav-

20 POGLAVJE 2. JEDRO OPERACIJSKEGA SISTEMA

Slika 4: Primer a) praznega, b) delno zasedenega in c) polnega medpom-nilnika.

ilom. Na drugem koncu medpomnilnika (tekocega traku) sedi opravilo SCI(blagajnicarka), ki s svojo hitrostjo (<9600 baud) jemlje znake iz medpom-nilnika in jih posilja osebnemu racunalniku preko RS232 vodila. Izpis 8prikazuje ustrezno zbirnisko kodo.

2.4. PROBLEM USKLAJENE KOMUNIKACIJE MED OPRAVILI 21

************************* TRANSMIT CHARACTER (~<=51) ****************

* Place binary in A to the SCI transmitting buffer TRAB-TRAE. In

* case of a full buffer, the procedure returns Z=1, otherwise Z=0.

* The contents of all registers are preserved. This procedure must

* never be interrupted by another call to TRACHR!

*********************************************************************

TRACHR pshx 4 Push X on stack.

ldx TRAE 6 Load logical end-of-buffer to X

staa 0,X 4 and store character from A to buffer.

inx 3 Increment X in order to

cpx #TRAE 4 compare with physical end-of-buffer.

bne TRA1 3 If physical end reached then

ldx #TRAB+2 3 cycle to physical begin-of-buffer.

TRA1 cpx TRAB 6 Compare logical end to logical begin

beq TRAERR 3 and return if buffer full.

stx TRAE 5 Then store logical end-of-buffer.

TRAERR pulx 5 Restore X.

rts 5 Return(Z).

* ...

* ...

ldx #STRING 3 Load string pointer to X.

LOOP ldaa 0,X 4 Get character from string

beq DONE 3 and jump down if end of string (null).

jsr TRACHR 6 Put valid character from A to TRAB-TRAE.

inx 3 Increment string pointer

bra LOOP 3 and loop back.

STRING FCC "Dobro jutro." This is the constant character string,

FCB $00 terminated by a null character.

DONE ...

* ...

Izpis 8: Primer vpisovanja niza znakov v medpomnilnik

Za vpis posameznega znaka v medpomnilnik smo oblikovali podpro-gram TRACHR, ki prenese znak iz akumulatorja A na ustrezno mesto inpomakne kazalec TRAE. Poleg tega rutina TRACHR predhodno preveri, alini morda medpomnilnik poln. V tem primeru postavi nicelno zastavicoZ=1, medtem ko uspesen vpis prepoznamo po Z=0. V normalnih primerihpotrebuje TRACHR 51 strojnih ciklov.

V spodnjem delu izpisa 8 vidimo programski izsek, ki v vsakem obhoduzanke LOOP zlozi po en znak iz niza v medpomnilnik. Analizirajmo casovnerazmere celotnega izseka. Zanka LOOP se bo v celoti zavrtela 12-krat, sajima niz 12 znakov. Vsak obhod terja 19 ciklov in 51 ciklov za izvrsitevrutine TRACHR. Ce upostevamo se 5 ciklov pred in 7 ciklov po zanki, potem

22 POGLAVJE 2. JEDRO OPERACIJSKEGA SISTEMA

traja vpis celotnega niza 5+(12*(19+51))+7=852 ciklov. Preracunano nacasovno premico to pomeni, da nas programski izsek zlozi v manj kot 700mscelotno vsebino nakupovalnega vozicka na tekoci trak.

Poglejmo sedaj, koliko casa potrebuje blagajnicarka na drugi stranitraku, da izprazni trak. Strojna oprema SCI vmesnika lahko v idealnihrazmerah deluje s hitrostjo 115200 baudov, kar znese priblizno 14000 znakovna sekundo! Prakticno pa ne moremo imeti opravila SCI vec kot 4-krat vurniku, torej bodo znaki odhajali iz medpomnilnika s hitrostjo 256 znakovna sekundo. Sporocilo Dobro jutro. bo potovalo iz medpomnilnika dozaslona priblizno 50ms.

Sedaj vidimo, kako pomembno vlogo igra medpomnilnik, saj bi breznjega programski izsek izgubil ogromno casa z nepotrebnim cakanjem medprenosom posameznih znakov. Tako pa v 700ms zmece znake v medpom-nilnik in takoj nadaljuje z drugim delom!

Povrnimo se se za hip k problemu hkratnega dostopa. Tudi pri uskla-jevanju komunikacije med opravili s pomocjo medpomnilnikov lahko pridedo spora pri dostopu do medpomnilnika. Denimo, da je programski izsek vizpisu 8 del glavnega programa. Ce imamo v urniku opravila, ki utegnejopisati sporocila, se lahko zgodi, da pridrvi opravilo s svojim nakupovalnimvozickom, prekine zanko LOOP sredi zlaganja na tekoci trak, ter vrine svojeznake na tekoci trak. Nastane nepopisna zmeda.

Premisliti velja tudi, ali lahko morda pride do tezav pri vpisovanjuv medpomnilnik, ce je rutina TRACHR na kateremkoli mestu prekinjena zbranjem iz istega medpomnilnika. V laboratoriju bomo pri nacrtovanjupodprograma za branje iz medpomnilnika posebej pazili na omenjeni prob-lem.

Poglavje 3

Sistemski gonilniki zunanjihenot

V predhodnem poglavju smo spoznali rutine (podprograme), ki dolocajojedro nasega mini operacijskega sistema. V prvi vrsti seveda mislimo narazvrscevalnik v obliki prekinitvene procedure SCHINT, vkljucno z zagon-sko rutino SCHON in sinhronizacijsko rutino SCHSYN. K jedru operacijskegasistema pristevamo tudi uro realnega casa v obliki opravila TIM. V tempoglavju bomo jedru dodali se nabor programskih gonilnikov za posameznezunanje enote ter tako zaokrozili nas mini operacijski sistem.

Naloga gonilnika (anglesko “driver”) je komunikacija z zunanjo enotona najnizjem registrskem nivoju. Vsa ostala programska nadgradnja natokomunicira z zunanjimi enotami izkljucno posredno preko gonilnikov.

3.1 Tipkovnica

Ce zelimo karkoli delati z mikrokrmilnisko plosco s slike 1, potem potrebu-jemo najprej preprosto tipkovnico in majhen LED prikazovalnik. Zamislilismo si torej polje 16 tipk in 4 mestni LED prikazovalnik. Vse skupajsmo uspeli povezati na vrata PSA in PSB paralelnega vmesnika. Poglejmopoenostavljeno shemo za polje 16 tipk na sliki 5.

Tipke so fizicno urejene v stiri vrste po stiri tipke. Mikrokrmilnik nimahkratnega dostopa do vseh tipk. Z izpisom nicle na eno izmed stirih vrstic(bit 0 do bit 3 izhoda PSB) aktiviramo ustrezne stiri tipke. Sedaj lahko pre-beremo stanje teh stirih tipk v stolpcih matrike (bit 4 do bit 7 vhoda PSA).Kot je razvidno iz slike 5 deluje nasa tipkovnica z negativno logiko. Uporipovzrocajo logicne enice na zgornjih bitih vhoda PSA, razen v primeruko je pritisnjena tipka v aktivirani vrstici. Mikroprocesor bo moral torej

23

24 POGLAVJE 3. SISTEMSKI GONILNIKI ZUNANJIH ENOT

Slika 5: Tipkovnica.

tipkovnico preleteti v stirih korakih - vsako vrstico posebej.Napisali bomo gonilnik, ki bo stalno bedel nad tipkovnico, ugotavljal

veljavne pritiske in zlagal ustrezne ASCII kode v medpomnilnik KBDB-KBDE.Pri tem mora biti kos dvema tezavama:

1. Sklepanje mehanskih kontakov je vedno pospremljeno s sumom.

2. Utegne se zgoditi, da je hkrati pritisnjenih vec tipk.

Oglejmo si razmere, ki nastanejo na podatkovni liniji pri pritisku alispustu dolocene tipke. Na sliki 6 vidimo znacilno slabost vseh mehanskihstikal.

V teku razklepanja kovinskih kontaktov pride nujno do faze trenja, vkateri se elektricni kontakt izgublja in vzpostavlja. V anglosaski literaturise je za opisani efekt uveljavil izraz “bouncing”. Seveda je casovno trajanjetega nekontroliranega skakanja omejeno, denimo na 100ms, kar je za clovekasicer neopazno, gonilnik pa lahko zavede. Ce gonilnik prehitro zaporednoodcitava stanje tipk, potem bo nastali sum prepoznal kot serijo pritiskov in

3.1. TIPKOVNICA 25

Slika 6: Razmere na podatkovni liniji pri pritisku na tipko.

spustov. Vsak pritisk in spust bosta tako pognala vecje stevilo iste ASCIIkode v medpomnilnik.

Prepocasno odcitavanje tipkovnice pa zopet vodi v tezave, saj lahkonekdo tako hitro pritisne in spusti tipko, da gonilnik pritiska sploh neopazi. Denimo, da najkrajsi mozen mehanski pritisk traja 100ms. Go-nilnik mora torej tipkovnico pregledati vec kot 10-krat na sekundo, ven-dar med dvema zaporednima odcitavanjima nikoli ne sme preteci manj kot3*100ms=300ms.

Programerji pogosto resujejo ta problem tako, da opremijo vsako odci-tavanje s potratno zakasnilno zanko. V nasem primeru bomo zasnovaligonilnik za tipkovnico kot sistemsko opravilo KBD, ki bo v urniku zasedlo enomesto. Tako bomo dosegli popolnoma enakomerno odcitavanje tipkovnicein sicer natanko 64-krat v sekundi.

Ceprav je ostalo se precej nedorecenega, si bomo v nadaljevanju ogledalidiagram poteka za nas gonilnik tipkovnice, ki je zasnovan kot opravilo.Resitve nekaterih odprtih vprasanj so razvidne neposredno s slike 7, kotna primer problem hkratnega pritiska vecih tipk, medtem ko so nekateredruge tezave namenoma prepuscene nacrtovalcu zbirniske kode. V slednjoskupino sodi na primer vprasanje, kaj storiti s prebrano ASCII kodo, ce jemedpomnilnik polno zaseden. Cakanje na izpraznenje nikakor ne pride vpostev, saj se mora opravilo nujno koncati pred iztekom casovne rezine!

Pazljivo nacrtovano opravilo KBD zasede 90 pomnilniskih lokacij in potre-buje v najslabsem primeru 214 strojnih ciklov, v povprecju pa shaja s 110-imi cikli. Opravilo KBD je sicer glavni del gonilnika za tipkovnico, vednar

26 POGLAVJE 3. SISTEMSKI GONILNIKI ZUNANJIH ENOT

Slika 7: Gonilnik za tipkovnico v obliki opravila KBD, ki se pozene 64-kratv sekundi.

mu moramo dodati se kratek podprogram, ki opravi branje znakov iz med-pomnilnika. Imenujmo ga KBDCHR.

Ob vsakem klicu podprogram KBDCHR najprej preveri, ali je sploh kakznak v medpomnilniku KBDB-KBDE. Ce je slednji prazen, se podprogramkonca in z nicelno zastavico Z=1 oznani klicnemu programu svoj neuspeh.Poudarimo se enkrat: podprogram KBDCHR ne caka prispetja novih znakov vmedpomnilnik, pac pa se vrne praznih rok! Ce pa medpomnilnik ni prazen,pobere rutina KBDCHR prvi znak iz medpomnilnika in ga vrne klicnemuprogramu v akumulatorju A. Poleg tega svoj uspeh veselo ozani z nicelnozastavico Z=0.

Rutina je kratka (25 pomnilniskih lokacij) in na prvi pogled nezahtevna,saj je po strukturi mocno podobna podprogramu TRACHR z izpisa 8. Vendarpozor, vrag se skriva v podrobnostih! Podprogram bo klican predvsem izglavnega programa. Torej moramo pri nacrtovanju rutine KBDCHR racunati s

3.2. SEDEMSEGMENTNI PRIKAZOVALNIK 27

prekinitavami. Rutina je lahko pri branju iz medpomnilnika na kateremkolimestu prekinjena z opravilom KBD, ki v taisti medpomnilnik doda nov znak!KBDCHR mora biti zasnovana tako, da tudi v takih primerih ne nastanezmeda!

3.2 Sedemsegmentni prikazovalnik

Na stikalnem nacrtu vhodno izhodnega modula za procesorsko polsco HC11najdemo poleg ze omenjene tipkovnice tudi stirimestni sedemsegmentniLED prikazovalnik. Sicer so prakticne prikazovalne moznosti omejene, ven-dar stiri mesta ze zadostujejo za malo veselja. Ce pa nujno potrebujemovecjo prikazovalno povrsino, lahko vedno preko SCI vmesnika uporabimozaslon osebnega racunalnika.

Podobno kot tipkovnica je tudi nas sedemsegmentni prikazovalnik pri-kljucen posredno na spodnje stiri bite izhoda PSA in na vseh osem bitovizhoda PSB. Hkrati lahko prizgemo torej le eno mesto! Na izhod PSBzapisemo ustrezno kombinacijo nicel in enic, ki predstavlja neko cifro (naprimer %01100110 za cifro 4), z niclo na spodnjih stirih biti izhoda PSApa povemo, katero mesto naj cifro prikaze. Ce izpisemo vec nicel na izhoduPSA, bomo sicer aktivirali vec mest, vendar bodo vsa aktivna mesta kazalaisto cifro. Gonilnik bo moral torej dovolj hitro preletavati vsa stiri mesta,da bodo LED prikazovalniki delovali “hkrati”. Vse skupaj spominja natelevizijski zaslon, ki se mora osvezevati najmanj 50 krat v sekundi, sicerclovesko oko zazna utripanje. V nasem primeru bomo nacrtovali opravilo, kibo preklapljalo posamezna mesta 256 krat v sekundi. Ce uvrstimo opraviloLED na stiri mesta v urniku, potem dobimo osvezevalno frekvenco 64Hz.

Pozorni bralec je opazil se eno tezavo. Ce primerjamo sliko 5 in sliko8, potem vidimo, da so spodnji stirje biti izhoda PSB uporabljeni tako zakrmiljenje prikazovalnika kot tudi tipkovnice! Aktiviranje posameznih vrsttipk priziga tudi sedemsegmentne LED enote. Problem bosta gonilnikaresila tako, da bo gonilnik tipkovnice najprej ugasnil LED prikazovalnike,nato zelo hitro opravil preletavanje vseh stirih vrst tipk in takoj vzpostavilprvotno stanje na izhodih PSA in PSB. Clovesko oko tega intervala splohne bo zaznalo.

Napisimo torej gonilnik z imenom LED, ki bo uvrscen na stiri mesta vurniku. Zagnal se bo torej 256 krat v sekundi, njegova naloga pa bo, daciklicno priziga vsa stiri mesta nasega prikazovalnika. Podatke za prikazdobi v pomnilniku na stirih zaporednih lokacijah LED0, LED1, LED2 in LED3.Nacin uporabe gonilnika je nekoliko podoben zapisovanju na zaslon oseb-nega racunalnika. Nase stiri lokacije delujejo v povezavi s opravilom LEDkot nekaksen videopomnilnik: vsebina teh stirih spremenljivk se nenehno

28 POGLAVJE 3. SISTEMSKI GONILNIKI ZUNANJIH ENOT

Slika 8: Stirimestni sedemsegmentni LED prikazovalnik.

izpisuje na prikazovalniku. Poglejmo primer v izpisu 9.

....

NAPAKA ldaa #%01111001 Load 7 segment code for char ’E’ to A

staa LED3 and display it leftmost.

ldaa #%01010000 Load code for ’r’

staa LED2 and display,

ldaa #%11010000 then ’r.’ and

staa LED1 display.

ldaa #%01011011 Finally load error number ’2’

staa LED0 and display rightmost.

....

Izpis 9: Izpis sporocila ”Err.2” na LED prikazovalniku.

Seveda je nekoliko nerodno, da moramo cifre “rocno” oblikovati, zatosi bomo privoscili poseben sistemski podprogram za pretvorbo stiri bitnedvojiske vrednosti v osem bitno 7-segmentno kodo, ki predstavlja dvojiskovrednost v sesnajstiski obliki. Rutina B2L pricakuje dvojisko vrednost vspodnjih stirih bitih akumulatorja A. To vrednost pretvori v sestnajstiskocifro in jo klicnemu programu zopet vrne v akumulatorju A. Podprogramseveda ohrani stanje vseh ostalih procesorskih registrov.

3.3. SERIJSKA KOMUNIKACIJA 29

3.3 Serijska komunikacija

Mikrokrmilniski sistem vsebuje asinhronski serijski vmesnik, ki je pravza-prav ze del mikrokrmilnika. Serijska komunikacija med razlicnimi racunal-niskimi enotami je na splosno zelo razsirjena. Asinhronski serijski prenospodatkov je tako priljubljen predvsem zato, ker je izredno nezahteven, takov strojnem kot v programskem smislu. Enostavna strojna zgradba in enos-taven komunikacijski protokol RS232 jamcita za visoko zanesljivost in vi-soko zdruzljivost. Nas sistem HC11 lahko preko SCI (Serial Communi-cation Interface) seveda komunicira z najrazlicnejsimi enotami. Nastejmonekaj moznosti: faks modem, serijski tiskalnik, osebni racunalnik, delovnapostaja in seveda lahko mikrokrmilniski sistemi HC11 tudi medsebojnokomunicirajo. V tem razdelku se bomo osredotocili na najosnovnejso ko-munikacijo z razvojnim okoljem na osebnem racunalniku. Komunikacija zdrugimi enotami je seveda zelo podobna. Komunikacijski standard RS232sicer predpisuje v strojnem smislu celo vrsto kontrolnih linij, vendar shaja vnajpreprostejsi obliki samo s tremi linijami: ozemljitvena linija GND, odda-jna linija TX in sprejemna linija RX. Strojna povezava je natancno opisanav poglavju 6.2, zato se na tem mestu ne bomo spuscali v podrobnosti. Tudiv programskem smislu ponuja RS232 celo vrsto moznih nacinov delovanja,kar je opisano v poglavju 6.4. Za uspesen prenos podatkov je potebno, dasta udelezenca pravilno povezana in da oba uporabljata isti nacin delovanja.Pri laboratorijskem delu smo se odlocili uporabljati naslednje nastavitve:• Hitrost prenosa 38400 baud,• brez paritete,• 8-bitni podatki,• 1 stop bit,• in oddajanje brez ponovitev.

Za opisane nastavitve nam ni potrebno skrbeti, saj je ze razvojni sis-tem vzpostavil RS232 povezavo in je lahko celo skodljivo, ce programskospreminjamo komunikacijske parametre.

Seveda je terminal na voljo tudi nasim aplikacijam. Razcistimo na-jprej pojem znakovnega terminala ali anglesko ”ASCII terminal”. Nalogavsakega terminala je (i) urejeno prikazovanje prihajajocih znakov na za-slonu in (ii) oddajanje znakov iz tipkovnice. Vcasih je bil terminal de-jansko strojna oprema, danes pa nikomur vec ne pade na pamet, da bizgradil strojno opremo, ki bi delovala le kot terminal. Moderni termi-nali so programske narave, zato jih pogosto imenujemo virtualni terminali.Tudi nas razvojni sistem vsebuje tako imenovano ”terminalsko okno”, ki jenatancno opisano v okviru poglavja 6.4. Na strani osebnega racunalnika

30 POGLAVJE 3. SISTEMSKI GONILNIKI ZUNANJIH ENOT

torej odpremo terminalsko okno. Od tega trenutka dalje vsaka pritisnjenatipka na tipkovnici osebnega racunalnika povzroci prenos ustrezne ASCIIkode v mikrokrmilniski SCI vmesnik. Vsak znak ki je vpisan v registre SCIvmesnika pa se znajde na zaslonu osebnega racunalnika.

Takoj prepoznamo problem usklajevanja komunikacije in sicer v obehsmereh. Ce na tipkovnici osebnega racunalnika pritisnemo tipko ’A’, potempricakujemo, da bo po kakih 300ms prispela ASCII koda $41 v SCDR reg-ister. Potem je na vrsti mikrokrmilniski program, ki mora prebrati znak izregistra in sicer se pred prispetjem naslednjega znaka, saj bi le-ta povozilprejsnjo ASCII kodo! Problemi pri oddajanju so se hujsi. V poglavju 2.4smo ze spoznali, da SCI vmesnik nikakor ne more z oddajanjem dohite-vati mikrokrmilnika, ki kar bruha nize znakov! V SCDR register seveda nesmemo vpisati novega znaka, dokler prejsni v celoti ni zapustil vmesnika!

Iz zagate nas bo elegantno popeljal gonilnik, ki bo skrbel za usklajenpromet znakov skozi register SCDR in dvema medpomnilnikoma. Gonilnikpoimenujmo SCI, medpomnilnika pa naj bosta dolocena s paroma kazalcevTRAB-TRAE in RECB-RECE. Slika 9 prikazuje opisane razmere.

Slika 9: Vloga gonilnika SCI pri serijski komunikaciji s terminalom.

Gonilnik SCI je seveda oblikovan kot opravilo in zaseda najmanj enomesto v urniku. Ob vsakem klicu SCI naprej pogleda kontrolni registerSCSR, kjer zastavice oznacujejo uspesno zakljuceno oddajanje znaka, pris-petje svezega podatka, napake in sum pri prenosu itd. Ce je prispel novznak, ga uvrsti na koncu sprejemnega medpomnilnika. V primeru, da je SCIvmesnik nezaseden, hkrati pa cakajo znaki v oddajnem medpominlniku,opravilo sprozi oddajanje naslednjega znaka. Glavni program in opravila,

3.4. A/D PRETVORNIK 31

ki zelijo pisati na zaslon terminala, sedaj enostavno zlozijo svoje nize znakovv medpomnilnik TRAB-TRAE in nadaljujejo z delom. Primer aplikacije, kioddaja znake preko serijskega vodila smo ze obravnavali v izpisu 8. Gledena pocasnost RS232 linije moramo za TRAB-TRAE zrtvovati vsaj 50 znakov!Sprejemni medpomnilnik pa je lahko precej manjsi, saj znaki iz tipkovnicepac ne morejo prihajati zelo hitro. Zadostuje 8 znakov.

Potrebujemo le se podprogram RECCHR za branje znakov iz sprejemnegamedpomnilnika in podprogram TRACHR za vpis znakov v oddajni medpom-nilnik. Slednjega smo pravzaprav ze predstavili v izpisu 8 in ga tudi opisaliv okviru poglavja 2.4.

Branje iz medpomnilnikov RECB-RECE in KBDB-KBDE se razlikuje samopo medpomnilniskih naslovih. Dejansko bi lahko oblikovali en sam uni-verzalen podprogram, vendar je iz sistemskega vidika primernejse, ce ob-likujemo dve loceni rutini. Do podprograma RECCHR torej pridemo enos-tavno tako, da prepisemo rutino KBDCHR, pri cemer namesto kazalcev KBDB-KBDE uporabljamo kazalca RECB-RECE.

3.4 A/D pretvornik

Mikrokrmilniki druzine MC68HC11 vsebujejo 8 kanalni 8 bitni analognodigitalni pretvornik. Pretvornik ima nadzorni register ADCTL, stiri po-datkovne registre ADR1, ADR2, ADR3, ADR4 in dve zastavici v sistemskemregistru OPTION. Podrobnejsi opis vseh moznosti najdemo v dodatku 7, natem mestu pa naredimo le kratek povzetek. Nacrtovali smo podprogram,ki sprozi enkratno, 4 kanalno pretvorbo vhodov (izpis 10). Ce rutina v aku-mulatorju A sprejme nicelno vrednost, potem sprozi pretvorbo na vhodihAN0 do AN3, v primeru nenicelnega akumulatorja pa na vodih AN4 doAN7. V vsakem primeru rutina pocaka pretvorbo, ki traja priblizno 128strojnih ciklov, nato pa se vrne v klicni program. Rezultate najdemo vvseh stirih podatkovinh registrih.

************************* A/D CONVERSION (~<=151) *******************

* This subroutine triggers a 4 chanel single scan A/D conversion

* of chanels AN0-AN3 in case A=0, AN4-AN7 if A nonzero. The routine

* then WAITS for the conversion to complete, which takes 128 E

* cycles. The results are left in registers _ADR1 through _ADR4.

*********************************************************************

ADC psha 3 Stack A.

tsta 2 If A=0 then

beq ADC1 3 AN0-AN3 input group selected,

ldaa #%00000100 2 otherwise set AN4-AN7 group active.

ADC1 oraa #%00010000 2 Set single scan multi chanel mode.

staa _ADCTL 4 Trigger conversion!

32 POGLAVJE 3. SISTEMSKI GONILNIKI ZUNANJIH ENOT

ADC2 ldaa _ADCTL 4 Read control register

bpl ADC2 3 until conversion complete.

pula 2 Restore A

rts 5 Return().

Izpis 10: Podprogram, ki sprozi 4 kanalno A/D pretvorbo

Ocitno je delo z A/D pretvornikom zelo preprosto. Za osnovne stvarizadostuje podprogram ADC, dodajmo le se opozorilo, da je A/D pretvorniskivmesnik naceloma izklopljen, torej bo podprogram v izpisu 10 deloval sele,ko bomo postavili ADPU zastavico (A/D Power Up) v OPTION registru.

Poglavje 4

Knjiznica podprogramov

V predhodnih dveh poglavjih smo predstavili nas operacijski sistem. V 2.poglavju smo spoznali jedro sistema, katerega smo nato v 3. poglavju nad-gradili z gonilniki zunanjih enot. Operacijski sistem v ozjem smislu je s temzakljucen. V sirsem smislu pa so operacijski sistemi obicajno opremljeni sez raznimi programskimi knjiznicami. Programska knjiznica (anglesko ”pro-gram library”) je nabor splosno uporabnih makrojev in podprogramov.

V tem poglavju bomo oblikovali zelo skromno knjiznico, ki bo vsebovalale nekaj najnujnejsih splosnih podprogramov.

4.1 Aritmeticni podprogrami

MUL10Mikrokrmilnik sicer pozna strojno instrukcijo za mnozenje 8-bitnih vred-

nosti, vendar bomo pri pretvorbi v desetiski stevilski sistem potrebovali16-bitno mnozenje in sicer s konstantno vrednostjo 10. V ta namen bomopripravili podprogram z imenom MUL10, ki bo pomnozil 16-bitno nepredzna-ceno vrednost v akumulatorju D s konstantno vrednostjo 10. MUL10 vrneprodukt v akumulatorju D in nastavi prenosno zastavico C v primeru preko-racitve obsega 16-bitnih nepredznacenih stevil. Podprogram MUL10 naj bishajal z 18 pomnilniskimi lokacijami in 52 strojnimi cikli.

4.2 Podprogrami za pretvorbo podatkovnih tipov

B2HRutina B2H pretvori dvojisko vrednost nizjih stirih bitov akumulatorja

A v sestnajstisko cifro, katere ASCII kodo vrne prav tako v akumulatorjuA. Vsi ostali registri ostanejo seveda nedotaknjeni. B2H zaseda le 11 pom-

33

34 POGLAVJE 4. KNJIZNICA PODPROGRAMOV

nilniskih lokacij in ne porabi vec kot 16 strojnih ciklov.

H2BV obratni smeri imamo nekoliko vec dela. Rutina H2B poskusa pretvoriti

ASCII kodo iz akumulatorja A v 4-bitno dvojisko vrednost, kar seveda nivedno mozno, saj so veljavne sestnajstiske cifre le 0-9 in A-F. V primeruneuspeha H2B postavi prenosno zastavico C in vrne nedoloceno vrednostakumulatorja A. V nasprotnem primeru najdemo rezultat v spodnjih stirihbitih akumulatorja A, prenosni bit pa je enak nic. Rutina zahteva 22 pom-nilniskih lokacij in najvec 29 strojnih ciklov.

S2IZelo pogosto zelimo, da uporabnik preko tipkovnice poda nek stevilcen

podatek. Neposredno s tipkovnice seveda ne moremo dobiti drugega kot nizASCII znakov, ki lahko vsebuje poleg zeljenih cifer se vrsto drugih znakov,kot so presledki, predznaki, decimalne pike in podobno.

Ocitno potrebujemo splosen podprogram, ki bo znal izlusciti iz poljub-nega niza predznaceno ali nepredznaceno 16-bitno stevilo. Rutino bomopoimenovali S2I, ”string to integer”. Ob njenem klicu bomo z indeksnimregistrom X pokazali na znak v nizu, s katerim naj se zacne pretvorba.Podprogram S2I sprejema izkljucno samo cifre, pri cemer na prvem mestudopusca predznak. Za pretvorbo poskusa upostevati vse cifre do prvegaznaka, ki ni cifra. Pri tem seveda lahko pride do prekoracitve obsegapredznacenih oziroma nepredznacenih 16-bitnih stevil. Ob svojem koncunam S2I z indeksnim registrom pokaze na prvi nepretvorjeni znak v nizu.Akumulator D vsebuje pretvorjeno dvojisko vrednost, prenosna zastavicaC=0 pa oznanja, da ni prislo do prekoracitve obsega. Neuspesno pretvorboprepoznamo po legi indeksnega registra, ki ostane nespremenjena, bodisizaradi prekoracenega obsega C=1 ali zaradi odsotnosti cifer.

Slika 10: Primer a) uspesne in b) neuspesne pretvorbe niza znakov v celostevilo.

Na sliki 10 vidimo dva primera uspesne in dva primera neuspesne pretvo-rbe. Poleg tega vidimo, kako sirok spekter uporabe smo dosegli z uporabo

4.2. PODPROGRAMI ZA PRETVORBO PODATKOVNIH TIPOV 35

indeksnega registra kot kazalca na zacetek oziroma konec pretvorbe. Kadarimamo opravka z daljsimi nizi znakov, ki vsebujejo poleg stevilcnih po-datkov se druge znake, lahko z veckratno uporabo podprograma S2I pos-topoma izluscimo celostevilcne vrednosti, ne da bi pri tem unicili niz znakov.Rutina S2I potrebuje pri pretvorbi v desetiski stevilcni sistem 16-bitnomnozenje s konstantno vrednostjo 10. V predhodnem poglavju smo si zepripravili poseben podprogram MUL10, ki opravi zeljeno mnozenje. Pazljivozasnovan podprogram S2I ne porabi vec kot 695 strojnih ciklov, vstevsiklice podprograma MUL10. S2I shaja s 76-imi pomnilniskimi lokacijami.

S2TMnoge aplikacije bodo potrebovale sistemsko uro realnega casa. Jedro

nasega operacijskega sistema sicer ze vsebuje opravilo TIM, ki poganja stiri8-bitne spremenljivke TIMH, TIMM, TIMS in TIMF, vendar je potrebno obvsakem zagonu uro najprej nastaviti. V ta namen bo uporabnik z nizomASCII znakov preko tipkovnice sistema ali preko terminalske tipkovnicepodal trenuten cas. V nizu pricakujemo dve desetiski stevili, loceni s piko,ki predstavljata ure in minute, na primer ”16.17”. Sicer je dvopicje boljobicajno locilo med urami in minutami, vendar nasa tipkovnica ne premoreustrezne tipke, zato smo se odlocili za piko. Naloga podprograma S2T jepretvoriti oba stevilcna podatka v osembitni dvojiski vrednosti, preveriti,ali lezita v dopustnih intervalih [0..23] oziroma [0..59] ter ustrezno nas-taviti globalni spremenljivki TIMH in TIMM. Ob uspesni nastavitvi dobijotako sekunde TIMS kot tudi 256-inke TIMF vrednost nic! Podobno kot S2Ibo tudi podprogram S2T oznanil svoj uspeh s prenosno zastavico C=0. Tudiindeksni register igra bodobno vlogo: ob klicu rutine kaze na znak v nizu, skaterim naj se pretvorba zacne. Ob povratku pa kaze na prvi nepretvorjeniznak. Pri nacrtovanju podprograma S2T bomo seveda z veseljem upora-bili pravkar napisano rutino S2I. Podobno kot na sliki 10 bomo z dvemazaporednima klicema izluscili ure in minute iz niza znakov. Rutina takozavzema le 50 pomnilniskih lokacij, v casovnem smislu pa je zato tolikobolj zahtevna, saj moramo upostevati tudi dvakrat po 695 ciklov za S2I. Vnajslabsem primeru traja S2T 1493 strojnih ciklov!

I2SHCe zelimo prikazovati stevilcne podatke na zaslonu terminala, nujno

potrebujemo tudi pretvorbo v obratni smeri, t.j. iz 16-bitnih celostevilskihvrednosti v nize ASCII znakov. Rutina I2SH bo pretvorila 16-bitno vred-nosti iz akumulatorja D v sestnajstiski niz ASCII znakov, ki je zakljucen znicelnim bajtom. Na prvem mestu v nizu je predpona $, nato sledijo stirisestnajstiske cifre.

I2SH zlozi znake v zaporedne pomnilniske lokacije, zacensi z naslovom,

36 POGLAVJE 4. KNJIZNICA PODPROGRAMOV

ki je ob klicu v indeksnem registru. Uporabnik rutine mora torej predklicem poskrbeti, da indeksni register kaze na prvo izmed sestih rezerviranihpomnilniskih lokacij.

Seveda bo podprogram I2SH pri svojem delu uporabljal rutino za pret-vorbo 4-bitnih dvojiskih vrednosti v sestnajstiske cifre B2H. Glede na sorod-nost dvojiskega in sestnajstiskega stevilskega sistema je pretvorba enos-tavna in hitra, potrebuje 41 pomnilniskih lokacij in ne vec kot 163 strojnihciklov.

I2SDPovsem drugacne razmere nastopijo v trenutku, ko si zazelimo izpis

vrednosti v desetiskem stevilskem sistemu. Podprogram I2SD se od I2SHrazlikuje navzven le po tem, da izpise maksimalno pet desetiskih cifer brezpredpone. Stevila so desno poravnana v polju petih znakov, kar pomeni,da so po potrebi dodani presledki na levi strani.

Notranjost podprograma I2SD pa se bistveno razlikuje od notranjostiI2SH. Do desetiskih cifer ne moremo priti drugace kot z desetiskim del-jenjem. Na sreco pozna nas procesor 68HC11 dva ukaza za 16 bitnocelostevilsko deljenje (FDIV in IDIV). To nam prihrani veliko truda in pom-nilnika, saj je rutina I2SD z 58 lokacijami le malo vecja od I2SH.

T2SOb koncu tega poglavja bomo nacrtovali se podprogram T2S, ki prebere

trenuten cas ter ga pretvori v niz osmih ASCII znakov. V nizu najdemopo dva znaka za ure, minute in sekunde. Kot obicajno so vrednosti, ki somanjse od deset, dopolnjene z niclo, kot locilo med njimi pa se uporabljadvopicje. Seveda je niz zakljucen z nicelnim bajtom. Ob klicu T2S morauporabnik z indeksnim registrom pokazati na prvi znak pretvorbe.

Pri nacrtovanju kode za T2S se pojavi problem hkratnega dostopa dosistemskih spremenljivk TIMH, TIMM in TIMS. Nastopijo razmere, kakrsnesmo podrobno obravnavali ze v razdelku 2.3, zdravilo za omenjene tezavepa smo tudi ze opisali. Pricakujemo, da bo podprogram T2S casovno zelozahteven, saj bo poleg cakalne rutine SCHSYN kar trikrat poklical pocasnorutino I2SD. V prostorskem smislu pa naj bi T2S shajal z 91-imi pom-nilniskimi lokacijami.

4.3 Vhodno izhodni podprogrami

V tem poglavju bomo obravnavali tri podprograme za delo z nizi ASCIIznakov, ki predstavljajo neposredno nadgradnjo gonilnikov podatkovnihtokov. V nasih sistemih imamo dva taka gonilnika, to sta KBD in SCI.

4.3. VHODNO IZHODNI PODPROGRAMI 37

V poglavju 2.4 smo se odlocili, da bomo vse podatkovne tokove speljalipreko medpomnilnikov. Kasneje smo v okviru poglavja o gonilnikih defini-rali medpomnilnik tipkovnice KBDB-KBDE ter dva medpomnilnika za serijskokomunikacijo z imeni TRAB-TRAE in RECB-RECE. Za vsak medpomnilnik tudize imamo podprogram za delo s posameznimi znaki, to so KBDCHR, TRACHRoziroma RECCHR.

TRASTRZacnimo s preprostim podprogramom TRASTR, cigar naloga je oddajanje

nizov preko serijskega vmesnika. TRASTR je pravzaprav le zanka, ki pobiraznake iz niza in jih preko podprograma TRACHR namesca v medpomnilnikTRAB-TRAE. Zanka zacne z znakom, katerega naslov ji je uporabnik posre-doval v indeksnem registru, ter nadaljuje, dokler ne naleti na nicelni bajt,ki oznacuje konec niza. TRASTR mora po vsakem klicu rutine TRACHR spomocjo nicelne zastavice preveriti, ali ni morda medpomnilnik poln. Ceje temu tako, potem mora prekiniti oddajanje niza in z Z=1 javiti neuspehklicnemu programu.

Podprogram TRASTR smo delno ze zasnovali v okviru primera uporabemedpomnilnikov v izpisu 8. V dokoncni obliki zavzema le 18 pomnilniskihlokacij in potrebuje 32 strojnih ciklov za prazen niz. Vsak znak v nizu terja73 dodatnih ciklov. Poglejmo si primer uporabe v izpisu 11. Na zaslonterminala zelimo izpisati trenuten cas z ustreznim pozdravom. Pred devetozjutraj naj se sporocilo glasi Ura je 08:42:18, dobro jutro!, med de-veto in sesto naj se izpise Ura je 15:11:01, dober dan!, po sesti zvecerpa pricakujemo Ura je 18:53:30, dober vecer!. Programski izsek prekoTRASTR najprej izpise Ura je , nato s T2S pretvori trenuten cas v niz ASCIIznakov. Sledi izbira ustreznega pozdrava in koncno se izpis. Pogramskiizsek na izpisu 11 se zanesljivo konca se pred iztekom 10ms, medtem kobo zadnji znak iz medpomnilnika prispel na zaslon terminala sele cez kakih400ms!

...

ldx #STR0 Load pointer to first string

jsr TRASTR and transmit.

ldx #HEAP Use the Heap

jsr T2S to convert the current time to string.

jsr TRASTR Transmit the current time string.

ldaa TIMH Read hours.

ldx #STR3 Load the good evening string pointer.

cmpa #18 Compare hours with 6pm

bcc WRITE and jump down if after 6pm.

ldx #STR2 Load the good day string pointer.

cmpa #9 Compare hours with 9am

bcc WRITE and jump down if after 9am,

38 POGLAVJE 4. KNJIZNICA PODPROGRAMOV

ldx #STR1 otherwise load the good morning string pointer.

WRITE jsr TRASTR Transmit the second string

ldx #CRLF and terminate

jsr TRASTR with CR and LF.

...

STR0 FCC "Ura je "

FCB $00

STR1 FCC ", dobro jutro!"

FCB $00

STR2 FCC ", dober dan!"

FCB $00

STR3 FCC ", dober vecer!"

FCB $00

CRLF FCB $0C,$0D,$00

Izpis 11: Primer uporabe podprograma TRASTR

RECSTRPodprogram RECSTR je v funkcijskem smislu komplementaren podpro-

gramu TRASTR, saj prenesa znake v obratni smeri, torej iz serijskega vmes-nika v niz na naslovu X. Njegova zgradba pa je neprimerno kompleksnejsa.Opravljati mora namrec se naslednjih sest nalog:

1. Filtriranje sprejetih znakov. Veljavni znaki so le tisti z ASCII ko-dami med $20 in $7E. Znaki izven tega intervala se ignorirajo, razennaslednjih dveh kontrolnih znakov.

2. Brisanje zadnjega znaka. Kontrolna ASCII koda $08 (tipka Backspace),izbrise nazadnje vpisani znak iz niza.

3. Konec niza. Kontrolna ASCII koda $0D (tipka Enter) oznacuje konecniza in hkrati tudi konec podprograma.

4. Dolzina niza. Niz v nobenem trenutku ne sme presegati maksimalnepredpisane dolzine v akumulatorju A. Znaki, ki bi prekoracili dolzinose smatrajo za neveljavne.

5. Odmev sprejetih znakov. Vsak veljaven znak, ki je bil sprejet v niz,se takoj izpise na zaslon terminala. V anglosaski literaturi se je za touveljavil izraz ”echo”.

6. Zvocna kontrola. Vsak neveljaven znak aktivira zvocni signal na ter-minalu. Piskanje terminala se sprozi z oddajo ASCII kode $07.

Na sliki 11 vidimo shemo podatkovnih tokov, kakrsne vzpostavi podpro-gram RECSTR. Znakovni izvor je sprejemni medpomnilnik serijskega vmes-nika. RECSTR s pomocjo podprograma RECCHR pobira znake iz medpomnil-nika tako dolgo, dokler ne naleti na $0D. Po potrebi seveda caka na prispetje

4.3. VHODNO IZHODNI PODPROGRAMI 39

naslednjega znaka. Vsak sprejeti znak obdela v skladu z vsemi sestimikriteriji ter ustrezno ukrepa. Zakljucna kontrolna koda $0D iz vhodnegapodatkovnega toka oznacuje konec niza, vendar sama ni del niza. Slednjije v vsakem primeru zakljucen s standardnim nicelnim bajtom. Pac pa jeodmev zakljucen z $0D, vrh tega doda RECSTR na koncu se kontrolno kodoza skok v novo vrstico $0C.

Ob povratku najdemo v akumulatorju B stevilo prebranih znakov, kije manjse ali kvecjemu enako maksimalnemu stevilu iz akumulatorja A.Podprogram RECSTR naj ne bi zavzemal vec kot 70 pomnilniskih lokacij,njegovo izvajanje pa casovno ni omejeno, saj je odvisno od operaterja naterminalu. Ocitno je torej, da opravila nikakor ne smejo klicati RECSTR.

Slika 11: RECSTR sprejema znake iz medpomnilnika, jih zlaga v niz in hkratitudi oddaja.

KBDSTRV 3. poglavju smo opisali vodno izhodni modul, ki vkljucuje lokalno

tipkovnico in stirimestni LED prikazovalnik. Pravzaprav si lahko ti dveenoti zamislimo kot neke vrste mocno okrnjen terminal. Zgradili bomopodprogram KBDSTR, ki bo imel za lokalni terminal sistema HC11 natankoisto vlogo kot RECSTR za pravi terminal.

KBDSTR sprejme naslov niza v indeksnem registru X, medtem ko je vakumulatorju A maksimalno stevilo znakov. Tako kot RECSTR, tudi KBDSTRtako dolgo prebira znake iz medpomnilnika, dokler ne naleti na $0D. Pravtako opravlja vseh sest funkcij iz predhodnega razdelka. Ob povratku vrnev akumulatorju B dolzino prebranega niza. Slika 12 shematicno prikazujepodatkovne tokove podprograma KBDSTR.

40 POGLAVJE 4. KNJIZNICA PODPROGRAMOV

Slika 12: KBDSTR sprejema znake iz medpomnilnika, jih zlaga v niz in hkratiprikazuje.

Ce primerjamo shemi na slikah 11 in 12, ugotovimo, da se razlikujetale pri odmevu znakov. Izpis na enomestni LED prikazovalnik ne potekapreko medpomnilnika, temvec posredno preko ”videopomnilnika”. Pri temne smemo pozabiti, da LED prikazovalnik ne zmore prikazati vseh ASCIIznakov. Najugodnejse je, ce najprej pretvorimo znak v dvojisko vrednosts pomocjo podprograma H2B. Ce je bila pretvorba uspesna (C=0), potemlahko dvojisko vrednost tudi prikazemo z B2L. V nasprotnem primeru najse LED prikazovalnik ugasne.

Poglavje 5

Aplikativni programi

Povzemimo najprej celoten operacijski sistem. V 2. poglavju smo zgradilijedro operacijskega sistema, v 3. poglavju smo podali sistemske gonilnikein v 4. poglavju zaokrozili operacijski sistem s knjiznico podprogramov. Vtabeli 1 so zbrani vsi podprogrami, vkljucno s komunikacijskimi parametri.V zadnjih dveh stolpcih vidimo tudi stevilo pomnilniskih lokacij, ki jihzasedajo posamezni podprogrami in okvirno stevilo strojnih ciklov, ki sopotrebni za njihovo izvajanje.

Ce sestejemo vse uporabljene pomnilniske lokacije, potem ugotovimo,da nas mini operacijski sistem zaseda le nekaj vec kot 1KB programskegapomnilnika. Za aplikativne programe torej ostane se skoraj 7KB! Se velikoskromnejsi pa je nas mini operacijski sistem pri porabi dinamicnega RAMpomnilnika. Jedro shaja s 7B, medtem ko sistemski gonilniki zasedejo 100bajtov. Od 8KB smo tako porabili le prvih 107 lokacij! Seveda ne smemopozabiti na sklad, ki prav tako sodi v RAM pomnilnik.

Mikroprocesorska druzina M68HC11 zlaga sklad od visjih naslovov protinizjim, torej bomo sklad namestili na dno RAM pomnilnika. V sveturacunal- nistva se je na zalost uveljavil nacin prikazovanja pomnilnika,pri katerem narascajo naslovi od zgoraj navzdol. V matematicnem smisluimamo torej negativno ordinato. Od tod izhaja mnogo protislovij. Zasklad pravimo da narasca, ceprav se dejansko siri proti nizjim naslovom.Ce recemo, da smo namestili sklad na ”dno” RAM pomnilnika, potem topomeni, da smo ga postavili na njegov najvisji naslov $3FFF.

Med skladom, ki ”raste” od spodaj navzgor, in globalnimi spremenljiv-kami, ki ”visijo” od zgoraj navzdol je naceloma se precej prostora. V omen-jen prostor lahko pravzaprav namestimo se viseci sklad, ki se siri navz-dol. Tak nacin dinamicnega zasedanja pomnilnika se anglosaski literaturiobicajno imenuje heap. Na zalost nas procesor premore le en sam skladovnikazalec, torej se bomo morali zadovoljiti s konstantnim kazalcem HEAP. Nas

41

42 POGLAVJE 5. APLIKATIVNI PROGRAMI

Podprogram Vhodni parametri Obsegime vrsta pogl. Izhodni parametri bajti cikliSCHINT prekinitev 2.1 78 80

SCHON rutina 2.1 22 38

SCHSYN rutina 2.3 D 18 ≤ ∞D

TIM opravilo 2.2 45 ≤77TIMH . . . TIMF

KBD opravilo 3.1 91 ≤214KBDB-KBDE

KBDCHR rutina 3.1 KBDB-KBDE 25 ≤51A, Z

LED opravilo 3.2 LED0 . . . LED3 26 ≤58

B2L rutina 3.2 A 30 35A

SCI opravilo 3.3 TRAB-TRAE 63 ≤76RECB-RECE

TRACHR rutina 3.3 A 25 ≤51TRAB-TRAE, Z

RECCHR rutina 3.3 RECB-RECE 25 ≤51A, Z

ADC rutina 3.4 A 18 ≤151ADR1 . . . ADR4

MUL10 rutina 4.1 D 18 ≤52D, C

B2H rutina 4.2 A 11 ≤16A

H2B rutina 4.2 A 22 ≤29A, C

S2I rutina 4.2 X 76 ≤695D, X, C

S2T rutina 4.2 X 55 ≤1493X, C, TIMH . . . TIMF

I2SH rutina 4.2 D, X 40 ≤163[X+0] . . . [X+5]

I2SD rutina 4.2 D, X 58 ≤760[X+0] . . . [X+5]

T2S rutina 4.2 TIMH . . . TIMS, X 88 ≤1205[X+0] . . . [X+8]

TRASTR rutina 4.3 X 18 ≤32 + i*73Z

RECSTR rutina 4.3 RECB-RECE, X, A 70 ≤ ∞B, [X] . . . , TRAB-TRAE

KBDSTR rutina 4.3 KBDB-KBDE, X, A 84 ≤ ∞B, [X] . . . , LED0

Tabela 1: Seznam sistemskih podprogramov

viseci sklad je tako uporaben izkljucno le v glavnem programu! V pred-hodnem poglavju smo v izpisu 11 brez posebne razlage podali zelo znacilenprimer uporabe visecega sklada.

Teoreticno se lahko sklad tako visoko dvigne, da povozi viseci sklad, ali

43

celo poplavi globalne spremenljivke. V takem primeru postanejo seveda vsiprogrami potencialno nestabilni in se zacnejo nekontrolirano obnasati. Vnormalnih okoliscinah sklad ne naraste tako visoko.

Slika 13: Razclenitev pomnilniskega prostora a) RAM in b) programskipomnilnik.

Slika 13 simbolicno prikazuje opisano zasedbo RAM in programskegapomnilnika. Najugodnejse je, ce v pomnilnik zlozimo operacijski sistem vvrstnem redu, v katerem smo ga obravnavali. Pri tem se moramo zavedati,da lahko neposredno vplivamo le na vrstni red strojne kode v programskempomnilniku, medtem ko je razporeditev in inicializacija RAM pomnilnikaze posledica izvajanja programa! Ob vsakem vklopu napajalne napetostiso vse celice RAM pomnilnika v poljubnem, nedefiniranem stanju.

V izpisu 12 vidimo kos zbirniskega programa, ki s pomocjo psevdoin-strukcije RMB namesca globalne spremenljivke v RAM pomnilnik. Pri temzbirnik dejansko le izracuna naslove oznak. Za pravilno delovanje pro-gramov pa so potrebne tudi ustrezne zacetne vrednosti spremenljivk. Potre-bujemo torej inicializacijski podprogram, ki bo ob vsakem zagonu postavil

44 POGLAVJE 5. APLIKATIVNI PROGRAMI

zacetne vrednosti spremenljivk. Imenujmo ga INIT.

ORG _XRAM

************************* KERNEL VARIABLES (7 bytes) ****************

SCHPTR RMB 2 16 bit pointer to current task in SCHTAH.

SCHTST RMB 1 Test task on exceeding time slice.

TIMH RMB 1 Hours (0..23),

TIMM RMB 1 minutes (0..59),

TIMS RMB 1 seconds (0..59),

TIMF RMB 1 and fractions (0..255).

************************* DRIVER VARIABLES (100 bytes) **************

LED0 RMB 1 The four

LED1 RMB 1 digits

LED2 RMB 1 of the

LED3 RMB 1 LED display.

KBDB RMB 3+8 KBD buffer

KBDE RMB 2 with a capacity of 8 characters.

KBDKEY RMB 1 KBD status variable: keypressed?

TRAB RMB 3+64 SCI transmitting buffer

TRAE RMB 2 with a capacity of 64 characters.

RECB RMB 3+8 SCI receiveing buffer

RECE RMB 2 with a capacity of 8 characters.

************************* APPLICATION VARIABLES *********************

*

*

*

************************* VARIABLE HEAP *****************************

HEAP RMB 1

Izpis 12: Primer konfiguracije RAM pomnilnika v zbirniski obliki.

Poglejmo sedaj, v kaksnem vrstnem redu se morajo odvijati stvari obzagonu. Najprej mikroprocesor iz tabele prekinitvenih vektorjev nalozi vse-bino celic $FFFE in $FFFF v programski stevec. Slednji tako vsebuje naslovzacetka programa START. Prva instrukcija mora poskrbeti za pravilno us-meritev skladovnega kazalca, ker sicer ne moremo uporabljati podprogramov.Takoj za tem bomo pognali naso inicializacijsko rutino INIT, ki bo nastavilapravilne zacetne vrednosti vsem globalnim spremenljivkam. Sledi zagonrazvrscevalnika SCHON. Sele v tem trenutku je vse pripravljeno za izvajanjeglavnega programa. V izpisu 13 so opisane razmere prikazane v zbirniskiobliki.

45

************************* KERNEL ************************************

************************* DRIVERS ***********************************

************************* LIBRARY ***********************************

************************* RESET *************************************

_START lds #$3FFF Define stack segment.

jsr INIT Initialize RAM variables.

jsr SCHON Start scheduler.

jsr MAIN Call MAIN -- there should be no return.

HALT bra HALT Dead loop!

************************* INITIALIZE RAM VARIABLES ******************

INIT ldx #$0000 Clear

stx TIMH hours, minutes,

stx TIMS seconds and fractions.

stx LED0 Clear the

stx LED2 4 digit LED display.

ldx #KBDB+2 Clear the

stx KBDB keyboard

stx KBDE buffer.

clr KBDKEY Indicate no key pressed.

ldx #TRAB+2 Clear the

stx TRAB SCI transmitting

stx TRAE buffer.

ldx #RECB+2 Clear the

stx RECB SCI receiveing

stx RECE buffer.

ldaa #$0F Set lower bits of port A

staa _PADIR to output, higher bits to input.

ldaa #$FF Set all bits of port B

staa _PBDIR to output.

ldaa #%00001110 Initialize port A

staa _PAOUT to activate LED0.

clr _PBOUT Clear port B.

ldaa _OPTION Get system options,

oraa #%10000000 set A/D power on

staa _OPTION and store options.

rts Return().

************************* MAIN PROGRAM ******************************

MAIN ...

Izpis 13: Primer zagonskih nastavitev programskega pomnilnika vzbirniski obliki.

46 POGLAVJE 5. APLIKATIVNI PROGRAMI

Kot vidimo, je glavni program zasnovan kot podprogram brez povratka.To je na prvi pogled nelogicno, vendar zelo koristno v primeru napak.Glavni program mora biti vedno sestavljen iz nekega sistema zank. Ce papomotoma le pride do rts instrukcije, potem imamo se zadnjo varovalnozanko HALT, ki procesor obdrzi v kontroliranem stanju.

Razporeditev podprogramov v pomnilniku je naceloma poljubna, ven-dar je priporocljivo drzati se nekega sistema. Struktura zbirniske kode vizpisu 13 se ujema s simbolicno pomnilnisko razdelitvijo s slike 13.

5.1 Poskusna aplikacija

Cas je, da preizkusimo delovanje in uporabnost nasega operacijskega sis-tema. Zastavili si bomo razmeroma zahtevno aplikacijo in sicer tako vcasnovnem kot v funkcijskem smislu. Mikroprocesorski sistem naj opravljanaslednje naloge:

• Prikazuje na LED prikazovalniku tekoci cas v obliki mm.ss (dve mestiza minute, pika in dve mesti za sekunde). Pri tem naj pika medsekundami in minutami utripa v sekundnem taktu.

• Hkrati naj sistem registrira vse pritiske na polju 16ih tipk in sprejeteznake poslje preko SCI vmesnika na terminal osebnega racunalnika.

• Hkrati naj deluje tudi tipkovnica na osebnem racunalniku. Pritiskinaj se prav tako prikazujejo v terminalskem oknu.

• Kadar sistem zazna ASCII znak ”D”, naj v terminalsko okno namestoznaka izpise trenutni cas v obliki hh.mm.ss, nato pa analogne vred-nosti na A/D vhodih AN0 do AN3.

V urniku bomo potrebovali opravilo TIM za uro realnega casa. Polegtega bomo uporabljali LED prikazovalnik, ki potrebuje osvezevanje, torejopravilo LED. V urniku rabimo seveda tudi gonilnik za polje tipk KBD in ser-ijsko komunikacijo s terminalskim oknom SCI. Urnik opravil bo zapolnjentako kot ga prikazuje izpis 2.

Nas glavni program bo naceloma samo usmerjal podatkovne tokove medposameznimi gonilniki. Zasnovan mora biti kot neskoncen zancni sistem, kipobira podatke iz medpomnilnikov, jih ustrezno predeluje in jih vpisuje vizhodne medpomnilnike. Seveda bomo pri tem z veseljem uporabljali pod-programe iz nase knjiznice. Znake iz polja tipk bomo brali s KBDCHR, tistes tipkovnice z RECCHR. V terminalsko okno bomo posamezne znake posiljali

5.1. POSKUSNA APLIKACIJA 47

s TRACHR, nize znakov pa s TRASTR. Pri oblikovanju nizov v pomnilniku sibomo pomagali s T2S in I2SD. Pri uporabi LED prikazovalnika bosta ko-ristni rutini H2B in B2L. Na sliki 14 vidimo diagram poteka za nas glavniprogram.

Slika 14: Diagram poteka za glavni program poskusne aplikacije.

Ogromno vecino casa se bo glavni program brez posebnega ucinka vrtelv centralni zanki, ki je na sliki 14 oznacena s polnimi crtami. Vsako polnosekundo se bo izpisal nov niz na LED prikazovalnik in ob vsaki polovicisekunde bo ugasnil pikico med minutami in sekundami (leva stran glavnezanke). Desna stran na sliki 14 se aktivira samo, kadar uporabnik pritisnetipko na polju 16 tipk ali na tipkovnici osebnega racunalnika. Takrat seznak izpise v terminalsko okno, razen v primeru ko prebrani znak ”D”

48 POGLAVJE 5. APLIKATIVNI PROGRAMI

zahteva izpis trenutnega casa in stanja A/D pretvornika. Poglejmo sedajvse skupaj se v obliki zbirniske kode.

************************* MAIN PROGRAM ******************************

MAIN ldx #HEAP Point with X to free memory and

jsr T2S and initially convert the time.

LOOP jsr KBDCHR Check keypad

bne GOTKEY and jump down if keypressed.

jsr RECCHR Check terminal keyboard

bne GOTKEY and jump down if keypressed.

ldaa TIMF Load fractions,

beq DISTIM jump down if new second,

cmpa #127 test for half seconds

beq DELDOT and jump down to clear dot.

bra LOOP Loop back.

GOTKEY cmpa #65 If received char is "D"

beq DISADC jump down to A/D cponverstion

jsr TRACHR transmit char otherwise.

bra LOOP Loop back.

DISADC jsr TRASTR Display time string from HEAP.

clra Select lower 4 A/D input lines

jsr ADC and trigger A/D conversion.

ldab _ADR1 Load frist result register to lower D

jsr I2SD convert the 16 binary to a deci string

jsr TRASTR and display it in the terminal window.

ldab _ADR2 Repeat

jsr I2SD this

jsr TRASTR procedure

ldab _ADR3 for

jsr I2SD allt current time to HEAP string. hh.mm.ss

ldaa 7,X Get lower digit of seconds,

jsr H2B convert it to binary,

jsr B2L convert binary to 7-segment

staa LED0 and display it on LED0.

ldaa 6,X Get higher digit of seconds,

jsr H2B con

jsr TRASTR four

ldab _ADR4 A/D

jsr I2SD result

jsr TRASTR registers

ldaa #$0D ...

jsr TRACHR ...

ldaa #$0A ...

jsr TRACHR ...

bra LOOP Loop back.

DISTIM jsr T2S Conververt it to binary,

jsr B2L convert binary to 7-s4egment

5.1. POSKUSNA APLIKACIJA 49

staa LED1 and display it on LED1.

ldaa 4,X Get lowerdigit of minutes,

jsr H2B convert it to binary,

jsr B2L convert binary to 7-segment,

oraa #%10000000 turn on the dot point

staa LED2 and display it on LED2.

ldaa 3,X Get higher digit of minutes,

jsr H2B convert it to binary,

jsr B2L convert binary to 7-segment

staa LED3 and display it on LED3

jmp LOOP Loop back.

DELDOT ldaa LED2 Load LED2

anda #%01111111 delete dot point bit

staa LED2 and redisplay LED2.

jmp LOOP Loop back.

Izpis 14: Zbirniska koda glavnega programa.

Ocitno smo nas operacijski sistem zelo spretno zasnovali, saj smo zlahkarealizirali zastavljen problem. Morda se niti ne zavedamo, kako elegantnosmo stvari izpeljali. Povzemimo torej na kratko dogajanje v nasem sistemu.Procesor izvaja 5 casovno odvisnih, navidezno vzporednih procesov:• Procesor vodi uro realnega casa in sicer z locljivostjo 255-tinke sekunde.

• V enakomernih intervalih osvezuje 4 mestni LED prikazovalnik.

• Preletava polje 16 tipk, registrira pritiske in jih pretvarja v ASCIIznake.

• Hkrati pregleduje SCI vmesnik ter prestreze vse prihajajoce znake injih zlozi v medpominlnik.

• Kadar je SCI linija prosta, posilja znake iz medpomnilnika na zaslon.

Vse to se dogaja neodvisno od glavnega programa. Zanimivo je, da pro-cesor pri tem sploh ni zelo obremenjen, v izpisu 2 vidimo, da je v urnikuprostora za se 6 dodatnih opravil. Opravila tudi v casovnem smislu niso za-htevna saj povprecno porabijo manj kot desetino dodeljene casovne rezine.Glavni program tece torej skoraj neovirano. Tudi zanka glavnega programabi lahko bila do 1000 krat pocasnejsa, ne da bi podatkovni tokovi zastajali.

Vidimo, da je nas sicer razmeroma preprost mikrokrmilnik lahko izrednoucinkovit in zmogljiv, ce smo le dobro zastavili programsko opremo. Doko-pali smo se do zelo pomembnega zakljucka - z dobro programsko opremo jemogoce delati cudeze tudi na zastarelih sistemih. Se pomembneje pa veljav obratni smeri - slabo programsko opremo je vedno mogoce degraditatitudi najzmogljivesi mikroprocesorski sistem!

50 POGLAVJE 5. APLIKATIVNI PROGRAMI

5.2 Seminarski projekti

Kot smo uvodoma ze omenili, se na tem mestu zacenja samostojno delostudentov na razlicnih projektih, zato se pricujoca navodila za prakticnelaboratorijske vaje koncujejo. V okviru domace strani predmetov najdemona naslovu http://www.fe.uni-lj.si/~tuma/seminarske/seminarske.html ob-sezno zbirko uspesno opravljenih seminarskih nalog, ki sluzijo kot zgled inpomoc pri nadaljnem delu.

Poglavje 6

Dodatek - razvojno okolje zaMC68HC11

Dodatek je nastal v obliki magistrske naloge, ki jo je izdelal Andrej Nuss-dorfer pod mentorstvom prof. dr. Franca Bratkovica na Fakulteti za elek-trotehniko Univerze v Ljubljani.

6.1 Uvod

Cilj te magistrske naloge je bila izdelava mikrokrmilniskega razvojnega sis-tema, osnovanega na mikrokrmilniku Motorola MC68HC11A1. Ta obsegatako strojno opremo (mikrokrmilnisko razvojno enoto HC11PSD), kot tudiprogramsko opremo (integrirano razvojno okolje JADE).

Zelo dobra stran mikrokrmilniske razvojne enote je univerzalnost, zatoomogoca uporabniku v kombinaciji z razvojnim okoljem izdelavo raznovrst-nih mikrokrmilniskih aplikacij. Poleg samega razvoja aplikacij ta enota nuditudi moznost preizkusanja programske opreme v zivo, saj se jo lahko brezkakrsnekoli spremembe uporabi kot prototipni sistem.

Mikrokrmilniska enota je sestavljena iz sledecega:• mikrokrmilnik Motorola MC68HC11A1• programabilna sistemska enota PSD834F2, ki vsebuje:

– 8kBajtov BIOS programskega pomnilnika– 8kBajtov Uporabniskega programskega FLASH pomnilnika– 8kBajtov Uporabniskega podatkovnega RAM pomnilnika– dva 8-bitna vhodno/izhodna vmesnika

• prikljucek RS-232 s pretvornikom nivojev• napetostni regulator• reset vezje

51

52 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

• LED prikazovalnik napajalne napetosti• RESET tipka• MODE tipka• napajalni prikljucek• razsiritveni prikljucek• vhodni/izhodni prikljucek

Razvojna enota je, kot ze receno, zgrajena na osnovi mikrokrmilnikaMC68HC11A1. Prednost tega mikrokrmilnika je velika kolicina vgrajenihenot, kar poenostavi vezje same enote. Z uporabo programabilnega sis-temskega vezja PSD834F2, pa je ze tako enostano vezje se bolj oklesceno.Kljub vsem v mikrokrmilniku vgrajenim enotam pa je razvojni sistem nacrtovan tudi s pogledom na odprtost in razsirljivost. To seveda le se povecakoncno uporabnost tega sistema.

Se tako izpopolnjena mikrokrmilniska enota je brez ustrezne programskeopreme le neuporaben kup plastike. Prav programska oprema enoto ozivi.Za zivljenje same mikrokrmilniske enote skrbi BIOS (Basic Input OutputSystem). Ta je majhen strojni program, ki omogoca osebnemu racunalnikunadzor nad mikrokrmilnisko enoto. Podajanje podatkov poteka preko RS-232 zaporednega vmesnika in omogoca tako nalaganje uporabniskega pro-grama kot tudi iskanje in odpravljanje napak v programu samem.

Mikrokrmilniski sistem ima sledece znacilnosti:• Mikrokrmilnik Motorola MC68HC11A1FN v razsirjenem nacinu de-

lovanja:– 8-bitni CPE z razsirjenim M6800/M6801 naborom ukazov– 256 Bajtov vgrajenega RAM pomnilnika– 512 Bajtov vgrajenega EEPROM pomnilnika– 12 vhodno/izhodnih linij z dodatnimi funkcijami– 8-kanalni 8-bitni analogno/digitalni pretvornik– 16-bitni casovnik (Timer) s posebnimi funkcijami– sinhroni zaporedni vmesnik (SPI)– asinhroni zaporedni vmesnik (SCI)– prekinitve

• Programabilna sistemska enota PSD834F2, ki vsebuje:– 8kBajtov BIOS programskega pomnilnika– 8kBajtov Uporabniskega programskega FLASH pomnilnika– 8kBajtov Uporabniskega podatkovnega RAM pomnilnika– Dva 8-bitna vhodno/izhodna vmesnika

• BIOS, ki omogoca:– nalaganje uporabniskih programov

6.1. UVOD 53

– poganjanje in koraco izvajanje uporabniskih programov– bralno / pisalni dostop do celotnega pomnilniskega prostora– prenos podatkov preko zaporednega RS-232 vmesnika

Kljub vsemu, kar BIOS nudi, je le vmesnik med nadzornim osebnimracunalnikom in mikrokrmilnisko razvojno enoto. Za razvijanje mikrokr-milniske programske opreme je potreben se krmilnin program na osebnemracunalniku. To je programski paket JADE.

Ta ima vgrajene vse funkcije za razvoj uporabniske programske opreme,vse to pa je zavito v uporabniku prijazno graficno okolje in deluje v vsehWindows operacijskih sistemih (95/98, Me, 2000, XP).

Razvojno okolje nudi moznost pisanja, prevajanje in nalaganja uporabniskih programov na mikrokrmilnisko razvojno enoto. Tako nalozen pro-gram je nato na voljo uporabniku za preizkusanje in iskanje napak, pricemer so mu na voljo razlicnba orodja - koracno izvajanje programa, opa-zovalnice (Watches), ustavitvene tocke (Breakpoints), dostop do celotnegapomnilnis kega prostora mikrokrmilnika in njegovih vgrajenih registrov.Vse to z namenom cimbolj olajsati odpravljanje napak v uporabniski pro-gramski opremi.

Razvojno okolje se odlikuje s sledecimi znacilnostimi:• urejevalnik teksta• prevajalnik (assembler)• povratni prevajalnik (disassembler)• nalaganje programov na razvojno mikrokrmilnisko enoto• poganjanje programov• korakanje skozi programe• ustavitvene tocke (Breakpoints)• opazovalnice (Watches)• zbirka simbolov• dostop do vsebine vseh registrov• dostop do celotnega pomnilniskega prostora• poznavanje osvnovih stevilskih sistemov (dvojiski, osmiski, desetiski,

sestnajstiski)• vgrajen zaporedni terminal• vgrajena pomoc

Predstavljena mikrokrmilniska razvojna enota skupaj z integriranimrazvojnim okoljem predstavljata zmogljivo orodje za razvoj mikrokrmilniskihaplikacij. Z lastnostimi, ki jih nudi se mocno priblizuje k profesionalnimrazvojnim orodjem, od katerih pa ga loci cena, ki je v primerjavi z profe-sionalnimi orodji zelo nizka.

54 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

To razvojno orodje je koncno namenjeno predvsem za pedagosko delo,saj je obvladanje uporabniku prijaznega graficnega vmesnika lahka nalogase tako neizkusenega zacetnika, nizka cena mikrokrmilniske enote pa naredita sistem dosegljiv sirokemu krogu studentov in drugih navdusencev.

6.2. MIKROKRMILNISKA ENOTA 55

6.2 Mikrokrmilniska enota

Srce razvojnega sistema je mikrokrmilniska razvojna enota. V tem odsekubo podrobno predstavljena strojna oprema razvojnega sistema, hkrati pabo razlozen tudi nacin prikljucitve dodatnih naprav.

6.2.1 Notranjost razvojne enote - obdukcija

Mikrokrmilniska enota je zgrajena na osnovi mikrokrmilnika MC68HC11A1.Ker ta nima vgrajenega programskega pomnilnika mu to moramo dodativ obliki dodatnih zunanjih elementov. Obicajen pristop k temu prob-lemu je uporaba RAM in ROM pomnilniskih elementov in dodatnega vezjaza razclenjevanje naslovnega prostora. Veliko bolj eleganten pristop, kida kompaktno vezje z majhnim stevilom elementov, je uporaba integri-ranega elementa, ki zdruzuje pomnilniske elemente in vsa dodatna vezjapotrebna za delovanje. Taka vezja obstajajo, v mikrokrmilniskem sistemu jeuporabljeno vezje PSD834F2 (PSD pomeni Programmable System Device- programabilna sistemska enota). Blocni prikaz mikrokrmilniske enote jeprikazan na sliki 15.

� � � � � � � � � � � �

� �

� � � � � � � �� �

� �� �

� �� � �

� � � � � � � � � !

� " � � � � � �# # � $ !

0&��+&��$�

� $ � % �

% & � �� � � � � &

' ( ) * + , - - ( . ( ) / 0 1 2

� � 3 4 � � 5� � 6 4 � � 7� � 7 4 � � 6

� � 5 4 8 � 9 4 8 � 6� � : 4 8 � : 4 8 � 6� � 9 4 8 � 5 4 8 � 6� � ; 4 8 � 7 4 8 � 6

� � < 4 � � � 4 8 � 6

= >� � � ? � � � � �

� @ 3 4 � A 3� @ 6 4 � A 6� @ 7 4 � A 7� @ 5 4 � A 5� @ : 4 � A :� @ 9 4 � A 9� @ ; 4 � A ;� @ < 4 � A <

B �� C 7 4 D � � 8� C 5 4 D 8 � �

� C : 4 � � E� C 9 4 � �

B � �F � C� � C� B G � H �

� I J I K � � � L� � L

� = $ � � � �

M N � O K I J P Q R J S� � 8 �

M N � O K I J P Q R J S� T U V T R W W I W U T O

M N � O K I J � � DC R K R W I W U T O

36'���)�

D U X I Y Z F � [ � U T K

� U T K �\ M ] ^ K _

� U T K �\ M ] ^ K _

� X X T I J J ] ` J \ � M Z � 6 9 _C R K R 4 � X X T I J J ] ` J

\ C 3 Z C < a � 3 Z � < _

@� 4 b

� �� � \ c ; 3 3 3 Z c < P P P _

Slika 15: Blocni prikaz mikrokrmilniske enote

Dva crtkasta okvirja objemata glavna sklopa, to sta mikrokrmilnik inPSD vezje. Ceprav sta ti dve vezji srce mikrokrmimlniske enote, jo sestavljavec elementov. Razpored le-teh in velikost enote je razvidna na sliki 16, kije podana v naravni velikosti. Slika 17 prikazuje podrobno shemo enote.

56 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

Elementi na mikrokrmilniski enoti so:• U1 - MC68HC11A1FN mikrokrmilnik (PLCC-52)• U2 - PSD834F2 programabilna sistemska enota (PLCC-52)• U3, U4 - MC34064 RESET vezji (TO-226AA)• U5 - MAX232 RS-232 pretvornik nivojev (DIL-14)• U6 - LM7805 napetostni regulator (TO-220)• 4.9152MHz kvarcni kristal• LED prikazovalnik• Razni upori in kondenzatorji• RESET tipka• MODE tipka• Razni prikljucki:

– Napajalni prikljucek– Serijski prikljucek (DB-9M)– J-TAG prikljucek– Razsiritveni prikljucek (IDC-40)– Vhodni/izhodni prikljucek (IDC-50)

820E

7805

GN

DTM

STC

KTS

TTE

RTD

ITD

OV

cc

POWER

MODERESET

68HC11

10k

10k

10k

++

PSD834

Comm

+ ++

MAX-232

+

+

Expansion port

+

V+

GND

Unregulated

4k7

4k7

1k

10M

4k7 1k

1k

1N4001

10k

J-TAG1uF

1uF

1uF

1uF

47uF 47uF

1uF

1uF

4.9152MHz

18pF 18pF

1uF

Power LED

I/O port

MC34064

MC34064

Slika 16: Razporeditev elementov na mikrokrmilniski enoti

6.2. MIKROKRMILNISKA ENOTA 57

MODA/LIR3

PA3/OC5/OC1 31

PA7/PAI/OC127

PC

0/A

D0

9

PC

1/A

D1

10

PC

2/A

D2

11

PC

3/A

D3

12

PC

4/A

D4

13

PC

5/A

D5

14

PC

6/A

D6

15

PC

7/A

D7

16

PD

0/R

XD

20

PD1/TXD21

PD2/MISO22

PD3/MOSI 23

PD4/SCK 24

PD5/SS 25

RS

T17

STRA/AS4

VSS1

IRQ

19

EXTAL7

MODB/VSTBY2

PA

0/IC

334

PA1/C233

PA2/C1 32

PE

0/A

N0

43

PE

1/A

N1

45

PE2/AN247

PE3/AN349

PE

4/A

N4

44

PE

5/A

N5

46

PE6/AN648

PE7/AN750

VRH52

VRL51

XIR

Q/V

PP

18

E5

PA4/OC4/OC1 30PA5/OC3/OC1

29PA6/OC2/OC128

PB

0/A

842

PB

1/A

941

PB

2/A

1040

PB

3/A

1139

PB

4/A

1238

PB

5/A

1337

PB

6/A

1436

PB

7/A

1535

STRB/R/W6

XT

AL

8

VDD26

U1

68H

C11

GND1

PB52

PB43

PB34

PB25

PB16

PB07

CNTL047

/RESET48

CNTL249

CNTL150

PB751

PB652

PD

28

PD

19

PD

010

PC

711

PC

612

PC

513

PC

414

Vcc

15

GN

D16

PC

317

PC

2/V

ST

BY

18

PC

119

PC

020

PA7 21PA6

22PA523PA424PA325

GND 26PA2 27PA1 28PA0

29AD030AD131

AD2 32AD3 33

AD

434

AD

535

AD

636

AD

737

VC

C38

AD

839

AD

940

AD

1041

AD

1142

AD

1243

AD

1344

AD

1445

AD

1546

U2

PS

D83

4

AD

0A

D1

AD

2A

D3

AD

4A

D5

AD

6A

D7

A8

A9

A10

A11

A12

A13

A14

A15

A8

A9

A10

A11

A12

A13

A14

A15

AD0AD1AD2AD3

AD

4A

D5

AD

6A

D7

PE

0

PE

1

PE2

PE3

PE

4

PE

5

PE6

PE7

PE0PE1PE2PE3PE4PE5PE6PE7

PA0

PA1PA2PA3PA4PA5PA6PA7

GN

D

GN

D

GN

D

GN

D

VC

C

VC

CV

CC

11

22

33

44

55

66

77

88

J4

J-T

AG

por

t

VC

C

GN

D

TD

OT

DI

TE

RR

TS

TA

TT

CK

TM

S

R1

1kR

24k

7

C1

1u

GN

D

VC

C

R3

4k7

X1

4.91

52M

Hz

R4

10M

C2

18p

C3

18p

GN

DG

ND

GND 1

Vin

2/R

ES

3U

3M

C34

064

GND 1

Vin

2/R

ES

3U

4M

C34

064

GN

D

GN

D

VC

C

R6

330E

C4

1u

GN

D

T1

Res

et

R5

1k

GN

D

Vcc

16

C2+

4

C2-

5

R1I

N13

T1O

UT

14

GN

D15

T2O

UT

7

R2I

N8

C1+

1V

+2

C1-

3

V-

6R

2OU

T9

T2I

N10

T1I

N11

R1O

UT

12

U5

MA

X-2

32

C5

1u

C6

1uC

71u

C8

1u

C9

1u

GN

D GN

D

VC

C

1 6 2 7 3 8 4 9 5

J6 Com

m

RX

D

TX

DC

TS

RT

S

GN

D

GN

D

123456789

RP

110

k

GN

DAD0AD1AD2AD3AD4AD5AD6AD7

11

22

33

44

55

66

77

88

99

1010

1111

1212

1313

1414

1515

1616

1717

1818

1919

2020

2121

2222

2323

2424

2525

2626

2727

2828

2929

3030

3131

3232

3333

3434

3535

3636

3737

3838

3939

4040

J1E

xpan

sion

por

t

VC

CG

ND

AD0AD1AD2AD3AD4AD5AD6AD7

A8A9A10A11A12A13A14A15

R//WE

/IRQ/RESET

IN1

GND2

OU

T3

4

U6

7805

C10

47u

C11

47u

GN

D

VC

C

11

22

J5 PO

WE

R

R7

820E

DL

1L

ED

GN

D

PSA0PSA1PSA2

PSA3PSA4PSA5PSA6PSA7PSB0

PSB1PSB2PSB3PSB4PSB5

PSB6PSB7

PD2PD3PD4PD5

GN

DV

CC

PA0PA1PA2PA3PA4PA5PA6PA7PD2PD3PD4PD5

123456789

RP

210

k

VC

C

PA0PA1PA2PA3PA4PA5PA6PA7

123456789

RP

310

k

VC

C

PD2PD3PD4PD5

/RS

T/X

IRQ

/IR

Q

/IRQ/XIRQ

/RST

GN

D

D1

1N40

01

R8

10k

VC

C

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950

J2I/

O p

ort

PSA0PSA1PSA2PSA3PSA4PSA5PSA6PSA7

PSB0PSB1PSB2PSB3PSB4PSB5PSB6PSB7

AS

R9

4k7

GN

D

VC

C

1

J3 Unr

egul

ated

GN

D

/CS3

/CS

3

T2

Mod

e

Slika 17: Celotna shema mikrokrmilniske enote

58 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

6.2.2 Mikrokrmilnik MC68HC11A1

MC68HC11A1 je zelo uporaben mikrokrmilnik, ki zdruzuje zmogljivo pro-cesorsko jedro in raznovrstne dodatne enote.

Glavne znacilnosti mikrokrmilnika so:• 8-bit CPU z izpopolnjenim MC6800/6801 naborom ukazov

– dva 8-bitna akumulatorja, AccA in AccB, ki skupaj tvorita 16-bitni akumulator AccD

– dva 16-bitna indeksna registra, IX in IY– 16-bitni skladovni kazalec, SP– 16-bitni programski stevec, PC– 8-bitni register stanja, CCR– 6 razlicnih nacinov naslavljanja: takojsnje, direktno, razsirjeno,

indeksno, registrsko in relativno• 256 bajtov internega RAM pomnilnika• 512 bajtov internega EEPROM pomnilnika• 64kBajtov naslovnega prostora• 8 I/O linij z dodatnimi funkcijami povezanimi z casovnikom - PA0 ÷

PA7• 4 I/O linij z dodatnimi funkcijami povezanimi z SPI vmesnikom -

PD2 ÷ PD5• 8 vhodnih linij z dodatnimi funkcijami povezanimi z AD pretvornikom

- PE0 ÷ PE7• 16-bitni casovnik s posebnimi funkcijami:

– 4 stopenjski programabilni delilec– 3 16-bitnih registrov za zajemanje vhodov (input capture)– 5 16-bitnih registrov za postavljanje izhodov (output compare)– 8-bitni stevec impulzov

• sinhron zaporedni vmesnik SPI• asinhron zaporedni vmesnik SCI• prekinitveni sistem• kuzapazi casomer za nadzor delovanja mikrokrmilnika

Vse mikrokrmilnikove vgrajene enote so dosegljive preko bloka 64 reg-istrov. Ta blok registrov je skupaj z internim pomnilnikom preslikan vpomnilniski prostor na sledec nacin:

Naslovi Velikost(bajti) Vloga$0000 ÷ $00FF 256 Interni RAM pomnilnik$1000 ÷ $103F 64 Interni mikrokrmilnikovi regisri$B600 ÷ $B7FF 8192 Interni EEPROM pomnilnik

6.2. MIKROKRMILNISKA ENOTA 59

Mikrokrmilnik MC68HC11A1 deluje v razsirjenem nacinu. V tem nacinuje na prikljuckih mikrokrmilnikovih vrat B prisotna zgornja polovica naslov-nih linij (A8 ÷ A15), medtem ko se na vratih C izmenoma pojavljajospodnje naslovne (A0 ÷ A7) in podatkovne linije (D0 ÷ D7). Vkljucitevmikrokrmilnika v sistem je prikazana na sliki 18

MO

DA

/LIR

3

PA3/

OC

5/O

C1

31

PA7/

PAI/O

C1

27

PC0/AD09

PC1/AD110

PC2/AD211

PC3/AD312

PC4/AD413

PC5/AD514

PC6/AD615

PC7/AD716

PD0/RXD20

PD1/

TXD

21

PD2/

MISO

22

PD3/

MO

SI23

PD4/

SCK

24

PD5/

SS25

RST17

STRA

/AS

4

VSS

1

IRQ19

EXTA

L7

MO

DB/

VST

BY2

PA0/IC334

PA1/

C2

33PA

2/C

132

PE0/AN043

PE1/AN145

PE2/

AN

247

PE3/

AN

349

PE4/AN444

PE5/AN546

PE6/

AN

648

PE7/

AN

750

VRH

52

VRL

51

XIRQ/VPP18

E5

PA4/

OC

4/O

C1

30PA

5/O

C3/

OC

129

PA6/

OC

2/O

C1

28

PB0/A842

PB1/A941

PB2/A1040

PB3/A1139

PB4/A1238

PB5/A1337

PB6/A1436

PB7/A1535

STRB

/R/W

6

XTAL8

VD

D26

U1

68HC11

AD0AD1AD2AD3AD4AD5AD6AD7

A8A9A10A11A12A13A14A15

PE0

PE1

PE2

PE3

PE4

PE5

PE6

PE7

PA0

PA1

PA2

PA3

PA4

PA5

PA6

PA7

GND

VCC

R1 1k

R2 4k7

C11u

GND

R3 4k7

X1

4.9152MHz

R410M

C218p

C318pGND

GND1 2 3 4 5 6 7 8 9

RP1 10k

GND

AD

0A

D1

AD

2A

D3

AD

4A

D5

AD

6A

D7

PD2

PD3

PD4

PD5

1 2 3 4 5 6 7 8 9

RP2 10k

VCC

PA0

PA1

PA2

PA3

PA4

PA5

PA6

PA7

1 2 3 4 5 6 7 8 9

RP3 10k

VCC

PD2

PD3

PD4

PD5

/RST/XIRQ

/IRQ

/IRQ

/XIR

Q

GND

R810k

VCC

/XIRQ/IRQRXDTXD

/RESET

Higher address bus

I/O bus

Data / Address bus

GND

Vcc

R//WE

AS

Slika 18: Vkljucitev mikrokrmilnika v sistem

Mikrokrmilnik je prisiljen v razsirjen nacin delovanja s prikljucitvijologicnega nivoja ’1’ na mikrokrmilnikove prikljucke MODA in MODB.Ker si nizje naslovne linije delijo prikljucke s podatkovnimi linijami jihje potrebno lociti. Vrednost spodnjih naslovnih linij izluscimo s pomocjozapaha krmiljenega z AS (Address Strobe) signalom. Smer pretoka po-datkov doloca signal R/W (Read/Write), tocen trenutek samega prenosapa signal E (izhodna sistemska ura). Ta zadnji signal tvori mikrokrmilniksam tako, da frekvenco kvarcnega oscilatorja deli z 4. Pri kvarcnem kristalu

60 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

4,9152MHz je frekvenca E signala 1,2288MHz. Ena perioda E signala jehkrati en strojni cikel mikrokrmilnika.

Dvosmerni prikljucek RST sluzi dvem funkcijam. Najpogosteje je vvlogi vhoda (aktiven nizki nivo) za inicializacijo mikrokrmilnika v znanozacetno stanje (RESET), lahko je pa tudi izhod (open-drain), ki z nizkimstanjem opozori na napako v delovanju mikrokrmilnika.

Vhodno/izhodne linije PA0 ÷ PA7 in PD2 ÷ PD5 z upori na napajanjeter vhodne linije PE0 ÷ PE7 so zvezane na Vhodno/izhodni prikljucek.V RH in V RL sta referencni napetosti za A/D pretvornik, IRQ je zahtevaz prekinitev in XIRQ je zahteva za nemaskirano prekinitev.

Tako veliko stevilo podatkovnih in krmilnih signalov je mikrokrmil-niku potrebno, da se udobno namesti v mikrokrmilniski sistem in da lahkonadzira razne procese v fizicnem svetu - kar je tudi naloga vecine mikrokr-milniskih sistemov.

6.2. MIKROKRMILNISKA ENOTA 61

6.2.3 Programabilna sistemska enota

Najpomembnejse bogastvo mikrokrmilnika je pomnilnik. Ta je njegov ziv-ljenski prostor. Mikrokrmilnik MC68HC11A1 nima vgrajenega program-skega pomnilnika, vsebuje le 256bajtov podatkovnega in 512bajtov EEP-ROM pomnilnika. Da mikrokrmilnik sploh lahko zazivi nujno potrebujezunanji programski pomnilnik.

Mikrokrmilniski sistem potrebuje 3 locene pomnilniske bloke:

• podatkovni pomnilnik• programski pomnilnik• pomnilnik z BIOSom

Na sliki 19 je prikazana poenostavljena shema pomnilnika.

� �� � � � � �� � � ��� ���

� � � � �

�� ��� � � � � �� � � � �

�� ��� � � � �

� �� � ��� �� � ��� �

� � � �� � � �� � � �� � �� � � �

�� �� � � �

�� � � ! "#$

%&#'()*$+' (

�� �� � � �

� �� � � �

Slika 19: Mikrokrmilnikov pomnilnik

Vsak pomnilniski blok sluzi dolocenemu namenu. Najocitnejsi je pro-gramski pomnilnik. V njem se nahaja uporabnikov program. Podatkovnipomnilnik hrani vse podatke, ki jih program rabi za delovanje (spremenljivke,sklad in druge podatkovne strukture). Ta dva bloka sta na voljo uporab-niku. Tretji blok pa je za uporabnika nedosegljiv, saj hrani BIOS BasicInput Output System. To je program, ki skrbi da mikrokrmilniska enotadeluje skladno z uporabniskim vmesnikom, in omogoca tako nalaganje pro-grama v programski pomnilnik kot tudi koracno izvajanje le-tega.

Kompaktnost mikrokrmilniske enote je bila ena izmed zelja pri nacr-tovanju sistema. Klasicni pristop z uporabo locenih programskih in po-datkovnih pomnilniskih vezij ter dekodirne logike ustvari razmeroma velikovezje s stevilnimi elementi. Zmanjsanje vezja lahko dosezemo z uporabokompleksnejsih integriranih vezij, ki vsebujejo vec razlicnih blokov (pom-nilnik in dekodirna logika). V sistemu je uporabljeno vezje PSD834F2. Toje visoko integrirano vezje, posebej nacrtovano za cimenostavnejsi prik-

62 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

lop na mikrokrmilnike. Poleg dveh blokov programskega in bloka po-datkovnega pomnilnika, vsebuje se celotno vezje za priklop na mikrokr-milnik MC68HC1A1 ter dodatne vhodno/izhodne prikljucke. Na sliki 20 jeprikaza shema PSD8xx druzine elementov, katere pripadnik je PSD834F2.

PROG.MCU BUS

INTRF.

ADIOPORT

CNTL0,CNTL1,CNTL2

AD0 – AD15

CLKIN

CLKIN

CLKIN

PLDINPUTBUS

PROG.PORT

PORTA

PROG.PORT

PORTB

POWERMANGMT

UNIT

1 OR 2 MBIT MAIN FLASHMEMORY

8 SECTORS

VSTDBY

PA0 – PA7

PB0 – PB7

PROG.PORT

PORTC

PROG.PORT

PORTD

PC0 – PC7

PD0 – PD2

ADDRESS/DATA/CONTROL BUS

PORT A ,B & C

3 EXT CS TO PORT D

24 INPUT MICRO⇔CELLS

PORT A ,B & C

73

73

256 KBIT SECONDARYFLASH MEMORY (BOOT OR DATA)

4 SECTORS

16, 64 OR 256 KBIT BATTERYBACKUP SRAM

RUNTIME CONTROLAND I/O REGISTERS

SRAM SELECT

PERIP I/O MODE SELECTS

MICRO⇔CELL FEEDBACK OR PORT INPUT

CSIOP

FLASH ISP CPLD(CPLD)

16 OUTPUT MICRO⇔CELLS

FLASH DECODEPLD (DPLD)

PLD, CONFIGURATION& FLASH MEMORY

LOADER

JTAGSERIAL

CHANNEL

(PC2)

PAGEREGISTER

EMBEDDEDALGORITHM

SECTORSELECTS

SECTORSELECTS

GLOBALCONFIG. &SECURITY

Slika 20: Notranji organi druzine PSD8xx

Druzina PSD8xx je razmeroma siroka. Razlika med posameznimi clanidruzine so velikosti pomnilniskih blokov, stevilo vhodni/izhodnih prikljuckovin izvedba ohisja elementa. PSD834F2 vsebuje sledece:• 2Mbita (256kBajtov) glavnega FLASH bloka razdeljenega na 8 sek-

torjev• 256kbitov (32kBajtov) stranskega FLASH bloka razdeljenega na 4

sektorje• 64kbitov (8kBajtov) RAM pomnilnika• 27 I/O linij• dekodirno vezje za naslavljanje FLASH vezja (DPLD)• CPLD vezje z naslednjimi gradniki:

– 24 vhodnih Micro⇔Cellov (IMCs)– 16 izhodnih Micro⇔Cellov (OMCs)– alokator Micro⇔Cellov– alokator produktnih termov

6.2. MIKROKRMILNISKA ENOTA 63

– AND polje z moznostjo generiranja do 137 produktnih termov– 4 I/O vrata

Razvojni sistem uporablja le manjsi del pomnilnika PSD vezja, kar jeuporabljeno pa je razporejeno na sledec nacin:

Naslovi Velikost(bajtov) Namen$1800 ÷ $18FF 256 registri PSD enote$2000 ÷ $3FFF 8192 Uporabniski podatkovni pomnilnik$6000 ÷ $7FFF 8192 Rezervirano za zunanje enote (CS)$C000 ÷ $DFFF 8192 BIOS$E000 ÷ $FFFF 8192 Uporabniski programski pomnilnik

Takoj po RESETu sta Uporabniski programski pomnilnik in BIOS za-menjana. To zagotovi, da je reset vektor zanesljivo definiran pri zagonusistema tudi v primeru, ce je uporabniski programski pomnilnik se prazen.To skakanje pomnilniskih blokov je realizirani s flip-flopom, ki je izdelan sCPLD vezjem vgrajenim v PSD element sam (pri klasicnem pristopu bi topomenilo dodatno integrirano vezje).

64 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

6.2.4 RS-232 zaporedni vmesnik

Mikrokrmilnik MC68HC11A1 ima vgrajen asinhron zaporedni vmesnik SCI(Serial Communication Interface). Ta omogoca mikrokrmilniku povezo-vanje s katerokoli enoto, opremljeno s podobnim vmesnikom. Preko tegavmesnika tudi osebni racunalnik nadzira delovanje BIOSa mikrokrmilniskeenote.

Podatki se pretakajo dvosmerno preko dveh signalnih linij TXD in RXD(Transmit Data - oddajna linija in Receive Data - sprejemna linija). Zaprikljucitev mikrokrmilnika na RS-232 linijo je potrebno le se pretvoritinapetostne nivoje. Mikrokrmilnik namrec ustvari TTL napetostne nivoje(5V - 0V), medtem ko RS-232 standard zahteva RS-232 napetostne nivoje(+12V - -12V). Za to pretvorbo poskrbi MAX232 integrirano vezje (21,U5).

Vcc16

C2+4

C2-5

R1IN13 T1OUT14

GND15

T2OUT7

R2IN8

C1+1V+2

C1-3

V-6R2OUT9T2IN10

T1IN11

R1OUT12

U5

MAX-232

C51u

C61u

C71u

C81u

C91u

GND

GND

VCC

162738495

J6

Comm

RXD

TXDCTS

RTS

GND

GND

/XIRQTXDRXD

Slika 21: Pretvornik napetostnih nivojev

Poleg TXD in RXD linij so uporabljene se RTS (Ready To Send)in CTS (Clear To Send). RTS linija sluzi za ugotavljanje prikljucenostimikrokrmilniske enote na osebni racunalnik. Kadar je enota prikljucena inima napajanje se RTS linija postavi na visok nivo in tako sporoci osebnemuracunalniku svojo prisotnost. Linija CTS je prikljucena na vhod za ne-maskirano prekinitev (XIRQ) mikrokrmilnika. Vsi ti signali so prikljucenina moski DB-9 konektor (J6).

6.2. MIKROKRMILNISKA ENOTA 65

Za svoje delovanje potrebuje vezje MAX232 zelo malo dodatnih ele-mentov, to je le 5 kondenzatorjev (oznaceni so z C5 ÷ C9). Podroben opisdelovanja vezja je moc najti na domaci strani proizvajalca Maxim [3].

6.2.5 Napajalno vezje

Tako mikrokrmilnik kot tudi PSD vezje potrebujeta za svoje delovanje sta-bilno napetost 5V. To napetost zagotavlja integrirano vezje LM7805 (U6).Ta je integriran napetostni regulator, ki zagotovi stabilno napetost 5V vsirokem obmocju vhodnih napetosti. Vgrajen stabilizator pomeni tudi vecjofleksibilnost vezja, saj je le-to lahko napajano s kakrsnimkoli napajalnikomz napetostjo 7V ali vec. Shema napajalnega vezja je na sliki 22.

IN1

GN

D2

OUT3

4

U6 7805

C1047u

C1147u

GND

VCC

11

22

J5

POWER

R7820E

DL1LED

GND

D1

1N4001

1

J3

Unregulated GND

Slika 22: Napajalno vezje

Poleg integriranega napetostnega regulatorja vezje sestavljajo se drugielementi. Kondenzatorja C10 in C11 skrbita za dodatno glajenje tokovnihinpulzov, ki nastopajo ob preklopih digitalnih vezij. LED dioda DL1 prika-zuje stanje napajalne napetosti. Dioda D1 ima vlogo zascite proti napacnipolariteti napajalne naspetosti. Nestabilizirana napajalna napetost je dose-gljiva na prikljucku J3. Mikrokrmilniska enota je napajana preko prikljuckaJ5 (slika 23).

Napajalna napetost se lahko giblje v mejah 7V ÷ 25V, vendar je pri-porocena vrednost 7V ÷ 9V. Pri visji napetosti se pojavi problem pregre-vanja napetostnega regulatorja, pri napetosti pod 7V pa postane delovanjeregulatorja nezanesljivo, v skrajni meri napetost preneha biti stabilizirana.

Dodatne prikljucene naprave so lahko napajane s stabilizirano napetostjo(dosegljiva je tako na vhodno/izhodnem prikljucku kot tudi na razsiritvenemprikljucku), vendar je potrebna pazljivost pri obremenjevanju regulatorja.

66 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

Ta regulator je predviden za obremenitve do 1A in skoraj ves ta tok je narazpolago za dodatne enote (poraba samega mikrokrmilniskega sistema segiblje med 50mA in 100mA). Pri tem ni potrebno posebej poudarjati, dase z visanjem obremenitve veca tudi segrevanje regulatorja. Prekomernotoploto je potrebno odvajati z ustreznim hladilnim telesom, saj v nasprot-nem primeru grozi pregrevanje regulatorja in njegovo unicenje. Tudi za tovezje je moc dobiti vse podatke na strani proizvajalca [4].

6.2. MIKROKRMILNISKA ENOTA 67

6.2.6 Vhodno/izhodni prikljucek

Ta prikljucek je eno od mikrokrmilnikovih oken v svet saj lahko preko njegamikrokrmilnik komunicira z zunanjimi napravami. Prikljucek vsebuje 36linij, ki so lahko nastavljene na razlicne nacine. Ti so lahko digitalni vhodiin izhodi ali analogni vhodi. Razporeditev linij na prikljucku je prikazanona sliki 23.

Vhodno/izhodni prikljucek ima naslednje linije:• Vcc in GND: +5V stabilizirana napetost za zunanje naprave• PSA0 ÷ PSA7: 8-bitna dvosmerna PSD vrata A• PSB0 ÷ PSB7: 8-bitna dvosmerna PSD vrata B• PA0 ÷ PA7: 8-bitna dvosmerna vrata z dodatnimi funkcijami casov-

nika:– PA0/IC3 (vhod):Digitalni vhod/Vhod za zajemanje (Input cap-

ture) 3– PA1/IC2 (vhod):Digitalni vhod/Vhod za zajemanje (Input cap-

ture) 2– PA2/IC1 (vhod):Digitalni vhod/Vhod za zajemanje (Input cap-

ture) 1– PA3/OC5/OC1 (izhod):Digitalni izhod/Izhod za postavljanje

(Output compare) 5/Izhod za postavljanje (Output compare) 1– PA4/OC4/OC1 (izhod):Digitalni izhod/Izhod za postavljanje

(Output compare) 4/Izhod za postavljanje (Output compare) 1– PA5/OC3/OC1 (izhod):Digitalni izhod/Izhod za postavljanje

(Output compare) 3/Izhod za postavljanje (Output compare) 1– PA6/OC2/OC1 (izhod):Digitalni izhod/Izhod za postavljanje

(Output compare) 2/Izhod za postavljanje (Output compare) 1– PA7/PAI/OC1 (vhod/izhod):Digitalni vhod/izhod/Vhod stevca

impulzov/Izhod za postavljanje (Output compare) 1• PD2 ÷ PD5: 4-bitna dvosmerna vrata z dodatnimi funkcijami SPI:

– PD2/MISO (vhod/izhod):Digitalni vhod/izhod / Master In SlaveOut

– PD3/MOSI (vhod/izhod):Digitalni vhod/izhod / Master OutSlave In

– PD4/SCK (vhod/izhod):Digitalni vhod/izhod / Serial Clock– PD5/SS (vhod/izhod):Digitalni vhod/izhod / Slave Select

• PE0 ÷ PE7 / AN0 ÷ AN7 : 8-biten Digitalen vhod / Analogen vhod

68 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

6.2.7 Razsiritveni prikljucek

Mikrokrmilniska enota je nacrtovana tako, da je kar se da odprta. Mogoce jeprikljucevanje naprav neposredno na mikrokrmilnikovo vodilo. Te napraveso tako dosegljive neposredno v mikrokrmilnikovem naslovnem prostoru. Toso lahko razna zunanja pomnilniska vezja (RAM, ROM, EPROM, FLASHRAM, . . .) in razni drugi vmesniki.

Mikrokrmilnikovo vodilo je dosegljivo preko razsiritvenega prikljucka(slika 23). Ta prikljucek vsebuje sledece signale:• Vcc and GND: +5V napajalna napetost za zunanje naprave• AD0 ÷ AD7: 8-bitno vodilo, ki si ga casovno delijo podatkovni in

spodnji naslovni biti• A8 ÷ A15: visja polovica naslovnega vodila• R/W :Read/Write - kontrola smeri pretoka podatkov• E: izhod mikrokrmilnikove sistemske ure• AS: Address Strobe signal• IRQ: Interrupt Request - zahteva po prekinitvi• RESET : reset izhod• CS: Zunanji izbirni signal

Podrobno razlago prikljucevanja naprav na mikrokrmilnikovo vodilo jenajti v podatkih proizvajalca mikrokrmilnika ([1] in poglavje 7).

6.2. MIKROKRMILNISKA ENOTA 69

6.2.8 Povezava z osebnim racunalnikom

Mikrokrmilniska enota je na osebni racunalnik povezana preko zaporednegaRS-232 vmesnika. Pri povezavi so uporabljeni 4 sigali (TXD, RXD, CTS,RTS) in masa (GND). Povezovalni kabel ima 2 moska DB-9 prikljucka(razporeditev signalov je na sliki 23). Vezava linij ustreza Null-Modemkablu. Para linij TXT-RXD in RTC-CTS sta povezana krizno (TXD →RXD, RXD → TXD, RTS → CTS, CTS → RTS), masi pa sta zvezaniskupaj. Shema povezave je prikazana na sliki 24.

1

3

5

7

9

11

13

15

17

19

21

23

25

27

29

31

33

35

37

39

41

43

45

47

49

2

4

6

8

10

12

14

16

18

20

22

24

26

28

30

32

34

36

38

40

42

44

46

48

50

Vcc

PSA0

PSA2

PSA4

PSA6

PSB0

PSB2

PSB4

PSB6

PA0

PA2

PA4

PA6

PD2

PD4

PE0

PE2

PE4

PE6

GND

PSA1

PSA3

PSA5

PSA7

PSB1

PSB3

PSB5

PSB7

PA1

PA3

PA5

PA7

PD3

PD5

PE1

PE3

PE5

PE5

I/O port

1

2

3

4

5

6

7

8

9

RXD

TXD

GND

RTS

CTS

Communication port

Vcc

AD0

AD2

AD4

AD6

A8

A10

A12

A14

R/W

IRQ

1

3

5

7

9

11

13

15

17

19

21

23

25

27

29

31

33

35

37

39

2

4

6

8

10

12

14

16

18

20

22

24

26

28

30

32

34

36

38

40

GND

AD1

AD3

AD5

AD7

A9

A11

A13

A15

E

CS

AS

RESET

Expansion port

V+

GND

Power connector

1

2

3

4

5

6

7

8

Vcc

TDO

TDI

TER

TST

TCK

TMS

GND

J−TAG port

Slika 23: Razlicni prikljucki na mikrokrmilniski enoti

TXD

RXD

CTS

RTS

GND GND

TXD

RXD

CTS

RTS

Personal computer

COM port

Development board

RS-232connector

Slika 24: Shema povezovalnega RS-232 kabla

70 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

6.2.9 Sestavljanje in odstreljevanje tezav

Gradnja mikrokrmilniskega sistema je, zahvaljujoc majhnemu stevilu ele-mentov, razmeroma enostavna. Kljub temu pa je potrebno pri sestavljanjusistema previden, predvsem pri postavljanju elementov na mikrokrmilniskoenoto. Pravilna postavitev in orientacija elementov je narisana na mikrokr-milniski plosci sami.

Ena izmed najvecjih tragedij, ki se jih lahko dozivi pri gradnji sistema, jenapacna postavitev PLCC podnozij mikrokrmilnika in PSD vezja. Razlogza to je v PLCC ohisju, ki ima en rob rahlo odpiljen. To onemogoca napacnopostavitev vezja v podnozje. V primeru, da je podnozje prav obrnjeno,seveda. Te napake se zal ne da tako enostavno popraviti. Ti podnozjiimata namrec po 52 nozic in v vecini primerov poskus odspajkanja tehpodnozij vodi do unicenja plosce tiskanega vezja. Malenkost bolj enostavennacin je predelava podnozja, kar omogoci vstavljanje vezja v poljubno smer.Pri tem je potrebno odlomiti nekaj plastike s podnozja, kar pa spet niprevec enostavno. Dodatna nevsecnost pri tem pa je se to, da se lahkomikrokrmilnik ali PSD vezje napacno obrne. Najboljsi nacin je seveda ta,da se podnozji ze takoj obrne v pravo smer.

Zal niso samo podnozja obcutljiva na obracanje. Za uporovne verigeje tudi bistveno, da so obrnjene v pravo smer. Pri teh pa je olajsevalnaokoliscina ta, da imajo razmeroma malo nozic in se jih da z malo tezavodstraniti iz vezja. To se najlaze doseze tako, da se odscipa posameznenozice, ki se jih loceno odspajka iz vezja. Na ta nacin je razmeroma maloverjetno, da se unici tiskano vezje. Potrebno je le se prispajkati novouporovno verigo. Tokrat obrnjeno v pravo smer.

Vsi ostali elementi imajo tako malo nozic, da ne predstavljajo nobenihtezav pri odstranjevanju in ponovnem prispajkanju. Vsekakor pa bi bilonajboljse to, da se jih ze takoj pravilno postavi.

Ko so enkrat vsi elementi prispajkani jih je dobro se enkrat pregledatiin preveriti ce so res pravilno postavljeni in dobro prispajkani. Ce ni vecnicesar sumljivega pa je cas za prve preizkuse.

Najprej je potrebno preveriti napajalno napetost. Pri praznih podnozjihpriklopimo napajalnik. Prva indikacija je napajalna LED dioda. Ce tazasveti napajalnik deluje. Pomerimo se napetost, ki jo daje stabilizator.Vhodna napetost stabilizatorja mora biti visja od 7V, izhodna napetostpa mora biti 5V. Ce je vhodna napetost prenizka je po vsej verjetnostikriv napajalnik (mogoce je le nastavljen na prenizko napetost), ce pa je tapravilna in je izhodna napetost napacna, je glavni osumljenec stabilizator.Tega je potrebno odstraniti iz vezja in loceno preizkusiti. Ce se izkaze, dadeluje, je napaka nekje v vezju in ga je potrebno se enkrat pregledati za

6.2. MIKROKRMILNISKA ENOTA 71

kratke stike in napacne postavitve elementov. V primeru, da ne deluje, pagre v vezje nov stabilizator.

Po tej telovadbi z napajanjem se posvetimo Reset signalu. Napetosttega signala mora biti 5V, pri pritisnjeni Reset tipki pa mora pasti na 0V (vobeh primerih so dovoljena majhna odstopanja do 0.5V). Ce so napetostidrugacne je nekje napaka. Najverjetneje je odpovedalo eno ali obe resetvezji in jih je potrebno zamenjati. Ce tudi to ne deluje pa je napaka zopetnekje v vezju in ga je potrebno spet temeljito pregledati (tako elemente kotpovezave).

Sele ko oba, napajanje in Reset vezje, delujeta, pride na vrsto us-tavljanje elementov v podnozja. Pri tem je zopet potrebna pazljivost priobracanju elementov. Ko so vsi elementi postavljeni (in pravilno obrnjeni)zopet preverimo napajalno napetost in nivo Reset signala. Oba morata spetbiti 5V. Ce je prislo do kake spremembe je potrebno ugotoviti kateri od trehelementov je kriv. Pri tem zal ne gre drugace kot s poskusanjem. Element,ki nagaja, seveda zamenjamo. Enkrat ko so obe napetosti pravilne pome-rimo napetost na RTS liniji RS-232 vmesnika (nozica 14 vezja MAX232).Ta mora znasati priblizno 10V. Napacna vrednost lahko pomeni ali slaboMAX232 vezje ali pa kak slab ali napacno obrnjen kondenzator (C5 ÷ C9).Najlaze je najprej zamenjati vezje MAX232, in sele ce to ne pomaga, sespraviti na okolisnje kondenzatorje.

Z malo srece smo sedaj prisli do tocke, kjer so vsaj vse napetostipravilne. Potrebno je le se eno opozorilo, predvsem za vse tiste, ki to berejopred dejanskim sestavljanjem sistema. V vecini primerov ne bo prislo nitido ene omenjene napake in bo vezje delovalo takoj, ko bodo vsi elementiprispajkani (ce bodo vsi prispajkani pravilno). Zato se moram se enkratpoudariti - dobro premislite ali je element, ki ga hocete prispajkati, pravilnoobrnjen.

Sedaj pa k ozivljanju sistema. Poleg mikrokrmilnika je PSD vezje srcerazvojne enote. To vezje je programirljivo in ga je zato potrebno preduporabo sprogramirati. To zahteva poseben programski paket - PSDsoftexpress. Ta je zastonj snemljiv iz PSD domace strani [2]. Poleg tega je sepotrebno imeti konfiguracijsko datoteko (psd obj.zip), ki pa je dosegljivaiz JADE domace strani [5]. Do tu je bilo vse enostavno. Problem nastanezaradi programirnega vmesnika FLASHLink. Tega se zal ne da brezplacnosneti iz kake internetne strani, potrebno ga je kupiti ali pa si ga zgraditi(po shemi, ki je dosegljiva na PSD domaci strani [2]). Ko je vse na kupuse lahko lotimo dejanskega programiranja PSD vezja.

Najprej razpakiramo datoteko psd obj.zip. Za tem pozenemo PSDsoftexpress in iz PSDsoft menija izberemo STMicroelectronics JTAG/ISP op-cijo, na kar se pokaze okno (figure 25).

72 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

Slika 25: Dialog za nastavitev PSD vezja

V koraku Step 1 najprej z pritiskom na gumb browse izberemo ravnokarrazpakirano datoteko. Pri tem bi se moral tip PSD vezja samodejno nas-taviti na PSD834F2. V Step 2 nato izberemo Program/Verify operacijo naAll PSD regions z 6 pins JTAG vmesnikom. Okno bi sedaj moralo zgledatinekako kot na sliki 25 (razlicna je lahko le pot do konfiguracijske datoteke).Sedaj lahko prikljucimo FLASHLink vmesnik na LPT prikljucek osebnegaracunalnika, programirne zice pa na ustrezne prikljucke na razvojni enoti.Prikljucki so poimenovani enako kot zice tako, da prikljucitev ne bi smeladelati tezav. Nazadnje prikljucimo se napajalnik na mikrokrmilnisko enotoin kliknemo Execute. Obstaja moznost, da PSD vezje ni pobrisano, na karnas opozori okence iz slike 26 ki nas uprasa ali naj pobrise PSD vezje. Najga.

Slika 26: Program sprasuje ali naj pobrise vezje

6.2. MIKROKRMILNISKA ENOTA 73

Z malo srece gre vse v najlepsem redu in imamo delujoco razvojno enotos sprogramiranim PSD vezjem. Edino kar nam lahko nagaja je sam LPTvmesnik osebnega racunalnika. Ce se programsko orodje PSDSoft expresskaj pritozuje (slika 27) je potrebno poskusati spremeniti nastavitve LPTvmesnika (v BIOSu osebnega racunalnika). Pri tem ne bi bila slaba idejaimeti zraven koga, ki se na to spozna.

Slika 27: Tezave z programirnim vmesnikom

Po vseh teh tezavah in telovadbi bi bil koncno cas videti, ce naprav-ica dejansko deluje. Kot prvo odklopimo napajalnik in programirne zice.Na osebni racunalnik namestimo programski paket JADE (dobimo ga naJADE domaci strani [5]) in sestavimo RS-232 povezovalni kabel, s katerimpovezemo razvojno enoto na osebni racunalnik. Pozenimo program JADEin na razvojno enoto spet prikljucimo napajalnik. V statusni vrstici bi nasmoral razveseliti napis HC11 Board: Ready (Reset). To pomeni, da se jerazvojna enota zbudila in osebnemu racunalniku to tudi sporocila. Ce vstatusni vrstici pise le HC11 Board: Ready pritisnimo gumb Reset (tegana razvojni enoti, ne na osebnem racunalniku). Prikazati bi se moral prvinapis. V primeru da nas razvojno okolje preseneti z napisom HC11 Board:Not connected nam skusa povedati, da ne zazna razvojnega sistema naizbranem RS-232 vmesniku.

74 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

6.3 BIOS - Basic Input Output System

BIOS je kratek program, ki tece na mikrokrmilniski enoti in omogoca oseb-nemu racunalniku nadzor nad izvajanjem uporabniskega programa. Tu sovsteti tako prenos podatkov med rezvojno enoto in osebnim racunalnikomkot tudi podpora funkcijam za razhroscevanje.

6.3.1 Prenos podatkov

Podatki se med osebnim racunalnikom in kmikrokrminlisko enoto prenasajopreko RS-232 vmesnika v paketih. Paketi so sestavljeni iz 8-bitne po-datkovne besede, ter Start in Stop bita. Slika 28 prikazuje en tak po-datkovni paket.

Start Stop0 1 2 3 4 5 6 7

LSB MSBIdle line

Data word

Slika 28: Format podatkovnega paketa

Podatkovni paket je sestavljen iz:• Start bit• 8-bitna podatkovna beseda• Stop bit

Najnizji bit (LSB) podatkovne besede je prenesen prvi, hitrost prenosapa je 38400 bitov v sekundi. Nacin prenosa nastavi BIOS ob resetu inga uporabniski program ne sme spreminjati, saj bi to onemogocilo prenospodatkov med mikrokrmilnisko enoto in osebnim racunalnikom.

Taka oblika prenosa podatkov je zelo robustna in tudi temeljito preizku-sena (uporablja jo ogromno stevilo naprav tudi pri obcutno visji hitrostiprenosa), vendar ni stoodstotno imuna na napake. Napake v prenosu po-datkov so najbolj opazne pri uporabi okolja v operacijskih sistemih Win-dows 98 in Me. Vzrok tici v zakasnitvah pri servisiranju prekinitev zapored-nega vmesnika. Zaporedni vmesnik ima namrec nizjo tezo kot ostali deli os-ebnega racunalnika in so zato odzivi na njegove prekinitve lahko ppocasnejsiod podatkov, ki prihajajo iz razvojne enote. Resitev, ki se je izkazalaza zadovoljivo, je hkratno znizanje praga za prozenje prekinitve pri spre-jemu podatkov zaporednega vmesnika in znizanje pospesevalnega faktorja

6.3. BIOS - BASIC INPUT OUTPUT SYSTEM 75

graficnega vmesnika. Ta dva ukrepa sta na vseh preizkusnih racunalnikihzagotovila delovanje razvojnega sistema. Te ukrepe je seveda treba upora-biti le v primeru napak v delovanju razvojnega sistema saj se vsekakor nipriporocljivo igrati s temi nastavitvami.

6.3.2 Strategija korakanja

Nadzorovano korakanje po programu je dosezeno z uporabo pristopa ”navi-deznega procesorja”. Pri tem pristopu mikrokrmilnik ima na razpolagomajhen odsek ”simulacijskega RAMa”, v katerega shrani vrednosti vsehsvojih registrov, ki se nanasajo na trenuten, simuliran, ukaz, skupaj s samokodo tega ukaza. Takoj za tem ukazom je postavljen skok nazaj v BIOS,kar privede sistem zopet v roke razvojnega okolja. Ukaz sam je simuliral les tem, da BIOS opravi skok nanj. Pri tem seveda nastavi vsebino registrovprocesorja na vrednosti, ki ustrezajo simuliranemu ukazu, po ukazu samempa dobljene vrednosti registrov shrani v simulacijski RAM. Zgradba tegapomnilnika je sledeca:

Naslov Vsebina$0000 akumulator A$0001 akumulator B

$0002 ÷ $0003 indeksni register X$0004 ÷ $0005 indeksni register Y$0006 ÷ $0007 skladovni kazalec SP

$0008 register stanja CCR$0009 ÷ $000C operacijska koda in operandi ukaza za simulirat$000D ÷ $000F skok v BIOS

Problem pri tem pristopu lahko nastane zaradi razlik v dolzinah op-eracijskih kod ukazov. Ti se lahko gibljejo med 1 in 5 bajti dolzine. Terazlike BIOS zgladi tako, da ostanek prostora v simulacijskem pomnilnikuzapolni z NOP instrukcijami. Tezava je tudi z vejitvenimi in skocnimi ukazi,ki bi poter programa speljali iz simulacijskega pomnilnika in tako porusilidelovanje BIOSa. V ta namen osebni racunalnik vsak ukaz pregleda in ganalozi v simulacijski pomnilnik le, ce ne ogrozi delovanja sistema. Blocnidiagram postopka je prikazan na sliki 29.

BIOS ima tudi svoj locen sklad na katerega odlaga podatke in ki ima dnona naslovu $007F. Simulacijski pomnilnik skupaj z BIOS-ovim skladom innekaj dodatnimi spremenljivkami zasedejo spodnjih 128 bajtov vgrajenegapodatkovnega pomnilnika mikrokrmilnika. Za pravilno delovanje sistemauporabniski program ne sme posegati v ta odsek pomnilnika.

76 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

Jeskok?

Je skok napodprogram?

Je pogojizpolnjen?

StepInto?

Je RTS?

Izra�unaj naslov

cilja skoka

Popravi PC

Izra�unaj naslovcilja

Popravi PC

Na sklad postavi naslov povratka

Iz sklada poberinaslov povratka

Sko�i v

podprogramPopravi PC

Popravi PC

Prenesi operacijskokodo v simulacijski

RAM

Simuliraj ukaz

Iz pomnilnika preberi ukaz

Da

Da

Da

DaDa

Ne

Ne

Ne

Ne Ne

Slika 29: Blok diagram obdelave ukazov

6.3.3 Osnovni pojmi BIOSa

Slika 30 prikazuje poenostavljen diagram poteka BIOSa. Na tej sliki sorazvidni glavni koraki BIOSa. Takoj po resetu BIOS nastavi skladovnikazalec (SP), zaporedni vmesnik (SCI) in registre mikroprocesorja, nakarzaide v glavno zanko. V tej zanki BIOS caka na ukaz iz osebnega racunalnika.BIOS prihajajoce ukaze razpozna in pozene ustrezne podprograme. Vsipodprogrami (razen RUN) vrnejo nadzor BIOSu (BIOS se vrne v glavno

6.3. BIOS - BASIC INPUT OUTPUT SYSTEM 77

zanko), RUN pa brezpogojno pozene uporabniski program. Edini nacin, daBIOS spet dobi nadzor nad mikrokrimlonisko enoto, je reset.

6.3.4 Ukazi, ki jih BIOS razume

BIOSu lahko osebni racunalnik poslje vec razlicnih ukazov. Ti ukazi omogocajuosebnemu racunalniku dostop do celotnega pomnilniskega prostora in reg-istrov mikrokrmilnika, ter da poganja ali koraka skozi uporabniski program.Ukazi, ki jih BIOS pozna so:• R - Read data - Branje podatkov iz pomnilnika• P - Program FLASH - Nalaganje programa v programski pomnilnik• E - Erase FLASH - Brisanje programskega pomnilnika• W - Write into RAM - Pisanje v podatkovni pomnilnik• S - Execute a Single step - Izvede en sam korak• X - Run program - Nenadzorovan pogon programa

78 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

RESET

Nastavitev SPNastavitev SCI

Break sekvenca

Cakanje na ukaz iz osebnega racunalnika

Write?

Erase?

Programm?

Step?

Run?

Read?Da

Ne

Da

Ne

Da

Ne

Da

Ne

Da

Ne

Da

Ne

Osebni racunalnik berepodatke iz pomnilnikamikrokrmilnika

Osebni racunalnik pisepo pomnilnikumikrokrmilnika

Brisanje FLASHprogramskegapomnilnika

Uporabniski programnalozi v FLASHpomnilnik

Mikrokrmilnik izvedeen programski korak

Nenadzorovan pogon

Slika 30: Diagram poteka BIOSa

6.3. BIOS - BASIC INPUT OUTPUT SYSTEM 79

6.3.5 Telovadba ob resetu

Po uspesnem resetu mikrorkmilniski sistem poslje niz 3 B znakov (breaksekvenca). To pove osebnemu racunalniku, da je mikrokrmilniski sistemdozivel reset in da je zdrav in zvesto pricakuje ukaze s strani uporabnika.

6.3.6 Prekinitve

Posebej svetla stran razvojnega sistema je omogocanje prekinitev. Sistemsam namerc prekinitev ne uporablja in so zato na voljo uporabniku brezomejitev. Uporabnik mora le spisati prekinitvene servisne podprograme, kise nato izvajajo nemoteno ob prekinitvah. Ob vpadanju prekinitev servisnipodprogrami nemoteno opravijo svoje delo, kar je se bolj pomembno pa je,da ne ovirajo delovanja BIOS-a. Prekinitveni servisni podprogrami so eniredkih odsekov uporabniske programske kode, ki se izvedejo neovirano (vrealnem casu), kar omogoca razvoj aplikacij s casovno kriticnimi odzivi naprekinitve (primer je lahko urnik realno-casovnega operacijskega sistema).

6.3.7 Omejitve

BIOS je kratek in ucinkovit program, ki omogoca osebnemu racunalnikuskoraj popoln nadzor nad delovanjem mikrokrmilniske enote. Ceprav omo-goca ucinkovit razvoj uporabniske programske opreme postavlja doloceneomejitve.

Najocitnejsa omejitev je uporaba zaporednega vmesnika RS-232 za nad-zor enote. To otezkoca uporabo tega vmesnika v uporabniskem programu.Ta vmesnik je nedosegljiv vse dokler ima nadzor nad enoto BIOS, ko paprogram pozenemo nenadzorovano, ta lahko uporablja zaporedni vmesnikbrez omejitev.

Verjetno najhujsa omejitev razvojnega sistema je nezmoznost praveganadzorovanega poganjanja uporabniskega programa. Vse kar BIOS zmoreje le hitro korakanje skozi program. Pogon programa (ukaz Run) povzrociizkljucitev BIOSa in edini nacin za povrnitev nadzora nad enoto v roke os-ebnega racunalnika je reset, programske resitve ni. Ceprav to lahko zgledahuda pomankljivost je pravzaprav le manjsa nadloga, saj reset ne pokvarivrednosti shranjenih v podatkovnem pomnilniku. Uporabnik lahko pro-gram nenadzorovano pozene in cez cas enoto resetira ter pregleda vsebinopomnilnika in sklepa na pravilnost delovanja programa. Poleg tega ob-staja se en nacin za preizkusanje krajsih odsekov programa v realnem casu.Uporabnik mora le casovno obcutljiv kos programa zapreti v podprogram,klic tega podprograma pa preskociti (Step-Over). Ta pristop bo bolj po-drobno razlozen kasneje.

80 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

6.4 Programsko razvojno okolje JADE

”JADE” (Just Another Development Environment) je programsko razvo-jno orodje, ki omogoca pisanje, prevajanje, razhroscevanje in nalaganjeuporabniskega programa v mikrokrmilnisko enoto. Ima uporabniku pri-jazen graficni vmesnik in deluje v okoljih Windows 9x/Me/NT/2000 inXP.

6.4.1 Namescanje na osebni racunalnik

Pred uporabo razvojnega okolja ga je potrebno namestiti na osebni racunal-nik. Namestitev sama je razmeroma enostavna. Pognati je treba le pro-gram setup.exe in slediti navodilom. Z malo srece je tako razvojno okoljenamesceno in pripravljeno za uporabo. Velja mogoce omeniti le se, da morav primeru uporabe operacijskih sistemov, osnovanih na Windows NT jedru(Windows NT, Windows 2000 in Windows XP) uporabnik imeti vsaj Superuser pravice.

6.4.2 Osnovne znacilnosti

Razvojno okolje omogoca uporabniku pisanje in urejanje zbirniskega pro-grama, iskanje in odpravljanje sintakticnih napak, prevajanje programa vstrojno kodo in nlaganje te kode v programski pomnilnik mikrokrmilniskeenote. Uporabnik lahko nato program izvaja korakoma, postavlja ustavit-vene tocke (break points), opazovalnice (watches) in pregleduje ter sprem-inja vsebino pomnilniskih celic in registrov mikrokrmilnika.

Glavne znacilnosti razvojnega okolja ”JADE” so:• urejevalnik teksta• prevajalnik• disassembler• nalaganje programa na razvojno enoto• korakanje• poganjanje programa• ustavitvene tocke• opazovalnice• bralni in pisalni dostop do registrov mikrokrmilnika• bralni in pisalni dostop do celotnega pomnilniskega prostora• vgrajeno terminalno okno• vgrajena pomoc

6.4. PROGRAMSKO RAZVOJNO OKOLJE JADE 81

6.4.3 Graficni uporabniski vmesnik

Graficni uporabniski vmesnik omogoca enostavno in ucinkovito uporabovseh funkcij razvojnega okolja. Primer izgleda vmesnika je prikazan nasliki 31.

Slika 31: Primer graficnega uporabniskega vmesnika

Uporabniski vmesnik je sestavljen iz vec podrocij. Skrajno zgornje po-drocje je vrstica z meniji. Vse funkcije razvojnega okolja so dostopne izrazlicnih menijev. Za vecino pomembnejsih funkcij obstajajo tipkovniskebliznjice, najpomembnejse pa so dostopne naravnost na naslednjem po-drocju - orodni vrstici. Gumbi na tej vrstici ustrezajo najpomembnejsimfunkcijam razvojnega okolja. Na dnu je se statusna vrstica, ki prikazujestanje razvojne enote, trenutni nalozeni program in nalozene simbole. Moznastanja razvojne enote so:• Not Connected : Razvojno okolje ne zazna razvojne enote na nave-

denem zaporednem vmesniku• Not Responding : Razvojna enota je zaznana ampak se ne odziva na

ukaze okolja• Ready : Razvojna enota je zaznana in pripravljena na delo• Ready - Reset : Razvojno okolje je zaznalo razvojno enoto in sprejelo

82 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

Break sekvenco• Running : Na razvojni enoti tecne uporabniski program• Simulator mode : Razvojno okolje uporablja simulator namesto razvo-

jne enote

6.4.4 Datoteke povezane z razvojnim okoljem

Razvojno kokolje med delovanjem ustvari in uporablja razlicne datoteke.Te datoteke imajo razlicne koncnice, po katerih se locijo. Tipi datotek so:

Koncnica Vrsta datoteke.asm Zbirniski program.lst datoteka z listingom prevedenega programa.err Seznam napak.txt Tekstovna datoteka.s19 Prevedena strojna koda

Vse funkcije, ki se nanasajo na delo z datotekami so zbrani v menijuFile. Slika 32 prikazuje odprt File menu.

Slika 32: Meni File

Vecji del ukazov se nanasa na delo z urejevalnikom teksta. Te so:• New : Ustvari novo datoteko z zbirniskim programom

6.4. PROGRAMSKO RAZVOJNO OKOLJE JADE 83

• Open : Odpre datoteko z zbirniskim programom

• Close : Zopre trenutno datoteko z zbirniskim programom

• Save : Shrani trenutno datoteko z zbirniskim programom

• Save As : Shrani trenutno datoteko z zbirniskim programom poddrugim imenom ali v drugo mapo

• Print Setup : Nastavi tiskalnik

• Print : Natisne trenutni zbirniski program

• Assemble : Prevede trenutni zbirniski program in ustvari datoteko zstrojno kodo

• Load Symbols : Nalozi zbirko simbolov

• Download : Nalozi strojno kodo trenutnega programa na razvojnoenoto

• Exit : Zapusti razvojno okolje

6.4.5 Okno Editor

V tem oknu lahko uporabnik pregleduje in ureja enostavne tekstovne da-toteke. Njegov prvotni namen je urejanje zbirniskih programov, a je uporabentudi za druge tekstovne datoteke, datoteke z listingom programa in datotekez seznamom napak. Pozna vse obicajne ukaze za urejanje teksta. Te so:• Undo - Razveljavi

• Redo - Obnovi

• Copy - Preslikaj

• Cut - Izrezi

• Paste - prilepi

• Delete - Zbrisi

• Select All - Oznaci vse

• Find - Najdi

• Find Next - Najdi naslednjo

• Replace - Zamenjaj tekst

• Goto Line - Pojdi v vrstico

Vse te funkcije so dostopne iz Edit menija in s pritiskom na desni gumbmiske v oknu Editor. Primer obeh je prikazan na sliki 33.

Ko je okno Editor aktivno statusna vrstica prikazuje vrstico in stolpeceditorja.

84 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

Slika 33: Okno Editor

6.4.6 Prevajalnik

Prevajalnik je program, ki iz prevede (kot ze ime samo nakazuje) zbirniskiprogram (.asm datoteka) v strojno kodo (datoteka .s19), zapisano v Mo-torolini s19 obliki. Poleg tega ustvari se listing datoteko (koncnica .lst) inv primeru napak se datoteko s seznamom napak (.err).

Vrstica zbirniskega programa ima tri dele :Oznaka Ukaz z operandi Komentar

Na skrajni levi je Oznaka (Labela). Ta mora nujno biti pri skrajnemrobu urejevalnika (ne svoji levi ne sme imeti presledkov). V splosnem sluziza oznacevanje ciljev vejitvenih ukazov in kot konstantna vrednost ter niobvezna. Lahko je sestavljena iz poljubnega zaporedja crk in stevilk, zrazliko, da prvi znak ne sme biti stevilka. Za oznako je ukaz z operandi. Taje lahko ukaz za mikrokrmilnik ali pa pseudokaz za prevajalnik. Nazadnjeje se komentar. Med sosednjima poljema vrstice mora biti najmanj enpresledek (poljubno stevilo). V primeru, da se vrstica zacne z znakom * jeoznacena kot komentar in je prevajalnik ne prevede.

6.4. PROGRAMSKO RAZVOJNO OKOLJE JADE 85

Prevajalnik pozna vec psevdoukazov:

Psevdoukaz Pomen PrimerLabel EQU <Word> Equal height EQU 342ORG <Word> Origin ORG $E000FCB <Byte> Force Constant Byte FCB $AAFDB <Word> Force Double Byte FDB $AABBFCC ”<Text>” Force Constant Character FCC ”Niz znakov”RMB <Number> Reserve Memory Byte RMB 27FILL <Byte>,<Count> Zapolne pomnilnik FILL $00,5END Konec programa END

Prevajalnik zna zonglirati z stevili v stirih osnovnih stevilskih sistemih(desetisko, dvojisko, osmisko in sestnajstisko). Predpone in ustrezni stevilskisistemi so navedeni v naslednji tabeli:

Predpona Stevilski sistem Primerbrez DEC - Desetiski 176

$ HEX - Sestnajstiski $E000% BIN - Dvojiski %10010101@ OCT - Osmiski @44235

Prevajalnik sam ni del razvojnega okolja, temvec je zunanji program,ki ga razvojno okolje po potrebi pozene. Edina omejitev pri uporabi tegaprevajalnika je, da mora prevajalnik biti namescen na osebni racunalnik,s katerim uporabnik razvija mikrokrmilniski program - ne deluje prekolokalnega omrezja.

6.4.7 Modul Download

Po uspesnem prevajanju programa je za nadaljni razvoj potrebno pretocitidobljeno strojno kodo na mikrorkmilnisko enoto. To opravi modul Down-load, ki strojno kodo prenese v programski pomnilnik mikrokrmilniskegasistema. Za to se poslozi (ze obdelanega) ukaza Program FLASH. BIOSsproti preverja pravilnost zapisa kode v pomnilnik in v primeru napacnegazapisa opozori razvojno okolje z NOACK znakom.

6.4.8 Razhroscevalnik - dezinsekcija

Kot ze ime nakazuje Razhroscevalnik pomaga programerju loviti in unicevatinapake (hrosce) v programu. Orodja, ki jih razhroscevalnik nudi so vgrajenpovratni prevajalnik (disassembler) in moznost korakanja po programskih

86 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

vrsticah. Mozno je tudi opazovanje in spreminjanje vrednosti vseh celicpomnilnika ter registrov mikrokrmilnika in nastavljanje ustavitvenih tock(breakpoint-ov) v program.

Razhroscevalnik razpolaga z vec okni. Ta so Disassembler, Labels,CPU registers, registri perifernih enot, registri PIA, sklad, opazovalno okno(watch window) in pomnilnisko okno. Ta okna dajejo vpogled v stanjemikrokrmilnika in so dosegljiva v meniju View (slika 34).

Slika 34: Meni View

Okno Disassembler

Povratni prevajalnik (disassembler) ima, kot ze ime samo nakazuje, obratnovlogo od prevajalnika. Iz programskega pomnilnika mikrokrmilniske enoteprebere strojno kodo in jo pretvori v zbirniski program, kar olajsa brskanjepo kodi in iskanje napak. Ta koda je prikazana v oknu Disassembler, ki jetudi glavno okno Razhroscevalnika. Vsaka vrstica v tem oknu vsebuje polegzbirniskega ukaza z operandi lahko tudi strojno kodo (ce je obkljukana op-cija Code On) in originalne oznake (obkljukana mora biti Include Symbols).Vse funkcije, ki se ticejo tega okna (z izjemo ukazov za izvajanje programa),so zbrane v meniju Debug in so dosegljive tudi z pritiskom na desno tipkomiske v oknu Disassembler. Slika 35 prikazuje okno Disassembler z odprtimmenijem.

V Debug meniju so:• Code On : Vkljuci strojno kodo v okno Disassembler• Include Symbols : Zamenja stevilske vrednosti s pripadajocimi oz-

nakami (labelami)• Toggle Breakpoint : Vkljuci ali izkljuci ustavitveno tocko

6.4. PROGRAMSKO RAZVOJNO OKOLJE JADE 87

• Clear All Breakpoints : Odstrani vse ustavitvene tocke• Set New PC : Nastavi novo vrednost v programski stevec (Program

Counter)• Get Reset Vector : Prebere vrednost Reset vektorja in jo vpise v

programski stevec• Go To PC Address : Premakne okno Disassembler na naslov pro-

gramskega stevca• Go To Address : Premakne okno Disassembler na vnesen naslov• Refresh Window : Osvezi vsebino okna Disassembler

Vse te funkcije bi bile seveda brez pomena, ce ne bi bilo moznostipocasnega, koracnega, izvajanja programske kode. Vsi ukazi, ki se ticejoizvajanja programa (tako koracnega kot tudi kontinuiranega) so zbrani vmeniju Run (slika 36).

Slika 35: Okno Disassembler

88 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

Slika 36: Meni Run

Tu so:• Run• Play• Animate• Step Into• Step Over• Step Out• Run To Cursor• Pause

Zaradi pokmembnosti si te funkcije zasluzijo podrobnejso obravnavo.

Najradikalnejsi ukaz je Run. Ta namrec sprozi nenadzorovan pogonuporabniskega programa. Pri tem je BIOS potisnjen v ozadje in edini nacin,da uporabnik spet pridobi nadzor nad razvojnim sistemom je reset. V temnacinu delovanja tece program s polno hitrostjo mikrokrmilnika, uporabnikpa nima vpogleda v samo delovanje programa. Ta nacin je tako najboljuporaben takrat, ko je program ze pretezno brez napak in zeli uporabnikpreveriti dejansko delovanje programa pri neodvisnem teku. Ce uporabnikvseeno potrebuje kako informacijo o delovanju programa pa mu pomagadejstvo, da reset sistema vsebine pomnilnika ne pokvari. Vsi podatki, kijih je program zapisal v pomnilnik so po resetu se vedno tam in so narazpolago uporabniku, da jih pregleda.

Ukaz Run povzroci nenadzorovan pogon programa. Vsi drugi ukazipoganjajo program nadzorovano, to je v rokah BIOSa (in uporabnika).

Obstajajo dva nacina izvajanja programov. Eden je koracno izvajanje(v vsakem koraku se izvede le ena vrstica programa), drugi je nadzorovanpogon (program navidezno tece), ki ga lahko uporabnik poljubno prekinja.

6.4. PROGRAMSKO RAZVOJNO OKOLJE JADE 89

Najosnovnejsi ukaz je Step Into. Ta izvede en sam korak programain sledi klicu podprogramov. To je, v primeru klica podprograma (ukazajsr ali bsr), skoci okolje na prvi ukaz podprograma. odoben ukaz je StepOver. Edina razlika med Step Into in Step Over je v obravnavanju pod-programov. Step Over podprograme namrec preskoci - celoten podpro-gram izvede v enem koraku. To pomeni, da se podprogram izvede s polnohitrostjo mikrokrmilnika (v realnem casu). Neljuba posledica tega je, da sepodprogram izvede nenadzorovano, brez moznosti uporabe razhroscevalnihorodij. Zelo ucinkovita uporaba funkcije Step Over je simulacija nenad-zorovanega pogona odseka programa. Del programa, ki ga uporabnik zelimpognati v realnem casu, zaprem v podprogram, klic tega podprograma papreskoci s Step Over ukazom. To je zelo uporabno povsod tam, kjer soodseki programa casovno kriticni. Po izteku podprograma se nadzor vrnev roke BIOSa. V primeru, da je uporabnik po pomoti zakorakal v podpro-gram (uporabil Step Into namesto Step Over) in zeli preostali del podpro-grama cimhitreje zakljuci, lahko uporabi Step Out. Ta pozene podprogrampodobno kot Step Over, ob prvem ukazu rts pa se nadzor nad sistemomspet povrne v roke BIOSa. Ustavitvene tocke v podprogramih, pognanih sStep Over in Step Out veselo zanemarjene.

Poleg osnovnega korakanja nudi razvojno okolje uporabniku tudi nad-zorovani tek programa. Nacina nadzorovanega teka sta dva, Play in Ani-mate. Ta dva ukaza sta si podobna. Oba izvajata program kot zaporedjekorakov, razlikujeta pa se le po tem, kaj izrisujeta na ekran osebnegaracunalnika. Prvi, Play, sproti osvezuje le vsebino okna CPU registersin tako omogoca hitrejse izvajanje programa. Drugi, Animate, pa osvezujevsa odprta okna, kar sicer poveca kolicino informacije, ki jo uporabnik dobio delovanju programa, vendar gree to na racun hitrosti izvajanja programa,ki je veliko pocasnejse. Ustavitvene tocke so v ovbeh nacinih upostevane.Tako Play kot tudi Animate lahko uporabnik prekine z ukazom Pause.

Kadar uporabnik zeli izvesti program le do dolocene vrstive lahko upo-rabi ukaz Run To Cursor. Ta ukaz postavi v zeljeno vrstico programaustavitveno tocko in sprozi ukaz Play. Po ustavitvi programa v ciljni vrsticise ustavitvena tocka samodejno odstrani.

Zelo uporabno orodje pri iskanju napak so ze omenjene ustavitvenetocke (breakpoint-i). Te ustavijo izvajanje programa (le pri Play ali Ani-mate). Ustavitvene tocke lahko uporabnik postavi ali brise z ukazom ToggleBreakpoint ali z dvojnim klkikom na zeljeno vrstico.

Dodatna pomoc pri iskanju napak je tudi napoved vejitev. Ko razvo-

90 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

jno okolje naleti na vejitveni ukaz ga le-to analizira in izracuna veljavnostpogoja za vejitev. Uporabniku nato sporoci smer vejitve z znakom v oknudisassembler. Vejitve lahko vodijo:

Znak Smer vejitvebrez znaka vejitev se ne izvede

+ cilj je nize (na visjem naslovu) kot vejitveni ukaz- cilj je vise (na nizjem naslovu) kot vejitveni ukaz± cilj je sam vejitveni ukaz (vejitev sama vase)

Razne moznosti so prikazane na slikah 37, 38, 39 in 40.

Slika 37: Ni vejitve, pogoji za vejitev niso izpolnjeni

Slika 38: Vejitev navzdol (visji naslov)

Slika 39: Vejitev navzgor (nizji naslov)

6.4. PROGRAMSKO RAZVOJNO OKOLJE JADE 91

Slika 40: Vejitev sama vase (na isti naslov)

Okno Registers

Mikrokrmilnik vsebuje veliko stevilo registrov. Najpomembnejsi so sevedaregistri CPU (dva akumulatorja, programski stevec, dva indeksna registra,skladovni kazalec in register stanja). Poleg teh je se vec skupin registrov,ki pa imajo skupno to, da se nanasajo na vgrajene enote mikrokrmilnika.Tu so registri Port, PIA, Timer, Pulse Accumulator, SCI, SPI, A/D inOther. Vsaka ta skupina ima pripadajoce okno, kjer so stanja registrov narazpolago za opazovanje in spreminjanje. Na sliki 41 so prikazana vsa oknaz registri in odprto desnoklikni meni.

Slika 41: Vsa okna z registri

Vsebine registrov okolje lahko prikaze v treh osnovnih stevilskih sis-temih (desetiskem (Decimal), dvojiskem (Binary) in sestnajstiskem (Hex-adecimal)). Vsebine opazovanih celic lahko uporabnik spremeni z ukazomEnter Value z denokliknega menija ali z dvojnim klikom na ime registra.

92 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

Okno Watch

Okno Watch prikazuje stanje opazovalnic (Watches), to je izbranih pom-nilniskih celic. Prikazane vrednosti so lahko 8-bitne (vrednost, vzeta iz nas-tavljene celice) ali 16-bitne (pri tem iz pomnilnika prebere dve zaporednicelici, zacensi z vpisanim naslovom). Ce ima uporabnik nalozene simbole(Symbol list) lahko vnasa namesto naslovov kar imena oznak (label), ka-terih spisek je prikazan v posebnem oknu Labels (slika 42). Vsebine takoopazovanih pomnilniskih celic lahko uporabnik tudi poljubno spreminja,ce so le zapisljive. Slika 42 prikazuje okno Watch z odprtim desnokliknimmenijem ter okno Labels.

Slika 42: Okni Watch in Labels

Vsaka vrstica okna Watch predstavlja opazovano pomnilnisko lokacijo.Vrstice so sestavljene iz naslova ali oznake (labele) pomnilniske celice invrednosti, ki jo ta celica vsebuje. Opazovalnice (posamezne vrstice) lahkouporabnik doda (Add Watch), odstrani (Remove Watch) in ureja (EditWatch). Vsebine celic so lahko prikazane v treh osnovnih stevilskih sis-temih (desetiskem (Decimal), dvojiskem (Binary) in sestnajstiskem (Hex-adecimal)). Vsebine opazovanih celic lahko uporabnik spremeni z ukazomEnter Value.

6.4. PROGRAMSKO RAZVOJNO OKOLJE JADE 93

Okno Memory

V tem oknu je prikazana vsebina dela pomnilniskega prostora mikrokr-milniskega sistema. Uporabnik ima tako moznost, da vsebino tako preverjakot tudi spreminja (v primeru zapisljive pomnilniske celice). Primer tegaokna z odprtim desnokliknim menijem je prikazan na sliki 43.

Slika 43: Okno Memory

Vsaka vrstica okna Memory vsebuje naslov prve celice v vrstici, vsebine16 zaporednih pomnilniskih celic, zapisanih v sestnajstiski obliki, in natose iste vrednosti prikazane kot ASCII znake. Zacetni naslov okna Memoryuporabnik lahko nastavi z ukazom Starting Address, vsebino okna pa lahkopomika z tipkovnico (kurzorske tipke ter PageUP in PageDOWN). Vsebinocelic lahko spreminja z Enter Value ukazom.

94 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

Okno Stack

Okno Stack kaze trenutno vsebino pomnilniskega prostora, rezerviranegaza sklad. Slika 44 prikazuje okno Stack z odprtim desnokliknim menijem.

Slika 44: Okno Stack

V osnovi je okno Stack zelo podobno oknu Memory s to razliko, da jev vsaki vrstici okna Stack le po ena podatkovna vrednost, ter da je edinistevilski nacin izpisa sestnajstiski. Vrstica, na katero kaze skladovni kazalec(Stack Pointer) je oznacena z debelejso pisavo.

Ukazov, ki krmilijo okno Stack je vec. Prvo je Enter Value. S temukazom lahko uporabnik vnese poljubno vrednost v sklad. Naslednji jeGo To SP Address. Ta povzroci premik vsebine okna Stack na tak nacin,da se na dnu okna (najnizja vrstica) znajde tista vrednost, na katero kazeskladovni kazalec (vrh sklada). Ukaz Go To Address je podoben ukazu GoTo SP Address s to razliko, da uporabnik sam vnese naslov celice, ki najbo na dnu okna.

Pri vseh do sedaj predstavljenih oknih je bila prisotna funkcija RefreshWindow, ki kot ze samo ime pove osvezi vsebino okna. Okolje pri tem izmikrokrmilniske enote prebere podatke in jih izpise v okno. Nekatera oknapa so imela tudi opcijo Auto Refresh. Ta je sorodna ukazu Refresh Win-dow, le da okolje samo periodicno, 50 krat na sekundo, osvezi vsebino okna,ki ima to opcijo obkljukano. Ta funkcija pride najbolj do izraza pri opazo-vanju registrov vgrajenih enot mikrokrmilnika, saj lahko uporabnik sprotiopazuje vrednosti, ki se v te registre vpisejo brez vmesavanja uporabniskega

6.4. PROGRAMSKO RAZVOJNO OKOLJE JADE 95

programa. Slaba stran tega pa je seveda velika kolicina podatkov, ki sepretaka med mikrokrmilnisko enoto in osebnim racunalnikom, kar lahkopovzroci napake v delovanju sistema, predvsem pir hkratnem osvezevanjuin korakanju skozi program. Previdnost pri uporabi te funkcije torej niodvec.

6.4.9 Serijski terminal

Okno serijski terminal pretvori osebni racunalnik v, no ja, neumen serijskiterminal. Vsi podatki, ki prispejo na zaporedni vmesnik so prikazani vserijskem teminalu, in vsi pritiski na tipke se posljejo na zaporedni vmesnik.Terminal pozna dva nacina izpisovanja podatkov. Prvi je cist znakovni izpis(slika 45), drugi pa je izpis surove sestnajstiske kode s pripadajocimi ASCIIznaki (slika 46).

Slika 45: Cist znakovni izpis

Slika 46: Mesan znakovni in sestnajstiski izpis

Serijski terminal je lahko koristnen pripomocek za preiskusanje pro-gramov, ki uporabljajo mikrokrmilnikov zaporedni vmesnik, vendar morabiti pri tem uporabnik posebno pazljiv. Zaporedni vmesnik je namrectudi vez med razvojnim okoljem in mikrokrmilnisko enoto in vsaka mot-nja v prenosu vodi do izgube nadzora nad mikrokrmilniskim sistemom. Vtem primeru lahko uporabnik le se resetira sistem. Pomembno je tudi,da uporab- niski program ne spreminja nastavitev zaporednega vmesnika,

96 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

kar spet privede do ze omenjenih posledic. Zaporedni vmesnik je tako narazpolago uporabniskemu programu le takrat, ko sistem ni pod nadzoromBIOSa, to je ko uporabniski program tece neodvisno od razvojnega okolja.

6.5. ZAKLJUCKI 97

6.5 Zakljucki

Izdelava celotnega mikrokrmilniskega razvojnega sistema je bila zahtevnain obsezna naloga. Zahtevala je tako nacrtovanje, izdelavo in preizkusanjevecnamenske mikrokrmilniske enote kot tudi izdelavo ucinkovite razvojneprogramske opreme. Izpolnjene so bile vse zahteve, navedene v uradnemopisu teme magistrske naloge.

Izdelana magistrska naloga obsega razvojno orodje za mikrokrmilniskisistem, osnovan na mikrokrmilniku MC68HC11A1. Zaradi nizke cene inenostavne izdelave je sistem dostopen sirokemu stevilu uporabnikov. Sis-tem je zelo primeren za uporabo v pedagoskem procesu pri vajah programi-ranja mikrokrmilnikov. Studenti imajo tako moznost koracnega izvajanjain preverjanja delovanja posameznih ukazov programa.

Izdelava mikrokrmilniske enote je zaradi majhnega stevila elementovzelo enostavna, primerna je tudi za popolne zacetnike. Nacrt ploscicetiskanega vezja je na razpolago v obliki PCB datoteke za programski paket”Tango”. Cena celotnega sistema je nizka, k cemur prispeva majhno steviloelementov in kompaktna ploscica tiskanega vezja.

V izdelavo te magistrske naloge je bilo vlozeno veliko truda in znanja.V veliko pomoc so mi tudi bile vse izkusnje pri delu z mikrokrmilniki. Vseto mi je omogocilo izdelavo robustnega in uporabnega mikrokrmilniskegarazvojnega sistema, ki izpolnjuje vse zahtevane cilje.

98 POGLAVJE 6. DODATEK - RAZVOJNO OKOLJE ZA MC68HC11

6.6 Viri

[1] e-www.motorola.com[2] us.st.com/stonline/prodpres/memory/psd/html/psd idx.htm[3] www.maxim-ic.com/quick view2.cfm/qv pk/1798/ln/en[4] www.fairchildsemi.com/pf/LM/LM7805.html[5] www.fe.uni-lj.si/jade

Poglavje 7

Datasheet

99