C-kieli ja ohjelmointi

Yleisesti

Tarkoituksena kun on hieman älykkäämpi sähköinenjärjestelmä, on hyvä ottaa avuksi tietokoneella ohjelmoitavat mikropiirit. Järjestelmä koostuu siis näkyvästä ns. Raudasta (komponenteista) ja niitä ohjaavasta ohjelmasta jota ei nähdä kuin tietokoneen ruudusta. C-kieli on yksi ohjelmointikielistä joka soveltuu hyvin mikropiirien ohjelmointiin. Ohjelma itsessään on joukko komentoja joita suoritetaan yksi rivikomento kerrallaan siinä järjestyksessä kuin ne ovat kirjoitettu. Valmis ohjelma siirretään sitä varten tarkoitetulla laitteella tietokoneelta ohjelmoitavaan mikropiiriin joka alkaa suorittamaan kirjoitettua ohjelmaa.


Rekisterit

Ohjelmoitava mikrokontrolleri sisältää lukuisan määrän rekistereitä. Näillä ohjataan kaikki haluttu toiminta. Yksi rekisteri sisältää 8kpl bittejä joita muuttamalla saadaan mikropiiri tekemään haluttuja asioita. Rekisteriin voidaan kirjoittaa ja sieltä voidaan lukea tietoa. Yksi rekisteri on siis tavun kokoinen muistipaikka. Esimerkkinä atmega328 mikrokontollerin rekisteri nimeltä PORTB:

Tällä rekisterillä määritellään mikropiirin jalkojen (8 kpl) tilat eli syötetäänkö virtaa jalkaan vai ei (syttyykö esim LED-valo vai ei)


Rekisteriin kirjoitetaan komennolla:

PORTB = 0b11110000;

Rekisterin neljä ensimmäistä bittiä on merkitty nollaksi. Tarkoittaa että neljässä ensimmäisessä jalassa ei ole sähköt päällä. Ja neljä viimeistä on merkitty ykköseksi. Siis neljään viimeiseen jalkaan tulee sähköä 5V ( 5Voltin käyttöjännite oletuksena ) . Tällä tavoin voidaan jo ohjata vaikka 8kpl led-valoja joista 4 jo loistaa hienosti. Aika hurjaa vai mitä? 


Keskeytykset

Normaalisti ohjelma suorittaa tekemäämme ohjelmaa rivi kerrallaan. Kesketys on toiminto jonka mikrokontrolleriin on sisäisesti rakennettu. Jos vaikka edellämainittuun PORTB rekistereissä määriteltyyn ulkoiseen jalkaan tulee piirin ulkopuolinen jännitemuutos ja määriteltyyn jalkaan on asetettu rekisterien kautta keskeytysmahdollisuus, keskeytyy ohjelman perussuoritus ja ohjelman suoritus jatkuu keskytysvektorista.. Hieno sana jo vain..taas vektoreita. Se on tässä tapauksessa vain muistiosoite joka sisältää itse kirjoittamamme keskeytysohjelmakoodin,  Sen jälkeen suoritetaan keskeytykseen kirjoittamamme ohjelmakomennot välittömästi. Suoritettua keskeytysohjelman, jatkuu ohjelman suoritus siitä mihin se ennen keskeytystä jäi. 


Ensimmäinen ohjelma

Tässä esimerkki kokonaisesta ohjelmasta: Ohjausmikropiirin yhteen jalkaan on liitetty LED-valo. Tämä ohjelma kytkee siihen jalkaan sähköt päälle jonka jälkeen antaa sen palaa sekunnin ja lopuksi sammuttaa valon sekunniksi. Ohjelma on sen jälkeen suoritettu ja se alkaa alusta. Tuloksena sekunnin välein vilkkuva led-valo. Uuuh..koodi näyttää vaikealta. Voikohan sitä ymmärtää? No yritetään.


#include <avr/io.h> Tämä rivi vain pitää olla. Se määrittelee käytettäviä kirjastoja. 

void setup() Tästä alkaa rekisterien alustus asetukset ennen ohjelman käynnistymistä

{

DDRB = 0b00000001 ; Nyt määritellään yksi rekisteri jonka nimi on DDRB. Asetetaan yksi jalka kahdeksasta, ( todellisuudessa niitä on tässä piirissä vain 6kpl PORTB:ssä, mutta koska rekisteri on aina 8 bittiä pitkä niin 2kpl jää käyttämättä) nyt meidän itse ohjattavaksi. Eli kirjoitetaan sinne yksi (1). Nolla (0)-tarkoittaa että jalkaa ei ohjata itse.

}

void loop() Tästä alkaa itse ohjelma jota suoritetaan loputtomasti.

{

PORTB = 0b00000001 ; Nyt on tutun näköistä. Virta päälle jalkaan yksi, ja LED-valo syttyy.

delay(1000) ; Odotetaan 1000 millisekuntia, eli sekunti paikallaan eikä liikuta tästä

PORTB = 0b00000000 ; Virta pois päältä jalasta yksi. LED-valo sammuu.

delay(1000) ; Taas odotetaan sekunti

} Ohjelma on suoritettu ja voidaan siirtyä suorittamaan se alusta uudelleen :)


Alla olevassa kuvassa mikropiirin jalkajärjestys 

Nähdään että PORTB jalat löytyvät kohdasta PB0, PB1, PB2, PB3, PB4 ja PB5. 



Ohjausmikropiirin kytkentä

Mikrokontrollerin kytkennän voi rakentaa itse tai ostaa valmiita piirikortteja jossa on kaikki mahdollinen valmiina. Itse suosin tee-se-itse tapaa. Tarvitaan Kide + 2kpl kondensaattoreita (Kelloksi), vastus + kondensaattori (Reset piiriksi) sekä virtalähde. Tällä laitos lähtee jo hyvin käyntiin. Ohjelmoiminen on hieman erilaista kuin  valmiin kortin mutta piirin toiminta tulee huomattavasti paremmin selville harjoitellessa.