Järjestelmän sisäinen kuvaus

v1.2
22.04.96

Prosessori

Prosessori-osasysteemi on jaettu neljään osaan. Nämä ovat IO-laitteet, CPU, Liitäntärima ja Debuggaus. Debuggaus-osa muodostuu luokista Ohjaus, Loki, Breakpoint ja RekEhdot (sekä RekEhdot luokan käyttämistä "apuluokista"). IO-laitteet, CPU ja Liitäntärima on toteutettu kukin omassa luokassaan.

Debuggaus-osa huolehtii ajettavan ohjelman debuggausominaisuuksista. Luokka MkOhjaus toimii debuggaus-osan (ja osittain myös CPU:n) käyttöliittymänä. Simulaattorin käyttöliittymä-osa suorittaa ajettavan ohjelman käskyjä kutsumalla luokan MkOhjaus funktiota, joka vuorostaan kutsuu luokan MkCPU funktiota, joka tarvittaessa kutsuu luokkien MkIO_laitteet ja MkLiitäntärima funktioita. Käyttöliittymän ja CPU:n väliin on toteutettu "ylimääräinen" MkOhjaus-luokan toiminto, koska debuggausominaisuuksien toteuttaminen vaatii, että prosessorin ja muistin tilaa voidaan tarkastella jokaisen käskyn jälkeen. Koska CPU:n koodi löytyi valmiina ja koska se on simuloitavan laitteiston todellinen fyysinen osa, jonka toteutus ei jatkossa muutu (vaan korkeintaan korvautuu kokonaan toisella), se haluttiin säilyttää omana selkeänä kokonaisuutenaan ja debuggausominaisuudet toteutettiin mahdollisimman suuressa määrin CPU:n ulkopuolella Debuggaus-osan luokissa.
Käyttöliittymä asettaa breakpointien tarkastuksen ja/tai lokiintulostamisen päälle tai pois päältä ja asettaa breakpointehtoja tai lokiin tulostettavia tietoja kutsumalla MkOhjaus-luokan funktioita.

Lokiintulostus toiminnot (eli kaikkien CPU:n rekistereiden ja/tai määritellyn muistialueen kirjoittaminen tekstitiedostoon) on toteutettu luokassa MkLoki. MkBreakpoint luokassa tarkastetaan (jos käyttäjä on asettanut ominaisuudet päälle) ettei ohjelmalaskuri ole käyttäjän määrittelemällä data-alueella ja että pysähdytään kun on suoritettu käyttäjän haluama määrä käskyjä. MkBreakpoint luokan jäsenenä on myös luokan MkRekEhdot olio. Luokassa MkRekEhdot huolehditaan käyttäjän antamien CPU:n rekistereihin kohdistuvien <, > ,= ja #(erisuuri) merkkien avulla tehtyjen ehtojen tarkastamisesta. Ominaisuus toteutettiin omassa luokassaan, koska sen tämänhetkinen toteutus on ehkä syytä myöhemmin korvata jollakin nopeammalla (jos huomataan, että rekisteribreakpointejen asettaminen on todella käyttökelpoinen ominaisuus). Tällä hetkellä toiminnon paras ominaisuus on se, että sen voi kytkeä pois päältä niin täysin, että se ei hidasta ohjelmaa.

MkOhjaus-luokalla ei ole muita julkisia jäsenfunktioita kuin tiedostossa ohjaus.h kuvatut, jotka kaikki on tarkoitettu käyttöliittymä-osasysteemin kutsumiksi, eli minkään prosessori-osasysteemin muun luokan ei ole tarkoitus kutsua MkOhjaus-luokan funktioita.

MkCPU -luokka mallittaa mikrokontrollerin CPU:n toimintaa. Se on suurelta osin toteutettu Motorolan speksien mukaan. Sen tehtäviin kuuluu käskyn suoritus. Jokaisen käskyn suorituksen jälkeen päivitetään I/O-laitteiden tilat ja liitäntärima ja tarkistetaan, onko tullut keskeytyksiä. Käskynsuoritusfunktion paluuarvo 0 tarkoittaa, että käskyn suoritus onnistui. Muut arvot ovat virhekoodeja eli yritettiin suorittaa tuntematon käsky tai lukea tai kirjoittaa sellaiseen muistiosoitteeseen, jota ei ole tai kirjoittaa kirjoitussuojattuun osoitteeseen.

Virhekoodit:
const int OK = 0;
const int ILLEGAL_OPCODE = 1;
const int MEMORY_ERROR = 2;
const int SHIFT_ERROR = 3;
const int STOP = 4;
Lisäksi on toteutettu funktiot rekisterien arvojen kyselyä ja muuttamista varten. Luokan funktioiden esittelyt ovat CPU.h -tiedostossa.

MkIO_laitteet -luokka sisältää muistin toteutuksen ja luku- ja kirjoitusfunktiot sekä I/O-laitteiden päivitysfunktiot ja keskeytysten käsittelyfunktiot. Muisti on toteutettu merkkitaulukkona. I/O-laitteista on toteutettu output comparet, pulse accumulator ja A/D-muunnin. Keskeytyksistä on toteutettu vain sisäiset keskeytykset. Suoritettavan koodin lataus muistiin oli osittain toteutettu valmiiksi. Luokan funktioiden esittelyt ovat IO-laitteet.h -tiedostossa.

Mikrokontrolleri ja auto on kytketty toisiinsa 40-nastaisella liitäntärimalla, joka toteutetaan omana luokkanaan MkLiitantarima. Siihen kuuluvat nastojen jännitteiden haku- ja päivitysfunktiot. Itse rimaa mallitetaan taulukolla, jossa on nastojen jännitteet. Luokan funktioiden esittelyt ovat liitantarima.h -tiedostossa.

Käyttöliittymä

Käyttöliittymä ohjelmoidaan C++:lla, käyttäen Motif-Widget Set:iä. Käyttöliittymän tekemiseen on myös käytössä Visual X-Windows Programming työkalu.

Modulin sisäinen osatoimintojako on kuvattu DFD-kaaviona. Käyttöliittymä-modulin keskeinen osa on event loop, joka on ohjelman kontrollista huolehtiva ikuinen silmukka. Tässä silmukassa suoritetaan mikrokontrolleria jokin tietty aika (aika on vielä speksaamatta, koska se täytyy käytännössä kokeilla), jonka jälkeen kutsutaan fysiikkamallia. Fysiikkamalli päivittää auton voimat ja paikan, tämän jälkeen ohjelman näyttö päivitetään. Event loop huolehtii myös käyttäjän toiminnoista, luomalla yhteyden X-serveriin ja tutkimalla käyttäjän tekemiä palvelupyyntöjä event-jonosta.

Fysiikkamalli

Osajärjestelmän keskeinen luokka on nimeltään Auto. Luokan päätehtävät ovat auton liikuttaminen ja sen paikan vertaaminen alla olevaan rataan. Näiden osien väliset suhteet on kuvattu DFD-kaaviona.

Autoluokalla on seuraavat kiinteät ominaisuudet: massa, akseliväli, leveys ja renkaan säde. Auto mallinnetaan kaksipyöräisenä eli eturenkaiden voimat on yhdistetty yhteen ja takarenkaiden voimat yhteen renkaaseen. Lisäksi autolla on muuttuvat ominaisuudet nopeusvektori v, kulmanopeus w ja rengaskulma runkoon nähden d (Kuva).

Auton liikutus -osajärjestelmään kuuluu autoon vaikuttavien voimien laskenta. Autoon vaikuttavat renkaan ja maan väliset kitkavoimat. Kitkavoimat koostuvat ohjausvoimista sekä moottorin ja jarrujen voimasta (Kuva).

Moottorin renkaaseen kohdistama voima Fa on renkaan suuntainen ja sen suuruus saadaan, kun jaetaan akselille kohdistuva vääntömomentti renkaan säteellä ja kerrotaan akselistossa olevan alennusvaihteen suuruudella. Moottorin voima kohdistuu tasan molemmille akseleille.

Jos moottoria ei käytetä, se toimii jarruna. Myös jarruvoima kohdistuu tasaisesti molemmille akseleille. Jarrujen voima Fb kohdistuu renkaan nopeusvektoria vastaan. Jarruvoima on valittu mielenkiinnon kohteeksi, koska se tavallisesti on nopeudesta riippumaton, kun taas jarrujen antama teho on suurilla nopeuksilla suurempi. Jarruvoiman suuntaisena on jatkuvasti mukana myös auton mekaniikan kitkavoima. Kitkavoima on vakio, kuitenkin siten, että auton paikoillaan ollessa vaikuttaa suurempi, ns. mekaniikan lepokitka.

Renkaalla on maahan nähden nopeus vp, johon vaikuttavat auton massakeskipisteen nopeus v, auton kulmanopeus keskipisteensä ympäri w sekä auton akseliväli r. Ohjausvoima on rengasta vastaan kohtisuorassa, poispäin nopeusvektorista. Sen suuruus on verrannollinen nopeusvektorin ja renkaan välisen kulman e tangenttiin sekä nopeuden vp neliöön.

Kaikkien edellisten voimien resultantti on voima, joka renkaan kautta yritetään välittää. Renkaasta maahan välittyvä maksimivoima on renkaaseen kohdistuva paino kertaa lepokitkakerroin. Jos renkaan kautta yritetään välittää tätä suurempi voima, pito menetetään ja välittyvä voima onkin vain paino kertaa liikekitkakerroin. Jos Fa on suurempi kuin välittyvän voiman samansuuntainen komponentti (nimetään tämä Fq:ksi), rengas sutii. Sutimisen määrä on verrannollinen Fa / Fq :hun. Sutimisnopeuden kasvaessa myös tiehen välittyvä voima (sekä ohjaus- että moottorivoima) pienenee. Sutimisnopeutta tarvitaan toimilaitteille välitettävän nopeusanturi-informaation laskemiseksi.

Lisäksi autoon lasketaan kohdistuvaksi nopeusvektorin vastainen vakio kitkavoima. Tämä ja renkaiden kitkavoimat yhdessä muuttavat auton nopeutta ja kulmanopeutta. Nopeuden muutos on voima kertaa aika jaettuna auton massalla. Kulmanopeuden muutos on voima kertaa sen vaikutussäde kertaa aika jaettuna inertiamomentilla, joka saadaan kaavasta I = m(akseliväli * akseliväli + leveys * leveys) / 12. Auto on tässä oletettu massajakaumaltaan tiiliskiven kaltaiseksi.

Malli ei ota huomioon esimerkiksi seuraavia seikkoja:

Fysiikkamallin ja toimilaitteiden toimintaan keskeisesti vaikuttavat (ja niiden hienosäädön mahdollistavat) parametrit sijaitsevat seuraavissa tiedostoissa:

   kitkakertoimet         fys/autodata.h
   mekaniikan lepokitka   fys/autodata.h
   kitkavoima             fys/autodata.h
   maksimi ohjauskulma    laitteet/tldata.h
   ohjausservon nopeus    laitteet/tldata.h
   pakkiviive             laitteet/tldata.h
   moottorin vääntö       laitteet/tlmootto.cpp
   maksimi kierrosluku    laitteet/tlmootto.cpp
   jarruvoima             laitteet/tlmootto.cpp

Toimilaiteosa

Osajärjestelmä on jaettu eri laitteiden mukaisiin luokkiin. Ulkoiset liitännät on kuitenkin keskitetty Laitteet-luokan jäseniksi. Laitteet instantioi kaikki toimilaitteet ja anturit ja välittää niille tarvittavat tiedot ja niiden välillä kulkevat tiedot. Muut luokat voivat kutsua niille tarpeellisia toimilaiteosan ulkopuolisia jäsenfunktioita, mutta toimilaiteosan sisällä laitteiden väliset tiedot kulkevat Laitteet-luokan (osajärjestelmän pääohjelma) kautta. Luokkien väliset suhteet näkyvät oliohierarkiassa ja tietovirrat on kuvattu DFD-kaaviona.

Luokat ovat seuraavat:

class Laitteet {};

class Toimilaite {};

class Anturi {};

class Servo : public Toimilaite {};

class Moottori {};

class Ohjausservo : Public Servo {};

class Moottoriservo : public Servo {};

class Ledikampa : public Toimilaite {};

class Nopeusanturi : public Anturi {};

class Kulmapotentiometri : public Anturi {};

class Fotodiodi : public Anturi {};

class Kaynnistysnappi : public Anturi {};

Anturit

Toimilaitteet

Moottori

Moottori on kestomagneettimoottori. Moottoria ohjataan servolta tulevan signaalin pulssisuhteella. Moottoriolio tuottaa tästä informaatiosta kiihdyttävän vääntömomentin ja jarruttavan voiman arvot fysiikkamallille. Toinen edellisistä on aina nolla. Meidän tapauksessamme jarruvoimakin on erityisen merkityksellinen, koska erillisiä jarruja ei ole.