Luku 1 käsittelee ja määrittelee yleisesti sulautetut järjestelmät sekä luo katsauksen alan mark kinatilanteeseen.
Luvussa 2 tehdään pintapuolinen katsaus mikro-ohjaimiin ja niiden sovellutuksiin. Lisäksi tutustutaan nopeasti kehittyviin signaaliprosessoreihin.
Luku 3 sisältää tarkempaa teknistä kuvausta Intelin 8051-mikro-ohjaimesta, joka on otettu kirjoitelman esimerkkiohjaimeksi. 8051-ohjain on edelleen lukumääräisesti suosituin käytössä olevista, joten sen ottaminen esimerkiksi on perusteltua. Sen syvempi tuntemus auttaa muidenkin ohjainten käytön opettelemisessa.
Luvussa 4 luodaan lyhyt katsaus mikro-ohjainten kehitysympäristöihin ja työkaluihin.
Luku 5 pyrkii kuvaamaan erilaisin esimerkein millaista mikro-ohjaimen ohjelmointi on C-kielellä ja millaisia asioita joudutaan ottamaan huomioon. Esimerkkiohjaimena on jälleen Intelin 8051-ohjain, jolle löytyy lukuisia ohjelmointiympäristöjä. Ohjelmointikielenä käytetään Keil Softwaren C51-kieltä. Olen olettanut, että lukija ymmärtää ohjelmointia ja C-kieltä sujuvasti. Lisäksi kuvataan myös muut ohjelmointikielet, joita mikro-ohjainten ohjelmoinnissa käytetään.
Luvussa 6 esitellään VMT Oy:lle suunniteltu kameran ohjausjärjestelmä.
Luvussa 7 esitellään sulautetuissa järjestelmissä suosituksi tullut sumea logiikka ja säätö.
Luku 8 keskittyy lähinnä ohjelmistotason ratkaisuihin rakennettaessa luotettavaa ja vikasietoista järjestelmää. Esitettävät tekniikat eivät välttämättä ole sellaisenaan käyttökelpoisia pieniin sulautettuihin järjestelmiin. Monet vaativat esimerkiksi käyttöjärjestelmän palveluja. Ne tuovat kuitenkin uuden ajatustavan ohjelmointiin.
Luvussa 9 esitellään erikoisuutena koko ohjelmistoprosessiin kehitettyjä laadunmittaus menetelmiä. Tämä osuus osaltaan antaa kuvaa millaista todellinen projektityö ja ohjelmointi on työelämässä.
Lukuun 10 on koottu aikaisemmissa luvuissa esiintyneiden lyhenteiden ja käsitteiden kuvauksia.
Sulautettu järjestelmä on nimensä mukaisesti sisällytetty johonkin tuotteeseen, joka käyttäjälle ei enää vaikuta tietokoneelta. Se koostuu yhdestä tai useammasta yleiskäyttöisestä mikro-ohjaimesta (eng. micro controller), jotka on kytketty oheislaitteisiin. Myös mikroprosessoreita käytetään laitteiden ohjauksessa vaadittaessa laajempaa muistiavaruutta ja tehokkaampaa suoritusta. Mikro-ohjain on kuitenkin monesti käytännöllisempi kokonsa ja halpuutensa takia. Oheislaitteet kommunikoivat suoraan ohjaimelle, joka valvoo niiden tilaa ja toimintaa. Sulaute tussa järjestelmässä harvoin on massamuisteja. Yleensä sulautetun järjestelmän laite on vain kerran ohjelmoitavissa ja jotta laite toimisi uudella tavalla, joudutaan mikro-ohjain vaihtamaan. Tällöin ohjelma on ladattu ohjaimen ROM-muistiin. On kuitenkin systeemejä, joita voidaan ohjelmoida uudelleen erilaisia tekniikoita, kuten EEPROM-, EAROM- ja EPROM-muisteja, käyttäen [14].
Komponenttien halpuudesta johtuen (esim. 16-bittiset MCS251-ohjaimet maksavat n. 30 mk/kpl) sulautettuun järjestelmään voidaan eri tarpeisiin laittaa useita ohjaimia, jolloin rinnak kaissuoritus on mahdollista. Tällaista kutsutaan moniprosessorijärjestelmäksi. Yleensä kuiten kin yksi ohjain on riittävä huolehtimaan järjestelmän tarpeista. Toiminnot tapahtuvat tällöin näennäisesti yhtäaikaa tietyllä virhemarginaalilla. Järjestelmään voidaan myös asentaa ylimää räisiä ohjaimia vikatilanteiden varalta. Fyysisen vian ilmetessä varaohjain ottaa vastuun järjes telmästä.
Reaaliaikaisessa (tosiaikaisessa) järjestelmässä ohjaimen tulee ärsykkeen saatuaan reagoida siihen tietyllä aikamarginaalilla. Reaaliaikaisuus kulkee käsikädessä luotettavuuden ja rinnak kaissuorituksen kanssa, sillä järjestelmien tulee usein olla ajoitukseltaan varmoja. Esimerkiksi lukkiutumattomien jarrujen on pysyttävä tietyssä tahdissa, tai seuraukset voivat olla tuhoisat [29].
Sulautetun järjestelmän tekniikkaa käytetään hyväksi mm. pankkiautomaateissa, autoissa, puhelimissa, pesukoneissa, taskulaskimissa, kelloissa, kopiokoneissa, paperikoneissa, mik roaaltouuneissa, sairaalalaitteissa, lentokoneissa, moottoripyörissä ja tietokoneissa (ks. tauluk ko 1.1). Tietokoneen näppäimistössä on mikro-ohjain, joka valvoo näppäinten painamista ja antaa tietyn koodin kaapelia pitkin tietokoneelle näppäimistön tilan muuttuessa. Taskulaskin on ensimmäisiä sulautetun järjestelmän keksintöjä. Siinä laskemista, näppäimistöä ja näytön päivitystä valvoo mikro-ohjain.
Nykyaikaisessa autossa (ks. kuva 1.1) on useita mikro-ohjaimia erilaisiin toimintoihin: ABS-jarrut, digitaaliset mittarit, luistonesto, vakionopeussäädin, aktiivijousitus, elektroninen poltto aineen ruiskutus ja sytytysyksikkö, murtohälyttimet sekä ajonestojärjestelmä. Elektroninen ajonesto koostuu kahdesta ohjaimesta, joista toinen on lukossa ja toinen avaimessa. Pistettäes sä avain lukkoon se lähettää koodin bittivirtana, jonka lukon mikro-ohjain tunnistaa.
Kuva 1.2. Elektroniikka- ja sähköalan vienti suhteessa muihin teollisuusaloihin.
Kuva 1.3. Elektroniikan- ja sähköalan tuotanto Suomessa vuonna 1994.
Elektroniikka- ja sähköalan vienti on kasvanut ohi tuonnin (ks. kuvat 1.4 ja 1.5) ja kehityksen katsotaan jatkuvan samanlaisena. Tämä jo osaltaan kertoo alan terveestä tilasta ja kilpailuky vystä. Suomalaisten valtteja ovat korkea koulutus- ja teknologiataso. Vienti on kasvanut moninkertaiseksi 80-luvusta ja ennusteet näyttävät kasvua myös tulevaisuudessa.
Kuva 1.4. Vienti elektroniikka- ja sähköalalla.
Kuva 1.5. Tuonti elektroniikka- ja sähköalalla.
Kuva 1.6. Teollisuuden työvoima.
Elektroniikka- ja sähköalan kasvu näkyy kuitenkin työmarkkinoiden kehityksessä verrattaessa alan työvoimaa muuhun teollisuuteen (ks. kuva 1.7).
Kuva 1.7. Elektroniikan- ja sähköalan työvoiman osuus teollisuuden työvoimasta.
Taulukko 1.3. Matkapuhelimen ohjelmiston koon kehittyminen.
Ohjelmistoprosessin tärkein ominaisuus on se, miten tehokkaasti hallitaan asiakaskohtainen tuotteiden generointi. Tämä edellyttää ohjelmistolta arkkitehtuuriratkaisua, jonka puitteissa automatisoitu tuoteominaisuuksien tuottaminen on mahdollista. Yritykset kehittävätkin lisään tyvästi vakioalusta-arkkitehtuureja, joiden pohjalta asiakaskohtaiset toimitukset ovat mahdolli sia.
Sulautettujen järjestelmien ollessa vaativia luotettavuuden ja virheettömyyden suhteen, suurim man osan tuotteen kehitysajasta vie ohjelmistojen testaaminen. Paljon panostetaan myös ohjel mistojen spesifiointiin käyttämällä visuaalisia, havainnollisia esitystapoja. Näin saadaan hyvä kokonaiskuva laitteen toiminnasta. Hyvissä ajoin tiedetään ohjelman kriittisimmät alueet, joihin panostetaan enemmän.
Vuonna 1994 ohjelmistohenkilöstön määrä elektroniikka ja sähköalan yrityksissä oli suhteelli sen pieni, vain 2500 henkilöä. Tämä on noin 9% koko alan henkilöstöstä. Eniten ohjelmisto työtä tehdään tietoliikennesektorilla, jossa ohjelmistotyötä teki yli 2100 henkilöä eli noin 29% henkilöstöstä. Ohjelmistotyötä tekevän henkilöstön määrä Suomen elektroniikka- ja sähköalan teollisuudessa vuosina 1993 ja 1994 on esitetty taulukossa 1.4.
Taulukko 1.4. Ohjelmistotyötä tekevä henkilöstö elektroniikka- ja sähköalan teollisuudessa.
Tyypillisessä sovellutuksessa mikro-ohjaimella korvataan joukko erilliskomponentteja halvem min kustannuksin. Myös tilaa kuluu vähemmän. Lisäetuna on käytön joustavuus, sillä samaa piiriä voidaan käyttää erilaisiin sovellutuksiin ohjelmaa muuttamalla. Mikro-ohjaimella toteute taan useimmissa tapauksissa melko yksinkertaisia ohjaustehtäviä, kuten ajastuksia, näyttöjen ohjausta ja signaalin muokkausta. Tarkemmin mikro-ohjaimen rakenteeseen syvennytään luvussa 3 Intelin 8051-ohjainta tutkimalla [46].
Ensimmäiset mikro-ohjaimet suunniteltiin ja valmistettiin 80-luvun alussa. Kuitenkin tekniikka, joka mahdollisti mikro-ohjaimen syntymisen, on paljon vanhempaa. Mikro-ohjaimen syntyhistoria voidaankin rinnastaa yleisemmin tietotekniikan ja mikroprosessoreiden kehityk seen. Tämä luku perustuu lähteisiin [17], [25] ja [44]. Tietokoneen esivaiheena pidetään 1800-luvun puolivälissä Charles Babbagen rakentamaa mekaanista, ohjelman ohjauksella toimivaa matematiikkakonetta. Ensimmäinen elektroninen tietokone ENIAC valmistui Pennsylvanian yliopistossa vuonna 1946. Nykyisen tietokonearkki tehtuurin perustana voitaneen pitää Cambridgen yliopistossa 1949 valmistunutta EDSAC-konetta ja samaisessa yliopistossa unkarilaissyntyisen matemaatikon John von Neumannin kehittämää Princeton-konetta. Ensimmäiset tietokoneet rakennettiin yliopistoissa pyrittäessä ratkaisemaan laajoja numeerisia tehtäviä, eikä niillä aluksi nähty olevan kaupallista merkitystä. Ensimmäisen kaupallisen tieto koneen markkinoille toi Remington Rand Corporation vuonna 1951. Pari vuotta sen jälkeen sittemmin tietokonealan valtayhtiöksi kasvanut IBM toi markkinoille oman kaupallisen tuot teensa IBM 701:n. Mullistuksen tietotekniikassa sai aikaan IC-tekniikan (eng. integrated circuit) kehittyminen ja ensimmäisen MOS-tekniikalla (eng. metal oxide semiconductor) valmistetun dynaamisen RAM-muistipiirin valmistaminen vuonna 1970. Samoihin aikoihin rakennettu laskimissa käy tetty Intelin 4004-mikropiiri on myös yksi kehityksen kulmakivistä. Kaksi vuotta myöhemmin, vuonna 1972, Intel kehitti maailman ensimmäisen varsinaisen mikroprosessorin. Intelin 8008-prosessorin saama julkisuus vauhditti tietotekniikan kehitystä yleisen mielenkiinnon herätessä. Mikroprosessorin eri kehitysvaiheet esitetään taulukossa 2.1.
70-luvun puolivälin jälkeen teollisuuden ohjausjärjestelmien tarpeet, siis ammattilaisten tarpeet, ja mikrotietokoneharrastajien tarpeet alkoivat erilaistua. Harrastelijoille alettiin kehittää erilai sia massamuisteja ja valmiita mikrotietokoneita, nykyisten mikrojen esiasteita. Ensimmäisiä massamuisteja olivat erilaiset magneettinauhat.
Mikro-ohjaimet ovat teollisuuden ohjaustekniikan kehityksen tulos. Intelin kehittämä 4-bitti nen 8048-mikro-ohjain oli tarpeeksi pieni sisällytettäväksi pieniinkin mekaanisiin laitteisiin. Lisäksi sen virrankulutus oli suhteellisen vähäistä aikaisempaan tekniikkaan verrattuna. Todel linen läpimurto mikro-ohjainten kehityksessä oli ensimmäisten 8-bittisten ohjainten valmistami nen. Taas Intel ehti ensimmäisenä 8051-mikro-ohjaimellaan vuonna 1981. 8-bittisissä ohjaimis sa oli tarpeeksi muistiavaruutta ja tehoa hoitamaan monimutkaisempiakin tehtäviä. Mikro-ohjaimet alkoivat vallata uusia markkinoita ja niitä alkoi pian löytyä kuluttajaelektroniikasta ja jopa leluista.
Ero mikro-ohjaimen ja mikroprosessorin välillä on nykyaikana häilyvä. Mikroprosessorissa on piirilevyllä komponentteja, jotka mikro-ohjaimessa on sulautettu yhteen piiriin. Tällaisia kom ponentteja ovat mm. muistit, ajastimet, keskeytykset ja erilaiset liitännät. Jaottelu ei kuitenkaan ole yleispätevä, sillä poikkeuksiakin löytyy. Monet mikroprosessorit on jo rakennettu yhteen siruun noudattaen mikro-ohjaimen ajatusta. Tällaisia prosessoreja ovat mm. Motorolan 86EC300, Intelin 386 EX ja IBM:n PowerPC 403GB [7].
Mikroprosessoreja käytetään edelleen sulautetuissa järjestelmissä ja teollisessa ohjauksessa tarvittaessa laajempaa muistiavaruutta ja nopeutta. Suosittuja mikroprosessoreja ovat mm. Intelin 80186, Zilogin Z86 ja Motorolan 68000 [7].
Muita mikro-ohjainperheitä ovat esimerkiksi National Semiconductorin COP800, SGS-Thom sonin ST62, Texas Instrumentsin TMS370, Zilogin Z86, Hitachin H8 ja Microchip Technolo gyn PIC [46].
Kuva 2.1. DSP-järjestelmän yleinen rakenne ja toiminta.
Intelin 2920-suorittimen jälkeen DSP-tekniikkaa on kehitetty eteenpäin huimalla vauhdilla. Muita valmistajia ovat mm. Texas Instruments, IBM, Analog Devices, Motorola, NEC, STL, AT&T ja Inmos. Näistä Texas Instrumentsin tuotteet ovat suosituimpia. Tämä osuus perustuu lähteisiin [2], [7], [20], [35], [36] ja [45].
Monesti signaaliprosessori voidaan korvata myös rakentamalla tarvittavaan tehtävään digitaali nen piiri. Tämän ns. "hardwired"-ratkaisun etuna on tietenkin nopeus, kun tarvittavat algorit mit on ohjelmoitu piiritasolle. Haittana on uudelleenohjelmoitavuuden menetys sekä kalliit suunnittelukustannukset. Yleisenä sääntönä voitaisiin sanoa, että tuotettaessa massatuotantoon signaaliprosessoreja piiritason ratkaisut ovat edullisia. Tämä voidaan yleistää koskemaan myös mikro-ohjaimia. Digitaalisen piirin suunnittelun viemä aika ja hinta ovat pieniä suhteutettuna koko tuotannon ja myynnin budjettiin. Monesti on kuitenkin edullisempaa käyttää valmista signaaliprosessoria ja rakentaa sille ohjelma, jolloin saadaan aikaan haluttu tuote. Etenkin tuotteen vaatiessa ohjelmoitavuutta piiritason ratkaisu muodostuu helposti kohtuuttoman hankalaksi.
Signaaliprosessorin arkkitehtuuri on optimoitu laskentaa varten, joten ohjaustoimintojen toteuttaminen sillä vaatii paljon koodia ja täten myös muistia. Lisäksi suuri koodin määrä syö signaaliprosessorin suorituskapasiteettia ja aiheuttaa näin nopeusvaatimuksia. Tämän vuoksi DSP-suorittimen sisällyttäminen ohjaimeen on monesti kannattavempaa.
Vaikka DSP-tekniikka vaatii normaalisti A/D- ja D/A-muuntimet mukaan järjestelmään, niitäei integroida mukaan piiriin. Tämä johtuu siitä, että ko. muuntimia on monia eri malleja ja ne poikkeavat paljon toisistaan. Sovellutuksen tekijälle jätetään siis vapaus valita parhaiten järjes telmään sopiva muunnin.
Algoritmien kehittämisessä on tiedettävä, mitä matemaattisia menetelmiä voi käyttää kohteena olevassa sovelluksessa ja osattava valita optimaalisin useasta vaihtoehdosta. Lisäksi on hallitta va laskentatarkkuuteen vaikuttavat tekijät ja vältettävä ylivuotoja, mikä ei ole monestikaan yksinkertaista. Lopuksi on osattava kuvata laskentamenetelmä jollakin ohjelmointikielellä. Kuten mikro-ohjaimissakin (ks.luku 5.1), signaaliprosessorien suosituimmat ohjelmointikielet ovat assembler, C ja C++.
Testaus, jolla pyritään varmistamaan, että algoritmi todella toimii halutulla tavalla, on yleensä erittäin aikaavievä vaihe. Algoritmien mallintamiseen ja testaukseen on tarjolla erittäin tehok kaita työkaluja, jotka tyypillisesti maksavat useita kymmeniä tuhansia markkoja. Näin suuri investointi on kannattavaa vain suurissa projekteissa. Tilanteesta riippuen parempi vaihtoehto voi olla testatun ja käyttövalmiin algoritmin ostaminen alalle erikoistuneilta yrityksiltä [45].
Mikro-ohjainten kauppa on valtavaa ja siinä pyörii isot rahat. DataQuestin tutkimuksen mu kaan pohjoisamerikkalaisessa perheessä on keskimäärin 35 mikro-ohjainta. Vuonna 2000 niitä on arvioitu olevan 240 taloutta kohdin. Mikro-ohjainten myyntiä nyt ja tulevaisuudessa esitel lään taulukossa 2.3 [7].
Taulukko 2.3. Mikro-ohjainten myynti nyt ja tulevaisuudessa.
Kuva 3.1. 8051-mikro-ohjaimen rakennekaavio.
Eri ohjainmuunnokset voivat erota paljonkin alkuperäisestä. Esim. 8751-ohjaimessa on 4k EPROM-muisti. Siten se on hieman kalliimpi kuin 8051 ja sitä käytetäänkin pääasiassa ohjel miston testaamiseen. Lopullinen versio asennetaan sitten esimerkiksi 8051-ohjaimeen, joka on taloudellisesti kannattavampi vaihtoehto massatuotannossa. 8031-ohjaimessa ei ole lainkaan si säistä ohjelmamuistia, vaan se käyttää mahdollisesti ulkoista aina 64 kilotavuun saakka. Tätä piiriä käytetään, jos tarvitaan enemmän muistia kuin 8051-ohjain tarjoaa.
Erilaisia 8051-muunnoksia rakentavat Intelin lisäksi Hitachi, Siemens, AMD, Dallas, Philips, Atmel, Matro, SMC, SSI ja OKI. Näistä Philipsillä on eniten erilaisia ohjainmuunnoksia. Esimerkiksi Atmel 89c1051 on markkinoiden pienin ohjain 20 milliamperin tehonkulutuksella. Dallasilta taas löytyy nopeimmat ohjaimet aina 10 MIPS suoritustehoon saakka (DS80c320, DS87c520, DS87c530) [46].
8051-arkkitehtuurin osuus kahdeksanbittisistä mikro-ohjaimista maailmalla oli 28 prosenttia vuonna 1993 ja se on eniten myyty yksittäinen mikro-ohjain. Se on edelleen runsaasti käytetty erilaisissa yksinkertaisissa sovelluksissa monipuolisuutensa (useita ohjainmuunnoksia eri tarkoituksiin), yhteensopivuutensa, ohjelmisto- ja laitetukensa sekä halpuutensa takia [33, 46].
Luku perustuu pääasiassa lähteisiin [4], [7], [8], [12-15], [33], [38] ja [46]. Luku 3.8 perustuu myös lähteeseen [23].
Kuva 3.2. 8051-ohjaimen nasta- ja logiikkakaavio (oikeanpuolinen).
VCC: 8051-ohjaimen virtalähde.
VSS: Sirun maapotentiaali (eng. ground potential).
Portit 0-3: 8051-ohjaimessa portteja käytetään normaalin I/O-liikenteen lisäksi erilaisiin erikoistoimintoihin. Portteja 0 (P0.0-P0.7) ja 2 (P2.0-P2.7) käytetään osoittaessa ulkoista muistia ja portti 3 (P3.0-P3.7) sisältää erilaisia erikoislippuja, joilla ohjataan ulkoisia keskeytyksiä, ajastimia ja laskureita. Portteja 0, 1 (P1.0-P1.7) ja 2 käytetään myös ohjelmointi- ja tarkastusportteina.
RST/Vpd: Tästä nastasta tapahtuu järjestelmän nollaus (eng. reset) ohjattaessa nollasta ykköseen (n. 3 voltin muutos). Tällöin keskusyksikkö asetetaan alkutilaan. Vpd syöttää RAMille virtaa silloin, jos Vcc-jännite on tippunut alle +5V. Normaalistihan RAMia syötetään Vcc:n kautta. Näiden kahden jännitepinnin välille tarvitaan vain kondensaattori, jotta saataisiin nollaus kytkettäessä jännite järjestelmään.
ALE/PROG: Normaalissa käytössä ALE:lla (eng. address latch enable) lukitaan osoite ulkopuoliseen muistiin. Samaan pinniin tuodaan ohjelmoitaessa ohjelmointipulssi.
PSEN: PSEN (eng. program store enable) kytkee ulkoisen ohjelmamuistin väylälle. Tällöin ohjelmamuistialue alkaa sisäisellä ja jatkuu ulkoisella ROM-muistilla. Jos halutaan suoraan alussakin osoittaa ulkoiseen ROMiin tulee PSEN kytkeä käyttöjännitteen maahan.
EA/VDD: EA (eng. effective address) kytkettynä 8051 suorittaa käskyjä sisäisestä ROM-tai EPROM-muistista, jos ohjelmalaskurin (eng. program counter, PC, ks. kuva 3.1) arvo on alle 4096. Maapotentiaaliin kytkettynä 8051 hakee käskyt ulkoisesta PROMista. Tähän nastaan tuodaan myös 21V:n polttojännite EPROMia ohjelmoitaessa.
XTAL1 ja XTAL2: Näitä nastoja käytetään lähinnä ohjaimen sisäisessä ajastuksessa (heilurissa). XTAL tulee englanninkielisestä sanasta "crystal" eli kide.
Aritmeettislooginen yksikkö nimensä mukaisesti pystyy tekemään aritmeettisiä ja loogisia operaatioita 8-bittisille muuttujille. Aritmeettisiä operaatioita ovat mm. yhteen-, vähennys-, ja ko- ja kertolasku. Loogisia operaatioita ovat mm. AND, OR ja XOR.
Sisäinen ohjelmamuisti (eng. internal program memory) sijaitsee ROM- tai EPROM-piireillä. Sitä osoitetaan 16-bittisillä osoitteilla, kun taas 128-256 tavun sisäiseen datamuistiin (riippuu piirityypistä) riittää 8-bittinen osoitus. Tämä tekee siitä nopean muistitilan keskusyksikön ol lessa 8-bittinen.
Sisäisten muistien lisäksi voidaan asentaa aina 64 kilotavuun saakka ulkoista ohjelma- ja datamuistia. Nämä muistit käyttävät samaa osoite- ja data-väylää, mutta niillä on erilaiset ohjaussignaalit. Se, miten 64 kilotavua ohjelmamuistia on jaettu sisäiseen ja ulkoiseen, riippuu piirityypistä. 8051-ohjaimessa on 4k sisäistä ROM-muistia ja 60k ulkoista.
Ulkoista ohjelmamuistia osoitetaan aina 16-bittisellä osoituksella, kun taas ulkoista datamuistia osoitetaan joko 16- tai 8-bittisesti. 8-bittisessä osoituksessa ulkoinen datamuisti on jaettu sivuihin, jotka ovat 256 tavun kokoisia. Kuva 3.3 esittää käsitellyt muistiosat.
Kuva 3.3. 8051-ohjaimen muistiavaruus.
Rekisterinimen alapuolella olevat 8-bittiä näyttävät rekistereiden alkutilan.
Kuva 3.4. Erikoisrekisteri.
A-rekisteriin eli akkuun (eng. accumulator, ACC) tallennetaan laskutoimitusten välivaiheet ja tulokset myöhempää käsittelyä varten. B-rekisteriä käytetään mm. kerto- ja jakolaskuissa.
Monet keskusyksikön toiminnot asettavat päälle erilaisia lippuja (eng. flag) tai toiminnot riippuvat siitä, mitä arvoja lipuilla milloinkin on. Nämä liput on koottu tilarekisteriin (eng. program status word, PSW, ks. kuva 3.5). Käytetyin on muistilippu (eng. carry flag), mikä mahdollistaa aritmeettiset lisäys-, vähennys- ja pyöristysoperaatiot. Tilarekisterillä valitaan myös käytettävä rekisteripankki (eng. register bank).
Pinorekisteri (eng. stack pointer, SP) on 8-bitin pino-osoitinrekisteri. Se sisältää pinorekisterin alkuosoitteen eli viimeksi tallennetun muistipaikan osoitteen.
Dataosoitin (eng. data pointer, DPTR) koostuu kahdesta eri tavusta DPH (eng. high byte) ja DPL (eng. low byte), joita käytetään epäsuorassa rekisteriosoituksessa. Se pystyy siis osoittamaan 16-bittisiä osoitteita, tai sitä voidaan käyttää kahtena erillisinä 8-bittisenä rekisterinä.
P0-P3 ovat 8-bitin I/O-portteja (yhteensä 32 I/O-linjaa). Jokainen näistä porteista on osoitettavissa tavu- tai bittikohtaisesti. Portteja P0 ja P2 käytetään myös 8051:n muistilaajennukses sa, jolloin P3 toimii kontrolliporttina ja P1 palvelee I/O:ta.
Keskeytysten prioriteettirekisterin (eng. interrupt priority register, IP, ks. kuva 3.13) biteillä määrätään haluttu keskeytystaso. Keskeytysten sallintarekisterin (eng. interrupt enable register, IE, ks. kuva 3.12) biteillä voidaan sallia tietyt keskeytykset mielivaltaisesti tai kaikki yhdessä.
SBUF (eng. serial data buffer) on itseasiassa kaksirekisterinen sisältäen lähetys- tai vastaanottopuskurirekisteri (eng. transmit buffer register, receive buffer register). Kun dataa siirretään rekisteriin, se menee lähetyspuskuriin, jossa sitä säilytetään sarjalähetykselle. Kun dataa siirretään SBUF:sta, se tulee vastaanottopuskurista.
Ajastinrekisteriparit (TH0, TL0) ja (TH1, TL1) ovat 16-bittisiä rekistereitä ajastimien jalaskureiden käyttöön.
Ohjainrekisterit TMOD (eng. timer/counter mode control register, ks. kuva 3.6), TCON (eng. timer/counter control register, ks. kuva 3.7), SCON (eng. serial port control register, ks. kuva 3.9) ja PCON (eng. power control register, ks. kuva 3.10) sisältävät ohjaus- ja tilabittejä keskeytysjärjestelmille, ajastin/laskureille ja sarjaportille.
Ohjelmistopakettien koostumus vaihtelee, mutta useimmiten työkaluihin kuuluu jonkinlainen C-kääntäjä, lähdekirjasto, assembler-kääntäjä, ohjekirjat, ohjelman virheiden jäljittäjä (eng. debugger) ja integroitu editori, jolla voi työskentelyn eri vaiheita ohjata. Lisäominaisuuksia ovat simulaattorit, sisäiset debuggerit ja emulaattorit. Parhaimmat paketit tukevat monia eri mikro-ohjaimia ja niiden eri versioita. Tällöin enemmän mikro-ohjainten parissa työskentelevän ei tarvitse opetella useampia ympäristöjä.
Ohjelmiston kehityksessä käytetty tietokone on useimmiten PC ja käyttäjärjestelmä Dos tai Windows. Kehitysympäristöjä on kuitenkin suunniteltu myös MacIntoshille, Sun-työasemille ja HP-Unix-ympäristöihin. Esimerkiksi MacIntosh käyttää Motorolan valmistamia prosessoreja ja erikoisuutena koneelle löytyykin valmiit emulaatiomahdollisuudet joidenkin 68-tyypin Motoro lan mikro-ohjainten kanssa.
ProView-ympäristön hinta karsii mahdolliset harrastelijat käyttäjäkunnastaan. Koko ohjelmisto laitteistoineen maksaa lähes 20 000 markkaa [6].
Kuva 4.1. ProView-työkalu 8051-mikro-ohjaimelle.
Kuva 4.2. Sulautettujen ja tosiaikaisten järjestelmien kehityssimulaattori ESIM.
Luku ei pyri olemaan kattava esitys asiasta, vaan ohjelmointiin syvennytään tarkastelemalla muutamia yksityiskohtia. Tässä ei myöskään tulla käsittelemään teoreettisia tosiaikaisten tai sulautettujen järjestelmien ohjelmointimalleja. Lähde [4] antaa lisätietoa aiheesta kiinnostuneil le.
Luku perustuu lähteisiin [4], [7-8], [21] ja [23-24].
Assembler-kielinen ohjelma on pieni ja nopea. Ohjelmoijalla on täysi hallinta siitä, mitä ohjai messa tapahtuu. Tietenkin voidaan kirjoittaa huonoakin assembler-koodia. Assembler-kieli ei voi korjata inhimillisiä erehdyksiä, saati epäpätevää ohjelmointia.
Assembler-kielen opetteleminen on kuitenkin vaivan arvoista. Se on paras ja varmin tapa oppia ymmärtämään mikro-ohjaimen "sielu". Assembler-kielen ongelmana on ohjainkohtaisuus, jolloin ohjelmiston muuttaminen erityyppiseen ohjaimeen on vaikeaa ja kallista [4].
Basicin suosio perustuu sen yksinkertaisuuteen, helppolukuisuuteen ja tietenkin siihen, että lähes jokainen ohjelmoija on joskus kokeillut Basic-kieltä aloittaessaan tietokoneiden kanssa puuhastelun. Basic-kieltä pidetään usein hitaana. Tämä voidaan monesti kiertää kirjoittamalla parempaa koodia ja käyttämällä erilaisia ohjelmointitekniikoita. Usein kuitenkin hitaus onhinta, jonka joutuu maksamaan tulkin käytöstä.
Forth-kielinen koodi on lähes yhtä nopeaa kuin assembler-kielinen. Kielen opettelu on kuiten kin hankalaa, koska se on vaikeaselkoista lukea.
Tulkkien etuna on vuorovaikutteinen ohjelman rakentaminen. Voidaan kirjoittaa pätkä koodia ja kokeilla heti, miten se toimii. Kun ohjelma toimii halutulla tavalla, voidaan sitä kasvattaa uusilla toiminnoilla.
C-kieli on suosituin ja käytetyin kääntäjä. Basic-kieliset kääntäjät ovat harrastajien suosimia, mutta kaupalliset sovellutukset tuskin niitä käyttävät. Intelin PL/M-kieli on myös jonkin verran käytössä maailmalla, koska yhtiö käyttää sitä paljon. PL/M-kieli oli yksi ensimmäisistä korkeamman tason kääntäjistä mikro-ohjaimille.
Koska Basic-kieli oli hidas ja toisaalta kuitenkin hyvin suosittu, oli odotettavissa, että siihen kehitetään kääntäjä. Suoritusnopeus kasvaa huomattavasti verrattuna tulkki-perustaiseen Basic-kieleen. Tämä johtuu siitä, että mikro-ohjaimen ei tarvitse enää tulkata saatuja komento ja. Koodi on valmiiksi sen suoraan ymmärtämää konekieltä.
Käännetty Forth-kieli lähenee (tai joskus jopa ohittaa) kääntäjiä nopeudessa ja Forth-kääntäjät ovat siten erittäin nopeita. Ongelma on kuitenkin sama kuin tulkatussa Forthissa eli vaikeasel koisuus.
C-kieli on tällä hetkellä suosituin myös mikro-ohjainten ohjelmoinnissa. Se on paljon käytetty, helppo saada (jopa ilmaiseksi), voimakkaasti tuettu ja se tuottaa melko tehokasta koodia.
Sisäisen muistin käyttö on hyvin nopeaa, koska se on 8-bittistä. Harvoin kuitenkaan voidaan pelkästään tyytyä sen käyttöön sen pienen koon takia, vaan joudutaan turvautumaan ulkoiseen datamuistiin.
Ulkoista datamuistia voi olla aina 64 kilotavuun saakka. Tätä ei kuitenkaan aina välttämättä käytetä pelkästään muistina, sillä sovellutuksen laitteistoa saatetaan ohjata tämän muistialueen avulla. Tällöin esimerkiksi jokin muistipaikka ulkoisessa datamuistissa ohjaa tiettyä laitteen toimintaa. Yksinkertaisin tapaus tietenkin laitteen käynnistäminen (muistipaikan arvo yksi) tai sammuttaminen (muistipaikan arvo nolla). Tätä tekniikkaa nimitetään muistikartoitetuksi I/O:ksi (eng. memory-mapped I/O).
Taulukko 5.1. C51-kielen datatyypit.
Datatyypit bit, sbit, sfr ja sfr16 eivät ole standardi-C:n mukaisia datatyyppejä ja niihin ei voida osoittaa osoittimilla. Näistä kahta jälkimmäistä käytetään manipuloitaessa erikoisrekisterien arvoja 8051-ohjaimessa.
Seuraavassa on esimerkkejä datatyyppien käytöstä:
int bdata omal; /* bitti-muunnettava integer-muuttuja */ sbit omabit0 = omal ^ 14; /* 14:sta bitti omal-muuttujasta */ sfr P0 = 0x80; /* muuttuja P0 osoittaa osoitteeseen 0x80, mikä on portti 0 (ks. kuva 3.4) 8051-ohjaimessa */ sfr16 T2 = 0xCC; /* 8052-ohjainmuunnoksessa on 16-bittinen struct rakenne { bit lippu; char input; char output; char data[100]; /* sadan 8-bitin paikan taulukko */ }; |
Taulukko 5.2. C51-kielen muistityypit.
Seuraavassa on esimerkki muistityypeistä ja miten ne muotoillaan ohjelmoitaessa:
char data kirjain; char code text[50]="Anna parametri:"; unsigned long xdata taulukko[200]; float idata x,y,z; unsigned int pdata laskuri; unsigned char xdata vektori[10][4][4]; char bdata liput; |
Erikoisrekisterin arvoja manipuloidaan C51:ssä muuttamalla <reg51.h>-kirjastossa määritelty jä vakioita. Tässä tiedostossa on kaikki erikoisrekisterin rekisterit kuvattuna symbolisesti. Arvot alustetaan tai muutetaan pääohjelmassa.
Alla on lyhyt esimerkki erikoisrekisterin arvojen manipuloinnista:
#pragma DEBUG CODE #include <stdio.h> /* C-kielen standardikirjasto */ #include <reg51.h> /* sisältää 8051 erikoisrekisterin määritykset */ void main(void) { SCON=0x50; /* SCON: tila 1, 8-bitin UART, mahdollista vastaanotto */ TMOD=0x20; /* TMOD: ajastin 1, tila 2, 8-bitin lataus */ TH1=0xf3; /* TH1: 2400 baudin lataus */ TR1=1; /* TR1: käynnistetään ajastin 1 */ TI=1; /* TI: asetetaan TI lähettämään ensimmäinen kirjain UART:lle */ printf("Tässä tulee sarjaporttiin tekstiä!\n"); while (1); } |
C51-kielessä voidaan määrittää osoittimia (eng. pointers) joko normaaliin tapaan (standardi-C), tai määrittämällä muistityypin (C51). Jälkimmäinen osoitustapa on nopeampaa, koska sevaatii vain yhden- (idata, data, bdata ja pdata) tai kaksi tavua (code ja xdata). Normaalissa osoittimien käytössä osoittimet vaativat aina 3 tavua tilaa. Ero nopeuksissa johtuu siitä, että ohjaimen sisäinen väylä on 8-bittinen, eli se kuljettaa yhden tavun kerrallaan.
Seuraavassa on esimerkki erilaisesta osoittimien muodostamisesta:
char *s; /* tavallinen char-8-bittinen-osoitin */ char data *str; /* sisäiseen ohjelmamuistiin (data) osoittava osoitin */ |
SMALL-tilassa kaikki muuttujat sijaitsevat oletuksena 8051-ohjaimen sisäisessä datamuistissa (ks. luvut 3.4 ja 5.2.2). Tämä vastaa siis tilannetta, missä kaikki muuttujat alustetaan käyttäen data-muistityyppiä. Sisäinen datamuisti on nopeinta, mutta rajoittavana tekijänä on muistin pieni koko (128 tavua). Tästä johtuen SMALL-tilaa tulisi käyttää vain, kun ohjelmoidaan hyvin pieniä ohjelmia.
COMPACT-tilassa muuttujat sijaitsevat oletuksena ulkoisessa datamuistissa, aivan kuin ne olisi alustettu käyttäen pdata-muistityyppiä (ks. luku 5.2.6). Muistityyppi voi varata tilaa vain 256-tavulle, koska pystytään osoittamaan vain ensimmäistä ulkoisen datamuistin sivua. Tämä muistityyppi ei ole yhtä nopeaa kuin SMALL-tila, mutta kuitenkin tehokkaampi kuin LARGE-tila.
LARGE-tila vastaa xdata-muistityypin käyttöä, eli pystytään sijoittamaan muuttujia koko ulkoisen muistin alueelle. Ulkoista muistia voi olla ohjaimesta riippuen aina 64 kilotavuun saakka. Koska muistinosoituksessa joudutaan käyttämään 16-bittistä DPTR-rekisteriä (ks. luku 3.4.1) on tämä tila hitain ja tuottaa eniten koodia.
Muuttujat voidaan pakottaa C51-kielessä tiettyihin muistipaikkoihin muistiavaruudessa. Täl löin muuttuja määritellään seuraavasti:
datatyyppi[muistityyppi]muuttujan nimi_at_muistipaikka
Esimerkiksi määritellään char-tyyppinen 8-bitin str-muuttuja sisäiseen datamuistiin kohtaan 0002h:
char data str _at_ 0x0002; |
Tavu tai sana voidaan lukea (tai kirjoittaa) tietystä muistipaikasta käyttämällä valmiita makroja CBYTE, CWORD, DBYTE, DWORD, PBYTE, PWORD, XBYTE ja XWORD. Makrojen ensimmäinen kirjain kertoo mitä muistityyppiä luetaan (ks. luku 5.2.6). Seuraava esimerkkialiohjelma on makrojen käytöstä:
/****************************************************************************** Aliohjelma asettaa halutun tavun kokoisen muistipaikan bitin päälle ulkoisessa datamuistissa. Tulokset kirjoitetaan mahdolliseen terminaaliin ohjelman testausta varten. Aliohjelman parametrit: unsigned int address muistipaikan osoite (ulkoinen datamuisti) unsigned int bitt mones bitti halutaan asettaa päälle ******************************************************************************/ void setbit(unsigned int address, unsigned int bitt) printf("setbit(0x%x, %d), address(0x%x)=0x%x, ", address, bitt, address, XBYTE[address]); /* tässä luetaan osoitteen sisältö */ printf("new value=0x%x\n", XBYTE[address]|=(1 << (bitt-1))); /* asetetaan osoitteelle uusi arvo */ } |
#pragma LARGE /* oletuksena LARGE-muistimalli */ #include <stdio.h> extern alien double plm_func(int, int); /* määritellään "vieras"-aliohjelma */ int calc (const int *a,const int *b) small reentrant /* tässä funktiossa käytetään SMALL-muistimallia */ { int i, result; for (i=0;i<100; i++) result+=plm_func(a[i], b[i]); /* kutsutaan PL/M-funktiota */ return result; } |
8051-ohjaimilla on 4 rekisteripankkia, joissa jokaisessa on kahdeksan tavunkokoista rekisteriä. Nämä asetetaan päälle kahdella PSW-rekisterin bitillä (ks. kuva 3.5). Normaalisti keskusyksikkö käyttää rekisteripankkeja laskutoimituksissa apumuistipaikkoina. Ohjelma käyttää oletuksena ensimmäistä rekisteripankkia. Muita rekisteripankkeja tulee osata käyttää suunniteltaessa kes keytyksiä. Tällöin asetetaan yksi rekisteripankki palvelemaan normaalia ohjelmistoa ja loput kolme keskeytyksiä niiden lukumäärästä riippuen. Rekisteripankin valinta tapahtuu käyttämällä using-attribuuttia.
Keskeytysten käyttäminen (ks. luku 3.8) on mikro-ohjainten ohjelmoinnissa hyvin oleellista ja C51-kieli tarjoaa helpon tavan rakentaa niitä. Ohjelmoija voi rakentaa aliohjelmat, jotka ajetaan tietyn keskeytyksen tapahduttua, käyttämällä interrupt-attribuuttia aliohjelma määrittelyssä. Ainoa mistä tarvitsee tämän jälkeen huolehtia, on keskeytyksen asettaminen päälle erikoisrekis terin lipuilla sekä huolehtiminen oikeiden rekisteripankkien käytöstä. Kuten aikaisemmin mainit tiin, keskeytysten aliohjelmarutiinien täytyy käyttää muuta rekisteripankkia kuin muun ohjelman. Huomattavaa on myös, että keskeytysten aliohjelmarutiinit eivät saa kutsua niihin kuulumatto mia osia. Päinvastainen ei ole myöskään sallittua.
Alla on listaus keskeytyksen ja rekisteripankkejen käytöstä (käytetyt erikoisrekisterejen tilat voi kerrata kuvista 3.6, 3.7, 3.9, 3.10, 3.12 ja 3.13). Ohjelma kirjoittaa tekstin sarjaporttiin kymme nen sekunnin välein:
#pragma DEBUG OBJECTEXTEND SMALL #include <stdio.h> /* standardikirjasto */ #include <reg51.h> /* erikoisrekisterin määritykset */ unsigned int calc=0; /* määritellään globaalit muuttujat */ bit flag=0; #pragma REGISTERBANK (1) /* ajastin 1 keskeytyksen käyttöön rekisteripankki 1 */ void timer1(void) interrupt 3 using 1 { calc++; if (calc > 40000) flag=1; /* 10 sec = 40000 * 250 usec kierros */ } #pragma REGISTERBANK (0) /* pääohjelma käyttää rekisteripankkia 0 */ int main(void) { SCON = 0x50; /* sarjaportti: tila 1, 8-bit UART, mahdollistetaan vastaanotto */ PCON = 0x00; /* asetetaan 9.6k modulointinopeus ja 12 Mhz taajuus */ TI = 1; /* asetetaan TI lähettämään ensimmäinen bitti UART:lle */ TMOD = 0x20; /* timer 1, tila 2 */ TH1 = 0xfd; /* 9.6k modulointinopeus */ TR1 = 1; /* käynnistetään timer1 */ ET1 = 1; /* asetetaan päälle timer1 keskeytys */ EA = 1; /* asetetaan päälle globaali keskeytys */ while (1) if (flag) { printf ("Kymmenen sekunttia kulunut!\n"); /* sarjaporttiin tekstiä */ flag=0;return 0; } return 0; } |
Mikro-ohjaimet pienentyvät, nopeutuvat ja integroituvat joka vuosi lisää. Selvästi mikro-ohjaimen ja mikroprosessorin erot edelleen kaventuvat tulevaisuudessa. Mikroprosessoreja yritetään kehittää samaan tapaan pienimmiksi, vähemmän virtaa kuluttaviksi ja tehokkaimmik si. Jo nyt on markkinoilla 32-bittisiä ohjaimia, jotka ovat lähes yhtä tehokkaita kuin vastaavat mikroprosessorit. Milloinkohan on kehitetty nuppineulanpään kokoinen Pentium-tasoinen suoritin, jossa on oma virrantuotanto huoneen lämmön avulla?
Myös DSP-prosessorien kehitys on ollut huimaa. Ennusteiden mukaan tuotantoprosessi kehit tyy niin nopeasti, että DSP-prosessorin suorituskyky kaksinkertaistuu 18 kuukauden välein. Signaalinkäsittely onkin yksi nopeiten kehittyvistä moderneista teknologioista. Sen käyttö etenkin multimediassa on esimerkki uudesta nopeasti kehittyvästä alasta.
Tällä hetkellä mikro-ohjaimia ohjelmoidaan lähes pelkästään C-kielellä. On odotettavissa, että ohjainten kehittyessä on mahdollista toteuttaa ohjainsovellutuksia Delphin ja Visual Basicin kaltaisissa ympäristöissä. Niillä tuotetut ohjelmat vaativat enemmän koneresursseja, kuten muistia, ohjelmien ollessa isoja. Etuna on kuitenkin sovellutusten nopea suunnittelu ja toteu tus. Nopea ja halpa sovellutusten tuottaminen on luonnollisestikin yritysten mielenkiinnon kohteena.
Mielenkiintoista on myös nähdä mihin sumea logiikka tulee kehittymään ja miten asiantuntevaa ja monipuolista ohjaustekniikka tulevaisuudessa on. Jo nyt japanilaiset teknikot kehuvat sume an logiikan ohjauksella kulkevan metronsa liikkuvan paremmin kuin mihin ihmiskuljettaja pystyy. Montakohan vuotta menee, että autot ajavat automaattiohjauksella ilman ihmistä turvallisemmin, nopeammin ja ympäristöystävällisemmin? Ottaen huomioon tietotekniikan ja automaation hurjan kehityksen 80-luvulta 90-luvulle nämä tulevaisuuden kuvat eivät ole mitenkään epärealistisia. On sanottu, että jos auto olisi kehittynyt yhtä nopeasti kuin tietokone, se kulkisi nyt valonnopeutta polttoaineenaan vesi.
Sovellutusten suunnittelu nykyaikana vaatii korkeaa osaamista kaikissa projektin vaiheissa. Tuotteen laatu ja toimivuus ovat edellytyksiä yrityksen hyvälle maineelle ja täten kilpailukyvyl le. Tuotantoprosessia pyritään automatisoimaan ja kehittämään toimivaksi, tehokkaaksi koko naisuudeksi. Edelleenkin on yhdenmiehenyrityksiä, jotka pystyvät ansaitsemaan elantonsa kovassa kilpailussa. Erilaiset alihankkijat pystyvät pitämään yrityksensä koon pienenä. Sen sijaan suurten, monimutkaisten sovellutusten rakentaminen voi vaatia kokonaisen armeijan asiantuntijoita. Ohjelmoijan tulee, kasvavasta erikoistumisesta huolimatta, entistä paremmin tuntea koko sovellutuksen kehittämisprosessia ja sen osa-alueita pystyäkseen tehokkaastityöskentelemään osana ryhmää.
[1] Alex Baker: "MEMEC PIC Seminar 1995", seminaarijulkaisu.
[2] Andrew Bateman, Warren Yates: "Digital Signal Processing Design", Pitman Publishing, 1988.
[3] Bootstrap Institute: <http://www.etnoteam.it/bootstrap/institut.html>.
[4] Alan Burns, Andy Wellings: "Real-time systems and their programming languages", Addison-Wesley, 1989.
[5] CCC Software Professionals: "Finspin", <http://www.ccc.fi/finspin>.
[6] Franklin Software: "ProView, Integrated Development Environment", <http://www.fsinc.com>.
[7] Russ Herch: "8051 FAQ", <http://www.ece.orst.edu/~pricec/8051/faq/8051.section2.html>, 1996.
[8] Russ Hersch: "Micro Controller FAQ", <http://www.cis.ohio-state.edu/hypertext/faq/usenet/microcontroller-faq/primer/faq.html>, 1996.
[9] Hannu Heusala ja Sakari Nikkanen: "Elektroniikan perusteet VI: Mikroprosessorit", Kustannus Oy Infopress, 1977.
[10] Risto Hienonen, Aila Lehtinen: "Elektroniikka- ja sähköalan kehitysnäkymät 1995...2000", VTT Automaatio, 1995.
[11] Petri Hukki, Urpo Pakarinen: "Englantilais-suomalainen elektroniikan sanakirja", Insinöö ritieto, 1983.
[12] Intel Corporation: "83C51KB Hardware Description, Addendum to the MCS51 Micro controller Family Users Manual", <http:/www.intel.com/design/mcs51/manuals>.
[13] Intel Corporation: "Embedded Control Applications", 1988.
[14] Intel Corporation: "Embedded Controller Handbook", 1987.
[15] Intel Corporation www-home page: <http:/www.intel.com>.
[16] Pekka Isomursu, Christer Carlsson, Vesa Niskanen, Patrik Eklund: "Sumean logiikan mahdollisuudet", TEKES, 1995.
[17] Hannu Jaakkola, Olli Mertanen: "Tietotekniikan ja mikroelektroniikan käyttö Suomen teollisuudessa", Teollisuuden kustannus Oy, 1989.
[18] Hannu Jaakohuhta: "PC-Tietotekniikan käsitteet ja sanasto", Suomen Atk-Kustannus Oy, 1993.
[19] Hannu Jaakohuhta: "Suuri tietotekniikan käsitteistö ja sanasto", Suomen Atk-Kustannus Oy, 1994.
[20] Jouni Joronen: "DSP-sovellutukset esillä Kööpenhaminassa", Prosessori 8/96, s. 39-44.
[21] Hannu-Matti Järvinen: "Sulautetut järjestelmät: luentomoniste", Tampereen Teknillinen Korkeakoulu, 1996.
[22] Petteri Järvinen: "PC-tietosanakirja", Yritysmikrot Oy, 1994.
[23] Keil Software: "C51 Compiler: Optimizing 8051 C Compiler and Library Reference", 1995.
[24] Keil Software: "Getting Started", 1994.
[25] Risto Linturi, Martti Tala: "Mikrotietokone Suomessa 1973-1993", Yritysmikrot Oy, 1993.
[26] Harri Kosonen: "8051, 8032 vai 85752?", Prosessori 3/95, s. 85-87.
[27] Harri Kosonen: "Uusia muotoja-8051", Prosessori 15-16/91, s. 54-59.
[28] L. Lamesch: "64-channel logic analyser", Elektor Electronics 3/96.
[29] Malcom G. Lane, James D. Mooney: "A practical approach to operating systems", Real-Time Systems, s.611-628, Mass. Boyd & Fraser, 1988.
[30] Aarno Lehtola, Jari Jokiniemi: "Embedded and real-time systems", Finnish artificial intelligence society, symposium, 1992 Espoo.
[31] Seppo Niinioja: "Miten sumea logiikka toimii?", Prosessori 15-16/91, s.43.
[32] OEMA Ltd: "Ecal Emulator for 4, 8, 16, 32-bit micro-controllers", Elektor Electronics 6/96, s. 39.
[33] Jari Peltoniemi: "Pientä ja nopeaa", Prosessori 11/94, s. 40-43.
[34] Jari Peltoniemi: "Uutisväylä", Prosessori 3/96, s. 11, 25.
[35] Ville Pietikäinen: "Mikro-ohjaintoimintoja DSP-prosessoreihin", Prosessori 9/96, s. 27-29.
[36] John G. Proakis, Dimitris G. Manolakis: "Digital Signal Processing: Principles, Algo rithms, and Applications", Prentice Hall, 1996.
[37] Prosoft: "ESIM: Testing enviroment for embedded software", <http://www.otm.fi/prosoft>, 1996.
[38] Raahen teknillisen oppilaitoksen luentomoniste: "MCS-51-Kurssi".
[39] Software Process Consultants home page, <http://www.processtrat.com/>.
[40] Tietotekniikan liitto ry: "ATK-sanakirja", Suomen ATK-kustannus Oy, 1994.
[41] VTT Elektroniikka: "Pr2imer for software process improvement", <http://www.ele.vtt.fi/docs/pr2imer/pr2imer.htm>.
[42] VTT Elektroniikka: "Software process improvement and Measurement in Prometri-project", <http://www.ele.vtt.fi/projects/prometri.htm>.
[43] VTT Elektroniikka, CCC Software Professionals: "Finspin News Letter", Yhteisjulkaisu, 1996.
[44] Petri Vuorimaa: "Mikroprosessorit", Modeemi Oy, TTKK, 1989.
[45] Krister Wikström: "DSP-prosessorien kehitystuki", Prosessori 1/96, s. 40-46.
[46] Krister Wikström: "Erilainen mikro-ohjain", Prosessori 11/94, s. 60-65.
[47] Krister Wikström: "Tosiaikaiset käyttöjärjestelmät: Piilotettua hallintaa", Prosessori 3/96, s. 48-53.
8051 FAQ: <http://www.ece.orst.edu/~pricec/8051/faq/index.html>.
8051 Home Page: <http://www.ece.orst.edu/serv/8051>.
8051 aiheiset uutisryhmät: comp.sys.intel, comp.realtime, comp.robotics, comp.lang.forth ja sci.electronics.
Embedded Systems FAQ: <http://www.cis.ohio-state.edu/hypertext/faq/usenet/microcontroller-faq/primer/faq.html>.
Embedded System Programming: <http://www.embedded.com>.
Intel corporation: <http://www.intel.com>.
Neuraaliverkkoja käsittelevät uutisryhmät: comp.realtime, comp.answers ja news.answers.
Prosessori: <http://www.prosessori.fi>.
Tosiaikaisuuteen liittyvät uutisryhmät: comp.realtime, comp.answers ja news.answers.
Sumean logiikan uutisryhmät: comp.ai.fuzzy,comp.answers,news.answers.
Jan Axelson: "The Microcontroller Idea Book", Lakeview Research (71163.3555@compuserve.com), 1994.
Alan Burns: "The Microchip: Appropriate or Inappropriate Technology", Ellis Horwood Limited, 1981.
Alan Burns and Andy Wellings: "Real-time Systems And Their Programming Languages", Addison-Wesley, 1989.
Richard H. Barnett: "The 8051 Family of Microcontrollers", Prentice-Hall, 1995.
Stuart Bennet: "Real-time Computer Control: An Introduction", Prentice-Hall, 1988.
John Forrest Brown: "Embedded Systems Programming in C and Assembler", Van Nostrand Reinhold, 1994.
Digitial Systems Consulting : "8-bit Microcontroller Instruction Set Performance", 1994.
Frederick Driscoll, Robert Coughlin, Robert Villanucci: "Data Acquisition and Process Cont rol with the M68HC11 Microcontroller", Macmillan Publishing Company, 1994.
Bill O. Gallmeister: "Posix.4: Programming for the Real World", O'Reilly and Associates, 1995.
Jack G. Ganssle: "The Art of Programming Embedded Systems", 1992.
Joseph D. Greenfield: "The 68hc11 Microcontroller", Saunders College Publishing, 1992.
Kenneth Hintz and Daniel Tabak: "Microcontrollers: Architecture, Implementation, and Prog ramming", McGraw-Hill Inc. 1992.
Intel corporation: "Embedded Control Applications", 1988.
Intel corporation: "Embedded Controller Handbook", 1987.
Jean Labrosse: "The Real-Time Kernel", R&D Publications, Inc., 1992.
G.J. Lipovski: "Single- and Multiple-Chip Microcomputer Interfacing", Motorola, 1988.
I. Scott MacKenzie: "The 8051 Microcontroller", Prentice Hall, 1995.
Gene H. Miller: "Microcomputer Engineering", Prentice Hall, 1993.
National Semiconductor Corporation: "Embedded Controllers Databook 1992 Edition".
Jack Quinn: "Microprocessor 1995", Integrated Circuit Engineering Corporation.
Ted Van Sickle: "Programming Microcontrollers in C", HighText Publications, 1994.
Peter Song and G. Jack Lipovski: "Single- and Multiple- Chip Microcomputer Interfacing (Lab Manual)", Prentice-Hall, 1988.
James W. Stewart: "The 8051 Microcontroller", Regents/Prentice-Hall, 1993.
Tom Swan: "Programmer's Guide to the 1802", Hayden Book Company, Inc., 1981.