Ajastin

Julkaistu 31 July 2016 kello 22.45

Tein tänä keväänä yhden yksinkertaisen ATtiny85-mikrokontrolleria käyttävän projektin. Se ei ole kovin kummoinen, mutta ainakin se valmistui, vaikka opiskeluissa riitti kiireitä. Minulla ei myöskään ole kuvia rakennusvaiheesta, mutta yritin vähän kirjoitella siitä ja laitoin kuvia valmiista ajastimesta.

Kuvat ovat vähän huonosti, laitan ne paremmin myöhemmin. Isot kuvat saat näkyviin klikkaamalla pikkukuvia.

Idea on hyvin yksinkertainen, periaatteessa perinteinen munakello AAA-paristoilla, binäärinäytöllä ja pietsokaiuttimella. Käytin neljää lediä ilmaisemaan kellonaikaa eli sillä voi esittää minuutit nollasta viiteentoista. Laitoin myös viidennen ledin ilmaisemaan, että ajastin on päällä.

Ajastin

Koska ATtiny85:ssä on vain kahdeksan pinniä, joista korkeintaan kuutta voi käyttää GPIO-pinninä, käytin ledeille Charliepleksausta. Koska käytin resetin reset-napille, laitoin toiseen pinniin napin ja kolmanteen pietson, minulle jäi vain kolme pinniä ledejä varten. Sillä saisi kuusikin lediä, mutta ulkonäkösyistä päätin laittaa vain kolme. Kuudennen lisääminen olisi myös vaatinut hieman lisää ajastuksen suhteen.

Käyttöliittymän suunnittelin kahdella napilla toimivaksi. Toinen on reset nappi, joka palaa aina alkuun. Toinen säätää ajan ja lopettaa hälytyksen. Ajan laskeminen aloitetaan muutama sekunti viimeisen painalluksen jälkeen. Lisäksi paristokotelossa on virtakytkin. Pietsona käytin tasavirtapietsoa, joten en käyttänyt PWM:ää sen ajamiseen enkä voi vaikuttaa ääneen. Totesin sen hieman miellyttävämmäksi, kun käytin puolen sekunnin mittaisia piippauksia.

Charliepleksauksessa ledejä poltetaan yksi kerrallaan vaihtaen niiden välillä nopeasti. Ledit ovat kytkettynä olemmista päistään GPIO-pinneihin ja niitä on molemmin päin eli vaihtamalla pinnien asentoa saadaan halutut ledit palamaan. Mikrokontrollerilta sen käyttö vaatii mahdollisuuden laittaa pinni high impedance-tilaan eli AVR:n tapauksessa määritellä pinni sisääntuloksi. Tässä toteutuksessa ledejä vaihdetaan 250 kertaa sekunnissa (250 Hz) ja jokainen ledi sytytetään 50 kertaa sekunnissa, joten vilkkumista ei juuri huomaa ellei niitä kuvaa kameralla. Vertailun vuoksi kuvaputkinäytöt yleensä piirtävät jokaisen pikselin 60-90 kertaa sekunnissa (LCD-näytöt toimivat eri tavalla).

Käytin projektissa kahta keskeytystä. Ensimmäinen niistä on ajastimelta (Timer0 Compare A), joka ohjaa ledejä. Se siis tuottaa keskeytyksen 250 kertaa sekunnissa ja käsittelijä sitten muuttaa ledien pinnien asentoa tarpeen mukaan. Toinen keskeytys on painonapin, joka muuttaa ohjelman tilaa tai laskuria sen mukaan missä tilassa ollaan.

En koteloinut ajastinta, koska arvelin ettei se olisi tarpeen, vaikka sitä keittiössä käytettäisiinkin. Tyydyin vain kuumaliimaamaan piirilevyn paristokotelon päälle. Kotelo voisi kuitenkin olla yksi mahdollinen parannus.

Ajastin

Ajastimen toiminttaan jäi pieni puute, sillä ledit näyttävät välkähtävän kerran sekunnissa. Luultavasti se johtuu siitä, etten jaksanut optimoida keskeytyksen koodia, niin ettei sillä kerran sekunnissa kauemmin vaihtaa palavaa lediä.

Koodi on mielestäni melko selkeää. Voit hakea sen GitHubista. Kicadillä tehty kytkentäkaaviokin löytyy.

Kommentoinnin tarjoaa Disqus