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
Az első projekt létrehozásaAz 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ései1. 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ásaA 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!
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ása1. 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égA 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ásaHa 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ásaA késleltetési idő megváltoztatása nagyon egyszerű, csak az alábbi sorban más értéket kell írni:
2. kísérlet: A másik LED villogtatásaHa 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:
A cikk még nem ért véget, lapozz! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |