TAMPEREEN AMMATTIKORKEAKOULU Tietotekniikan koulutusohjelma Tietokonetekniikan suuntautumisvaihtoehto

TAMPEREEN AMMATTIKORKEAKOULU Tietotekniikan koulutusohjelma Tietokonetekniikan suuntautumisvaihtoehto
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikan koulutusohjelma
Tietokonetekniikan suuntautumisvaihtoehto
Perttu Kilpijoki
TEXAS INSTRUMENTSIN EZ430-F2013-KEHITYSTYÖKALU
Työn valvoja:
Työn ohjaaja:
Tampere 2007
Yliopettaja Mauri Inha
Yliopettaja Mauri Inha
TAMPEREEN AMMATTIKORKEAKOULU
INSINÖÖRITYÖN TIIVISTELMÄ
Tekijä:
Työn nimi:
Perttu Kilpijoki
Texas Instrumentsin eZ430-F2013-kehitystyökalu
Päivämäärä:
Sivumäärä:
Hakusanat:
Koulutusohjelma:
Suuntautumisvaihtoehto:
6.11.2007
24 sivua ja 11 liitesivua
MSP430, mikro-ohjain
Tietotekniikka
Tietokonetekniikka
Työn valvoja:
Yliopettaja Mauri Inha
Tässä tutkintotyössä on tutustuttu Texas Instrumentsin sulautettujen järjestelmien
kehitystyökaluun eZ430-F2013 ja 16-bittiseen MSP430-mikro-ohjaimeen, johonka laite
perustuu. Työ käsittelee laitteen ominaisuuksia ja mikro-ohjaimen ohjelmointia.
Texasin Instrumentsin kehitystyökalu tarjoaa oivan alustan tutustua MSP430-mikro-ohjaimen
ohjelmointiin, mutta se soveltuu myös laajemmin mikro-ohjaimen ohjelmankehitykseen ja
testaukseen. Kehitystyökalu on tehty rakenteeltaan USB-tikun kaltaiseksi, ja se koostuu USBliitäntäisestä ohjelmointi-työkalusta ja kohdepiiristä, jolla itse mikro-ohjain sijaitsee. Mikroohjaimen ohjelmointi tapahtuu vaivattomasti suoraan USB-väylän kautta, josta saadaan myös
käyttöjännite piirille, eikä mitään ulkoista teholähdettä tarvita.
Mikro-ohjaimeen tutustumista ja sen toiminnan testaamista varten on kirjoitettu C-kielellä
kokoelma erilaisia ohjelmia. Ohjelmien toiminta painottuu pääosin mikro-ohjaimen
perusominaisuuksien ja oheispiirien hallintaan kuten kellomoduulin, keskeytystapahtumien,
ajastimien ja perus-I/O-toimintojen suorittamiseen. Työssä on testattu lisäksi piirin flash-muistiin
tallentamista ohjelman ajon aikana sekä A/D-muuntimen sisäistä lämpötila-anturia. Ohjelmien
kirjoittamiseen on käytetty kehitystyökalun mukana tulevaa ilmaisversiota IAR Systemsin
Embedded Workbench -ohjelmasta, jonka tarvittuja ominaisuuksia käsitellään myös työssä.
TAMPERE POLYTECHNIC
THESIS ABSTRACT
Author:
Name of the thesis:
Perttu Kilpijoki
Texas Instrument’s eZ430-F2013 Development Tool
Date:
Number of pages:
Keywords:
Program:
Specialisation:
6.11.2007
24 pages and 11 appendix pages
MSP430, microcontroller
Computer Systems Engineering
Embedded Systems
Thesis supervisor
Senior Lecturer Mauri Inha
This engineering thesis is focusing on the Texas Instrument's eZ430-F2013 development tool
and its 16 bit MSP430 microcontroller. Thesis handles device's basic features and
microcontroller's programming.
The development tool provides a good base to become familiar with a MSP430 microcontroller
and its programming but it also can be used for the microcontroller's program development and
testing in more extensive projects. The development tool is in USB stick form and consists of a
USB emulation tool and a target board with the microcontroller. Programming is easily done via
the USB port and there is no need to use external power supply because USB provides needed
operation voltage to the microcontroller.
To get to know the microcontroller and to test its functions, there has been written several
programs in C-language using a free kickstart version of a programming IDE called IAR
Embedded Workbench. Programs' functions are mainly focused on using the microcontroller's
basic events and peripherals such as a clock module, interrupt routines, timers and I/O functions.
In addition to this there is tested flash memory writing and A/D converter's internal temperature
sensor. Work also contains some issues about IAR Embedded Workbench that are used in
programming.
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
iii
ALKUSANAT
Tämän työn tarkoituksena oli oppia tuntemaan mikro-ohjaimen kehitystyökalun
toimintaa ja mikro-ohjaimen ohjelmointia. Työ on pääasiassa tehty syksyn 2007
aikana, mutta alustava työn suunnittelu alkoi jo aikaisemmin kesällä. Työn tekeminen on ollut aikaa vievää ja haastavaa, mutta lopulta palkitsevaa.
Haluan kiittää kaikkia niitä henkilöitä, jotka ovat antaneet tukensa työn aikana,
kiitos myös Mauri Inhalle mielenkiintoisesta tutkintotyön aiheesta.
Tampereella 6. marraskuuta 2007
Perttu Kilpijoki
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
iv
SISÄLLYSLUETTELO
TIIVISTELMÄ…………………………………………………………………………...….....…i
ABSTRACT………………………………………………………………………………………ii
ALKUSANAT……………………………………………………………………………………iii
LYHENTEET JA SYMBOLIT………………………………………………………………..….v
1 JOHDANTO...............................................................................................................................1
2 EZ430-F2013-KEHITYSTYÖKALU ........................................................................................2
2.1 MSP430-F2013-mikro-ohjaimen ominaisuuksia................................................................3
2.2 I/O-liitännät.........................................................................................................................4
2.3 Kellomoduuli ......................................................................................................................4
3 OHJELMOINTI EZ430-F2013-KEHITYSTYÖKALULLA.....................................................5
4 OHJELMIEN TEKEMINEN .....................................................................................................7
4.1 Keskeytykset ja ajastimet....................................................................................................7
4.1.1 Vahtiajastin .................................................................................................................7
4.1.2 Timer_A ......................................................................................................................9
4.1.2.1 Sieppaustilojen käyttö .......................................................................................14
4.1.2.2 Pulssinleveysmodulaatio ...................................................................................16
4.1.3 Ulkoinen keskeytys ...................................................................................................17
4.2 Flash-muistin käyttäminen................................................................................................18
4.3 Lämpötilasensori...............................................................................................................21
5 YHTEENVETO .......................................................................................................................24
LÄHTEET
LIITTEET
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
v
LYHENTEET JA SYMBOLIT
A/D
Analog to Digital, analogisen signaalin muuttaminen digitaaliseksi
FLASH
Uudelleen kirjoitettava haihtumaton muistityyppi
FET
Flash Emulation Tool, emulointityökalu
I/O
Input/Output, piirin sisään- ja ulostuloliitännät
I2C
Inter-Integrated Circuit bus, Philipsin kehittämä yleiskäyttöinen
tiedonsiirtoväylä
IDE
Integrated Development Environment, integroitu kehitysympäristö
RF
Radio Frequency, radiotaajuus
RISC
Reduced Instruction Set Computer, suppean käskykannan omaava
prosessori
SPI
Serial Peripheral Interface, Motorolan synkroninen tiedonsiirtoväylä
SRAM
Static Random Access Memory, yleinen käyttömuistityyppi, josta
tieto haihtuu virran katkettua
TSSOP
Thin-Shrink Small Outline Package, pintaliitoskotelo tyyppi
USB
Universal Serial Bus, sarjaväylästandardi oheislaitteiden liittämiseksi
tietokoneeseen
USI
Universal Serial Interface, sarjaliikennepiiri
VLO
Very Low Power Low Frequnecy Oscillator, MSP430-mikroohjaimen sisäinen kello-oskillaattori
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
1(24)
1 JOHDANTO
EZ430-F2013 on Texas Instrumentsin kehittämä ja vuoden 2006 alkupuolella
julkaisema edullinen sulautettujen järjestelmien kehitystyökalu, joka perustuu
Texas Instrumentsin MSP430-mikro-ohjaimeen.
Erittäin pienikokoinen kehitystyökalu on muotoilultaan USB-tikun kaltainen ja
USB-liitäntäinen, mikä mahdollistaa laitteen helpon liitännän ja ohjelmoinnin
suoraan USB-portista ilman erillisiä kaapeleita tai teholähdettä. Ohjelmien
tekemiseen ja testaamiseen on tarkoitus käyttää laitteen mukana tulevaa
ruotsalaisen IAR Systems -yhtiön Embedded Workbench -kehitysympäristöä.
Tässä työssä on tarkoituksena tutustua eZ430-F2013-kehitystyökaluun. Tavoitteena
on oppia tuntemaan kehitystyökalun ominaisuuksia ja toimintaa sekä tehdä
kokoelma pieniä ohjelmia C-kielellä, että laitteen toimintaa voitaisiin
monipuolisesti testata.
Työssä esitellään ensin eZ430-F2013-kehitystyökalun rakennetta ja ominaisuuksia.
MSP430-F2013-mikro-ohjaimen ominaisuuksista on pyritty tekemään vain
pääkohdat sisältävä esittely, koska kaikki tarvittavat yksityiskohdat on
löydettävissä mikro-ohjaimen datakirjasta ja ohjekirjasta./1,2/ Loppuosa työstä
keskittyy laitteen ohjelmointiin ja ohjelmien käsittelyyn.
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
2(24)
2 EZ430-F2013-KEHITYSTYÖKALU
Texas Instrumentsin eZ430-F2013-kehitystyökalupakettiin kuuluu itse laite ja
kaikki tarvittava ohjelmisto kokonaisten projektien tekemiseen ja testaamiseen.
Kehitystyökalu on kapseloitu läpinäkyvään muovikoteloon (kuva 1), joka voidaan
liittää USB-portin kautta suoraan tietokoneeseen tavallisen USB-tikun tavoin.
Suljetussa kotelossa olevaa laitetta voidaan sinällään käyttää ohjelmistonkehitykseen ja testaukseen, mutta jos piirille halutaan lisätä komponentteja, tai itse
kehityskortti halutaan sijoittaa loppulaitteeseen ohjelman kehityksen jälkeen, niin
suojakotelo tarvitsee avata. Suojakotelo voidaan helposti avata esimerkiksi
ruuvitaltalla vääntämällä, minkä jälkeen sisällä oleviin piireihin pääsee käsiksi.
Kuva 1 EZ430-F2013-kehitystyökalu
USB-moduulin sisältä paljastuu kaksi piiriä (kuva 2). Toinen piiri on USBemulointityökalu (MSP-EZ430U Debugging Interface), ja sen päähän liitetty toinen
piiri on varsinainen kehityskortti (MSP-EZ430D Target Board). Emulointityökalua
käytetään kehityskortin ohjelmointi- ja emulointilaitteena. Emulointikortilla TI:n
TUSB3410-piiri hoitaa USB-väylän ohjauksen ja TPS77301-piiri reguloi
kehityskortille tarvittavan 3V:n jännitteen USB-väylän 5 V:n jännitteestä.
Kehityskortilla on MSP430-F2013-mikro-ohjaimen lisäksi vain muutama muu
komponentti ja mikro-ohjaimen kaikki liitäntänastat on kytketty piirin reunassa
oleviin 14 kytkentäreikään, jotka ovat halkaisijaltaan 1 mm:n. Ainoan näkyvän
I/O-osuuden muodostaa P1-portin 0-pinniin kytketty vihreä ledi. Kehityskortti ja
emulointityökalu liitetään toisiinsa nelinapaisella liittimellä ja kommunikointi osien
välillä hoidetaan Texas Instrumentsin Spy Bi-Wire debug- ja ohjelmointiliitännän
avulla. /3/
Kuva 2 USB-emulointikortti ja irrotettava kehityskortti
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
3(24)
2.1 MSP430-F2013-mikro-ohjaimen ominaisuuksia
Texas Instrumentsin MSP430-mikro-ohjaimet on suunniteltu erityisesti edullisiin ja
pientä kulutusta vaativiin sulautettuihin laitteisiin, kuten langattomiin RFsovelluksiin tai erilaisiin paristokäyttöisiin sovelluksiin. /4/
Kehityskortilla oleva MSP430-F2013-mikro-ohjain kuuluu Texas Instrumentsin
MSP430F20xx-suoritinperheeseen. Kaikki suoritinperheen mikro-ohjaimet perustuvat 16-bittiseen RISC-prosessoriin ja von Neuman-arkkitehtuuriin, missä
ohjelma- ja datamuisti sijaitsevat samassa osoiteavaruudessa, käyttäen samaa
osoiteväylää. Pieni käskykanta sisältää 27 käskyä ja 7 erilaista osoitusmuotoa.
Mikro-ohjaimen arkkitehtuuri tukee hyvin korkean tason ohjelmointia ja
esimerkiksi c-kielellä tehtyjä ohjelmia pystytään suorittamaan tehokkaasti.
Prosessorin sisäisiä rekistereitä on 15 kappaletta, joista suurin osa on
yleiskäyttöisiä. Erityiskäyttöiset rekisterit R0-R3 ovat käytössä ohjelmalaskurille,
pino-osoittimelle, tilarekisterille ja vakiolukugeneraattorille.
F2013-mikro-ohjaimen suurin kellotaajuus voi olla 16 MHz ja käyttöjännite voi
olla välillä 1,8 - 3,6 V. Ohjelmamuistina piirillä toimii flash-muisti, jota voidaan
ohjelmoida vaikka ohjelman ajon aikana. Flash-muistin määrä on 2 kilotavua + 256
tavua, koska se on osioitu kahteen pääosaan, jotka on vielä jaettu useisiin
segmentteihin. Flash-muistin lisäksi piirillä on käyttömuistina 128 tavua SRAMmuistia.
Muita tärkeitä ominaisuuksia ovat 10 kappaletta I/O-liitäntöjä ja monipuoliset
oheispiirit kuten 16-bittinen TIMER_A-ajastin/laskuri, vahtiajastin ja 16-bitttinen
sigma-delta-tyyppinen analogia-digitaalimuunnin, jossa on sisäänrakennettu
lämpötilasensori. Piirillä on myös USI-sarjaväylä, joka tukee SPI- ja I2Ctiedonsiirtotapoja, sekä niin sanottu brownout detector, jolla valvotaan mikroohjaimen käyttöjännitettä. Lisäksi käyttäjällä on mahdollisuus hyödyntää viittä
erilaista virransäästötilaa sovelluksissa.
Kuvassa 3 on esitetty F2013-piirin sisäisistä rakenteista pelkistetty
toimintalohkokaavio, josta voidaan nähdä laitteiden väliset yhteydet ja
kytkeytyminen osoite- ja dataväylälle (MAB ja MDB). /1/
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
4(24)
Kuva 3 MSP430-F2013 lohkokaavio /1/
2.2 I/O-liitännät
F2013-piiri on paketoitu 14-nastaiseen TSSOP-pintaliitoskoteloon, ja kuvassa 4 on
esitetty piirin pinnijärjestys. Mikro-ohjaimessa on vain 10 kappaletta I/O-liitäntöjä,
mikä rajoittaa paljon kytkettävien oheislaitteiden määrää. I/O-liitännät on jaettu
digitaalisiin P1- ja P2-portteihin. P1 on 8-bittinen I/O-portti pinneissä 2–9, mutta
P2 on vain 2-bittinen I/O-portti pinneissä 12–13.
Porttien kaikki pinnit voidaan erikseen ohjelmoida joko tuloksi tai lähdöksi ja
niissä on kaikissa sisäänrakennetut ylös- ja alasvetovastukset, sekä keskeytysominaisuus ulkoisia keskeytyksiä varten. Pinnit sisältävät myös muita toimintoja,
jotka voidaan ottaa käyttöön, jos tietyn ominaisuuden omaavaa pinniä ei käytetä
tavallisena sisään- tai ulostulona.
Kuva 4 MSP430-F2013 pinnijärjestys /1/
2.3 Kellomoduuli
F2013-piirillä oleva kellomoduuli voi sisältää kolme eri kellolähdettä. Piirin
sisäisiä lähteitä on kaksi ja lisäksi on mahdollista käyttää ulkoista kidettä, jos
vaikka vaaditaan suurempaa tarkkuutta kellosignaalilta. Ulkoinen kide kytketään
XIN- ja XOUT-pinneihin, jotka ovat portin P2 molemmat pinnit. Sisäisiä lähteitä
ovat digitaalisesti ohjattava oskillaattori DCOCLK ja vähävirtainen ja
pienitaajuuksinen oskillaattori VLOCLK. Käytettäviä kellosignaaleja voi olla
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
5(24)
kolmea eri tyyppiä. Ne ovat nimeltään ACLK, MCLK ja SMCLK. Pienitaajuuksinen ACLK-kellosignaali voidaan tuottaa joko ulkoiselta kiteeltä tai sitten
sisäisestä VLO-oskillaattorista. ACLK-signaalia pystytään käyttämään esimerkiksi
taustalla kellona, joka herättää laitteen virransäästötilasta keskeytyspyynnön
tapahtuessa. MCLK-signaali on kellosignaali, jolla tahditetaan itse prosessoria ja
SMCLK-signaali on tarkoitettu nopeutta vaativille oheispiireille. MCLK- ja
SMCLK-signaalit voidaan muodostaa mistä tahansa piirin kellolähteestä, mutta
piirin käynnistyessä ne muodostetaan oletuksena DCO:lta. /2/
Useiden kellolähteiden ansiosta käyttäjällä on mahdollisuus tehdä sovelluksista
suorituskykyisiä, mutta myös vähän tehoa kuluttavia. Prosessorin ollessa
joutilaana, voidaan piiri laittaa sopivaan virransäästötilaan. Virransäästötilassa
tarpeettomat kellolähteet sammutetaan, jotta piiri kuluttaisi mahdollisimman vähän
tehoa. Esimerkisi LPM3-virransäästötilassa käytetään ainoastaan ACLK-signaalin
muodostavaa VLO-oskillaattoria tai ulkoista kidettä. Prosessori sekä muut
kellolähteet, jotka muodostavat MCLK- ja SMCL-signaalit, ovat sammutettuina.
Keskeytyksen tapahtuessa, piiri palaa nopeasti takaisin toimintatilaan, ja suorittaa
keskeytyspalvelun. Herääminen virransäästötilasta tapahtuu valmistajan mukaan
alle yhdessä mikrosekunnissa. /1/
3 OHJELMOINTI EZ430-F2013-KEHITYSTYÖKALULLA
Kehityslaitteen mukana toimitettava IAR Systemsin Embedded Workbench ohjelma on integroitu kehitysympäristö (IDE), joka on tarkoitettu kaikkien
MSP430-mikro-ohjaimien ohjelmointiin ja debuggaukseen. Ohjelma sisältää
editorin, simulaatorin, debuggerin sekä assembly- ja c-kääntäjän samassa paketissa.
Ilmaiseksi saatava ohjelma on eräänlainen kokeiluversio (kickstart), mutta sisältää
kuitenkin samat toiminnot kuin maksullinenkin. Lähdekoodin kokoa on kuitenkin
rajoitettu 4 kilotavuun ja tekninen tuki on erittäin rajallinen. /5/
Käyttöliittymältään ohjelma on perinteiseen Windows-tyyliin yksinkertainen (kuva
5). Projektikansioiden luominen ja järjestely on kuitenkin tehty vaikeaksi, mutta
ohjelmiston ohjekirjasta löytyy onneksi hyvä askel askeleelta opastava ohjeistus
niiden hallintaan. /7/
Ohjelmoinnin aloittaminen ei vaadi paljoakaan asetusten säätämistä, mutta
muutama tärkeä asia on huomioitava. Kuvasta 5 nähdään, kuinka valitaan oikea
mikro-ohjain projektia varten ylävalikosta Project -> Options. Samasta Optionsvalikosta voidaan valita Debugger-kohdasta, käytetäänkö ohjelman ajamiseen
simulaatoria vai käytetäänkö kehitystyökalun FET Debuggeria. Options-valikon
FET Debugger -kohdasta on tärkeä valita myös Connection-ruudusta TI USB FET,
että ohjelma tietää käyttää oikeaa USB-väylään kytkettyä kehitystyökalua. Lisäksi
on hyvä tietää FET Debugger-kohdan flash-muistiin liittyvistä valinnoista, joilla on
mahdollista pyyhkiä flash-muistin osiot tai säilyttää tiedot ilman uudelleenkirjoitusta, aina käyttäjän aloittaessa uuden debuggaus-jakson. Käyttäjä voi myös
valita mahdollisuuden liittyä testaamaan jo valmiiksi pyörivää ohjelmaa, mikä ei
häiritse ohjelman ajamista, eikä tyhjennä flash-muistia (kuva 6).
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
6(24)
Kuva 5. IAR Embedded Workbench -ohjelman käyttöliittymä
Kuva 6. Kehitystyökalun asetuksien valinta
Valmiin lähdekoodin testaaminen joko simulaattorilla tai itse laitteella tapahtuu,
kun valitaan Projects -> Debug. Debug-tilassa lähdekoodia voidaan ajaa koko ajan
tai käsky kerrallaan. Rekisterien muutoksia voidaan seurata vain, kun ohjelmaa
ajetaan käsky kerrallaan, tai sitten asettamalla pysäytyskohtia (break point)
haluttuihin kohtiin lähdekoodia. Rekisteri-ikkuna voidaan avata debug-tilassa
menemällä ylävalikkoon View ja valitsemalla sieltä Register.
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
7(24)
4 OHJELMIEN TEKEMINEN
Tässä luvussa käsitellään ohjelmien tekemistä kehitystyökalulle. Ohjelmat ovat
pääasiassa lyhyitä esimerkkejä, joilla voidaan käyttää jotain laitteen toimintoa.
Kaikkia käytettävien rekisterien ominaisuuksia ei selitetä, koska ne ovat
löydettävissä suoraan laitteen käyttöohjeista. Kaikkiin ohjelmiin sisällytetään
ainakin io430x20x3.h- ja intrinsics.h-määrittelytiedostot, jotka sisältävät mikroohjaimen rekisteri- ja bittimääritykset sekä ohjeita kääntäjälle.
4.1 Keskeytykset ja ajastimet
Keskeytyspalvelut ovat olennainen osa sulautetun järjestelmän ohjelmaa.
Satunnaisten tai tietyin väliajoin tapahtuvien tapahtumien suorittamiseen on
järkevin käyttää keskeytyksiä, ettei prosessorin tarvitse työskennellä turhaan
esimerkiksi kiertokyselemällä laitteiden tiloja.
F2013-mikro-ohjaimessa on kolmen tyyppisiä keskeytyksiä: nollauskeskeytykset
(System Reset), keskeytykset jotka voidaan estää ohjelmallisesti ja ehdottomat
keskeytykset (NMI). Nollauskeskeytyksen aiheuttaa useimmiten piirin
käynnistyminen ja ehdottoman keskeytyksen voi aiheuttaa esimerkiksi kellooskillaattorin viallinen toiminta.
Oheispiirit joilla on keskeytysominaisuus voivat aiheuttaa ohjelmallisesti estettävät
keskeytykset. Ohjelmallisesti estettävät keskeytykset ovat vektoroituja
keskeytyksiä, eli keskeytyksen tapahtuessa ohjelman suoritus jatkuu kyseiselle
keskeytysvektorille määritetystä kiinteästä osoitteesta, josta hypätään varsinaiseen
keskeytyspalveluohjelmaan. Kaikille keskeytysvektoreille on varattu tilaa
muistialueen loppupäästä. Keskeytysvektorin määrittämiseen löytyy ohjeet
kääntäjän ohjekirjasta.
#pragma vector = keskeytysvektorin nimi
__interrupt void Keskeytyspalveluohjelman nimi( void ); /6/
Vektorin määrittäminen ja keskeytyspalveluohjelma tai ohjelman prototyyppi on
oltava ohjelmakoodissa peräkkäin.
4.1.1 Vahtiajastin
Yksinkertaisin tapa tehdä ajastinkeskeytys on käyttää hyväksi mikro-ohjaimen
vahtiajastinta. Piirillä sijaitsevan vahtiajastimen pääasiallinen tarkoitus on nollata
prosessori, jos ohjelma jää ajon aikana jumiin. Mikäli vahtiajastinta ei kuitenkaan
tarvitse käyttää ohjelmassa, voidaan se ohjelmoida toimimaan tavallisena
ajastimena, joka tekee halutuin aikavälein keskeytyksen.
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
8(24)
Vahtiajastinohjelman tarkoituksena on vaihtaa kehityskortilla olevan ledin tilaa
noin viiden sekunnin välein hyödyntäen keskeytyspalvelua.
#pragma vector=WDT_VECTOR
__interrupt void WdtInterval( void );
void main(void)
{
BCSCTL3 = LFXT1S_2;
WDTCTL = WDTPW
+ WDTTMSEL
+ WDTSSEL
+ WDTIS0
+ WDTIS1
+ WDTCNTCL ;
//valitaan vlo-oskillaattori ACLK:n lähteeksi
//kirjoituksen sallinta
//interval timer mode
//Kellolähteeksi ACLK-signaali
//kellolähteen jakaja = 64
//wdt:n laskurin nollaus
P1DIR |= 0x01;
P1OUT = 0x00;
// Asetetaan P1.0 ulostuloksi
//nollataan P1.0...P1.7
IE1 +=0x01;
__enable_interrupt();
//sallitaan vahtiajastin keskeytys
//yleinen keskeytysten sallinta
while(1)
{
}
}
Ohjelman alussa määritellään vahtiajastimen keskeytysvektori WDT_VECTOR
kääntäjän vaatimassa muodossa sekä esitellään keskeytyspalveluohjelma.
Pääohjelmaan tultaessa valitaan VLO-oskillaattori tahdittamaan ACLK-signaalia
BCSCTL3-rekisteristä, joka on yksi kellomoduulin rekistereistä.
Seuraavaksi säädetään vahtiajastimen asetukset. Vahtiajastimen ohjelmointi
tapahtuu muokkaamalla sen ohjausrekisterin WDTCTL-arvoja. Rekisteri on
kuitenkin suojattu ja sen ylimpään tavuun on ensin asetettava heksaluku 0x5A
WDTPW-määrityksellä, ennen kuin siihen voidaan kirjoittaa. Jos lukua ei aseteta ja
rekisteriin yritetään kirjoittaa, niin piiri nollautuu. Vahtiajastin asetetaan intervaltilaan eli laskemaan pelkkää aikaväliä ja kellosignaaliksi valitaan ACLK, joka nyt
saadaan VLO:lta. VLO:n taajuus on vakio 12 kHz ja se jaetaan lisäksi 64:llä. Muita
mahdollisia jakajia kellolähteelle ovat 512, 8192 ja 32768. Varsinkin viimeinen on
hyödyllinen, jos käytössä on 32,768 kHz:n ulkoinen kide. Jakajalla saadaan
suoraan 1 sekunnin keskeytysaika, mitä voidaan hyödyntää vaikka
reaaliaikakellossa. Viimeinen määritys on vahtiajastimen laskurin nollaus.
Ledin ohjausta varten asetetaan portin P1 0-bitti lähdöksi. Keskeytyksiä varten
tarvitsee asettaa vahtiajastimen oma keskeytyksen sallinta ja yleinen keskeytysten
sallinta. Kun kaikki asetukset on laitettu, ohjelma siirtyy tyhjään ikuiseen
silmukkaan.
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
9(24)
__interrupt void WdtInterval( void )
{
static unsigned int laskuri = 0; //arvo säilyy kutsukertojen välissä
laskuri++;
if(laskuri == 938)
{
P1OUT ^= 0x01;
//ledin kääntö
laskuri = 0;
}
}
Keskeytyspalveluohjelma on hyvin yksinkertainen. Se sisältää laskurin toiminnan
ja ledin käännön. Keskeytys tapahtuu noin 5,3 ms:n välein, ja asettamalla laskurin
arvoksi 938 saadaan ledin kääntöajaksi noin 5 sekuntia. Laskurin arvo saadaan
pysymään, kun käytetään static-määritystä muuttujalle.
Ohjelman toimintaa pystyy parhaiten testaamaan ajamalla sitä käsky kerrallaan ja
tutkimalla rekisterien arvoja. Kuvassa 7 nähdään WDTCTL-, IE1- ja tilarekisterin
arvot vahtiajastimen säätämisen jälkeen. Rekisterien arvoista huomataan, että
halutut arvot on saatu asetettua vahtiajastimen rekisteriin, keskeytykset on sallittu
(WDTIE, GIE) ja ohjelman pitäisi toimia halutulla tavalla.
Kuva 7. Rekistereiden arvot vahtiajastimen asettamisen jälkeen
4.1.2 Timer_A
F2013-mikro-ohjaimessa on ajan tai tapahtumien laskemiseen monipuolinen 16bittinen Timer_A2-ajastin-laskuri, jossa on kaksi vertailu-/sieppausrekisteriä
(TCCR0 ja TACCR1) ja mahdollisuus toimia pulssinleveysmodulaattorina.
Ajastinta hallitaan TACTL-ohjausrekisterin kautta ja vertailu-/sieppausrekisterien
toimintaa puolestaan TACCTL0- ja TACCTL1-ohjausrekisterien avulla. Ajastimen
kellolähteenä voi toimia ACLK- tai SMCLK-kellosignaali tai määrättyyn ulkoiseen
pinniin tuotava TACLK-pulssi tai sen invertoitu arvo eli INCLK. Ajastimen
keskeytyksen voi eri toimintatiloissa aiheuttaa TAR-rekisterin ylivuoto ja
molemmat vertailu-/sieppausrekisterit. Keskeytyslähteitä voi olla yhteensä siis
kolme, joten ajastimella on kaksi keskeytysvektoria. Ensimmäisellä
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
10(24)
vertailu/sieppaus-rekisterillä on oma keskeytysvektorinsa, joka asettaa
keskeytyslipun TCCR0 CCIFG:n, mutta ajastin ja toinen vertailu-/sieppausrekisteri
käyttävät samaa keskeytysvektoria TAIV. TAIV-keskeytysvektorin keskeytyslähde
päätellään TAIV-bittien arvosta. Esimerkiksi arvo 0x02 kertoo kyseessä olevan
TACCR1 CCIFG keskeytyksen, jossa toisen vertailu-/sieppausrekisterin
keskeytyslippu on asettunut ja 0x04 taas kertoo ajastimen ylivuodosta. /2/
Ajastimen toimintaa varten on kolme eri toimintamuotoa, jos pysähdystilaa ei
lasketa: ylöslaskenta, jatkuvalaskenta ja ylös-/alaslaskenta. Ylöslaskentaa
käytetään, kun halutaan keskeytys ennen ajastimen varsinaista TAR-rekisterin
ylivuotoa, eli ei lasketa 0xFFFF:ään asti. Suurin haluttu laskurin arvo tallennetaan
erityisasemassa olevaan TACCR0-vertailu-/sieppausrekisteriin. Laskurin ollessa
päällä, TAR-rekisterin arvoa kasvatetaan aina kellopulssilla. Kun laskuri saavuttaa
TACCR0:aan sijoitetun arvon, se pyörähtää nollaan ja aiheuttaa keskeytyksen, jos
ajastinkeskeytys on sallittu TAIE-bitillä. Vertailutilan ollessa päällä voidaan
keskeytys aiheuttaa myös TACCR0:n avulla, kun laskurin arvo TAR-rekisterissä
on sama kuin sijoitettu arvo TACCR0:ssa.
Jatkuvassa tilassa laskuri laskee aina TAR-rekisterin ylivuotoon asti, eli väliä
0...65535, ja jatkaa sen jälkeen taas nollasta. Tilaa voidaan käyttää esimerkiksi
erilaisten aikavälien tai taajuuksien muodostamiseen. Vertailutilassa molemmat
vertailu-/sieppausrekisterit pystyvät aiheuttamaan oman keskeytyksensä, joten
aikavälikeskeytyksiä voi olla kaksi ennen laskurin aiheuttamaa ylivuotokeskeytystä.
Viimeistä tilaa eli ylös-/alaslaskentaa voidaan myös käyttää, kun halutaan 0xFFFFluvusta poikkeava aikajakso tai halutaan tuottaa symmetrinen pulssi. Keskeytykset
tapahtuvat tässä tilassa ajastimen tai TACCR0:n toimesta. Ajastin laskee ensin
TACCR0-rekisteriin asetettuun arvoon ja palaa takaisin nollaan. Ajastinkeskeytys
tapahtuu vasta, kun laskurin arvo muuttuu nollaksi.
Seuraavaksi esitellään ohjelmaesimerkki Timer_A2:n toiminnasta jatkuvalaskentatilassa ja ylös-/alaslaskenta-tilassa vertailun ollessa päällä. Pelkkää ylöslaskentaa ei
esitellä, mutta toiminta on hyvin samantapainen kuin muissakin tiloissa.
Ohjelmassa käyttäjä voi valita toimintatilan syöttämällä Embedded Workbench ohjelmassa I/O-ikkunan kautta valinnan. Jatkuvassa tilassa on käytössä kaikki
kolme keskeytyslähdettä, joista jokainen aiheuttaa eri portin tilan muuttumisen
keskeytyksen tapahtuessa. Ylös-/alaslaskennassa taasen käytetään TACCR0 ja
TAIFG keskeytyslähteitä kääntämään kahden eri portin tiloja.
Ohjelman alussa, ennen pääohjelmaa, määritetään prototyypit ajastimen
toimintatilojen asetusfunktioille sekä toimintafunktioille. Lisäksi määritetään
molemmat keskeytysvektorit ja tarvittavat globaalit muuttujat.
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
11(24)
void init_cont(void);
void init_updown(void);
void cont(void);
void updown(void);
//määritetään molemmat keskeytys vektorit ja keskeytyspalvelu prototyypit
#pragma vector=TIMERA1_VECTOR
__interrupt void TimerAkesk( void );
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAkesk2( void );
//globaalit muuttujat
unsigned int lippu_0 = 0;
unsigned int lippu_1 = 0;
unsigned int lippu_2 = 0;
unsigned char init = 0;
//liput kaikille keskeytys lähteille
//tilan asetus muuttuja
Pääohjelman määrityksissä tehdään ensin paikalliset muuttujat, joista päätellään
toimintatila. Seuraavaksi sammutetaan vahtiajastin ja asetetaan portin 1 kaikki
pinnit ulostuloiksi ja nollataan ne. Ajastimessa on tarkoitus käyttää DCO:ta
kellolähteenä ja 1 MHz:ä kellotaajuutena, joten ne on hyvä asettaa myös tässä
vaiheessa. DCO voidaan asettaa helposti käyttämällä niin sanottuja valmiiksi
kalibroituja arvoja, jotka on määritelty 1, 8, 12 ja 16 MHz:lle laitteen
määrittelytiedostossa.
//pääohjelma
void main(void)
{
//lippumuuttujat tiloille
unsigned int lippu_a = 0;
unsigned int lippu_b = 0;
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xFF;
P1OUT = 0x00;
//sammutetaan vahtiajastin
//port1 kaikki pinnit ulostuloiksi
//porttien nollaus
//DCO:n asettaminen 1MHz
DCOCTL = CALDCO_1MHZ;
BCSCTL1 = CALBC1_1MHZ;
// Valitaan 1 MHz MCLK ja SMCLK käyttämällä
// valmiita kalibrointi arvoja
Toimintatilan valintaan on käytetty valmiita printf()- ja getchar()-funktioita, joita
varten tarvitsee koodiin sisällyttää stdio.h-määrittelytiedosto. Kirjastofunktio on
kuitenkin kooltaan erittäin suuri, eikä sen kaikkia ominaisuuksia tarvita. Onneksi
Embedded Workbench -ohjelma tarjoaa mahdollisuuden karsia printf()-funktion
ominaisuuksia ja tällä tavalla muisti riittää funktion käyttämiseen. Ylävalikosta
Project -> Options valitaan kohdasta General Options välilehti Library Options.
Kohdasta Printf formatter valitaan asetukseksi Tiny. Getchar()-funktio asettaa
järjestelmän pysäytyskohdan (system breakpoint) ja odottaa käyttäjän syötettä. /7/
Ohjelmassa käyttäjä voi valita joko a- tai b-valinnan ohjelmointiympäristön I/Oikkunasta, joka saadaan päälle debug-tilassa valikosta View -> Terminal I/O.
Valinnan perusteella päätellään, kumpaa asetusfunktiota kutsutaan. A-valinta
käynnistää jatkuvanlaskennan ja b-valinta ylös-/alaslaskennan.
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
while(1)
{
printf("mode(a,b)");
init = getchar();
if(init == 'a')
{
init_cont();
lippu_a =1;
break;
}
INSINÖÖRITYÖ
12(24)
//pyydetään käyttäjältä syötettä
//odotetaan käyttäjän syötettä
//päätellään syötteen perusteella
//kumpaa asetusfunktiota kutsutaan
if(init == 'b')
{
init_updown();
lippu_b =1;
break;
}
}
Seuraavaksi asetetaan yleinen keskeytystensallinta ja siirrytään pääohjelman
ikuiseen silmukkaan, ja odotellaan keskeytystä joltakin keskeytyslähteeltä. Kun
keskeytys tapahtuu, kutsutaan asetuslipun mukaista funktiota.
__enable_interrupt();
while(1)
{
if(lippu_0 == 1 || lippu_1 == 1 || lippu_2 ==1) //tutkitaan onko
{
//keskeytys tapahtunut
if(lippu_a == 1)
//valitaan oikea aliohjelma asetuslipun mukaan
{
cont();
}
else
if(lippu_b == 1)
{
updown();
}
}
}
}
Ensimmäiseen keskeytyspalveluohjelmaan mennään, kun tapahtuu ajastimen
ylivuoto tai TACCR1 aiheuttaa keskeytyksen. Keskeytyslähde päätellään caserakenteella TAIV-bittien arvosta, ja asetetaan oikea keskeytyslippu keskeytyksen
merkiksi
pääohjelmaa
ja
toimintafunktioita
varten.
Toinen
keskeytyspalveluohjelma asettaa ainoastaan lipun TACCR0:n aiheuttaman
keskeytyksen merkiksi. Keskeytyspalvelun suorittamisen jälkeen palataan
pääohjelmaan.
__interrupt void TimerAkesk( void )//Keskeytys palvelu TAIFG:lle ja TACCR1
CCIFG:lle
{
switch (TAIV)
{
case 0x0a:
//Ajastimen ylivuoto -> TAIFG =1
lippu_1 = 1;
break;
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
case 0x02:
lippu_2 = 1;
break;
INSINÖÖRITYÖ
//Vertailu täsmää
13(24)
-> TACCR1 CCIFG =1
default:
break;
}
}
__interrupt void TimerAkesk2( void ) //Keskeytys palvelu TACCR0 CCIFG:lle
{
lippu_0 = 1;
}
Ajastimen asettamista varten on tehty omat funktiot, että samaa ohjelmaa voidaan
käyttää useamman eri toimintatilan tutkimiseen ja ajastimen asetusten muuttaminen
olisi helppoa. Jatkuvan tilan asettamisessa vertailu-/sieppausrekisterihin asetetaan
arvoiksi 50000 ja 25000. Kellotaajuuden ollessa 1 MHz laskurin arvo kasvaa joka
mikrosekunti aina yhdellä. Tästä saadaan keskeytysajoiksi 50 ms ja 25 ms. Lisäksi
ajastimen ylivuoto tapahtuu aina noin 65,5 ms:n välein. Seuraavaksi on valittu
DCO:lta saatava SMCLK-kellosignaali tahdittamaan ajastinta. Sitten valitaan oikea
tila MC-bitillä ja sallitaan keskeytykset kaikista kolmesta keskeytyslähteestä.
void init_cont(void)
{
TACCR0 = 50000;
TACCR1 = 25000;
//1 MHz kellolla 50 ms keskeytys aika
//25 ms
//Timer_A2:n asettaminen
TACTL = TASSEL_2
+MC_2
+TAIE;
TACCTL0 = CCIE;
TACCTL1 = CCIE;
//Valitaan kellolähteeksi SMCLK
//jatkuvatila
//Sallitaan ajastin keskeytys
//sallitaan keskeytykset molemmista
//sieppaus-/vertailureksiteristä
}
Ylös-/alaslaskennan asettaminen hoidetaan samalla tavoin, mutta ei tarvita kuin
kaksi keskeytyslähdettä, koska toinen vertailu-/sieppausrekisteri ei aiheuta nyt
keskeytystä. Kellosignaali jaetaan tässä tilassa kahdeksalla, poiketen jatkuvan tilan
asetuksista. Tällä tavalla saadaan hitaampi keskeytysaika, joka on 0,4 s
ensimmäiselle vertailu-/sieppausrekisterille ja 0,8 s ajastimen ylivuodolle.
void init_updown(void)
{
TACCR0 = 50000;
//1 MHz kellolla 50 ms keskeytys aika
//kellon jakajasta johtuen kesk.aika 0,4 s
//Timer_A2:n asettaminen
TACTL = TASSEL_2
+ID_3
+MC_3
+TAIE;
TACCTL0 = CCIE;
}
//valitaan kellolähteeksi SMCLK
//jaetaan kellolähde 8:lla
// ylös-/alastila
// Sallitaan ajastin keskeytys
//sallitaan keskeytys
TACCR0:sta
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
14(24)
Tiloille määritetyissä toimintafunktioissa tapahtuu porttien tilojen vaihdokset.
Tultaessa jompaankumpaan toimintafunktioon, päätellään ensin, mikä keskeytyslähde on kyseessä, minkä jälkeen käännetään jonkin portin tilaa. Esimerkiksi
ensimmäisen vertailu-/sieppausrekisterin aiheuttama keskeytys kääntää portin P1.0
tilaa, toinen vertailu-/sieppausrekisteri kääntää portin P1.2 tilaa ja ajastimen
ylivuoto portin P1.1 tilaa.
void cont(void)
{
if(lippu_0 == 1)
{
P1OUT ^= 0x01;
lippu_0 = 0;
}
else
if(lippu_1 == 1)
{
P1OUT ^= 0x02;
lippu_1 = 0;
}
else
if(lippu_2 == 1)
{
P1OUT ^= 0x04;
lippu_2 = 0;
}
}
void updown(void)
{
if(lippu_0 == 1)
{
P1OUT ^= 0x01;
lippu_0 = 0;
}
else
if(lippu_1 == 1)
{
P1OUT ^= 0x02;
lippu_1 = 0;
}
}
Ohjelman testaamista varten on kytketty portin P1.0 tavoin kahteen muuhunkin
porttiin ledi sopivalla etuvastuksella. Asettamalla keskeytyksille eri aikoja saadaan
ledit vilkkumaan eri taajuuksilla ja voidaan päätellä, milloin mikäkin
keskeytyslähde aiheuttaa keskeytyksen.
4.1.2.1 Sieppaustilojen käyttö
Ajastimessa on mahdollista käyttää myös sieppaustoimintoa, jossa ajastimen arvo
siepataan
TAR-rekisteristä
jompaankumpaan
vertailu-/sieppausrekisteriin.
Sieppaustilaa voidaan käyttää esimerkiksi erilaisten tapahtumien keston
mittaamiseen. Sieppaustila saadaan päälle TACCR0:ssa ja TACCR1:ssä
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
15(24)
asettamalla CAP-bitti ykköseksi. Sieppaustilaa on myös helppo testata
ohjelmallisesti ilman mitään ulkoisia signaaleja, koska piirissä on mahdollista
käytää Vcc- ja maatasoa aiheuttamaan sieppaus. /2/ Muokkaamalla hieman
Timer_A2-ohjelmaesimerkkiä saadaan ohjelma, joka tekee kaksi ajastimen arvon
sieppausta ja vähentää jälkimmäisestä arvosta edellisen arvon. Erotuksena saadaan
sieppauksien väliin kulunut aika kellopulsseina, joka tulostetaan I/O-ikkunaan.
Sieppaukset tehdään vain kerran, jonka jälkeen ohjelma jää ikuiseen silmukkaan.
Sieppaustila asetetaan TACCR0:aan sen ohjausrekisterin TACCTL0:an kautta.
Sieppaus asetetaan tapahtuvaksi nousevalla ja laskevalla reunalla. Sieppauksen
sisääntuloksi valitaan ensiksi maataso ja synkronoidaan sieppaus ajastimen
kellosignaaliin.
//asetetaan sieppaustila TACCTL0:aan.
TACCTL0 = CM_3
//sieppaus nousevalla ja laskevalla reunalla
+CCIS_2
//maataso sisääntuloksi
+SCS
//synkronoidaan sieppaus
+CAP
//sieppaustila päälle
+CCIE;
//sallitaan keskeytys TACCR0:lle
__enable_interrupt();
Pääohjelman ikuisessa silmukassa aiheutetaan ensimmäinen sieppaus ja keskeytys
kääntämällä XOR-operaatiolla CCIS-bitin tilaa. Keskeytys ja sieppaus johtuvat
nousevasta reunasta, kun sisääntulo muuttuu maatasosta Vcc-tasoon. Keskeytys
asettaa lippu_0:n, ja sen jälkeen kopioidaan TACCR0:sta ajastimen arvo sieppaushetkellä, koska toinen sieppaus tallennetaan kuitenkin samaan rekisteriin. Toinen
sieppaus tapahtuu samalla tavalla ja sen arvo kopioidaan myös muuttujaan. Kun
sieppaukset on tehty, kutsutaan tulostus-funktiota, jossa tehdään vähennys ja
tulostetaan saatu arvo. Ajamalla ohjelmaa debug-tilassa saadaan näytölle arvo 33,
joka 1 MHz:n kellolla on sama kuin 33 µs.
while(1)
{
if(tarkistus == 1)
{
TACCTL0 ^= CCIS_1;
kopio = TACCR0;
tarkistus = 0;
}
if(lippu_0 == 1)
{
TACCTL0 ^= CCIS_1;
kopio2 = TACCR0;
tulostus();
lippu_0 = 0;
}
}
//sallii silmukkaan tulon vain kerran
//aiheutetaan ensimmäinen sieppaus
//tähän tullaan myös vain kerran
//aiheutetaan toinen sieppaus
}
__interrupt void TimerAkesk2( void ) //Keskeytys palvelu TACCR0 CCIFG:lle
{
lippu_0 = 1;
}
void tulostus(void)
{
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
16(24)
unsigned int tulos =0;
tulos = kopio2 - kopio;
printf("%i\n", tulos);
}
4.1.2.2 Pulssinleveysmodulaatio
Timer_A2:n molemmat sieppaus-/vertailurekisterit sisältävät ulostuloyksikön, joka
voidaan asettaa toimimaan pulssinleveysmodulaattorina. Ulostuloyksikön kautta
käyttäjä voi tuottaa haluamallaan pulssisuhteella ja jaksonajalla olevaa signaalia
tiettyihin ulkoisiin pinneihin. Seuraavassa ohjelmassa esitellään, kuinka
muodostetaan signaali, jonka jaksonaika on 10 sekuntia ja pulssisuhde 50 %.
Tarkoituksena on käyttää TACCR1-vertailu-/sieppausrekisterin ulostuloyksikköä.
Ohjelman alussa valitaan taas VLOCLK-kellolähde, koska aiotaan käyttää ACLKkellosignaalia tahdittamaan ajastinta, sekä sammutetaan vahtiajastin. Seuraavaksi
valitaan kaikkien porttien suunta ulostuloksi ja nollataan ne. Tutkimalla mikroohjaimen datakirjaa saadaan selville, että portin P1 6-pinnissä on TACCR1:n
ulostuloyksikön ulostulopinni (Out1 output). Ulostulotoiminto pitää valita erikseen
asettamalla P1SEL-bitti P1.6:een, muuten portti toimisi tavallisena I/O-liitäntänä.
//Pääohjelma
void main(void)
{
BCSCTL3 = LFXT1S_2;
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xFF;
P1OUT = 0x00;
P1SEL = 0x40;
//valitaan VLOCLK käyttöön
//sammutetaan vahtiajastin
//port1 kaikki pinnit ulotuloksi
//porttien nollaus
//pinnin P1.6 valinta PWM-ulostuloksi
Käyttäjällä on valittavana lukuisia eri vaihtoehtoja muodostaa haluamansa signaali,
sillä laskurin toimintamuotojen lisäksi ulostuloyksiköillä on kahdeksan eri
toimintamuotoa. Ulostuloyksiköiden toimintamuodot ovat lähinnä eri variaatioita ja
yhdistelmiä asetus- (set), nollaus- (reset) ja tilanvaihtotoiminnoista (toggle).
Esimerkissä on käytetty laskurin ylöslaskentaa, jossa laskuri laskee TACCR0:n
arvoon asti ja pyörähtää ympäri. Ulostuloyksikön toimintamuodoksi on valittu
asetus/nollaus, eli ulostulo asettuu laskurin arvon ollessa sama kuin TACCR1:ssä ja
TACCR0:n kohdalla ulostulo nollataan. Pulssisuhteen ja halutun jaksonajan
käyttäjä joutuu itse päättelemään ja laskemaan. Ohjelmassa käytettävä ACLKkellosignaali jaetaan kahdeksalla ja kellotaajuudeksi saadaan 1500 Hz. Haluttu 10
sekunnin jaksonaika tulee asettamalla 15000 TACCR0:n arvoksi ja asettamalla
puolet siitä eli 7500 TACCR1:een saadaan 50 %:n pulssisuhde.
TACCR0 =15000;
TACCR1 =7500;
//Timer_A2:n asettaminen
TACTL = TASSEL_1
+MC_1
+ID_3;
//valitaan kellolähteeksi ACLK
// up-tila
//jaetaan kello 8:lla
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
TACCTL1 = OUTMOD_3;
INSINÖÖRITYÖ
17(24)
//valitaan set/reset toimintatila
while(1)
{
}
}
Ohjelman toimintaa on testattu kytkemällä ledi porttiin P1.6 ja todettu sen
vilkkuvan halutulla taajuudella. Ulostuloa voitaisiin mitata myös oskilloskoopilla,
jolloin pitäisi näkyä asetuksien mukaista kanttiaaltoa.
4.1.3 Ulkoinen keskeytys
F2013-mikro-ohjaimen jokainen I/O-pinni sisältää keskeytysmahdollisuuden
ulkoisia keskeytyksiä varten. Tässä esimerkissä testataan ulkoisen keskeytyksen
toimintaa piirin yhdessä I/O-pinnissä. Tarkoituksena on asentaa kytkin porttiin P1.1
niin, että kytkintä painamalla pystytään aiheuttamaan keskeytys tässä portissa.
Ohjelma alkaa taas keskeytysvektorin määrittämisellä, jonka jälkeen tehdään viivefunktiolle prototyyppi. Pääohjelmaan tultaessa pysäytetään vahtiajastin ja tehdään
asetukset porttiin P1. Keskeytystä varten portin pitää olla asetettuna sisäänmenoksi.
P1DIR-bitit asetetaan niin, että kaikki muut portin pinnit ovat ulostuloja, mutta
P1.1 on sisäänmeno. Kytkin on tarkoituksena kytkeä sisäänmenosta suoraan
maihin. Tästä syystä otetaan P1.1-liitännän ylös-/alasvetovastus käyttöön, ja
asetetaan P1.1 ylätilaan. Keskeytys saadaan aiheutettua nappia painamalla, kun
asetetaan keskeytyksen reunavalinta laskevalle reunalla. Lisäksi, että keskeytykset
toimisivat, pitää asettaa portin P1 keskeytyksen sallinta ja yleinen keskeytyksen
sallinta.
#pragma vector=PORT1_VECTOR
__interrupt void Extint( void );
void viive(void);
//pääohjelma
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
//sammutetaan vahtiajastin
P1DIR
P1REN
P1OUT
P1IES
0xFD;
0x02;
0x02;
0x02;
//P1.1 sisäänmenoksi
//ylös-/alasvetovastus P1.1:lle
//P1.1 ylätilaan
//keskeytys laskevalla reunalla
P1IE = 0x02;
__enable_interrupt();
//P1.1 porttiin sallitaan keskeytys
//sallitaan keskeytykset yleisesti
=
=
=
=
while(1)
{
}
}
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
18(24)
Kytkimen painalluksen seurauksena tullaan keskeytyspalveluohjelmaan, ja
käännetään ledin tilaa portissa P1.0. Kutsumalla viive-funktiota aiheutetaan pieni
viive, jolla pyritään poistamaan kytkinvärähtelyä. Kytkimen tilan asetuttua
odotetaan while-silmukassa, että kytkin vapautetaan ja kutsutaan uudestaan viivefunktiota. Lopuksi nollataan vielä portin keskeytysliput.
__interrupt void Extint( void )
{
P1OUT ^=0x01; //käännetään ledi P1.0 portissa
viive();
while(P1IN == 0x00 || P1IN == 0x01)
;
viive();
P1IFG = 0x00;
}
Viive-funktion viivettä ei ole erityisemmin laskettu, vaan se on silmämääräisesti
asetettu, niin että viive on riittävä. Funktion sisälle on tehty kaksi laskuria, joiden
arvoja lisäämällä while-silmukoissa kulutetaan aikaa.
void viive(void)
{
unsigned int laskuri, laskuri2 = 0;
while(laskuri2 <100)
{
while(laskuri < 65000)
laskuri++;
laskuri2++;
}
laskuri = 0;
laskuri2 = 0;
return;
}
4.2 Flash-muistin käyttäminen
MSP430-F2013-mikro-ohjaimessa oleva flash-muisti on jaettu 2 kilotavun
päämuistiosaan ja 256 tavun informaatiomuistiosaan kuvan 8 mukaisesti.
Päämuistin segmentit ovat kooltaan 512 tavua ja informaatiomuistissa 64 tavua.
Flash-muistista voidaan normaalisti lukea tietoa ohjelman ajon aikana, mutta myös
flash-muistiin tallentaminen ja tiedon poistaminen on ohjelmallisesti mahdollista.
Piirillä on oma jännitegeneraattori flash-muistin ohjelmointijännitteen
muodostamiseen sekä ajastingeneraattori, joka ohjaa flash-muistin kirjoitus ja
tyhjennys toimintaa. /2/
Seuraavaksi esitellään esimerkki kuinka flash-muistiin voidaan tallentaa tietoa.
Ohjelmassa tallennetaan tavu kerrallaan kaksi 10-alkioista char-tyyppistä taulukkoa
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
19(24)
flash-muistin D-segmenttiin. Ohjelman pohjana käytetään Texas Instrumentsin
valmista ohjelmaesimerkkiä flash-muistiin tallentamisesta. /8/
Kuva 8. Flash-muistin rakenne F2013-mikro-ohjaimessa /2/
Ohjelma alkaa globaaleiden taulukoiden luomisella ja määrittämisellä, ja lisäksi
tehdään tarkistus-muuttuja ja annetaan sille alkuarvoksi nolla. Flash-muistiin
kirjoitus tapahtuu write_SegD-funktiolla, joka esitellään myös ohjelman alussa.
char taulukko[] = {1,2,3,4,5,6,7,8,9,10};
char taulukko2[] = {20,19,18,17,16,15,14,13,12,11};
unsigned int tarkistus = 0;
//kirjoitus-funktion prototyyppi
void write_SegD(void);
Pääohjelmaan tultaessa hoidetaan vahtiajastimen sammutus ja asetetaan DCOkellolähde toimimaan 1 MHz:n kellotaajuudella. Flash-muistin kaikkia toimintoja
hallitaan kolmella ohjausrekisterillä: FCTL1:llä, FCTL2:lla ja FCTL3:lla. Kaikki
kolme rekisteriä ovat kirjoitussuojattuja samalla tavalla kuin vahtiajastimen
ohjausrekisteri.
FCTL2:sta
valitaan
flash-muistin
ajastingeneraattorille
kellosignaaliksi MCLK ja jaetaan se kolmella, koska ajastingeneraattorin
kellotaajuuden pitää olla välillä 257 kHz – 476 kHz. Kolmella jaettuna kellotaajuus
on sopiva 333 kHz.
//pääohjelma
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
FCTL2 = FWKEY
+ FSSEL_1
+ FN1;
// Vahtiajastimen pysäytys
// Asetetaan DCO 1MHz
//valitaan MCLK
// MCLK jaettuna 3:lla
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
20(24)
Pääohjelman ikuisessa silmukassa kutsutaan kerran flash-muistin kirjoitusfunktiota ja asetetaan tarkistus-muuttuja, että kirjoitus tapahtuu vain kerran.
while(1)
{
if(tarkistus == 0)
{
write_SegD();
tarkistus = 1;
}
}
//Kutsutaan flash_muistin kirjoitus funktiota
//asetetaan tarkistus, ettei kirjoiteta uudestaan
}
Flash-muistin kirjoitus-funktiossa tehdään aivan ensimmäisenä osoitinmuuttuja,
jonka avulla käsitellään flash-muistia. Osoitinmuuttujan arvoksi asetetaan 0x1000,
niin se osoittaa D-segmentin alkuosoitteeseen.
void write_SegD(void)
{
char *Flash_ptr;
unsigned int i;
Flash_ptr = (char *) 0x1000;
//tehdään osoitin flash-muistiin
//Osoitin osoittamaan D-segmentin alkuun
Flash-muisti tarvitsee tyhjentää ennen kirjoittamista. Flash-muisti voidaan
tyhjentää kokonaisuudessaan tai osa kerrallaan, mutta yksi segmentti on kuitenkin
pienin osa, joka voidaan tyhjentää. Tyhjennystä varten tarvitsee asettaa FCTL1rekisterin ERASE-bitti ja flash-muistin lukitus tarvitsee poistaa nollaamalla
FCTL3-rekisteristä LOCK-bitti. Tyhjennys alkaa, kun tyhjennettävälle alueelle
tehdään niin sanottu valekirjoitus (Dummy Write), joka käynnistää flash-muistin
ajastingeneraattorin.
FCTL1 = FWKEY + ERASE;
FCTL3 = FWKEY;
*Flash_ptr = 0;
//ERASE-bitti muistin pyyhkimistä varten
// Nollataan LOCK-bitti
// Tehdään valekirjoitus
Kirjoitustapahtuma alkaa WRT-bitin asettamisella FCTL1-rekisteristä, minkä
jälkeen ohjelmassa siirrytään vuorotellen molempiin for-silmukoihin. Forsilmukoissa molempien taulukoiden arvot kopioidaan osoittimen välityksellä flashmuistiin. Kirjoitus tapahtuman loputtua WRT-bitti asetetaan jälleen nollatilaan ja
lukitaan flash-muisti.
FCTL1 = FWKEY + WRT;
for (i=0; i<10; i++)
{
*Flash_ptr++ = taulukko[i];
}
for (i=0; i<10; i++)
{
*Flash_ptr++ = taulukko2[i];
}
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}
//Asetetaan WRT-bitti kirjoitusta varten
//taulukon arvot flash-muistiin
//taulukko2:n arvot flash-muistiin
// Nollataan WRT-bitti
// Asetetaan LOCK-bitti
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
21(24)
Kirjoituksen loputtua ohjelma palaa ikuiseen silmukkaan. Ohjelman suorituksen
jälkeen voidaan tutkia flash-muistiin kirjoitettua tietoa avaamalla muisti-ikkuna
ylävalikosta View -> Memory. Kuvassa 9 näkyy tummennettuna D-segmentti.
Osoitteesta 0x1000 alkaen on tallennettuna molempien taulukoiden arvot, eli 20
tavua yhteensä.
Kuva 9. Flash-muistiin tallennetut arvot
4.3 Lämpötilasensori
F2013-mikro-ohjain sisältää oheispiirinä 16-bittisen sigma-delta modulointiin
perustuvan SD16_A-A/D-muuntimen, missä modulaattorin ulostulosta saadaan 1bittistä tietoa, joka desimoidaan modulaattorin perässä olevalla kampasuotimella
16-bittiseen muotoon ja tallennetaan SD16MEM0-rekisteriin.
Yhdessä SD16_A:n sisääntuloista on integroitu lämpötilasensori. Seuraava ohjelma
esittelee lämpötilasensorin perustoiminnan. Ohjelmassa mitataan viisi
lämpötilanäytettä 30 sekunnin välein ja tehdään niille A/D-muunnos. Muunnostulokset tallennetaan taulukkoon. Tuloksista voidaan laskea mitattu ympäristön
lämpötila.
Ohjelman alussa tehdään tarvittavat määritykset ja esitellään aliohjelmien
prototyyppi. Globaalit muuttujat tehdään vahtiajastimen kutsukertojen laskemista
ja tulosten tallennusta varten. Itse pääohjelma sisältää vahtiajastimen asetuksen,
jota tässä ei enää esitellä, sekä SD16_A:n asettamisen mittaamaan lämpötilaa. A/Dmuunnin pystyy tuottamaan sisäisen 1,2 voltin vertailujännitteen, jota on pakko
käyttää lämpötilamittauksissa. Muunnoksessa käytettään unipolar- ja single
conversion -tiloja. Unipolar-valinta vaikuttaa lukualueen jänniteväliin ja single
conversion -tilassa muunnos tehdään vain kerran. Muilta osin käytetään muuntimen
oletusasetuksia. Pääohjelman ikuisessa silmukassa tarkistetaan, että lämpötilamuunnoksia tehdään viisi kappaletta, jonka jälkeen kielletään vahtiajastin
keskeytykset.
#pragma vector=SD16_VECTOR
__interrupt void SD16Keskeytys( void );
//aliohjelma esittely
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
22(24)
void startADC(void);
unsigned int vahtiajastin = 0;
unsigned int tulostaulu[5];
void main(void)
{
P1DIR |= 0xFF;
P1OUT = 0x00;
//Asetetaan P1:n kaikki pinnit ulostuloksi
//nollataan portit P1.0...P1.7
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
//Asetetaan DCO 1MHz
SD16CTL = SD16SSEL_1
+SD16REFON;
//Valitaan SMCLK kellolähteeksi
//1,2 voltin jännite referenssi päälle
SD16CCTL0 = SD16OSR_1024
+SD16UNI
+SD16SNGL
+SD16IE;
//oversampling = 1024
//Unipolar tila
//single conversion tila
//sallitaan SD16 keskeytys
SD16INCTL0 = SD16INCH_6;
IE1 +=0x01;
__enable_interrupt();
while(1)
{
if(vahtiajastin == 4)
{
IE1 ^=0x01;
}
}
//valitaan lämpötilasensori
//sallitaan vahtiajastin keskeytys
//ei enää vahtiajastin keskeytyksiä
}
Vahtiajastimen keskeytyspalveluohjelmaan tullaan noin 30 sekunnin välein ja siellä
kutsutaan startADC()-funktiota, joka käynnistää lämpötilamittauksen. A/Dmuunnoksen valmistuminen ja tallentuminen SD16MEM0-rekisteriin aiheuttaa
SD16_A-kesketyksen, jolloin SD16MEM0:n sisältö luetaan tulostauluun.
Tulostaulun sisältönä olevia käännöstuloksia voidaan tarkastella suoraan RAMmuistista.
__interrupt void WdtInterval( void )
{
static unsigned int laskuri = 0; //arvo säilyy kutsukertojen välissä
laskuri++;
if(laskuri == 5625)
//30 sekuntia
{
P1OUT ^= 0x01;
//käännetään ledi merkiksi
startADC();
//aloitetaan A/D-muunnos
laskuri = 0;
//nollataan laskuri
}
}
void startADC(void)
{
SD16CCTL0 |= SD16SC;
}
//käynnistetään näytteenotto
__interrupt void SD16Keskeytys( void )
{
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
23(24)
tulostaulu[vahtiajastin] = SD16MEM0; //tallennetaan muunnostulos
vahtiajastin++;
}
Ohjelmaa on testattu jäähdyttämällä kehitystyökalua tuulettimella mittauksen ajan
niin, että lämpötila on laskenut. Mittauksesta on saatu taulukon 1 mukaiset arvot,
jotka on muutettu desimaaliluvuiksi. Mitatuista arvoista voidaan kaavan 1 avulla
laskea lämpötila celsiusasteina.
Vsensor.typ = TCsensor(273 + T[°C])+Voffset[mV]
(1) /2/
Vsensor.typ on lämpötilasensorin ulostulojännite, joka sijoittuu ohjelman
asetuksilla kuvan 10 mukaiselle jännitealueelle. Kuvassa esiintyvä Vfsr lasketaan
kaavan 2 mukaisesti, missä Vref on 1,2 V:n vertailujännite ja vahvistus GAINpga
on 1. Tästä saadaan Vref:n arvoksi 0,6 V.
Vfsr = (Vref/2)/GAINpga
(2) /2/
Saatu Vfsr:n arvo jaetaan lukualueen suuruudella eli 65536:lla, mistä saadaan
yhden bitin jännitemuutos. Kertomalla jännitemuutos mitatulla lämpötila-arvolla
saadaan lopulta ulostulojännite Vsensor.typ laskettua. TCsensor on lämpötilasensorin lämpötilakerroin, jonka tyypilliseksi arvoksi on datakirjassa ilmoitettu
1,32 mV/K. /1/ Voffset:n vaihteluksi ilmoitetaan datakirjassa -100…100 mV ja sen
arvo voi aiheuttaa suuriakin vaihteluja lämpötila-arvoihin. Voffset on määritetty
ajamalla ohjelma tasaisessa huoneenlämmössä noin 21,5 celsiusasteessa. Viidestä
mittaustuloksesta on otettu keskiarvo ja laskettu Voffset-arvoksi noin -5 mV.
Taulukkoon 1 on laskettu saaduilla arvoilla lämpötilasensorin ulostulojännitteitä
vastaavat celsiusasteet.
Taulukko 1. Lämpötilamittaus
Hex
A28C
A27A
A252
A24D
A214
Des
41612
41594
41554
41549
41492
T / °C
19,40
19,28
19,00
18,97
18,57
Mittaustuloksista voidaan nähdä, että tuuletin viilentää anturin läheisyydessä
olevaa ilmaa hieman vajaan asteen mittauksen aikana. Saatujen lämpötila-arvojen
luotettavuudesta ei ole varmuutta, kun lämpötila-anturia ei erityisemmin kalibroitu,
mutta esimerkiksi huoneenlämmön mittaukseen tarkkuus on varmasti riittävä.
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
24(24)
Kuva 10. Lukualue unipolar-tilassa /2/
5 YHTEENVETO
Tutustuminen monipuoliseen mikro-ohjaimeen ja sen ohjelmointiin voi olla
haastavaa jo pelkästään kalliiden kehityspakettien takia. Onneksi myös halpoja
kehitystyökaluja on piirivalmistajien toimesta tarjolla, joista hyvänä esimerkkinä
on työssä käytetty eZ430-F2013-kehitystyökalu. Muutaman kymmentä euroa
maksava laite on hinnaltaan sopiva ja sen pystyy halutessaan hankkimaan kuka
tahansa. Laite sopii erinomaisesti mikro-ohjaimen ohjelmoinnin opetteluun tai
vaikka jonkin pienen mittalaitteen rakentamiseen.
Laitteen saaminen toimintakuntoon ei vaatinut suuria ponnisteluja. Ainoat
toimenpiteet olivat tarvittavien ajureiden asentaminen käyttöjärjestelmään ja
ohjelmointiympäristön asennus. Työn vaativimmat osuudet olivat laitteen
ominaisuuksien ymmärtäminen ja tietysti ohjelmien tekeminen. Ohjelmoinnin
apuna laitteen ohjekirja on ehdottoman tärkeä huolimatta siitä, että jotkin asiat on
kerrottu vain pintapuolisesti. Myös mikro-ohjaimen datakirja on tarpeellinen,
vaikka mitään varsinaista kytkentää piirille ei tehtäisikään.
Ohjelmien tekemisessä on pyritty siihen, että ohjelmat olisivat jollain tavalla
mielekkäitä, ja että niissä tulisi käytettyä paljon piirin ja myös ohjelmointiympäristön ominaisuuksia.
Työ käsittelee suurimmaksi osaksi kehitystyökalun perusominaisuuksia ja sen
ohjelmoinnin perusteita. Jatkossa on tarkoituksena tutustua F2013-mikroohjaimeen vielä lähemmin ja tutkia esimerkiksi sen sarjaliikenne ominaisuuksia,
joita tässä työssä ei ole käsitelty. Myöskään jonkin käytännön sovelluksen
rakentamista ei ole pois suljettu.
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
LÄHTEET
1
MSP430F20xx-datakirja. [sähköinen dokumentti]. [viitattu 26.8.2007]
http://www.alldatasheet.co.kr/datasheet-pdf/pdf_kor/AD/ADXL05.html
2
MSP430F2xx-käyttöopas. [sähköinen dokumentti]. [viitattu 26.8.2007]
http://focus.ti.com/lit/ug/slau144b/slau144b.pdf
3
EZ430-F2013 Development Tool- käyttöopas. [sähköinen dokumentti].
[viitattu 26.8.2007]
http://focus.ti.com/lit/ug/slau176b/slau176b.pdf
4
Texas Instruments kotisivu. [www-sivu]. [viitattu 6.11.2007]
http://focus.ti.com/mcu/docs/mcugettingstarteddetail.tsp?sectionId=97&tabId
=1511&familyId=342
5
IAR-kotisivu. [www-sivu]. [viitattu 15.9.2007]
http://supp.iar.com/Download/SW/?item=EW430-KS4
6
MSP430 IAR C/C++ Compiler-käyttöopas. [sähköinen dokumentti].
[viitattu 17.9.2007]
ftp://ftp.iar.se/WWWfiles/msp430/guides/oc430.pdf
7
MSP430 IAR Embedded Workbench IDE-käyttöopas. [sähköinen
dokumentti]. [viitattu 17.9.2007]
ftp://ftp.iar.se/WWWfiles/msp430/guides/ou430.pdf
8
MSP430F20xx ohjelmaesimerkkejä [sähköinen dokumentti].
[viitattu 14.10.2007]
http://www-s.ti.com/sc/techzip/SLAC080.zip
TAMPEREEN AMMATTIKORKEAKOULU
Tietotekniikka, tietokonetekniikka
Perttu Kilpijoki
INSINÖÖRITYÖ
LIITTEET
Liite 1
Ohjelmaesimerkkien lähdekoodit
11 sivua
Liite 1 Ohjelmaesimerkkien lähdekoodit 1(11)
/*=================================================================
Perttu Kilpijoki
vahtiajastin keskeytys esimerkki
13.8.2007
=================================================================*/
#include <io430x20x3.h>
#include <intrinsics.h>
#include <in430.h>
#pragma vector=WDT_VECTOR
__interrupt void WdtInterval( void );
void main(void)
{
BCSCTL3 = LFXT1S_2;
lähteeksi
WDTCTL = WDTPW
+ WDTTMSEL
+ WDTSSEL
+ WDTIS0
+ WDTIS1
+ WDTCNTCL ;
//valitaan vlo-oskillaattori ACLK//kirjoituksen sallinta
//interval timer mode
//Kellolähteeksi ACLK-signaali
//kellolähteen jakaja = 64
//wdt:n laskurin nollaus
P1DIR |= 0x01;
P1OUT = 0x00;
// Asetetaan P1.0 ulostuloksi
//nollataan portit P1.0...P1.7
IE1 +=0x01;
__enable_interrupt();
//sallitaan vahtiajastin keskeytys
//yleinen keskeytysten sallinta
while(1)
{
}
}
__interrupt void WdtInterval( void )
{
static unsigned int laskuri = 0; //arvo säilyy kutsukertojen välissä
laskuri++;
if(laskuri == 1000)
{
P1OUT ^= 0x01;
//ledin kääntö
laskuri = 0;
}
}
Liite 1 Ohjelmaesimerkkien lähdekoodit 2(11)
/*========================================================================
Perttu Kilpijoki
Timer_A2 ohjelmointiesimerkki
13.8.2007
========================================================================*/
#include
#include
#include
#include
<io430x20x3.h>
<intrinsics.h>
<in430.h>
<stdio.h>
void init_cont(void);
void init_updown(void);
void cont(void);
void updown(void);
//määritetään molemmat keskeytys vektorit
#pragma vector=TIMERA1_VECTOR
__interrupt void TimerAkesk( void );
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAkesk2( void );
//globaalit muuttujat
unsigned int lippu_0 = 0;
unsigned int lippu_1 = 0;
unsigned int lippu_2 = 0;
unsigned char init = 0;
//liput kaikille keskeytys lähteille
//tilan asetus muuttuja
//pääohjelma
void main(void)
{
//lippumuuttujat tiloille
unsigned int lippu_a = 0;
unsigned int lippu_b = 0;
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xFF;
P1OUT = 0x00;
//sammutetaan vahtiajastin
//port1 kaikki pinnit ulotuloksi
//porttien nollaus
//DCO:n asettaminen 1MHz
DCOCTL = CALDCO_1MHZ;
BCSCTL1 = CALBC1_1MHZ;
while(1)
{
printf("mode(a,b)");
init = getchar();
if(init == 'a')
{
init_cont();
lippu_a =1;
break;
}
if(init == 'b')
{
init_updown();
lippu_b =1;
break;
}
}
// Valitaan 1 MHz MCLK ja SMCLK käyttämällä
// valmiita kalibrointi arvoja
Liite 1 Ohjelmaesimerkkien lähdekoodit 3(11)
__enable_interrupt();
while(1)
{
if(lippu_0 == 1 || lippu_1 == 1 || lippu_2 ==1) //onko keskeytys
{
if(lippu_a == 1)
//valitaan oikea aliohjelma asetuslipun mukaan
{
cont();
}
else
if(lippu_b == 1)
{
updown();
}
}
}
}
__interrupt void TimerAkesk( void )//Keskeytys palvelu TAIFG:lle ja TACCR1
CCIFG:lle
{
switch (TAIV)
{
case 0x0a:
//Ajastimen ylivuoto -> TAIFG =1
lippu_1 = 1;
break;
case 0x02:
//Vertailu täsmää
-> TACCR1 CCIFG =1
lippu_2 = 1;
break;
default:
break;
}
}
__interrupt void TimerAkesk2( void ) //Keskeytys palvelu TACCR0 CCIFG:lle
{
lippu_0 = 1;
}
void init_cont(void)
{
TACCR0 = 50000;
TACCR1 = 25000;
//Timer_A2:n asettaminen
TACTL = TASSEL_2
+MC_2
+TAIE;
TACCTL0 = CCIE;
TACCTL1 = CCIE;
//1 MHz kellolla 50 ms keskeytys aika
// 25 ms
// valitaan kellolähteeksi SMCLK
// Continuous-tila
// Sallitaan ajastin keskeytys
//sallitaan keskeytykset molemmista
//sieppaus-/vertailurekisteristä
}
void init_updown(void)
{
TACCR0 =
50000;
//Timer_A2:n asettaminen
TACTL = TASSEL_2
+ID_3
+MC_3
//1 MHz kellolla 50 ms keskeytys aika
//kellon jakajasta johtuen kesk.aika 0,4 s
// valitaan kellolähteeksi SMCLK
//jaetaan kellolähde 8:lla
// Up/down-tila
Liite 1 Ohjelmaesimerkkien lähdekoodit 4(11)
+TAIE;
TACCTL0 = CCIE;
}
//ledi toiminnot
void cont(void)
{
if(lippu_0 == 1)
{
P1OUT ^= 0x01;
lippu_0 = 0;
}
else
if(lippu_1 == 1)
{
P1OUT ^= 0x02;
lippu_1 = 0;
}
else
if(lippu_2 == 1)
{
P1OUT ^= 0x04;
lippu_2 = 0;
}
}
void updown(void)
{
if(lippu_0 == 1)
{
P1OUT ^= 0x01;
lippu_0 = 0;
}
else
if(lippu_1 == 1)
{
P1OUT ^= 0x02;
lippu_1 = 0;
}
}
// Sallitaan ajastin keskeytys
//sallitaan keskeytys TACCR0:sta
Liite 1 Ohjelmaesimerkkien lähdekoodit 5(11)
/*========================================================================
Perttu Kilpijoki
Timer_A2 ohjelmointiesimerkki
sieppausrekisterin käyttö
13.8.2007
========================================================================*/
#include
#include
#include
#include
<io430x20x3.h>
<intrinsics.h>
<in430.h>
<stdio.h>
//määritetään molemmat keskeytys vektorit
#pragma vector=TIMERA1_VECTOR
__interrupt void TimerAkesk( void );
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAkesk2( void );
unsigned int lippu_0 = 0;
unsigned int kopio = 0;
unsigned int kopio2 = 0;
void tulostus(void);
//pääohjelma
void main(void)
{
unsigned int tarkistus = 1;
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0xFF;
P1OUT = 0x00;
//sammutetaan vahtiajastin
//port1 kaikki pinnit ulotuloksi
//porttien nollaus
//DCO:n asettaminen 1MHz
DCOCTL = CALDCO_1MHZ;
BCSCTL1 = CALBC1_1MHZ;
//Valitaan 1 MHz MCLK ja SMCLK käyttämällä
//valmiita kalibrointi arvoja
//Timer_A2:n asettaminen
TACTL = TASSEL_2
+MC_2;
// valitaan kellolähteeksi SMCLK
// Continuous-tila
//asetetaan sieppaustila TACCTL0:aan.
TACCTL0 = CM_3
//sieppaus nousevalla ja laskevalla reunalla
+CCIS_2
//maataso sisääntuloksi
+SCS
//synkronoidaan sieppaus
+CAP
//sieppaustila päälle
+CCIE;
//sallitaan keskeytys TACCR0:lle
__enable_interrupt();
while(1)
{
if(tarkistus == 1)
{
TACCTL0 ^= CCIS_1; //aiheutetaan ensimmäinen sieppaus
kopio = TACCR0;
tarkistus = 0;
}
if(lippu_0 == 1)
{
TACCTL0 ^= CCIS_1; //aiheutetaan toinen sieppaus
kopio2 = TACCR0;
Liite 1 Ohjelmaesimerkkien lähdekoodit 6(11)
tulostus();
lippu_0 = 0;
}
}
}
__interrupt void TimerAkesk2( void ) //Keskeytys palvelu TACCR0 CCIFG:lle
{
lippu_0 = 1;
}
void tulostus(void)
{
unsigned int tulos =0;
tulos = kopio2 - kopio;
printf("%i\n", tulos);
}
Liite 1 Ohjelmaesimerkkien lähdekoodit 7(11)
*=========================================================================
Perttu Kilpijoki
Timer_A2 ohjelmointiesimerkki
Pulssinleveysmodulaatio
22.9.2007
========================================================================*/
#include <io430x20x3.h>
#include <intrinsics.h>
#include <in430.h>
//pääohjelma
void main(void)
{
BCSCTL3 = LFXT1S_2;
WDTCTL = WDTPW + WDTHOLD;
//vlo
//sammutetaan vahtiajastin
P1DIR = 0xFF;
P1OUT = 0x00;
P1SEL = 0x40;
//port1 kaikki pinnit ulotuloksi
//porttien nollaus
//pinnin p1.6 valinta output:ksi
TACCR0 =15000;
TACCR1 =7500;
//reset
//set
//Timer_A2:n asettaminen
TACTL = TASSEL_1
+MC_1
+ID_3;
TACCTL1 = OUTMOD_3;
while(1)
{
}
}
// valitaan kellolähteeksi ACLK
// up-tila
//jaetaan kello 8:lla
//set reset
Liite 1 Ohjelmaesimerkkien lähdekoodit 8(11)
/*========================================================================
Perttu Kilpijoki
Esimerkki ulkoisenkeskeytyksen käytöstä
23.9.2007
========================================================================*/
#include <io430x20x3.h>
#include <intrinsics.h>
#include <in430.h>
#pragma vector=PORT1_VECTOR
__interrupt void Extint( void );
void viive(void);
unsigned int lippu = 0;
//pääohjelma
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
//sammutetaan vahtiajastin
P1DIR
P1REN
P1OUT
P1IES
//P1.1 sisäänmenoksi
//ylösveto vastus P1.1:lle
//P1.1 ylätilaan
//keskeytys laskevalla reunalla
=
=
=
=
0xFD;
0x02;
0x02;
0x02;
P1IE = 0x02;
__enable_interrupt();
//P1.1 porttiin sallitaan keskeytys
//sallitaan keskeytykset yleisesti
while(1)
{
}
}
__interrupt void Extint( void )
{
P1OUT ^=0x01; //käännetään ledi P1.0 portissa
viive();
while(P1IN == 0x00 || P1IN == 0x01)
;
viive();
P1IFG = 0x00;
}
void viive(void)
{
unsigned int laskuri, laskuri2 = 0;
while(laskuri2 <100)
{
while(laskuri < 65000)
laskuri++;
laskuri2++;
}
laskuri = 0;
laskuri2 = 0;
return;
}
Liite 1 Ohjelmaesimerkkien lähdekoodit 9(11)
/*========================================================================
Perttu Kilpijoki
Esimerkki Flash-muistiin tallennuksesta
13.10.2007
========================================================================*/
#include
<msp430x20x3.h>
char taulukko[] = {1,2,3,4,5,6,7,8,9,10};
char taulukko2[] = {20,19,18,17,16,15,14,13,12,11};
unsigned int tarkistus = 0;
//kirjoitus-funktion prototyyppi
void write_SegD(void);
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
FCTL2 = FWKEY
+ FSSEL_1
+ FN1;
while(1)
{
if(tarkistus == 0)
{
write_SegD();
tarkistus = 1;
}
}
// Vahtiajastimen pysäytys
// Asetetaan DCO 1MHz
//valitaan MCLK
// MCLK/3
//Kutsutaan flash_muistin kirjoitus funktiota
//asetetaan tarkistus, ettei kirjoiteta uudestaan
}
void write_SegD(void)
{
char *Flash_ptr;
unsigned int i;
//tehdään osoitin flash-muistiin
Flash_ptr = (char *) 0x1000; //osoitin osoittamaan D-segmentin alkuun
FCTL1 = FWKEY + ERASE;
// ERASE-bitti muistin pyyhkimistä varten
FCTL3 = FWKEY;
//Nollataan LOCK-bitti
*Flash_ptr = 0;
//Tehdään valekirjoitus
FCTL1 = FWKEY + WRT;
//Asetetaan WRT-bitti kirjoitusta varten
for (i=0; i<10; i++)
{
*Flash_ptr++ = taulukko[i]; // taulukon arvot flash-muistiin
}
for (i=0; i<10; i++)
{
*Flash_ptr++ = taulukko2[i];
//taulukko2:n arvot flash-muistiin
}
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
}
// Nollataan WRT-bitti
// Asetetaan LOCK-bitti
Liite 1 Ohjelmaesimerkkien lähdekoodit 10(11)
/*========================================================================
Perttu Kilpijoki
Esimerkki lämpötilasensorin käytöstä
20.10.2007
========================================================================*/
#include
#include
#include
#include
<io430x20x3.h>
<intrinsics.h>
<in430.h>
<stdio.h>
//keskeytysvektoreiden määritys
#pragma vector=SD16_VECTOR
__interrupt void SD16Keskeytys( void );
#pragma vector=WDT_VECTOR
__interrupt void WdtInterval( void );
//aliohjelma esittely
void startADC(void);
unsigned int vahtiajastin = 0;
unsigned int tulostaulu[5];
void main(void)
{
//vahtiajastimen asetus
BCSCTL3 = LFXT1S_2;
WDTCTL = WDTPW
+ WDTTMSEL
+ WDTSSEL
+ WDTIS0
+ WDTIS1
+ WDTCNTCL ;
P1DIR |= 0xFF;
P1OUT = 0x00;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
SD16CTL = SD16SSEL_1
+SD16REFON;
//valitaan vlo-oskillaattori ACLK-lähteeksi
//kirjoituksen sallinta
//interval timer mode
//Kellolähteeksi ACLK-signaali
//kellolähteen jakaja = 64
//wdt:n laskurin nollaus
// Asetetaan P1:n kaikki pinnit ulostuloksi
//nollataan portit P1.0...P1.7
//Asetetaan DCO 1MHz
//Valitaan SMCLK kellolähteeksi
//1,2 voltin jännitereferenssi päälle
SD16CCTL0 = SD16OSR_1024
+SD16UNI
+SD16SNGL
+SD16IE;
//oversampling = 1024
//Unipolar tila
//single conversion tila
//sallitaan SD16 keskeytys
SD16INCTL0 = SD16INCH_6;
//valitaan lämpötilasensori
IE1 +=0x01;
//sallitaan vahtiajastinkeskeytys
__enable_interrupt();
while(1)
{
if(vahtiajastin == 4)
{
IE1 ^=0x01;
}
}
//ei enää keskeytyksiä
}
__interrupt void WdtInterval( void )
{
static unsigned int laskuri = 0; //arvo säilyy kutsukertojen välissä
laskuri++;
if(laskuri == 5625)
//30 sekuntia
Liite 1 Ohjelmaesimerkkien lähdekoodit 11(11)
{
P1OUT ^= 0x01;
startADC();
laskuri = 0;
//käännetään ledi merkiksi
//aloitetaan A/D-muunnos
//nollataan laskuri
}
}
void startADC(void)
{
SD16CCTL0 |= SD16SC;
}
//käynnistetään näytteenotto
__interrupt void SD16Keskeytys( void )
{
tulostaulu[vahtiajastin] = SD16MEM0; //tallennetaan muunnostulos
vahtiajastin++;
}
Was this manual useful for you? yes no
Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Related manuals

Download PDF

advertising