Liikennevaloprojekti, osa 2

Jatketaanpa liikennevalojen parissa. Kun varsinainen kytkentä oli saatu tehtyä, siirryttiin koodaamaan. Henkilökohtaisesti en ollut ikinä koodannut PICcejä muulla kuin PicBasicilla ja halusinkin tutustua C-kielen maailmaan. Microchip tarjoaa ilmaiseksi MPLAB-käyttöympäristön, joka tosin oletuksena käyttää suoraan Assembleriä. MPLABiin voidaan onneksi suoraan liittää erilaisia ohjelmointikieliä ja valitsin nopealla googlauksella parhaalta tuntuvan ilmaisvaihtoehdon, Hi-Tech C Liten. Ilmaisversiosta puuttuu ilmeisesti koodinoptimointiominaisuuksia, joita emme varmastikaan tässä projektissa tarvitse :) Lisäksi MPLAB Tukee suoraan PicKit2-ohjelmointilaitetta, joka pöytälaatikosta valmiiksi löytyikin.

Toimivuus Windows 7:n kanssa oli kyseenalaista joten jätin sen testauksen väliin ja asensin ohjelmistot vanhalle XP-kannettavalle, jonka hetimiten nimesinkin Miljoonalaatikon omaksi pikku apulaiseksi. Pienen asentelun jälkeen kaikki tuntui toimivan ja voimmekin siirtyä itse asiaan. Ohjelmallisesti halusimme valojen siis toimivan kuten oikeatkin jalankulkijavalot, eli valon vaihtuessa vihreästä punaiseksi se välkyttäisi kolme kertaa ennen vaihtumistaan.

Käydäänpä lähdekoodi läpi :

#include <htc.h>

__CONFIG(0x0FEA);

#define _XTAL_FREQ 4000000
#define VIHREA GP4
#define PUNAINEN GP5
#define NAPPI GP0

 

Alkuun sisällytetään tietenkin Hi-Tech C:n kirjastot ja asetetaan Config-bitit (vrt. Atmel sulakkeet). Config-bitit voidaan asettaa myös MPLABin valikosta mutta on parempi asettaa ne suoraan koodiin, jolloin koodi on siirrettävissä IDEstä toiseen. Jos bitit ovat koodissa MPLABista pitää muistaa asettaa “Configuration bits set in code”-kohtaan ruksi valikosta Configure – Configuration Bits. Bittien merkitys selviää datakirjasta, mutta tässä 0FEA tarkoittaa että käytetään sisäistä oskillaattoria, WDT ja Code Protection disabloitu ja pinni 4 ei toteuta Mem Clear-toimintoa vaan on digitaalitulo.
Lisäksi määritellään oskillaattorin taajuus jotta delayt toimivat oikealla nopeudella (käytetään PIC12 4MHz sisäistä oskillaattoria) ja lähdöt (punainen ja vihreä valo) sekä tulo (nappi).

void main()
{

int MENE = 0;

TRIS = 0b00000011;
GPIO = 0;

Varsinaisessa ohjelman pääfunktiossa alustetaan MENE-muuttujan arvoksi 0 (alkuarvoisesti liikennevalot ovat siis punaisella). TRIS-rekisterillä määritellään pinnit GPIO0 ja GPIO1 tuloiksi ja kaikki muut lähdöiksi. Lisäksi asetetaan kaikki lähdöt nollaksi (mikään valo ei pala).

while (1==1)
{
if (NAPPI)
{

Luodaan silmukka, jossa tarkistetaan koko ajan IF:llä tulon tila. Jos nappia painetaan…

if (MENE==1)
{
VIHREA = 0;
__delay_ms(500);
VIHREA = 1;
__delay_ms(500);
VIHREA = 0;
__delay_ms(500);
VIHREA = 1;
__delay_ms(500);
VIHREA = 0;
__delay_ms(500);
VIHREA = 1;
__delay_ms(500);
VIHREA = 0;
PUNAINEN = 1;
MENE = 0;
__delay_ms(1000);
}

…ja valo on vihreä (MENE=1), vilkutetaan vihreää valoa kolme kertaa 0.5 sekunnin välein päälle ja pois. Tämän jälkeen sytytetään punainen valo, asetetaan MENE nollaksi ja odotetaan 1s (Jotta ei vaihdeta tilaa heti uudestaan vaikka nappia pidettäisiin pohjassa).

else
{
MENE = 1;
PUNAINEN = 0;
VIHREA = 1;
__delay_ms(1000);
}
}
}
}

Jos taas valo on punainen (MENE=0), sytytetään vihreä heti ja odotetaan 1s.

Nyt kun koodi on valmis, se voidaan kääntää (MPLAB: Project – Build tai F10) ja mikäli kääntämisen aikana ei tule virheitä, ohjelmoida laitteeseen (Programmer – Program).

Aluksi ohjelma testattiin ilman 230V kytkentää syöttämällä levylle suoraan 12V tasajännite. Ei ole mukavaa jos kytkentä/ohjelmavirheen takia kauniista projektista tulee savut ulos. Toiminta todettiin juuri sellaiseksi kuin haluttiin.

Kuten koodista huomataan, ohjelman toiminta on todella yksinkertainen, mutta kuitenkin sen toteutus erillispiireillä vaatisi huomattavan määrän komponentteja ja piirilevyn koko paisuisi turhan isoksi. Koska toinen tulo (GPIO1) on tässä jätetty vielä käyttämättä, voidaan siihen helposti lisätä ohjelmallinen toiminto, kuten vaikka jatkuva vuorottelu kahden valon välillä tai ajastettu ohjelmakierto. Tätä tullaan tutkailemaan myöhemmin lisää kunhan pyöritellään ideoita mitä valoilla halutaan tehdä.

Valmis lähdekoodi: liikennevalot.c

Seuraavassa osassa kasataan valot valmiiksi kokonaisuudeksi ja kuinkas sitten kävikään…

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>