KILPAILIJAN TEHTÄVÄT Kilpailijan nimi / Nro: Tehtävän laatinut: Hannu Laurikainen, Deltabit Oy
Kilpailutehtävä Kilpailijalle annetaan tehtävässä tarvittavat ohjelmakoodit. Tämä ohjelma on tehty laitteen edellisen suunnittelukierroksen jälkeen ja se on lähes toimiva. Ohjelma koostuu seuraavista tiedostoista: T2007_T4.prj T2006.c Deltabit.h Deltabit.lib Projektitiedosto Pääohjelma Kirjastofunktioiden esittely Kirjastorutiinit, kopioi tämä tiedosto kääntäjän lib-kansioon, esim. C:\Program Files\cvavreval\lib Kilpailijan tehtävänä on korjata ohjelmassa esiintyvät virheet ja jatkaa laitteen ohjelmistokehitystä jäljempänä olevien tehtävämääritysten mukaisesti. Ohjelman toiminta Käynnistyksen jälkeen ohjelma alustaa ja tarkistaa sormenjälkitunnistimen (SjAlustus). Jos tunnistimen toiminnassa ei havaita virheitä, laite on valmiina tunnistamaan sormenjälkiä. Perustilassa tunnistimessa palaa punainen valo. Ennen kuin sormea voidaan tunnistaa, se on rekisteröitävä järjestelmään. Rekisteröintiä varten on käytettävissä kymmenen muistipaikkaa. Rekisteröinti käynnistetään numeronäppäimellä 0 9, joka samalla määrää käytettävän muistipaikan. Näppäimellä * voidaan poistaa kaikki rekisteröinnit. Näppäin # ei ole toistaiseksi käytössä sovelluksessa. Kappaleessa Ohjelman käyttö on lisää ohjeita. Kirjastorutiinit välittävät tietoa pääohjelmalle seuraavien muuttujien avulla. Kunkin muuttujan arvo nollataan aina käsittelyn jälkeen. Nappain: Tähän muuttujaan asetetaan painettua näppäintä vastaava merkki. SjTila: Tähän muuttujaan asetetaan tieto sormenjälkitunnistuksen tapahtumista (ks. Deltabit.h). Pulssi: Tämä muuttuja asetetaan ykköseksi noin puolen sekunnin välein. Sitä voi käyttää toimintojen ajastukseen. Ohjelman rakenne ja muotoilu (6 pistettä) Ohjelman kirjoittamisessa on noudatettava alkuperäisen ohjelman mukaista muotoilua. Kilpailijan muuttama tai lisäämä koodi pitää olla hyvin kommentoitua. Ohjelmassa esiintyvät vakiot pitää nimetä ja määritellä niitä kuvaavalla suomenkielisellä vakiomäärityksellä. Ohjelmakoodissa on käytettävä ehto- ja toistorakenteita tarkoituksenmukaisella tavalla.
Tehtävä 1 (2 pistettä) Ohjelmakoodissa on jokin syntaksivirhe (tai useita), jonka takia ohjelman käännös ei onnistu. Korjaa ohjelmassa esiintyvät syntaksivirheet siten, että ohjelman käännöksessä ei esiinny virheitä. Kilpailun tuomari ilmoittaa maksimiajan, mikä tähän tehtävään on käytettävissä. Mikäli et ole tähän mennessä ratkaissut tehtävää 1, tuomari kertoo oikean ratkaisun ja menetät tästä tehtävästä saatavat 2 pistettä. Tämän jälkeen voit jatkaa kilpailua normaalisti eteenpäin. Tehtävä 2 (2 pistettä) Kun sormenjälki tunnistetaan, releen pitäisi vetää noin 3 sekunnin ajan. Nyt rele antaa vain lyhyen pulssin. Korjaa ohjelma niin, että releen pulssi on oikean mittainen. Tehtävä 3 (4 pistettä) Näppäin # ei toistaiseksi ole käytössä ohjelmassa. Muuta ohjelmaa niin, että näppäimellä # asetetaan releen vetoajaksi vuorotellen 3 sekuntia tai 1 sekunti. Tunnistimen vihreän ledin pitää palaa sama aika kuin rele vetää. Lisää ohjelmaan uusi muuttuja, johon releen vetoaika talletetaan. Anna muuttujalle myös alkuarvo ohjelman käynnistyessä. Tehtävä 4 (4 pistettä) Muuta ohjelmaa niin, että muistipaikkaan 0 rekisteröidyllä sormella ohjataan rele vuorotellen pysyvästi päälle ja vastaavasti pois päältä. Muistipaikan saa selville muuttujasta SjTila (ks. Deltabit.h). Tunnistimen vihreän ledin toimintaa ei muuteta, eli se palaa 3 sekuntia (tai 1 sekunnin) onnistuneen tunnistuksen merkiksi. Muiden sormenjälkien toiminta jätetään ennalleen. Kun rele on ohjattu pysyvästi auki, normaalin sormen tunnistus palauttaa sen takaisin lepotilaan, kun 3 sekuntia (tai 1 sekunti) on kulunut.. Tehtävä 5 (8 pistettä) Sormenjälkitunnistuksen tilasta on saatavana tieto muuttujassa SjTila (ks. Deltabit.h): - kun tunnistin havaitsee sormen tunnistimella - kun sormea ei tunnistettu - kun tunnistimella on havaittu virhe Kommentoi ohjelmasta pois käytöstä koko if-lause:
/* */ if ((SjTila > 0) && (SjTila <= 10)) // Sormenjälki tunnistettu?... Korvaa se funktiokutsulla: SjTarkistus(); Laadi funktio SjTarkistus, joka toteuttaa kommentoimasi if-lauseen toiminnot sekä lisäksi: - sytyttää keltaisen ledin, kun tunnistin havaitsee sormen tunnistimella - vilkuttaa punaista lediä 3 sekunnin ajan, kun sormea ei tunnistettu - sytyttää punaisen ledin vilkkumaan, kun tunnistimella on havaittu virhe Tunnistimen virhettä voit testata irrottamalla liittimestä J3 johdon 3 tai 4.
Ohjelman käyttö Sormenjäljen rekisteröinti 0 9 Ennen kuin sormenjäljen tunnistus on mahdollista, sormi on rekisteröitävä. Käytössä on kymmenen muistipaikkaa. Rekisteröinti käynnistetään numeronäppäimellä 0-9. Numero määrää samalla muistipaikan. Varmista, että tunnistin on valmiustilassa (punainen valo palaa yksinään). Paina numeronäppäintä 0 9 haluamasi muistipaikan mukaan. Keltainen valo palaa. Laita sormi tunnistimelle. Pidä sormi tunnistimella, kunnes vihreä valo palaa yksinään. Rekisteröinti onnistui. Jos punainen valo vilkkuu, rekisteröinti epäonnistui. Muistipaikka on jo käytössä tai sormesta ei saatu kunnollista kuvaa.
Sormenjälkien poistaminen * Tällä toiminnolla poistetaan kaikki rekisteröidyt sormenjäljet. Varmista, että tunnistin on valmiustilassa (punainen valo palaa yksinään). Paina näppäintä *. Keltainen valo palaa lyhyesti. Kun vihreä valo syttyy, sormenjäljet on poistettu. Jos punainen valo vilkkuu, sormenjälkirekisteri oli jo tyhjä.
Ohjelmalistaus Tiedosto T2007.c /************************************************************************** TAITAJA 2007 ELEKTRONIIKKAFINAALI 30-1.2.2007 Ohjelmointitehtävä Kilpailijan nimi: (laita nimesi tähän) **************************************************************************/ #include "Mega48.h" #include "Deltabit.h" #define AIKA_3S 6 // 3 sekunnin aikavakio // Sj-tunnistimen funktiokutsujen tilat (muuttuja Tila) #define T_OK 0 // - palvelu onnistui #define T_VIRHE 1 // - palvelu päättyi virheeseen unsigned char ReleLaskuri; unsigned char LedLaskuri; void LueNappain() bit Tila = T_VIRHE; SjLedit(LED_K, 0); switch (Nappain) case "#": break; case '*': if (!SjPoista()) Tila = T_OK; break; // Releen vetoaika 0,5 s pulsseina // Ledien näyttöaika 0,5 s pulsseina // Funktiokutsun tila, oletusarvoksi virhetila // Keltainen led palamaan komennon suorituksen ajaksi. // Näppäintä ei käsitellä. // Sormenjälkien poistaminen default: if (!SjRekisteroi(Nappain - '0')) Tila = T_OK; // Sormenjäljen rekisteröinti if (Tila == T_OK) SjLedit(LED_V, 0); else SjLedit(LED_P, LED_P); LedLaskuri = AIKA_3S; Nappain = 0; // Vihreä ledi palamaan. // Punainen ledi vilkkumaan. // Näytetään lediä 3s // Nollataan näppäintieto käsittelyn jälkeen. void main(void) ReleLaskuri = 0; LedLaskuri = 0; if (SjAlustus()) SjLedit(LED_P, LED_P); while(1); SjLedit(LED_P, 0); while(1) if (Nappain) LueNappain(); // Alustus ei onnistunut. Punainen ledi vilkkumaan. // Jätetään pyörimään silmukkaan. // Näppäimen käsittely if ((SjTila > 0) && (SjTila <= 10)) // Sormenjälki tunnistettu? SjLedit(LED_V, 0); // Vihreä ledi palamaan.
RELE = ON; // Rele päälle. ReleLaskuri = AIKA_3S; LedLaskuri = AIKA_3S; SjTila = 0; if (Pulssi) Pulssi = 0; if (LedLaskuri) LedLaskuri--; if (!LedLaskuri) SjLedit(LED_P, 0); // Kellopulssin käsittely (noin 0,5 s välein) // Ovatko ledit poikkeustilassa? // Palataan perustilaan (punainen palamaan). if (ReleLaskuri) ReleLaskuri--; if (ReleLaskuri) RELE = OFF; // Releen ohjaus päällä? // Rele pois päältä
Tiedosto Deltabit.h #define LED_P #define LED_K #define LED_V 0b00000001 // Punainen led 0b00000010 // Keltainen led 0b00000100 // Vihreä led #define RELE PORTC.0 // Releen ohjausportti #define ON 1 // Rele vetää #define OFF 0 // Rele ei vedä extern char extern bit Nappain; // Painettu näpppäin // Näppäimen käsittelyn jälkeen // asetetaan arvoksi 0 Pulssi; // Kellopulssi, asetetaan 0,5s välein // Pulssin käsittelyn jälkeen arvoksi // on asetettava nolla extern unsigned char SjTila; // Sormenjäljen tunnistuksen tila // Tilan käsittelyn jälkeen arvoksi // on asetettava nolla // 0 = ei tapahtumia // 1..10 = tunnistettu sormi (0-9) // 20 = havaittu sormi tunnistimella // 21 = sormea ei tunnistettu // 22 = virhe tunnistimella /* SjAlustus - SORMENJÄLKITUNNISTIMEN ALUSTUS */ /* Palauttaa */ /* 0 = alustus onnistui */ /* 1 = virhe */ unsigned char SjAlustus(); /* SjLedit - LEDIEN TILAN ASETUS */ /* tila = sytytettävät ledit (LED_P, LED_K, LED_V) */ /* vilkutus = vilkutettavat ledit (LED_P, LED_K, LED_V) */ /* Halutut ledit yhdistetään or-operaattorilla esim. */ /* LED_P LED_K */ void SjLedit(unsigned char tila, unsigned char vilkutus); /* SjRekisteroi - SORMENJÄLJEN REKISTERÖINTI */ /* Parametri */ /* no = muistipaikan numero 0-9 (0x00-0x09) */ /* Palauttaa */ /* 0 = rekisteröinti onnistui */ /* 1 = virhe */ unsigned char SjRekisteroi(unsigned char no); /* SjPoista - KAIKKIEN SORMENJÄLKIEN POISTAMINEN */ /* Palauttaa */ /* 0 = poistaminen onnistui */ /* 1 = virhe */ unsigned char SjPoista(); #pragma library Deltabit.lib
MAKSIMIPISTEET 26 p Tuomarit T1-T3 Arvostelukohde KA T1 T2 T3 Tehtävä 1 Syntaksivirheen korjaus 0 2p Tehtävä 2 Releen vetoajan korjaus 0 2p Tehtävä 3 Näppäimen # käsittely 0 4p Tehtävä 4 Releen pysyvä ohjaus sormella 0 0 4p Tehtävä 5 Funktio tunnistuksen tilan käsittelyyn 0-8p Ohjelmakoodin muotoilu 0-2p Kommenttien käyttö Vakioiden käyttö 0-2p 0-2p Yhteensä pistettä Osion 1 pisteet yhteensä pistettä / 26p Tuomarien allekirjoitus T1 T2 T3