Fórum témák

» Több friss téma
Cikkek » Launchpad: ismerkedés az MSP430 mikrovezérlőkkel I.
Launchpad: ismerkedés az MSP430 mikrovezérlőkkel I.
Szerző: icserny, idő: Szept 7, 2011, Olvasva: 51203, Oldal olvasási idő: kb. 7 perc
Lapozás: OK   3 / 9

Az első projekt létrehozása

Az előzőekben már feltelepített IAR Embedded Workbench fejlesztői környezet kipróbálásához hozzunk létre egy új, önálló projektet és próbáljuk ki az alábbi útmutató szerint! Ez lesz a mintapéldája az összes többi projektünknek, tehát jól jegyezzük meg a végrehajtandó lépéseket!

De mi is az a projekt?

Ha egy új programot fejlesztünk a mikrovezérlőhöz, akkor a forráskódot (assembly vagy C nyelvű) tartalmazó állományokon kívül azok lefordításához szükségünk lehet leíró, vagy fejléc állományokra (.h vagy .inc kiterjesztésű állományokra), s a fejlesztői környezet is létrehoz olyan állományokat, amelyekben a beállításokat, fordítási opciókat és a fordításhoz illetve a tárgykód összecsatolásához szükséges állományok neveit és összefüggéseiket tárolja. Ezek összessége alkotja a projektet.

Megjegyzés: Minden projekt számára nyissunk külön mappát, különben menthetetlenül összekeverednek az állományok!

Az új projekt létrehozásának lépései

1. lépés: Indítsuk el az IAR Embedded Workbench programot (a "csavarhúzó/franciakulcs" ikonra kattintsunk)!

2. lépés: Kattintsunk a Project menü Create New Project menüpontjára!

3. lépés: A felbukkanó panelon az MSP430 fejlesztőeszközt kell kiválasztani, de ha az MSP430-hoz való IAR Embedded Workbench Kisckstart kiadását telepítettük, valószínűleg nincs is más választási lehetőségünk. Mivel az első projektünk  egy C nyelvű program lesz, kattintsunk a C betű melletti plusz jelre és válasszuk ki  az alatta megjelenő main opciót (ez azt jelenti, hogy önálló C nyelvű alkalmazást akarunk létrehozni, ami main függvényt is tartalmaz), ahogy az alábbi ábra is mutatja. Ezután kattintsunk az OK gombra, s adjuk meg a projekt nevét (pl. ledflash)! Ahogy korábban is ajánlottuk, a projektet egy külön mappában hozzuk létre!

3_1. ábra: Új projekt létrehozása (C program, main függvénnyel)

A fenti lépések sikeres végrehajtása után létrejön az új projekt és automatikusan generálódik egy alapértelmezett main.c forrásállomány is, amelyet majd a kívánt feladathoz alakíthatunk. A következő ábrán látható az új projekt végrehajtásának végeredménye. Ezután már csak néhány beállításra lesz szükség.

3_3. ábra: A projekt létrehozása utáni képernyőkép

4. lépés: A Workspace ablakban kattintsunk a projekt nevére (lásd a 3_3. ábrát!). Ezután válasszuk ki a Project menü Options menüpontját. Itt kell beállítanunk,hogy melyik mikrovezérlő típusra akarjuk lefordítani a projektet, s azt is, hogy milyen eszközzel történik a programbeírás vagy hardveres nyomkövetés. A projektre vonatkozóan sok más beállítási lehetőséget is találunk itt, de ezeket most ne babráljuk,hanem az eredeti gyári beállításokat !

a.) A General Options kategória kiválasztása után a Device mezőben válasszuk ki az MSP430G2231 mikrovezérlőt használjuk!

3_4. ábra: Projekt konfigurálása - a mikrovezérlő típusának megadása

b.) Ezután válasszuk ki a Debugger kategóriát, s a Driver mezőben a Simulator helyett válasszuk ki a FET debugger-t! A beállítás után kattintsunk az OK gombra, bezárva ezzel a Project/Options felbukkanó panelt!

3_5. ábra: Projekt konfigurálása - szimulátor helyett hardveres nyomkövető eszköz megadása

5. lépés: A projekt létrehozása és beállítása lényegében lezárult, már csak az van hátra, hogy elmentsük a Workspace (munkaterület) állományt. Erre a a fejlesztői környezet is emlékeztet bennünket, legkésőbb az első fordításkor vagy kilépéskor. De ne várjuk ezt most meg, hanem kattintsunk  a File menü Save Workspace menüpontjára! A felbukkanó ablakban adjunk meg egy nevet a munkaterületnek (nem kötelező, de logikus, ha a projekt nevével azonos nevet adunk meg, így esetünkben legyen ez is ledflash)!

Megjegyzés: A workspace állomány kiterjesztése .eww, s ez az a kiterjesztés, amit  a Windows felismer, s az IAR Embedded Workspace fejlesztőrendszert társítja hozzá. Így a későbbiek folyamán az elmentett munkaterület állományra történő dupla kattintáskor a rendszer automatikusan betölti a fejlesztőrendszert ami megnyitja a projektet.

Első programunk: LED1 villogtatása

A 3_3. ábrán látható programot módosítsuk úgy, hogy valami "értelmes" dolgot is csináljon! Például villogtassuk a piros LED-et, ami a mikrovezérlő P1.0 kivezetésére van kötve! A feladat sokféle módon megoldható. Egy lehetséges változat az alábbi listában látható, ezt írjuk be!

  1. #include "io430.h"
  2. #include "intrinsics.h"
  3.  
  4. void main(void) {
  5.   WDTCTL = WDTPW + WDTHOLD;       //Letiltjuk a watchdog időzítőt
  6.   P1DIR |= BIT0;                  //P1.0 legyen digitális kimenet
  7.   while(1) {
  8.     P1OUT ^= BIT0;                //P1.0 állapotának átbillentése
  9.     __delay_cycles(250000);       //Várakozás kb. 250 ms ideig
  10.   }
  11. }

Megjegyzés: A sorszámozás nem tartozik a program forráskódjához, tehát csak a sorszámok utáni szövegsorokat írjuk be!

A programban a // jellel kezdődő szövegeket a fordító figyelmen kívül hagyja, azok csupán emlékeztető megjegyzések (komment). Az #include direktívával kezdődő sorok egy-egy fejléc állományt csatolnak be.A becsatolások legfőbb előnye az, hogy a bennük levő sok-sok definíciót nem kell nekünk újra és újra begépelni.

Az io430.h fejléc állomány valójában csak feltételes fordítási direktívákat tartalmaz, s végeredményben a Project/Options menüben kiválasztott mikrovezérlőt leíró állomány (esetünkben io430g2231.h) kerül becsatolásra. Erre azért van szükségünk, hogy a mikrovezérlő regisztereire, portjaira és azok bitjeire szimbolikus nevekkel lehessen hivatkozni, nem pedig számokkal.

Az intrinsics.h fejléc állományt azért kell becsatolnunk, mert ez deklarálja a beépített függvényeket, amelyek közül most a __delay_cycles() nevűt fogjuk használni. Ha megfeledkezünk ennek a fejléc állománynak a becsatolásáról, akkor a fordító és a linker nem fogja tudni, hogy mi fán terem ez a függvény...

A main() függvény az a függvény, amelyre a mikrovezérlő bekapcsolásakor automatikusan átadódik a vezérlés (nem azonnal, a C futtatókönyvtár bizonyos inicializáló lépéseket végrehajt előtte, ugyanúgy, ahogy a PC-n futó programoknál is szokás). A void szavak azt jelzik a fordítónak, hogy a main() függvénynek nincs sem bemenő paramétere, sem visszatérési értéke.

A mikrovezérlőkön futó alkalmazásokat mindig úgy kell megírni, hogy a főprogram egy végtelen ciklusban fusson. Annak ugyanis nincs értelme, hogy a főprogram véget érjen, mert a PC-ktől eltérően itt nincs operációs, rendszer  aminek vissza lehetne adni a vezérlést.

A fenti listán bemutatott programunk main() függvénye két részből áll: az 5. és 6. sorban álló inicializáló (kezdeti beállítást végző) utasítások csak egyszer, a program elindulásakor hajtódnak végre. Az ezt követő while() ciklus magja (8. és 9. sor) azonban végtelen ciklusban ismétlődik, mivel a while(1) "feltétele" mindig "igaz" (azaz nullától különbözőnek mutatkozó érték).

Hogyan működik a fenti program?

A inicializálás első sora (WDTCTL = WDTPW + WDTHOLD; ) még a projekt létrehozásakor automatikusan generálódik. Arra szolgál, hogy a mikrovezérlő watchdog időzítőjét (őrkutya, a program folyamatos működését ellenőrzi) letitsuk, hatástalanítsuk. A watchdog  ugyanis olyan, mint egy időzített bomba, amelyek óráját rendszeresen fel kell húzni. Ha ezt elmulasztjuk, s a watchdog időzítője lejár, akkor reseteli, azaz újraindítja a mikrovezérlőt. Így, bár nagyon hasznos a watchdog használata a programelakadások kezelésére, rendkívül bosszantó, és meggátolja a program normális működését, ha nem foglalkozunk vele rendszeresen.Éppen ezért az egyszerű alkalmazások elején célszerű letiltani úgy, ahogy az automatikusan generált programsor ajánlja: a watchdog működését  vezérlő bitcsoportban (vagy más néven regiszterben) a WDTHOLD bitet "1"-be kell állítani. A 8 bites  WDTCTL bitcsoport írása azonban nem szimpla művelet: a művelet csak akkor lesz sikeres, ha a  beírandó 8 bites adatot 16 bitesre egészítjük ki, úgy, hogy a felső 8 bit egy előre megadott "jelszóval" megegyező érték.

A P1DIR |= 0x01; utasítás a P1.0 kivezetésen az adatáramlási irányt kimenetre állítja. Ez lényegében a P1DIR regiszter legalacsonyabb helyiértékű bitjét állítja "1" állapotba. A P1DIR |= 0x01; utasítás rövidített formája lényegében megegyezik a P1DIR = P1DIR | 1; értékadással, vagyis P1DIR aktuális értékét megengedő vagy kapcsolatba hozzuk az "1" konstanssal (a C nyelvben az "|" jel bitenkénti megengedő vagy (IOR, inclusive OR) műveletet jelent). Ez lényegében P1DIR 0. bitjének "1"-be állítását jelenti, de a C nyelvben ezt az egyszerű műveletet ilyen körmönfont módon kell megadnunk. A BIT0 szimbolikus név egyébként az io430g2231.h állományban van definiálva, s értéke = 1. Hasonló definíciókat találhatunk ott a többi bitre is, használjuk ezeket bátran! 

A végtelen ciklusban a P1OUT ^= BIT0; értékadás hatására a P1 általános célú port kimeneti adatregiszterének 0. bitje (a P1.0 kimenethez tartozó bit) ellenkezőjére változik. A P1OUT ^= BIT0;  rövidített írásmód valójában az P1OUT = P1OUT ^1; értékadással egyenértékű, ahol a "^" jel a bitenkénti "kizáró vagy" művelet (XOR, exclusive OR) jele. Itt a bitenkénti "kizáró vagy" művelet azon tulajdonságát használjuk ki, hogy azokat a biteket változatlanul hagyja, amelyekkel szemben "0" áll, azokat pedig ellenkezőjére változtatja, amelyekkel szemben "1" áll. A fenti értékadásban csak P1OUT 0. bitjével áll szemben "1", így csak a P1.0 kimeneten lesz változás.

A __delay_cycles(250000); függvényhívás hatására a program a megadott ideig várakozik. Ha az órajel beállításával külön nem foglalkozunk, akkor alapértelmezetten nagyjából 1MHz frekvenciájú lesz a mikrovezérlő órajele. A fenti függvényhívásban 250 000 utasításciklus tartamáig terjedő várakozást írtunk elő, ami nagyjából 250 ms-nak felel meg. Így a LED kb. 250 ms-onként vált állapotot, s két állapotváltás után kerül azonos fázisba., vagyis a LED villogásának periódusideje kb. T = 500 ms = 0,5 s. A frekvencia a periódusidő reciproka, tehát a villogás frekvenciája f = 1/T, azaz nagyjából 2 Hz.

A projekt lefordítása és futtatása

1. A program beírása után kattintsunk a Project menü Make menüpontjára (vagy nyomjuk meg az F7 billenytyűt)! A program fordítása során figyeljük a Messages ablakban feltűnő üzeneteket! Ha a végén a "Total number of errors: 0" üzenet jelenik meg, akkor sikeres volt a fordítás.

2. Ellenőrizzük, hogy a Launchpad kártya csatlakoztatva van a számítógéphez!

3. Töltsük le a programot és indítsuk el a nyomkövetőt a Project menü Download and Debug menüpontjára kattintva (vagy nyomjuk meg a Ctrl-D gyorsbillentyűt)!

4. Indítsuk el az alkalmazást a Debug menü Go pontjára kattintva (vagy nyomjuk meg az F5 gyorsbillentyűt)!

Ha a piros LED villog, akkor minden rendben, működik a program. Ha nem, akkor nézzük végig újra a fenti leírást, s ellenőrizzük, hogy melyik lépésnél rontottuk el a dolgot.

Egy tipikus hibajelenség

A program betöltése után semmi sem változik, a régi program fut (esetünkben pl. a gyári demó fut, ami felváltva villogtatja a piros ésa zöld LED-eket).

Ez akkor fordul elő, ha a projekt beállításainál a Szimulátor maradt a kiválasztott nyomkövető eszköz. Ilyenkor letöltés helyett a számítógép memóriájába kerül a program, s a szimulátorban fut.

Megoldás: a Project/Options menüpontban  a Debugger kategóriában a Szimulátor helyett válasszuk a FET Debugger opciót.

A program módosítása

Ha a programunkat módosítani akarjuk (pl. meg akarjuk változtatni az alkalmazott késleltetést, vagy a másik LED-et akarjuk villogtatni), akkor először lépjünk ki a nyomkövetés módból (Debug menü Stop Debugging pontja, vagy nyomjuk le a Shift-Ctrl-D gyorsbillentyűt). Utána ugyanúgy folytathatjuk, mint az első program beírásánál.

1. kísérlet: A villogás frekvenciájának változtatása

A késleltetési idő megváltoztatása nagyon egyszerű, csak az alábbi sorban más értéket kell írni:

  1. __delay_cycles(250000);       //Várakozás kb. 250 ms ideig
Ha például 500 000-et írunk, akkor a LED 500 ms-ig világít, s 500 ms-ig lesz sötét, azaz másodpercenként egyszer gyullad fel.

2. kísérlet: A másik LED villogtatása

Ha a piros helyett a zöld LED-et akarjuk villogtatni, akkor a P1 port 6. bitjét kell kapcsolgatni, mivel LED2 a P1.6 kimenetre van kötve.  Ennek a bitnek a helyiértéke 64 (hexadecimálisan 0x40), ezt a számot kell használnunk a bit műveletekhez. Kényelmesebb azonban, ha az előre definiált szimbolikus névvel (BIT6) hivatkozunk rá. A módosított program listája így néz ki:

  1. #include "io430.h"
  2. #include "intrinsics.h"
  3.  
  4. void main(void) {
  5.   WDTCTL = WDTPW + WDTHOLD;       //Letiltjuk a watchdog időzítőt
  6.   P1DIR |= BIT6;                  //P1.6 legyen digitális kimenet
  7.   while(1) {
  8.     P1OUT ^= BIT6;                //P1.6 állapotának átbillentése
  9.     __delay_cycles(250000);       //Várakozás kb. 250 ms ideig
  10.   }
  11. }


A cikk még nem ért véget, lapozz!
Következő: »»   3 / 9
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem