Vaatimusten määrittely asetti laitteistolle mm. seuraavat vaatimukset:
Ohjelmiston muistivaatimuksiksi arvioitiin:
I/O-ominaisuuksia arvioitiin tarvittavan seuraavasti:
LCD-näyttöjä on yleisesti saatavilla kolmea päätyyppiä:
Alfanumeeristen moduleiden heikko puoli on niiden näyttämien merkkien pieni koko ja rajoitettu katselukulma (riippuu mallista). Yleensä merkkien korkeus on n. 5-7 mm, joten modulit soveltuvat parhaiten luettaviksi 0.5-1 metrin etäisyydeltä, joka tässä sovelluksessa on selvästi liian vähän.
Yleisimmät modulit näyttävät kerralla 1*16..4*40 merkkiä tyypistä riippuen.
Pienemmissä näytöissä (ainakin 6-numeroisiin 7-segmenttinäyttöihin asti) on jokaista ohjattavaa segmenttiä varten oma pinninsä. Segmenttien "toinen pää" on kytketty yhteiseen pinniin (backplane).
Pienen, esim. kolmenumeroisen 7-segmenttinäytön ohjaukseen tarvitaan siten 3*7+1 = 22 I/O-linjaa, joten sellainen voidaan liittää suoraan tyypilliseen mikrokontrolleriin.
Tässä sovelluksessa näyttöjä haluttiin liittää useita, jolloin minkään valmiin mikrokontrollerin I/O-linjat eivät riittäisi (puhumattakaan kymmenien johtojen aiheuttamasta ongelmasta).
Kuten edellä on kerrottu, on alfanumeerisen modulin liittäminen hyvin yksinkertaista. Sille tarvitsee vain varata liitin, jonka kautta se voidaan liittää prosessorin väylään. Segmenttinäyttöjen liittäminen on sen sijaan paljon monimutkaisempaa.
Sattumalta projektin alkuvaiheessa löytyi romuksi tuomittuja laitteita, joihin sisältyi riittävä määrä tähän projektiin soveltuvia 6-numeroisia 7-segmentti-LCD-näyttöjä. Niihin myös sisältyi tähänkin käyttötarkoitukseen soveltuva, yksinkertainen I/O-logiikka: LCD-lasit on liitetty CMOS-logiikasta tehtyyn 56-bittiseen siirtorekisteriin (data sarjamuotoisena sisään, ulostulot rinnakkaisesti. Data siirtyy ulostuloihin vasta kun ohjaussignaali Lp vaihtaa tilaa). Moduleita voi ketjuttaa, jolloin esim. neljä näyttöä muodostavat 224-bittisen siirtorekisterin.
LCD-moduleiden periaate on esitetty alla olevassa kuvassa. Myös numerosegmenttien välissä olevia pisteitä voidaan ohjata yksitellen. Kaksoispisteiden pisteet ovat yhteisohjattavia. Kuuden numeron näytössä on siten itsenäisesti ohjattavia segmenttejä yhteensä 4*7+5+2=49 kpl.
Näiden näyttöjen käyttäminen siis edellyttää jatkuvaa ohjelmallista päivittämistä:
Siirtorekisterejä on ohjattava LCD-näyttöjen ohjausvaatimuksen mukaisesti, eli jokainen näyttöjä ohjaava bitti on komplementoitava täsmällisin välein. Jotta komplementointi tapahtuisi juuri oikealla hetkellä on datan siirtoa rekisterien ulostuloihin ohjaava signaali (Lp) saatava ajastimelta.
Seuraavaksi käytettävä data (edellisen komplementti) voidaan siirtää siirtorekistereihin odottamaan milloin vain Lp-signaalin tilanvaihdosten välillä.
(Huom. myös näyttömodulin backplane on kytketty siirtorekisterin yhteen ulostuloon, joten se komplementoituu samalla taajuudella kuin segmenttien ohjauslinjatkin. Segmentti on joko musta tai läpinäkyvä sen mukaan, onko sen ohjauslinja samassa- vai erivaiheessa backplanen kanssa).
Valitut LCD-näytöt aiheuttavat ohjelmiston rakenteelle seuraavat vaatimukset:
Koska yhtenä tavoitteena on prosessorin kellotaajuuden laskeminen mahdollisimman alas, saadaan näyttöjen rakenteen aiheuttamista ohjelmistovaatimuksista johdettua minimi prosessorin kellotaajuudelle, kun LCD-näyttöjä päivittävän ohjelmiston rakenne (ja suoritusajat) on määritelty.
Valinta kohdistui lopulta Motorolan 68HC11-kontrolleriin. Aluksi oli tarkoitus käyttää mallia E1, mutta alustava suunnittelu osoitti, että mallia F1 käytettäessä päästään vähempään ulkoisten komponenttien määrään ja säästetään tarvittavaa piirilevypinta-alaa.
Valinnan ratkaisivat 68HC11:n eduksi
Malliin F1 päädyttiin kahdesta syystä: Sen muistiväylä on multipleksoimaton, eli osoite- ja datalinjat ovat erillään. Siten sitä käytettäessä ei tarvita ulkoista latch-piiriä alimpien osoitelinjojen erottamiseksi multipleksoidusta väylästä. Mm. A- ja E-malleissa käytetyssä multipleksoidussa väylässä puolet osoiteväylästä ja dataväylä tuodaan ulos kontrollerista samoja linjoja pitkin.
Kontrollerissa on myös chip selectien tuottamiseen tarvittava logiikka (ellei sellaista ole (esim. malli E1), tuotetaan tarvittavat chip selectit ulkoisella logiikalla ylimmistä osoitelinjoista ja CPU:n kellosignaalista).
Ulkoisen muistin ja I/O-laitteiden liittäminen 68HC11F1-kontrolleriin on helppoa, koska se tuottaa muistin tarvitsemat chip select-valintasignaalit kahdelle muistipiirille ja kahdelle I/O-laitteelle. Toinen muistipiiri on ohjelmamuisti (ROM), ja toinen valintasignaali päätettiin käyttää lisämuistipiirille, jollaisena voidaan käyttää joko RAM- tai ROM-muistia (lisämuistia (RAM) tarvitaan lähinnä ohjelmankehityksen aikana). Lisämuistin koko voi vaihdella 8 - 128 kilotavun välillä. I/O-valintasignaalien avulla tarvittavan alfanumeerisen LCD-näytön liittämiseen ei tarvita yhtään aktiivista lisäkomponenttia.
Mikrokontrollerin sisältämä yhden kilotavun RAM-muisti on mahdollista varmistaa ulkoisen muistinvarmistuspariston avulla. Valitettavasti sellaisen käyttäminen vaatisi lisäämään ulkoista logiikkaa (prosessorin muistinsäilytysjännitteen syöttöpinnillä on muitakin tehtäviä). Kun kelloa varten löytyi sopiva piiri, joka sisältää myös 56 tavua RAM-muistia, päätettiin prosessorin muisti jättää varmistamatta. Se siis nollautuu jokaisen virtakatkon yhteydessä, samoin kuin ulkoinen lisämuisti-RAM. Kellopiirin 56 tavua riittävät täyttämään haihtumattoman muistin tarpeen.
Seuraavaan kuvaan on koottu kaikki järjestelmään sisältyvät muistit. Kuvasta näkyy myös ulkoisten muistipiirien kytkentäperiaate. Osoiteavaruutta suurempien, 128 kilotavun muistipiirien ylimmät osoitelinjat on yhdistetty I/O-linjoihin, jolloin muistista voidaan ohjelmallisesti valita 32 kilon sivu näkymään muistiavaruudessa. Tähän palataan vielä myöhemmin.
Väylään liitettävistä piireistä on malleja, joihin kuuluu kiinteästi ainakin kymmeneksi vuodeksi riittävä lithium-paristo (ulkoista paristoa ei tarvita). Sellaisia on käytetty mm. PC-tietokoneissa ja niiden saatavuus Suomesta on hyvä. Väylään liitettävien piirien huono puoli on kuitenkin se, että ne vaativat chip select-signaalin, ja muisteille sopivat kaksi linjaa oli jo varattu. Valinta kohdistui siten sarjaliitännällisiin kellopiireihin.
Dallas Semiconductorsin datakirjasta löytyi kiinnostava malli, joka olisi sisältänyt mm. ohjelmoitavia hälytysominaisuuksia. Piiriä ei ollut saatavissa pienissä erissä, joten tilalle oli etsittävä toinen malli. Soittokierros suomalaisille puolijohdekauppialle paljasti kuitenkin, ettei sarjaliitännällisiä malleja juurikaan varastoida suomessa. Varasto-ohjelmista löytyy vain sellaisia malleja, joita muutamat suuret elektroniikkatuotteiden valmistajat käyttävät omissa tuotteissaan, joten valinta rajoittui niihin. Jokseenkin ainoa soveltuva malli oli SGS-Thomsonin MK41T56, piiri, jossa on kellon lisäksi 56 tavua RAM-muistia.
Valittu kellopiiri on tarkoitettu liitettäväksi I2C-yhteensopivaan väylään. I2C on kahden linjan (kello ja data) sarjaväylä, johon voidaan liittää useita erilaisia muisti- ja I/O-piirejä. Väylän siirtonopeus on enintään 100kbps. Sitä käytetään mm. kulutuselektroniikkatuotteissa. Useissa mikrokontrollereissa, mm. monissa Philipsin tuotteissa, on I2C-väyläohjain sisäänrakennettuna, mutta 68HC11-malleissa sellaista ei ole.
I2C-väylän simuloiminen ohjelmallisesti tavallisia I/O-linjoja käyttäen on mahdollista ainakin tätä piiriä käytettäessä, koska sarjaväylän kellotaajuudelle on minimiksi määritelty 0hz. Siten piirin ohjainohjelma voi toimia keskeytykset sallittuina, jolloin LCD-näyttöjen päivitysohjelman toiminta ei esty pitkienkään I2C-väyläoperaatioiden aikana.
Puskurointia varten tarvitavan piirin valinta oli yksinkertainen: Maximin MAX232 seuraajineen on saavuttanut "teollisuusstandardin" aseman. MAX232:n ainoa ongelma on suuri virrankulutus, 10mA, joka on aivan liikaa tässä sovelluksessa, jossa ko. sarjaliitäntään ei yleensä ole liitetty yhtään mitään. Onneksi sama valmistaja tekee yhteensopivaa mallia, jolla on pienempi virrankulutus (2mA, 0.5mA typ., MAX220), sekä kahta laajennettua mallia, jotka voidaan ohjata shutdown-tilaan (10uA, MAX222 ja MAX242).
Kaikkia em. piirejä voidaan käyttää samalla piirilevyllä, kun levy suunnitellaan MAX242:ta varten. Se valittiin siten ensisijaiseksi vaihtoehdoksi.
Vene-elektroniikan yleisesti käyttämä sarjaväylä NMEA-0183 ei ole RS-232-yhteensopiva. Koska NMEA-standardista on olemassa useita versioita, jotka eivät ole keskenään yhteensopivia, eikä koko väylään ollut suoranaista tarvetta, päätettiin se jättää pois suunnitelmista ja korvata RS-232-puskureilla, josta on selvästi enemmän hyötyä. Tarvittaessa NMEA-väylää varten voitaisiin lisätä ulkoisia komponetteja vaikka erilliselle piirilevylle.
Liittimiä laitettiin kaksi, koska prosessorissa oli kaksi I/O-piirien liittämiseen soveltuvaa chip select-signaalia. Toinen liittimistä on "standardin" mukainen 14-pinninen liitin, toisessa on 20 pinniä, joista 14 ensimmäistä vastaavat ensimmäistä liitintä. Kuuteen lisäpinniin on yhdistetty mm. IRQ- ja XIRQ-keskeytyslinjat, jotta liittimeen voisi tarvittaessa yhdistää muunkin tyyppisen I/O-laitteen.
Ominaisuuksia jaettiin seuraavasti:
"Liian isojen" muistipiirien käyttämiseksi oli useita vaihtoehtoja:
Järjestely jakaa kummankin muistipiirin neljään 32 kilotavun sivuun. Ylimmille osoitelinjoille kytkettyjen I/O-linjojen tilaa vaihtamalla voidaan osoittaa kaikkia sivuja.
Muistien kytkennän yleisrakenne on esitetty edellä muistipiirien käsittelyn yhteydessä. Kuvassa näkyy myös I/O-linjojen käyttäminen muistipiirien ylimpinä osoitelinjoina. Linjat, joita käytetään lisämuistipiirin ylimpinä osoitteina, toimivat myös I2C-väylänä kellopiirille. Tämän järjestelyn tarkoituksena on säästää I/O-linjoja. I2C-väylän toimintaa ja samojen linjojen käyttämistä useissa tarkoituksissa käsitellään vielä ohjelmiston yhteydessä.
(68HC11-kontrollerista on olemassa malleja, joihin sisältyy mahdollisuus 1 megatavun muistiavaruuden käyttämiseen. F1-malli ei kuitenkaan ole sellainen).
Piirilevy päätettiin suunnitella 2-puoliseksi sellaista valmistusprosessia varten, johon voi hyvissä olosuhteissa päästä itse tehden, vaikka protoa varten olikin tarkoitus teettää levy. Tämä sääntö rajoitti "normaalietäisyydellä" (0.1") olevien piirin jalkojen välistä vedettävien vetojen määrän yhteen ja pakotti käyttämään suhteellisen leveää viivanleveyttä.
Toinen suunnitteluun vaikuttava seikka on käytettävä kokoamistekniikka: Tämän laitteen prototyyppi, samoin kuin kaikki mahdollisesti myöhemmin tehtävät kappaleet oli tarkoitus koota käsityönä. Se sulkee pois ainakin pienimmät pintaliitososat (suurempia pystyy kyllä asettelemaan pinsettien avulla). Lopulta päädyttiin käyttämään vain "perinteisiä" osia, pintaliitososia ei käytetty.
Piirilevy suunniteltiin Circad-ohjelman demoversiolla.
Arvioitu 750 kellojaksoa tarkoittaa, että suurimmalla päivitystaajuudella (100Hz) päivitys käyttäisi
Juurikaan 250kHz pienempää kellotaajuutta ei liene syytä harkita.
Seuraavassa kaaviossa on esitetty päivitysrutiinin suoritus suhteessa aikaan. LCD-näyttöjä ohjaava Lp-signaali vaihtaa tilaa hetkillä 0,n,2n,3n,... ja antaa samalla keskeytyksen. Päivitysrutiinin suoritus (1,2,3,4) aloitetaan heti kun mahdollista, ts. välittömästi kun keskeytysten käsittely on sallittu (td0, td1 tai td2 kuluttua Lp:stä). Tällä keskeytyksellä on suurin prioriteetti, joten muut keskeytyspalvelut eivät pääse väliin. Näyttöjen vaurioitumisen välttämiseksi on pystyttävä takaamaan, että käsittelyn alkamisen viive lisättynä keskeytyksen suoritusajalla (tx) ei ylitä päivitysjakson pituutta (n).
Näyttöjen päivittämisen lisäksi vaatimuksiin sisältyy sarjaliitännän käyttäminen. Koska kontrollerin sarjaliitäntä ei sisällä erillistä FIFOa, vaan jokainen merkki on luettava erikseen, saadaan suurin mahdollinen siirtonopeus määriteltyä näyttöjen päivitysten vaatiman ajan perusteella: Näyttöjen päivitystä suoritettaessa ovat muut keskeytykset estettyinä, joten päivitys saa kestää korkeintaan kahden merkin vastaanottamiseksi tarvittavan ajan lisättynä ajalla, joka saattaa kulua keskeytysten ollessa estettynä muusta syystä (koska näyttöjä päivittävällä keskeytyksellä on suurin prioriteetti).
Kun edelliseen kuvaan lisätään näyttöjen päivitysten lisäksi sarjaliikennekeskeytykset, saadaan periaatekuva näistä lähteistä aiheutuvista keskeytyksistä. Sarjaliitännän keskeytys toistuu enimmillään. 5 kertaa useammin kun näyttöjen (mikä seuraa aiotusta 4800 bps siirtonopeudesta vs. 100Hz näyttöjen maksimipäivitystaajuudesta).
Kellotaajuuden laskennan pohjaksi käy arvio, että muut keskeytykset kieltävät osuudet kestävät korkeintaan 250 kellojaksoa. Silloin kahden vastaanotetun merkin saapumisajoilla pitää olla väliä vähintään 1000 kellojaksoa. Merkkien välissä kuluva aika määräytyy yksinkertaisesti siirtonopeudesta ja siirrettävien bittien määrästä.
Sarjaliitännän käyttäminen NMEA-liitännän toteuttamiseen haluttiin pitää mahdollisena, joten minimivaatimukseksi tuli NMEA:n määrittelemä siirtotapa (4800 bps, 8 bittiä dataa, ei pariteettia, 1 stop-bitti, eli yhteensä 10 bittiä/merkki), eli 480 merkkiä sekunnissa. Tästä saadaan kellotaajuudeksi 480kHz, mikä tarkoittaisi (noin) 1.92MHz:n kiteen käyttämistä. Käytännössä kide on valittava siten, että siitä saadaan muodostettua asynkronisen sarjaliitännän vaatima ohjaustaajuus. Lähimmät sopivat taajuudet ovat 2.0MHz ja 1.8432MHz.
Kidetaajuudeksi päätettiin valita 1.8432MHz. Se tarkoittaa myös käytännössä, että muiden kuin näyttöjä päivittävän rutiinin aiheuttamien keskeytysten kieltämisten maksimikesto saa olla vain 210 kellojaksoa, ja silloinkin ollaan aivan äärirajoilla (Huom. tässäkin tapauksessa aikaa jää muuhunkin. Pahimmillaan saadaan välittömästi peräkkäin keskeytykset sarjaliitännältä, näyttöjen päivityksestä ja uudestaan sarjaliitännältä, mutta sen jälkeen ei seuraa uutta näyttökeskeytystä).
[versio 1.6, 1996/03/10 20:08:32] [Lähetä palautetta Laurille]