Matopeli
Yleistä
Matopeli (työnimi Snake) käyttää näyttönään 256 lediä, jotka on asetettu 16x16 -matriisiksi. Pelin ydin on PIC16F84-mikrokontrolleri, jonka ohjaamia neljää siirtorekisteriä (4094) käytetään näyttämään kuvaa ruudulla. Laitteen "rautapuoli" on siis tarkoitettu pelkästään kuvan esittämistä ja näppäinpainallusten välittämistä varten, joten ahkera koodaaja saa tehtyä sille lisääkin pelejä. Esimerkiksi tetris kävisi näyttötyypille hyvin. Alkuperäisen idean matopeliin on keksinyt Antti Gärding.
Laitteen suunnittelun lähtökohtana oli saada peli mahtumaan taskukokoon. Se aiheutti tarpeen jakaa laitteisto kahdelle piirilevylle: näyttölevy ja ohjainlevy, jotka molemmat ovat kaksipuoleisia. Pelin ensimmäisen version ohjainpiirilevy oli yksipuoleinen, mutta rivejä ohjaavat 16 transistoria oli erotettava vielä omalle pienelle piirilevylleen tilanpuutteen takia. Nykyisessä versiossa koko ohjausjärjestelmä on samalla levyllä.
Laitteen toiminta
PIC16F84:ssa on vain 13 I/O-nastaa, joten vapaasti määritellyn kuvan piirtämiseen 256 ledistä muodostuvalle näytölle tarvitaan jokunen muukin komponentti. Helpoin toteutus saatiin, kun sekä näytön rivejä että sarakkeita ohjaamaan pistettiin kaksi sarjaan kytkettyä 8-bittistä siirtorekisteriä (4094), jotka antavat PIC:n syöttämän sarjamuotoisen datan ulos rinnakkaismuodossa. Näin koko näytön ohjaamiseen tarvitaan vain kuusi I/O-nastaa
Rivejä ohjaavaan siirtorekisterilinjaan syötetään binääriluku, jossa vain yksi bitti on asetettu. Tällöin vain yhtä riviä ohjaava transistori johtaa kytkien kyseisen rivin ledien katodit maapotentiaaliin. Nyt sarakkeita ohjaavaan siirtorekisterilinjaan voidaan syöttää valitun rivin sisältöä vastaava bittisarja, ja kun siirtorekisterien ulostulot kytketään toimimaan, rivin ledit palavat halutunlaisesti. Kun kaikkia rivejä piirretään järjestyksessä tarpeeksi nopeasti, saadaan kuva syntymään.
Siirtorekisterien toimintaperiaatteen ansiosta riviohjaimen sisältöä ei tarvitse syöttää kokonaan uudestaan joka rivin piirtoa varten, vaan riittää, kun ennen ensimmäisen rivin piirtoa riviohjaimeen syötetään bitti 1, ja sen jälkeen syötetään bitti 0 aina, kun halutaan vaihtaa seuraavalle riville. Näin ykkönen kulkee koko linjaston läpi valiten yhden rivin kerrallaan piirrettäväksi.
Laitteen kokoonpano
Huomautuksia:
- Muutamassa kuvassa esiintyy laitteeseen tekemäni laajennus, joka tuo pelin sisältävän mikrokontrollerin (matopelissä PIC16F84A) laitteen ulkopuolelle erilliselle kortille. Kortilla on PIC:n lisäksi kide, kiteen kondensaattorit, sekä kolmas kondensaattori tasaamaan käyttöjännitettä. Korttiliittimenä on vanhasta tietokoneen emolevystä irroitettu ISA-väylän lyhyempi osa (18-pin leveä). Korttiliitin on kytketty laitteen ohjauspiirilevyllä olevaan mikrokontrollerin kantaan johtojen päässä olevilla piikki(/holkki)rimoilla. Pelikortille käyttämäni syövytysmaski on täällä.
- Piirilevyjen syövytysmaskit ovat 300dpi ja negatiiviset (musta alue syövytetään pois). Kaikki maskit on kuvattu komponenttipuolelta katsoen.
- Kuvissa esiintyvä laite on tehty käyttäen vanhempia piirilevyjen versioita, joten pieniä ulkoisia eroja uuteen versioon saattaa löytyä (esim. näytön sarakkeille tulevien johtojen kiinnityskohdat).
- Kannattaa miettiä osien kiinnitysjärjestys huolella, muuten tulee ahdasta: esim. päältä juotettavat osat ensin, ja rivejä ohjaavat 16 transistoria ennen niiden vieressä olevaa vastusriviä.
- Näytön ledejä juotettaessa kannattaa testata jokainen ledisarake (johdoilla ja jännitelähteellä) ennen seuraavan sarakkeen ledien juottamista, sillä sen jälkeen ledien puoleisia juotoksia voi korjata vain näytön taakse asennettavilla hyppylangoilla (joita ei ole kiva asentaa).
- Tässä kuvassa piirilevyn oikeassa reunassa näkyvä kide on pujotettu pahvinpalan läpi ennen juottamista, mikä kannattaa tehdä, mikäli kide näyttää koskevan vieressä kulkeviin kuparivetoihin.
- Kannattaa pistää toinen paristolta tulevista johdoista kulkemaan virtakytkimen kautta, helpottaa laitteen sulkemista huomattavasti... Omassa versiossani käytin pientä liukukytkintä, jota näkyy hiukan sivun yläreunassa olevassa kuvassa, laitteen oikealla kyljellä.
- Matopeliä varten ohjaukseen tarvitaan vain 4 näppäintä, mutta laitteeseen on rakennettu mahdollisuus kahteen lisänäppäimeen (kuvissa asennettu). Mahdolliset laitteelle tehtävät uudet pelit saattavat käyttää näitä näppäimiä.
- Kuvissa näkyvä laitekotelo on SP-Elektroniikan kotelo B10SW (ulkomitat 29x72x124 mm), josta on vuoltu pois piirilevyn kiinnikkeet.
Matopeli-ohjelma
Kiinteät ominaisuudet:
- madon maksimipituus 181 yksikköä
- vilkkuva ruokapalikka
- pistelaskuri, 1 piste/ruokapalikka
- ennätyspisteiden tallennus PIC:n EEPROM-muistiin
- pelin lopussa näytetään saavutettu pistemäärä ja ennätyspisteet. Saavutettua pistemäärää vilkutetaan mikäli ennätys on rikkoutunut.
- ohjaus neljällä näppäimellä
- mahdollisuus kiertää seinien läpi kentän "ympäri"
Koodista helposti muutettavat vakiot (osio VAKIOT lähdekoodin alkupuolella):
- madon aloituspituus (oletus 3)
- pituuden lisäys yhden ruokapalikan syömisestä (oletus 2)
- madon liikkumisnopeus (oletus noin 5.4 siirtoa sekunnissa)
- madon alkusijainti
- kentän kiinteät esteet (valinnanvapaus rajoitettu), "suljettu" kenttä mahdollinen
Ongelmat ja huomautukset:
- Koska PIC16F84:ssä on käytettävissä vain 68 tavua RAM-muistia, koodin optimointi on tehty täysin muistinkäytön ehdoilla. Siksi ruudunpäivitystaajuus pienenee selvästi madon pituuden kasvaessa, ja suurilla pituuksilla (~100 yksikköä) välkkyminen käy jo häiritseväksi.
- Koska tämä oli ensimmäinen PIC-projektini, en koodia suunnitellessani vielä hallinnut tiedon lukemista koodimuistista ajon aikana. Siksi pisteiden esittämisessä tarvittavat numeroiden fontit on tallennettu PIC:n EEPROM-muistiin, jonka sisältö kirjoitetaan ohjelmapaketin mukana tulevasta tiedostosta (snake_ee.hex) erikseen ohjelmakoodin (snake.hex) kanssa. EEPROMin kirjoittaminen nollaa samalla pelin ennätyspisteet.
- Koska laitteen näppäimissä ei ole minkäänlaista häiriösuodatusta, niin näppäimen painallus tulkitaan joskus moneksi painallukseksi. Matopelissä tästä voi olla haittaa vain, jos painaa seuraavan näppäimen alas ennen edellisen vapauttamista, jolloin mato saattaa tehdä ylimääräisen käännöksen takaisin alkuperäiseen menosuuntaan. Jos tekee laitteelle muita pelejä tai vika muuten vain häiritsee, niin kannattaa rakentaa näppäimille vaikkapa kondensaattorisuodatukset. Osittain ongelmaa voi poistaa myös ohjelmallisesti.
Kuvia:
Yleiskuva, kuvassa myös ulkoinen pelikortti.
Sisälmykset: Kuva1, Kuva2, Kuva3.
Tiedostot:
Ohjauselektroniikan kytkentäkaavio: snake_schematic.gif
Piirilevyjen maskit ja osasijoittelu: snake_pcb.zip
PIC:lle kirjoitettava ohjelma lähdekoodeineen: snake_software.zip
Ohjainpiirilevy Eaglen ymmärtämässä muodossa: snake.brd
Näyttöosan maskit PSP-kuvatiedostona, joka sisältää näytön valinnaiset osat eri kuvatasoina (layers) ja mahdollistaa esimerkiksi toiskätisen näppäinten asettelun: snake_display+buttons+ctrl.psp
Kysymyksiä, kommentteja ja ehdotuksia saa pistää sähköpostilla, osoitteet löytyvät allekirjoittaneen kotisivulta.
Päivitetty: [12.10.2003]
Tuomas Tuononen