maanantai 23. huhtikuuta 2018

Mietteitä softasta


Ennen varsinaisesti hommiin ryhtymistä tuli vähän ajateltua ja hahmoteltua millainen mikrokontrollerin ohjelman tulisi karkealla päätasolla olla. Ohjelmahan on tyypillinen ohjausohjelmisto eli sille on tuloja, joiden perusteella lähtöjä (=2 solenoidia + 3 merkkivaloa) ohjataan. Ohjelma on helpointa rakentaa tilakoneena (FSM, Finate State Machine) toimivaksi, jolloin tiladiagrammi näyttää tältä:

DPS-ohjainkortin tilakone

Eli tilakoneessa on kolme tilaa (DPS1, DPS2 ja DPS3), joihin siirrytään kahden napin (DPS+ ja DPS-) signaaleilla. DPS+:lla siirrytään ylöspäin, mutta kun päästään 3. vaihteelle, niin siitä ylöspäin (eikä ympäri) ei tietenkään mennä. Vastaavalla tavalla alaspäin mennään pykälä kerrallaan.  

Ohjelmateknisesti yksinkertaisin tapa rakentaa tilakone on käyttää muutamia globaaleja muuttujia, tässä tapauksessa tarvitaan pitää muistissa nykytila (curr_state) ja tieto seuraavasta tilasta (next_state). Vaihteen vaihtonappien (DPS+ ja DPS-) käsittely on järkevintä tehdä keskeytyskäsittelijöissä, joissa on tarpeen ainoastaan asettaa next_state -muuttujalle arvo curr_staten perusteella. Molempien nappien keskeytyksille tehdään omat rutiinit eli jotenkin näin: 
 Keskeytysrutiineiden lohkokaaviot
Eli kun nappia painetaan, siitä seuraa keskeytys ja ohjelman suoritus siirtyy keskeytyskäsittelijään, jossa asetetaan pääohjelmassa käsiteltävä tieto tilasta, johon tulee siirtyä. Käsittelijässä huolehditaan myös ympäripyörähdysten estäminen. Keskeytyskäsittelijöitä ei tavallisten funktioiden tapaan kutsuta omasta koodista vaan niihin siirtyminen tapahtuu rautatasolla signaloituna. Keskeytyskäsittelijän suorittamiseen siirrytään mistä tahansa kohdasta ohjelmakoodia ja tätä siirtymistä voidaan kontrolloida vain sallimalla tai kieltämällä keskeytykset.

Pääohjelman lohkokaavio voisi karkealla tasolla näyttää vaikkapa tältä:
 Hahmotelma ohjaimen pääohjelmaksi

En ala käymään ajattelemaani toimintaa sen tarkemmin läpi, ohjelmointia osaavat pystyvät kyllä saamaan tuosta irti tarvittavan tiedon. Tärkeää tuossa on huomata se, että pikavaihteiden ohjaamiseen vaikuttaa myös käsijarrun, moottorin öljynpaineen (eli onko kone käynnissä vai ei) ja kytkinpolkimen tila. Vaihde voidaan valita milloin vain, mutta solenoideja ohjataan vain, jos käsijarru on pois päältä JA öljynpaine on normaali JA kytkinpoljinta ei ole painettu. Oleellista on myös se, että kun ohjausta aloitetaan suorittamaan, niin keskeytykset on kiellettävä siihen saakka kunnes edellinen on käsitelty loppuun. Käsittelyn aikana tapahtuva mahdollinen uusi keskeytys ja tilakoneen tilan muutos voisi johtaa kummallisuuksiin.

Tässä vaiheessa en ole vielä miettinyt tai selvittänyt tarvittavia ajastuksia ja viiveitä, mutta ne selviävät matkan varrella. Keskeytyskäsittelijätkin tulevat toiminnaltaan yllä olevaa karkeaa hahmotelmaa monimutkaisemmiksi. Niissä täytyy ottaa huomioon ja osata käsitellä mm. mekaanisissa kytkimissä aina esiintyvä värähtely. Jos värähtelyä ei huomioida, niin yhdestä napin painalluksesta seuraisi lukemattomia keskeytyksiä jännitteen heiluessa 10-30 ms ajan ylös ja alas.

Softakin on siis tekemistä vaille valmis... 

Ei kommentteja: