Sulautetut järjestelmät, mikro-ohjaimet ja niiden ohjelmointi

Sami Saalasti

Ohjelmistotekniikan seminaari (Osa pro gradu -tutkielmaa)

8.5.1997



Johdanto

Tutkielman nimeä voisi tarkentaa pidentämällä se muotoon "Pienet sulautetut järjestelmät, Intelin 8051-mikro-ohjaimet ja niiden ohjelmointi". Yleisesti ottaen suuremmat sulautetut järjestelmät toimivat tehokkailla prosessoreilla ja ne koostuvat useista laitteista, käyttöjärjestelmästä sekä monimutkaisista ohjelmistoista. Tällaisia ovat mm. lentokoneiden valvontajärjestelmät, ydinvoimaloiden turväjärjestelmät ja avaruussukkuloiden lentojärjestelmät. Tämän kaltaiset sovellutukset alkavat jo muistuttaa normaaleja tietokonejärjestelmiä. Sulautetun järjestelmän eräs määritelmähän on puhua laitteesta, joka ei enää ulospäin vaikuta tietokoneelta.

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.


1. Sulautetut järjestelmät

Tietokonejärjestelmät voidaan karkeasti jakaa (uudelleen) ohjelmoitaviin ja sulautettuihin järjestelmiin (eng. embedded system). Ohjelmoitavat järjestelmät toimivat tietokoneen tavoin ja esimerkkinä käykin henkilökohtainen tietokone, PC. Ohjelmoitavissa järjestelmissä on yleensä jonkinlainen massamuisti (esimerkiksi nauha-asema, kovalevy, CD-ROM), johon voidaan tallentaa myöhemmin käytettävää tietoa ja erilaisia ohjelmia. Tällaiseen järjestelmään liitetyt oheislaitteet (tulostin, kuvanlukija, näyttöpääte, näppäimistö, hiiri, syntetisaattori, peliohjain, jne.) ovat suoraan käyttäjän ohjattavissa ja käytettävissä, jolloin laitteiston toiminta tapahtuu hänen ehdoillaan [14,29].

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].

1.1 Käyttöjärjestelmät

Normaalisti sulautetun järjestelmän ohjelmat eivät vaadi käyttöjärjestelmää, mutta monimut kaisissa sovellutuksissa niitä sen sijaan käytetään (esim. pankkiautomaatit). Käyttöjärjestelmä tarjoaa erilaisia palveluja, tyypillisesti tiedostojen hallintaa sekä syöttö- ja tulostustoimintoja. Ongelma käyttöjärjestelmien käytössä on korkeat lisenssimaksut, joita joudutaan maksamaan valmiista kaupallisen käyttöjärjestelmän sisältämästä tuotteesta. Markkinoilta löytyy sulaute tuille ja reaaliaikaisille järjestelmille rakennettuja valmiita käyttöjärjestelmiä, kuten LynxOs, Embedded Dos, TNT DOS-Extender, pSOS+, UniFlex, Pdos ja OSE Delta. Dos on edelleen suosittu ja käytössä puutteistaan huolimatta: moniajosta ei ole tietoakaan ja muistinsuojausme kanismit puuttuvat. Lisäksi Dos vaatii järjestelmäresursseja, joita sulautetuissa järjestelmissä ei ole. Sitä käytetään kuitenkin, koska se on halpa, helposti saatavilla ja laajasti tunnettu. Sille löytyy myös paljon ohjelmistoja ja kehitystyökaluja sekä valmiita ohjelmia [14, 28].

1.2 Luotettavuus ja tosiaikaisuus

Sulautetuille järjestelmille on tyypillistä luotettavuus, kyky rinnakkaisprosessointiin ja reaaliaikaiseen toimintaan. Luotettavuus on tärkeää: jos esimerkiksi mikroaaltouunin ohjausjärjestelmä jossain erikoistilanteessa pettää, yhtiölle tulee roimat tappiot. Tuote pitää tällöin vetää pois markkinoilta ja pettyneille asiakkaille maksaa korvauksia. Tässä onkin selvä ero tietokoneohjelmiin verrattuna. Sulautettujen järjestelmien tulee toimia lähes sataprosentti sesti, kun taas tietokoneohjelmilta tätä ei vaadita. Tietokoneohjelmien virheet käyttäjä joutuumaksamaan omasta pussistaan ostamalla ohjelman päivitetyn version, joka ei sittenkään välttä mättä toimi. Sairaalalaitteistoissa, sotilaallisissa järjestelmissä ja lentokoneissa järjestelmän pettämisen tuloksena voi olla ihmishenkien menettäminen. Luotettavuutta ja vikasietoisuutta käsitellään tarkemmin luvussa 7 [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].

1.3 Käytännön sovellutukset

Ohjelmateknisesti sulautettujen järjestelmien sovellutukset voidaan jakaa vuorottaisohjaukseen, suljettusilmukkaohjaukseen ja tieto-ohjaukseen (eng. sequential control, closed loop control, data control). Vuorottaisohjauksessa järjestelmän töillä on tietty suoritusjärjestys. Suljetussa silmukassa tarkkaillaan tapahtuman tai laitteen ulostuloja (eng. output) ja muutetaan sisääntuloja (eng. inputs) siten, että saavutetaan haluttu ulostulo. Esimerkiksi, jos laitteisto alkaa ylikuumentua, käynnistetään jäähdyttäjä. Se suljetaan, kun lämpötila on takaisin sallitulla tasolla. Nämä kaksi sovellutustyyppiä keskustelevat suoraan ulkomaailman kanssa. Niiden rakenne on yksinkertainen ja käytetyt tietorakenteet ovat pieniä. Tieto-ohjauksessa sitä vastoin tietorakenteet ovat usein suuria ja monimutkaisia. Voidaan joutua käsittelemään suurta tietomäärää ja tekemään sen pohjalta johtopäätöksiä. Esimerkiksi kopiokone kuvaa valokuvan ja muuttaa sen digitaaliseen muotoon. Tämän jälkeen se kuvankäsittelytekniikkaa hyväksikäyt täen muuttaa kuvan kontrastia ja kokoa, jotta se mahtuisi halutulle A4-paperille [14].

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.

1.4 Sulautettujen järjestelmien markkinatilanne

Tässä luvussa tarkastellaan eritoteten Suomen elektroniikkateollisuutta perustuen lähteeseen [10]. Samalla saadaan kuva alan kehityksestä myös maailmanlaajuisesti. Syy Suomen tilanteen tarkastelulle on kiinnostus tulevasta kehityksestä työmarkkinoilla, ts. onko alalla tarjottavana töitä vai ei. Ennusteiden mukaan elektroniikkateollisuus tulee kasvamaan Suomen suurimmaksi yksittäi seksi vientiteollisuuden alaksi ohittaen metalliteollisuuden (ks. kuva 1.2). Elektroniikkateollisuudessa sulautettuja järjestelmiä tuottaa yli 80% yrityksistä ja metalliteollisuudessakin lähes puolet. Tarkkoja tämänhetkisiä osuuksia on mahdoton arvioida, sillä viimeisin löytämäni tutkimus asiasta on tehty vuonna 1989 (ks. [17]). Tutkimus perustui yritysten omiin arvioihin sulautettujen järjestelmien käytöstä. Elektroniikka- ja sähköalan tuotesektorit on lueteltu taulukossa 1.2. Luku perustuu lähteisiin [10], [17], [30] ja [34].

Undisplayed Graphic

Kuva 1.2. Elektroniikka- ja sähköalan vienti suhteessa muihin teollisuusaloihin.

1.4.1 Suurimmat yritykset

Suomessa sulautettuja järjestelmiä käytetään ja valmistetaan eniten metalli- ja elektroniikkate ollisuudessa. Etenkin tietoliikenteen alalla kasvu on ollut nopeaa NMT- ja GSM-puhelimien kasvavan suosion myötä. Nokia Telecommunications Oy onkin tällä hetkellä Suomen suurin sulautettujen järjestelmien hyväksikäyttäjä. Vuonna 1995 matkapuhelimien vienti kasvoi 66% edellisvuodesta. Muita suuria sulautettuja järjestelmiä käyttäviä yhtiöitä ovat mm. Ahlström Sähkötarvikkeet Oy, Outokumpu Elektroniikka Oy, Valmet Automaatio Oy, Wärtsilä Oy ja Abloy Oy. Laitevalmistamisen kasvun seurauksena on myös komponenttien, kuten henkilökohtaisten mikropiirien, valmistus Suomessa lisääntynyt. Tämä on seurausta teollisuu den verkottumisesta, jolloin alihankkijoita syntyy suurten yritysten rinnalle. Kasvua on myös kulutuselektroniikan, sairaalatekniikan, tietokoneiden ja teollisuusautomaation piirissä. On kuitenkin huomattavaa, että perinteisten sulautettuja järjestelmiä käyttävien alojen lisäksi on syntynyt paljon sovellutuksia esimerkiksi puunjalostuksen sekä kirjapainon ja kustantamisen piiriin. Tämä on seurausta kasvavasta automatisoitumisesta kaikilla toimialoilla. Kuvassa 1.3 esitetään elektroniikka- ja sähköalan tuotanto vuonna 1994 tuotesektoreittain.

Undisplayed Graphic

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.

Undisplayed Graphic

Kuva 1.4. Vienti elektroniikka- ja sähköalalla.

Undisplayed Graphic

Kuva 1.5. Tuonti elektroniikka- ja sähköalalla.

1.4.2 Työmarkkinat

Vaikkakin elektroniikka- ja sähköala on kehittynyt nopeasti, ei samaa voi sanoa uusien työpaikkojen syntymisestä (ks. kuva 1.6). Tämä johtunee yleisemmästä työmarkkinoiden rakennemuutoksesta. Kaikki teollisuuden sektorit ovat voimakkaasti automatisoituneet tarjoten vä hemmän työpaikkoja. Vuonna 1980 teollisia työpaikkoja oli noin 562 000, mutta vuonna 1994 määrä oli laskenut 399 000:een.

Undisplayed Graphic

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).

Undisplayed Graphic

Kuva 1.7. Elektroniikan- ja sähköalan työvoiman osuus teollisuuden työvoimasta.

1.4.3 Sulautetut ohjelmistot

Ohjelmistotekniikka on kehittymässä sulautettujen järjestelmien avainteknologiaksi. Ohjelmis toteknisillä ratkaisuilla voidaan lisätä helposti tuotteisiin uusia ominaisuuksia ja toimintoja lisäten niiden kilpailukykyä. Tyypillinen kehitys on ollut sellainen, että uuden sukupolven tuotteessa ohjelmistojen määrä on kymmenkertainen verrattuna aikaisempaan. Taulukossa 1.3 on kuvattu matkapuhelimien ohjelmistojen määrän kehittymistä noin 15 vuoden aikana. Ohjel mistojen kehittäminen voi muodostua nopeasti tuotekehityksen pullonkaulaksi, ja yritykset ovatkin palkanneet lisää ohjelmasuunnittelijoita tuotekehitysyksikköihinsä.

Tyyppi

Sukupolvi

Esimerkkijärjestelmä

Ohjelmistojen määrä

Analoginen

1.

Nordic mobile phone system (NMT)

muutama kilotavu

Analoginen

2.

NMT

kymmeniä kilotavuja

Digitaalinen

1.

Global system for mobile communications (GSM)

satoja kilotavuja

Digitaalinen

2.

GSM

noin miljoona tavua

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.


Vuosi

1993

1994

1

Tietoliikenne-elektroniikan laitteet

1711

2111

2

Tietokoneet ja toimistoelektroniikkalaitteet

104

102

3

Teollisuusautomaatio ja mittauslaitteet

119

127

4

Lääketieteen elektroniikkalaitteet

86

100

5

Kulutuselektroniikan laitteet

14

14

8

Elektroniikan komponentit

3

4


Elektroniikka-ala yhteensä 1..5 ja 8

2037

2458

6

Talouskoneet

2

2

7

Sähkövoimatekniikan tuotteet

51

51

9

Akut ja paristot

0

0

10

Kaapelit ja johtimet

0

0

11

Sähkölamput ja valaisimet

0

0


Sähköala yhteensä 6, 7, 9..1

53

53


Elektroniikka- ja sähköala yhteensä, 1..11

2090

2511

Taulukko 1.4. Ohjelmistotyötä tekevä henkilöstö elektroniikka- ja sähköalan teollisuudessa.


2. Mikro-ohjaimet

Mikro-ohjaimessa on samassa sirussa keskusyksikkö, datamuisti, ohjelmamuisti, ajastimia, keskeytyksiä ja joukko otto- ja antolinjoja. Lisäksi ohjain voi sisältää mm. DSP-suorittimen (käsitellään luvussa 2.3), sumeaan ohjaukseen erikoistuneen suorittimen (luku 6), sekä AD/DA-muuntimia (luku 2.3). Mikro-ohjaimen komponenttien kokoonpano riippuu suuresti sovellutuksesta. Mikro-ohjaimia valmistetaankin tuhansia, jollei satoja tuhansia, eri versioita erilaisiin laitteisiin ja tarkoituksiin.

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].

2.1 Kehityshistoria

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].

2.2 Mikro-ohjainten eri valmistajat ja perheet

Mikro-ohjaimissa sanapituus vaihtelee neljästä 32 bittiin. Käskykoodin sanapituus voi kuiten kin olla eri kuin datan, joten jaotteluperusteena käytetään yleensä datasanan pituutta. Suurim man ryhmän yli 50 prosentin markkinaosuudella muodostavat kahdeksanbittiset mikro-ohjai met, joiden suhteellisen markkinaosuuden ennustetaan edelleen kasvavan lähivuosina. Myös neljän bitin mikro-ohjaimia myydään edelleen. Vaikka ne ovat tehottomampia kuin uudet kehittyneemmät mikro-ohjaimet, niille löytyy käyttöä. Mitä järkeä olisi laittaa esimerkiksi videon kaukosäätimeen 32-bittinen mikro-ohjain, kun 4-bittinen (tai kahdeksan bittinen) tulee huomattavasti halvemmaksi [7, 46] ?

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].

2.3 DSP-tekniikka

Vuonna 1979 Intel kehitti ensimmäisen digitaalisen signaalisuorittimen Intel 2920:n. DSP-suoritin laskee kertautuvia matemaattisia algoritmeja, jotka useimmiten liittyvät erilaisten analogisten signaalien, kuten äänen käsittelyyn. Ensin kuitenkin analoginen signaali muutetaan digitaaliseksi A/D-muuntimella (ks. kuva 2.1).

Undisplayed Graphic

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].

2.3.1 Signaaliprosessorien kehitys

Ennen DSP-tekniikan syntymistä analogisen signaalin käsitteleminen täytyi hoitaa erilaisilla analogisilla laitteilla. DSP-tekniikka on analogista parempi monessa mielessä. Tuotekehittelys sä monet tilanteet voidaan simuloida ja testata ohjelmistotasolla. Yhdellä DSP-suorittimen sisältämällä ohjaimella voidaan hoitaa useita tilanteita vaihtamalla vain ohjelmaa. Lisäksi, kuten aikaisemmin on todettu DSP-suoritin muuntaa analogista signaalia tiettyjen algoritmien mu kaan. Tämä tekee sovellutuksesta stabiilin, tarkan ja sen käyttäytymisen helposti ennustetta vaksi. Huomattavaa on myös, että DSP-tekniikka tulee yleisesti ottaen halvemmaksi verrattuna analogisten komponenttien valmistamiseen (tämä on tosin hyvin sovelluskohtaista). Analogista tekniikkaa joudutaan kuitenkin yhä käyttämään sovellutuksissa, joissa on laaja kaistanleveys (eng. bandwith). On myös tiukkaa tosiaikaisuutta vaativia monimutkaisia sovellutuksia, joita ei voida implementoida suorittimella (laskentanopeus ei riitä), vaan joudutaan turvautumaan analogiseen tai monesti optiseen signaalin käsittelyyn.

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.

2.3.2 Mikro-ohjaintoimintoja DSP-prosessoreihin

Suurin osa saatavilla olevista DSP-arkkitehtuureista on tähän asti ollut tiukasti numeerisiin sovellutuksiin tarkoitettuja erikoisprosessoreja. Prosessorien yhteydet ulkomaailmaan on hoidettu AD- ja DA-muuntimien kautta ja kyljessä on ollut mikro-ohjain kertomassa DSP:lle, mitä pitäisi tehdä. Uudet sovellutukset monesti tarvitsevat sekä mikro-ohjainta että DSP-suoritinta. Uusin trendi onkin yhdistää signaaliprosessorin ja mikro-ohjaimen ominaisuudet. Tämä tapahtuu joko ottamalla signaaliprosessoriin mikro-ohjaimen ominaisuuksia (esimerkiksi Texas Instrumentsin TMS320C20X, Motorolan 68HC16 ja DSP56800) tai integroimalla DSP-suoritin mikrosuorittimen sisään (esimerkiksi Hitachin Super H8). Yhdistämällä ominaisuuksia säästetään piiripinta-alaa, tehonkulutusta ja suunnitteluaikaa. Lisäksi säästetään RAM-muistin tarvetta, koska erillisiä DSP:n ja mikro-ohjaimen vaatimia ohjelmistoja ei tarvitse rakentaa.

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.

2.3.3 Algoritmit

DSP-sovelluksissa keskeinen osa on algoritmi eli se matemaattinen kaava tai laskentamenetel mä, johon signaalin käsittely perustuu. Algoritmien kehittäminen ja testaus on kaikkein vaikein työvaihe ja se vaatii syvällistä matematiikan ja ohjelmoinnin asiantuntemusta.

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].

2.3.4 DSP-sovellutukset

DSP-tekniikkaa käytetään hyväksi mm. erilaisissa digitaalisissa suodattimissa, robottinäössä, puheentunnistamisessa, tekstin muuttamisessa puheeksi, ohjusten ohjausjärjestelmissä, modee meissa, FAXeissa, digitaaliradioissa, tutkajärjestelmissä, GSM-puhelimissa, leluissa sekä ultraäänilaitteissa. Esimerkiksi Oulun yliopiston biofysiikan laitoksella on kehitetty laite tunnis tamaan erilaisia hajuja. Hajua aistivan bioanturin analoginen signaali vahvistetaan ja muutetaan digitaaliseksi jatkokäsittelyä varten. Analoginen hajuvaste aikaansaadaan erityisen aika-jännite muunnoksen avulla.

2.4 Mikro-ohjainmarkkinat

Eniten mikro-ohjaimia käytetään autoteollisuudessa. Monet ohjainperheet on suunniteltu nimenomaan autojen laitteistojen ohjaukseen. Auto on vaativa ympäristö ohjaimelle, sillä sen pitää pystyä sietämään korkeita ja matalia lämpötiloja, liikettä sekä värinää. Ohjaimessa oleva virhe johtaa korvausvaatimuksiin tai pahimmassa tapauksessa vakaviin onnettumuuksiin [7].

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].

Mikro-ohjainten myynti maailmalla 1990-1994 (miljoonissa), sekä ennuste vuosille 1995-1999.

vuosi

1990

1991

1992

1993

1994

1995

1996

1997

1998

1999

4-bittiä

778

906

979

1036

1064

1110

1100

1096

1064

1025

8-bittiä

588

753

843

1073

1449

1803

2123

2374

2556

2681

16-bittiä

22

38

45

59

106

157

227

313

419

501

Taulukko 2.3. Mikro-ohjainten myynti nyt ja tulevaisuudessa.


3. Intelin 8051-mikro-ohjain

Intel kehitti Harvard-arkkitehtuurin mukaisen 8051-mikro-ohjainperheen vuonna 1980 täyden tämään ja nykyisin käytännössä korvaamaan suosittua 8048-mikro-ohjainta. 8-bittisestä 8051-perheestä tuli joka suhteessa 8048:aa parempi, sillä muistia, I/O-linjoja, ajoitinpiirejä sekä keskeytyksiä on enemmän. Myös käskykanta ja kehitystukitarjonta on huomattavasti laajem paa kuin 8048-perheellä. Perheen ensimmäiset jäsenet olivat 8051-, 8751- ja 8031-ohjaimet. Kuva 3.1 esittää 8051-ohjaimen rakennekaavion.

Undisplayed Graphic

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].

3.1 Rakenne

8051-ohjaimen muodostavat keskusyksikkö, erilaiset muistit, sisään- ja ulostuloportit sekä rekisterit (eng. registers). Muisteja ovat sisäinen ja ulkoinen data-RAM sekä sisäinen ja ulkoinen ohjelma-ROM tai -EPROM. Nämä peruselementit viestivät piirissä kulkevan 8-bittisen väylän (eng. bus) avulla. Lisäksi olennaisena osana ovat ajastin/laskuri (eng. timer/counters) sekä sarjaporttiliitäntä- (eng. serial interface) ja keskeytystoiminnot (eng. interrupts). Seuraavissa luvuissa esitellään 8051-ohjaimen peruskomponentit tarkemmin.

3.2 Nastat

Kuva 3.2 esittää 8051-mikro-ohjaimen logiikka- ja nastakaavion. Nastoja on yhteensä 40 ja piiri toimii noin 5 voltin jännitteellä. Seuraavassa on lyhyt kuvaus kunkin nastan toiminnasta.

Undisplayed Graphic

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.

3.3 Keskusyksikkö ja sen osat

Keskusyksikkö (eng. CPU, central processing unit) on mikro-ohjaimen aivot. Se lukee ja toteuttaa ohjelmoijan kirjoittamaa ohjelmaa. Sen pääosat muodostaa 8-bittinen aritmeettislooginen yksikkö (ALUL, eng. arithmetic logical unit, ks. kuva 3.1) ja erilaiset rekisterit sekä laskurit. Muistiosaa, missä rekisterit sijaitsevat kutsutaan erikoisrekisteriksi (SFR, eng. special function register, ks. kuva 3.4). Rekisterit sijaitsevat eripuolilla piiriä kytkettyinä väy lään ja ne ovat osa sisäistä datamuistia (osoitteet 80H-FFH).

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.

3.4 Muistityypit

Ohjelmamuisti on erillään datamuistista. Kummallakin muistityypillä on erilaiset muistinosoi tustavat ja ohjaussignaalit. Sisäinen datamuisti (eng. internal data RAM, IDR) koostuu 128 tavun datamuistista ja 21 erikoisrekisteristä (ks. kuva 3.4).

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.

Undisplayed Graphic

Kuva 3.3. 8051-ohjaimen muistiavaruus.

3.4.1 Erikoisrekisteri

8051-ohjaimessa on 21 erilaista erikoisrekisteriä, jotka ovat oleellinen osa mikro-ohjaimen sisäistä toimintaa. Seuraavassa selitetään kukin rekisteri pikaisesti. Myöhemmät luvut täyden tävät kuvauksia. Kuva 3.4 esittää erikoisrekisteriä ja sen rekisterejä osoiteavaruudessa.

Undisplayed Graphic

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.


4. Mikro-ohjainten työkalut

Pelkällä mikro-ohjaimella, ohjelmointikielellä tai käyttäjänoppaalla ei ammattimaista suunnittelua tehdä saatikka valmiita tuotteita rakenneta. Sovellutuksen tekijän apuna ovat erilaiset kehitysympäristöt, CASE-työkalut, simulaattorit, debuggerit, emulaattorit ja logiikka-analysaattorit (ks. luku 10). Luku perustuu pääasiassa lähteeseen [7].

4.1 Kehitysympäristöt

8051-pohjaisiin tai muihin mikro-ohjaimiin löytyy kehitysohjelmistoja ilmaiseksikin, mutta ammattimaisempi käyttäjä joutuu usein turvautumaan kaupallisiin versioihin. Lähinnä teknisen tuen puuttuminen on ilmaisten ohjelmien ongelma. Monet kaupalliset tuotteet sisältävät koko naisen kehitystyökalupaketin kohtuulliseen hintaan. Hintataso on n. 500 markasta ylöspäin.

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.

4.1.1 ProView-työkalu 8051-mikro-ohjaimelle

Hyvä esimerkki kehittyneemmästä ohjelmointityökalusta on Franklin Softwaren kehittämä ProView-suunnitteluympäristö (ks. kuva 4.1). Se toimii Windows 3.1-, 95- ja NT käyttöjärjes telmissä. Siinä on yhdistetty samaan ohjelmaan debuggeri, simulaattori, optimoiva C-kääntäjä, linkittäjä, hyvät C-kirjastot, assembler-kääntäjä, editori sekä projektin hallinta. Lisäksi ohjel maa voidaan ajaa yhdessä emulaattorin kanssa. Emulaattorin käyttö yhdessä debuggerin kans sa mahdollistaa korkean tason järjestelmän testaamisen. Käytettävä C-kieli muistuttaa luvussa 5 esiteltävää Keil Softwaren C51-kääntäjää.

ProView-ympäristön hinta karsii mahdolliset harrastelijat käyttäjäkunnastaan. Koko ohjelmisto laitteistoineen maksaa lähes 20 000 markkaa [6].

Undisplayed Graphic

Kuva 4.1. ProView-työkalu 8051-mikro-ohjaimelle.

4.2 Simulaattorit

Simulaattori jäljittelee ohjaimelle rakennettua ohjelmaa isäntätietokoneessa. Isäntätietokone on nykyään lähestulkoon aina PC-tietokone. PC:llä tapahtuu kaikki ohjelmointi ja työskentely. Valmis ohjelma sitten ladataan mikro-ohjaimeen, kun ollaan tyytyväisiä tulokseen. Simulaatto rin huonona puolena on sen hitaus verrattuna todellisen mikro-ohjainohjelmaan. Lisäksi erilais ten keskeytysten ja oheislaitteiden simulointi on vaikeaa ja monesti mahdotonta. Hyötynä on kuitenkin mahdollisuus seurata, miten eri rekisterit ja muuttujat käyttäytyvät ohjelmaa ajettaes sa. On olemassa myös laitteistopohjaisia simulaattoreita. Tällöin eri nastat toimivat kuten normaalistikin mikro-ohjaimessa, tosin hitaammin.

4.2.1 ESIM-simulaattori

Suomalaisen Prosoftin (http://www.otm.fi/prosoft) kehittämä simulaattori ESIM (eng. Embed ded System SIMulator, ks. kuva 4.2) on pitkälle kehitetty työkalu sulautettuihin järjestelmiin. Se tukee periaatteessa mitä tahansa mikro-ohjainta ja järjestelmää. Sillä on mahdollista luoda virtuaalinen prototyyppi sovellutuksesta sekä lisätä nappuloita ja toimintoja. Kokeilemalla toimintoja prototyypissä voi samalla seurata eri rekisterien tiloja, väylällä kulkevaa tietoa, portteja, ohjaimen käyttöjärjestelmää [37].

Undisplayed Graphic

Kuva 4.2. Sulautettujen ja tosiaikaisten järjestelmien kehityssimulaattori ESIM.

4.3 Sisäinen debuggeri

Sisäinen debuggeri ajaa ohjelmaa itse mikro-ohjaimessa ja näyttää ohjelman toimintaa, rekistei tä ja muuttujia isäntätietokoneella (PC-tietokone). Debuggeri joutuu kuitenkin varastamaan mikro-ohjaimen resursseja, sillä se tarvitsee yhden I/O-porteista keskustellakseen isäntäkoneel le ja yhden keskeytyksen pystyäkseen käymään ohjelmaa läpi askel kerrallaan. Lisäksi se vaatii hieman ohjaimen muistia.

4.4 Emulaattorit

Emulaattori on selvästi paras työkalu mikro-ohjaimen ohjelmoinnissa. Tosin harrastelijan kukkarolle se saattaa olla hieman liian kallis. Esimerkiksi OEAMA Ltd yhtiön 4-32-bittinen ECAL-emulaattori maksaa n. 4000 markkaa [32]. Emulaattori nimensä mukaisesti matkii mikro-ohjaimen toimintaa ja samanaikaisesti sieppaa informaatiota ohjelmoijalle. Se mahdollis taa täydellisen mikro-ohjaimen hallinnan ilman, että ohjaimen resursseja käytettäisiin. Tällöin siis kaikki keskeytykset, portit ja muisti ovat käytettävissä. Emulaattori voi toimia yksin tai isäntätietokoneen kanssa.

5. 8051-ohjaimen ohjelmointi

Luvussa 5.1 käsitellään yleisemmin mikro-ohjainten eri ohjelmointikieliä. Itse ohjelmointiosuu dessa (luvut 5.2 ja 5.3) painotetaan niitä ohjelmoinnin alueita ja tekniikoita, jotka selvästi poikkeavat normaalista käyttöjärjestelmän alaisesta ohjelmasta ja ohjelmoinnista. Ohjelmointi kielenä käytetään C-kieltä ja eritoten Keil Softwaren C51-kääntäjää. Tämän kääntäjän valitse minen esimerkkikieleksi johtui lähinnä saatavuudesta. Muut vastaavat 8051-ohjaimen C-ohjel mointikielet vastaavat melko paljon C51-kieltä periaatteeltaan ja rakenteeltaan. Eroavuuksia voi olla mm. vakioiden (kuten rekistereiden) nimeämisessä ja funktioiden parametriesityksissä. C51-kääntäjä tukee useita eri 8051-muunnoksia, kuten 80535-ohjainta.

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].

5.1 Mikro-ohjainten eri ohjelmointikielet

Mikro-ohjaimia ohjelmoidaan nykyään lähes pelkästään assembler- tai C-kielellä. Harrastajat saattavat edelleen käyttää vanhentuneita kieliä kuten Forth tai Basic. Joissakin erikoissovellutuksissa käytetään Ada, Modula-2 ja Occam2-kieliä.

5.1.1 Kone- tai assembler-kieli

Konekieliset käskyt ovat binäärimuotoisia ykkös-nollayhdistelmiä, joita mikro-ohjain ymmär tää. Tavallinen ihminen ei ymmärrä moista numeroviidakkoa. Siksi on kehitetty assembler-kieli, jossa binääriyhdistelmät on korvattu kuvaavilla käskyillä. Tällöin ohjelmakoodia on helpompi kirjoittaa ja ymmärtää.

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].

5.1.2 Tulkit

Tulkki on korkean tason kääntäjä, jonka ohjelmakoodi on lähellä luonnollista kieltä. Itse tulkki sijaitsee mikro-ohjaimessa ja se lukee jokaisen ohjelmarivin kerrallaan toimien ohjeiden mukai sesti. Kaksi suosituinta mikro-ohjaintulkkia ovat Basic ja Forth.

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.

5.1.3 Kääntäjät

Kääntäjä on korkean tason kieli, jota on suhteellisen helppo ymmärtää. Kuvaava kieli käänne tään isäntätietokoneessa (yleensä PC-tietokone) konekieliseksi ja sitten ladataan EPROM-muistiin tai suoraan mikro-ohjaimeen. Mikro-ohjain suorittaa käännetyn ohjelman suoraan ilman tulkkaamista. Kääntäjän tuottama koodi on konekielisenä nopeaa.

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.

5.2 8051-ohjaimen muistialueet

Kuten luvussa 3.4 todettiin, 8051-arkkitehtuurissa muisti on jakautunut ohjelma- ja datamuis tiin, jotka ovat edelleen jakautuneet eri osioihin. Kukin muistialue tarjoaa omat etunsa ja haittansa ohjelmoijan kannalta. On alueita, joita voidaan vain kirjoittaa tai lukea. On myös alueita, joita voidaan kirjoittaa tai lukea nopeammin kuin muita. Tämä rakennelma poikkeaa selvästi tavanomaisesta keskustietokoneiden, mikrotietokoneen tai pientietokoneen ohjelmoin nista, missä ohjelma ja data on kaikki ladattu samaan tietokoneen fyysiseen tilaan. Erilaisten muistityyppien ymmärtäminen onkin tärkeää ohjelmoitaessa mikro-ohjaimia. Hyvä kääntäjä tosin voidaan käskeä optimoimaan ohjelmakoodi mahdollisimman nopeaksi ja pieneen tilaan. Tällöin ohjelmakoodi voidaan kirjoittaa ilman muistimanipulaatioita. Kuitenkin osaava ohjel moija saa käsintehdyllä työllä parempaa jälkeä aikaan.

5.2.1 Ohjelmamuisti

Ohjelmamuistia voidaan vain lukea. Se sijaitsee CPU:n sisällä (sisäinen ohjelmamuisti), ulko puolella (ulkoinen ohjelmamuisti) tai kummassakin 8051-muunnoksesta riippuen. Ohjelma muistia voi olla aina 64 kilotavuun saakka. Ohjelman koodi kaikkine funktioineen ja kirjastoru tiineineen sijaitsee siellä. Muuttujia voidaan tallentaa myös ohjelmamuistiin. 8051 ajaa vain ohjelmia, jotka sijaitsevat ohjelmamuistissa.

5.2.2 Sisäinen datamuisti

Sisäinen datamuisti on 8051-CPU:n sisällä sijaitseva muisti, jota voidaan lukea ja kirjoittaa. 8051-muunnoksesta riippuen sisäistä muistia on aina 256 tavuun saakka. Ensimmäiset 128 tavua ovat suoraan tai epäsuorasti osoitettavissa. Ylempää 128 tavua (0x80-0xff) voidaan osoittaa ainoastaan epäsuorasti. Sisäisessä muistissa on myös 16 tavun alue alkaen osoitteesta 20h, jota voidaan osoittaa bitti-tasolla.

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.

5.2.3 Ulkoinen datamuisti

Ulkoista datamuistia voidaan lukea tai kirjoittaa ja se sijaitsee fyysisesti 8051-CPU:n ulkopuo lella. Sen käyttäminen on selvästi hitaampaa kuin sisäisen datamuistin. Tämä johtuu siitä, että ulkoista datamuistia osoitetaan epäsuorasti 16-bittisen dataosoittimen (eng. data pointer, DPTR, ks. luku 3.4.1 ja kuva 3.4) kautta.

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).

5.2.4 Erikoisrekisteri

8051:ssä on myös 128:n tavun suuruinen muistiosa, jota kutsutaan erikoisrekisteriksi (ks. kuva 3.4). Siinä on bitin-, tavun- tai sanankokoisia rekistereitä, joilla voidaan manipuloida ajastin ten, laskureiden, sarjaportin, porttien ja oheislaitteiden toimintaa.

5.2.5 Datatyypit

C51-kieli tukee taulukon 5.1 mukaisia datatyyppejä. Skalaarisen esitysmuodon lisäksi näitä muuttujia voidaan yhdistellä rakenteissa (eng. structures), liitoissa (eng. unions) ja taulukoissa (eng. arrays). Muutamaa poikkeusta lukuunottamatta (bit, sbit, sfr, sfr16) niitä voidaan osoittaa osoittimilla.

Datatyyppi

Bittien lukumäärä

Kuinka monta tavua

Luvun väli

bit *
signed char
unsigned char
enum
signed short
unsigned short
signed int
unsigned int
signed long
unsigned long
float
sbit *
sfr *
sfr16 *
1
8
8
16
16
16
16
16
32
32
32
1
8
16
-
1
1
2
2
2
2
2
4
4
4
-
1
2
0 tai 1
-128 - 127
0 - 255
-32768 - 32767
-32768 - 32767
0 - 65535
-32768 - 32767
0 - 65535
-2147483648 - 2147483647
0 - 4294967295
+-1.175494E-38 - +-3.402823E+38
0 tai 1
0 - 255
0 - 65535

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 */
};

5.2.6 C51-kielen muistityypit

C51-kielessä on mahdollista tallentaa alustamansa muuttujat haluttuun ohjaimen muistiosaan taulukon 5.2 mukaisesti. On siis mahdollista tallentaa muuttujia sisäiseen- ja ulkoiseen data muistiin. Nämä muistit on edelleen paloiteltu pienempiin osioihin. On myös mahdollista sijoit taa muuttujat muistipaikan tarkkuudella (ks. luku 5.2.8).

Muistityyppi

Selitys

code
data
idata

bdata

xdata
pdata
Osoittaa ohjelmamuistia.
Osoittaa suorasti sisäisen datamuistin ensimmäistä 128 tavua.
Osoittaa koko 256 tavua sisäistä datamuistia. Käyttää epäsuoraa osoitusta, 
joten koodi on hi taampaa kuin datamuistityypillä osoitettu muisti.
Osoittaa 16 tavun muistitilaa (20h-2fh) sisäisessä datamuistissa, jota voidaan
manipuloida bittitasolla.
Voidaan osoittaa mitä tahansa aluetta ulkoisessa datamuistissa.
Osoitetaan vain yhtä 256 tavun sivua ulkoisessa datamuistissa. Tällöin muisti
on jaettu 256 tavun "sivuihin".

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 */

5.2.7 Muistimallit

Muistimalli (eng. memory model) määrittää funktioargumenttien ja muuttujien oletusmuistityypin, jos niitä ei ole määritetty (ks. luku 5.2.6). C51-kielen muistimalleja ovat SMALL, COMPACT ja LARGE. Haluttu tila valitaan esimerkiksi lisäämällä koodin alkuun rivi #pragma SMALL. Muistimallin voi määrittää myös käännösvaiheessa.

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.

5.2.8 Muuttujien sijainnin määrittäminen, muistipaikan lukeminen ja -kirjoittaminen

Ohjelmoitaessa mikro-ohjaimia on hyvin tärkeää pystyä manipuloimaan muistipaikkoja luke malla ja kirjoittamalla niihin. Esimerkiksi oheislaitteita ohjataan sijoittamalla erilaiset toiminnot tiettyihin muistipaikkoihin ulkoisessa datamuistissa. Tätä tekniikkaa kutsutaan muistikartoite tuksi I/O:ksi (ks. luku 5.2.3).

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 */
 
}

5.3 Aliohjelman määritys, keskeytykset ja rekisteripankit

C51-kielessä on muutamia erikoistapoja määritellä aliohjelmia. Aliohjelmalle voidaan määritellä sen sijainti muistissa ja käytettävät rekisteripankit. Tehokkaampaa koodia syntyy, kun kriittisim pien aliohjelmien muuttujat ja parametrit sijoitetaan sisäiseen datamuistiin. Lisäksi aliohjelma voidaan ajaa keskeytysrutiineissa ja ne voivat käyttää PL/M-51-kielisiä rutiineja (ks. luku 5.1.3). Aliohjelman voi määritellä myös reentrant-tyypillä, jolloin sitä voi käyttää useammat prosessit yhtä aikaa. Seuraavassa on esimerkki muistimallin ja PL/M-rutiinien käytöstä sekä reentrant-tyyppisestä aliohjelmasta:

#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;
}


11. Yhteenveto

Nyky-yhteiskunta on automatisoitunut hurjaa vauhtia. Esimerkiksi 50-luvulla Yhdysvaltain asejärjestelmistä vain 10% oli jotenkin tekemisissä tietokoneohjauksen kanssa. 80-luvulla vastaava osuus oli jo 80% [4]. Kotitalouksissa erilaisia mikro-ohjaimia sisältäviä laitteita on satoja ensi vuosituhannelle mentäessä [8]. Sulautetut järjestelmät ovat siis ajankohtaisia ja niitä hyväksikäyttävät ja valmistavat teollisuudenalat tarjoavat työtä hyvinkoulutetuille alan asian tuntijoille. Eritoten ohjelmistosuunnittelu on kasvamassa tärkeäksi, jollei tärkeimmäksi alan osa-alueeksi. Tällä hetkellä ohjainten suorituskapasiteetti on korkea, mutta ohjelmistot ovat jäljessä kehityksestä. Tilanne on siis sama kuin PC-tietokoneilla, joille uusia ja nopeita proses soreita kehitetään vuosittain, mutta ohjelmakehitys on takapajuista. Ongelmana on nykyisten ohjelmistojen monimutkaisuus, jolloin ohjelman kehitys ideasta tuotteeksi voi viedä vuosia.

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ää.


12. Lähdeluettelo

[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 User’s 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.


13. Lisämateriaalia

Sulautetuista järjestelmistä ja etenkin tosiaikaisista järjestelmistä löytyy paljon englanninkielistä materiaalia. Paras suomalainen ja suomenkielinen lähde on Prosessorilehti, missä on artikkelei ta ja uusinta tietoa alalta. Tähän osuuteen on koottu alan kirjoja, lehtiä ja Internet-osoitteita lähteistä [7] ja [8].

13.1 Internet

Seuraavista osoitteista on hyvä lähteä liikkeelle. Niiden kautta löytää satoja linkkejä eteenpäin aiheesta. Eri yhtiöiden, yksityishenkilöiden ja järjestöjen kotisivuilta löytyy täydellisempiä kirjaluetteloja ja arvosteluja sekä lehtiluetteloja alalta.

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.

13.2 Kirjat

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.