Fórum témák
» Több friss téma |
Cikkek » Launchpad: ismerkedés az MSP430 mikrovezérlőkkel II. Launchpad: ismerkedés az MSP430 mikrovezérlőkkel II.
Szerző: icserny, idő: Nov 3, 2011, Olvasva: 22764, Oldal olvasási idő: kb. 10 perc
Mintaprogramok az órajelek beállításáhozAz alapértelmezett órajelekHa egyetlen sornyi programot sem írunk az óra beállításával kapcsolatban, akkor is működni fog a mikrovezérlőnk az alábbi alapértelmezett beállásokkal (a cikksorozat első részében is így használtuk a mikrovezérlőt): ACLK forrása LFXT1 lesz, de ez csak akkor működik, ha be van forrasztva az XIN/XOUT lábak közé a 32 kHz-es órakvarc. Alapértelmezetten 6-6 pF belső kapacitás kapcsolódik a lábakra. Ha nem akarjuk beforrasztani a kristályt, akkor ACLK átkapcsolható a VLO oszcillátorra, s az XIN (P2.6) és XOUT (P2.7) kivezetések digitális I/O-ként használhatók. Ehhez a beállításhoz az alábbi utasításokat kell beszúrni a programunkba:
Fentiekből tulajdonképpen csak az első sor kapcsolatos az óra beállításával, a többi utasítással a P2 portot állítjuk be digitális bemenetnek, s egyúttal bekapcsoljuk a belső felhúzást, hogy ne lebegjen a bemenet. Természetesen, egy konkrét alkalmazásnál előfordulhat, hogy a P2 port lábait nem bemenetként, hanem kimenetnek használjuk. Ilyen esetben nem használható a felhúzás, helyette a P2OUT kimeneti adatregiszterben állítjuk be, hogy a kimenetek alacsony, vagy magas szintre álljanak be. MCLK forrása alapértelmezetten DCO lesz, (DCOx = 3, RSELx = 7, MODx = 0 paraméterekkel), ami hozzávetőlegesen 1 MHz körüli (vagy inkább 1,1 MHz) frekvenciát jelent. SMCLK forrása alapértelmezetten ugyancsak DCO lesz. A következőkben néhány olyan programot mutatunk be, amelyekben az alapértelmezettől eltérő órajel beállításokat használunk. VLO kipróbálása - aktív állapot alacsony frekvenciánElső kísérletünkben a VLO oszcillátor leosztott jelét használjuk (VLO/8 = ~ 1500 Hz, ez a belső oszcillátorokkal beállítható legalacsonyabb frekvencia), ez lesz beállítva az ACLK, MCLK és SMCLK órajelnek. A DCO oszcillátort pedig kikapcsoljuk, így kapjuk a legkisebb fogyasztású aktív módot. Az aktív mód azt jelenti, hogy a CPU be van kapcsolva, fut a program. A későbbiekben majd mutatunk példákat a még kisebb fogyasztású energiatakarékos módokra is, azonban ezeknél a CPU-t is lekapcsoljuk, akkor tehát nem futhat program. Az alábbi programban LED1-et villantjuk fel 10 másodpercenként, 0.1 másodpercre. A CPU frekvenciája MCLK = VLO/8 = ~1500 Hz lesz. Ha a VCC átkötést lehúzzuk, akkor egy árammérővel megmérhetjük a CPU áramfelvételét (kb. 80 µA lesz). Az alapértelmezett 1 MHz-es frekvencián, DCO-t használva kb. négyszer nagyobb volna az áramfelvétel, ugyanezen a tápfeszültségen (VCC kb. 3,3 V). Telepes üzemmódban ez azt jelenti, hogy a VLO és az alacsonyabb CPU frekvencia használata esetén négyszer lassabban merül le az elem, vagy az akkumulátor. Ennek természetesen ára is van: a CPU nagyságrendekkel kevesebb utasítást hajt végre időegységenként. Hardver követelmények:
3_1. lista: A vlo_test.c program listája
A program elején a szokásos módon letiltjuk a watchdog időzítőt (ezt a sort a projekt létrehozásakor a projektvarázsló rakja be a főprogram elejére). A következő sorban az alapértelmezett LFXT1 kristályoszcillátorról átkapcsolunk a kis teljesítményfelvételű belső oszcillátorra (VLO). Ehhez a BCSCTL3 regiszter LFXT1S1 és LFXT1S0 bitjeiben a bináris '10' bitkombinációt kell beállítani az eredeti '00' helyett. Tudva azt, hogy bekapcsoláskor ez a bitcsoport '00'-ban áll, a VLO bekapcsolásához elegendő az LFXT1S1 bitet '1'-be állítani, amit itt bitenkénti VAGY művelettel valósítunk meg. BCSCTL3 biteinek kiosztását fentebb már bemutattuk. Abból látható, hogy a beállítandó bit helyiértéke 0x20, tehát a bitbeállítást így végezhetjük:
A bitcsoportok beállításánál azonban nem muszáj mindig kiszámolgatni a bitek helyiértékeit, használhatjuk helyettük az io430g2231.h állományban előre definiált makrókat. A programban használt LFXT1S_2 értéke 0x20, tehát a '10' bitkombinációt az LFXT1Sx bitcsoport beállításához megfelelő helyiértéken tartalmazza. Ennek felhasználásával, és a C nyelvben szokásos rövidítéssel a fenti utasítást így is megadhatjuk tehát:
Mielőtt tovább mennénk, törölnünk kell LFXT1 "oszcillátor hiba" jelzését, ami bekapcsoláskor vagy újrainduláskor (RESET) automatikusan beáll '1'-be, s megakadályozza DCO kikapcsolását, s azt is, hogy MCLK és SMCLK a VLOCLK órajelet használhassa. A BCSCTL3 regiszter LFXT1OF hibajelző bitje azonban csak olvasható, tehát közvetlenül nem törölhető. Az "oszcillátor hiba" jelzést a hozzá kapcsolódó OFIFG programmegszakítást kérő jelzőbit törlésével tudjuk megszüntetni (ez a jelzőbit az IFG1 regiszterben található). Az OFIFG bit törlésére a programban a bitenkénti ÉS műveletet használtuk. Ehhez olyan számot kell megadnunk bitmaszk gyanánt, ami csak azokon a biten tartalmaz nullát, amelyet törölni akarunk. Mivel az io430.h állományban definiált OFIFG makró azon a helyiértéken tartalmaz '1'-et , ahol az OFIFG bit található (OFIFG = 0b00000010), a törléshez az OFIFG makró értékének komplemensét kell használnunk (az ~OFIFG kifejezést használjuk, melynek értéke 0b11111101).
Az alábbi sorral a DCO oszcillátort kapcsolhatjuk ki. Az SCG0 vezérlő bit a CPU Státusz Regiszterében (SR) található, ezért C nyelvű utasításokkal nem nyúlhatunk hozzá (egy C utasítás feldolgozása során SR értéke többször is megváltozhat, így a kiolvasás - módosítás - visszaírás során könnyen előfordulhatna, hogy egyes bitekbe rossz, idejét múlt értéket írunk vissza). Ezért a __bis_SR_register() nevű beépített függvénnyel (BIS = bit set, azaz '1'-be állító) billentjük be az SG0 bitet.
Az ACLK osztójának beállításánál figyelembe vettük, hogy csak bitek '1'-be állítását kell végeznünk, amit a BCSCTL3 beállításához hasonlóan bitenként logikai VAGY kapcsolatra egyszerűsíthetjük. Ezt így írhatjuk:
Más a helyzet a BCSCTL2 regiszter beállításánál, mivel itt szinte minden bitet módosítunk (csak a DCOR bittel nem foglalkozunk, mert az a mi mikrovezérlőinknél nem használható). Bár úgy is írhattuk volna, hogy:
de ennek az utólagos értelmezése elég nehéz volna. Ezért, ha lehetséges, mindig az alábbihoz hasonló öndokumentáló formát használjuk:
Megjegyzés: ha a főprogram eddig tárgyalt része zavarosnak vagy nehezen követhetőnek tűnik, az azért van mert már egy sor 'ad hoc' kézi optimalizálást tartalmaz, másrészt a gyári fejléc állományok (pl. io430g2231.h nem támogatják a több-bites bitcsoportok írását.) Így marad az ÉS és VAGY műveletekkel végzett bitfaragás... A portok beállításánál nincs semmi trükközés, vagy magyarázatra szoruló utasítás. Az összes portlábat kimenetnek állítjuk (P1DIR és P2DIR összes bitjét '1'-be állítjuk). Nem görcsöltünk rajta, hogy a P2DIR regiszternek csak két bitje van kiépítve. Abból nincs gond, ha a nemlétező bitekbe is megpróbálunk írni... A P2 portnál külön be kell állítani a P2.6 és P2.7 digitális I/O funkcióját a P2SEL megfelelő bitjeinek törlésével. A P1 portnál ezzel nem kell foglalkoznunk, mert ott eleve a digitális I/O az alapértelmezett funkció. Kalibrált DCO frekvencia (1 MHz) beállításaHa pontosabban akarjuk beállítani a DCO frekvenciáját, akkor használhatjuk az információs memóriában gyárilag letárolt paramétereket, melyek a gyártás közben egyedileg meghatározott értékek. A gyárilag meghatározott kalibrációs értékeket az információs memória írásvédett "A" szekciójában tárolja a mikrovezérlő (a 0x10FE és 0x10FF címeken), s a gyári fejléc állományok (pl. msp430g2231.h) szimbolikus neveket is definiálnak a kényelmes hivatkozáshoz. A beállításhoz ezt írjuk:
Megjegyzések
Az alábbi listán egy komplett programot is bemutatunk a kalibrált 1 MHz-es órajel beállítására, amelyben LED2 10 másodpercenként villan fel 0,1 s időtartamra (itt azért választottuk LED2 villogtatását, hogy a LED színe is jelezze, hogy nem az előző programot futtatjuk). A 10 másodperces szünetek lehetőséget adnak a mikrovezérlő áramfelvételének megmérésére. Az MCLK órajelét az 1 MHz-es, gyárilag kalibrált DCO frekvenciájú DCOCLK adja. Az ACLK forrását VLO/8-ra állítjuk be. Ez utóbbinak ugyan nincs jelentősége, de így azonos lesz ACLK itteni beállítása a kisfogyasztású módot bemutató programéval. Hardver követelmények: ugyanazok, mint az előző programnál. 3_2. lista: A dco_1mhz.c program listája
A program nem sokban különbözik az előzőektől, ezért csak az eltéréseket ismertetjük. BCSCTL3 beállítását csak lustaságból végezzük sima értékadással (kihasználva, hogy a regiszter többi bitje 0 lehet). Természetesen írhattuk volna ugyanúgy, mint az előző programban. Maximális CPU frekvencia (16 MHz) beállításaHarmadik példánkban bemutatjuk, hogyan állíthatjuk a be a maximális CPU frekvenciát. Az adatlap szerint az MSP430G2xxx mikrovezérlők maximális órajele 16 MHz lehet. Ilyen nagy frekcenciát csak a DCO oszcillátorral tudunk előállítani. Az adatlep szerint az RSELx = 15, DCOx = 3, MODx = 0 beállítással 30 ºC-on, 3 V-os tápfeszültség mellett kb. 15.25 MHz-es frekvencia várható. Tapasztalataink szerint 25 ºC-on, 3,5 V-os tápfeszültségen ennél kevesebb (14,5 MHz) volt mérhető. A kívánt 16 MH-es frekvenciához tehát DCOx inkább 4 kell, hogy legyen. Az alábbi programban szereplő DCOx = 5 beállítással már egy kicsit fölélőttünk: 16.3 MHz körüli frekvenciát kaptunk. Megjegyzés: Az MSP430G2x01, G2x11, G2x21, G2x31 Device Erratasheet (SLAZ061B) szerint DCO beállításánál ügyelnünk kell arra, hogy az RSELx = 13 sávot nem szabad átugrani, mert a DCO oszcillátor kihagy, vagy le is állhat. A probléma elkerülésére az alapértelmezett RSELx = 7 értékről először RSELx = 13-ra kell ugrani, majd onnan léphetünk tovább az RSELx = 15 beállításra. Az alábbi program ugyanazt csinálja, mint a korábbiak (0.1 s ideig felvillannak a LED-ek majd 10 s szünet következik), de MCLK 16 MHz körüli érték (csúcsra járatjuk a CPU-t!), s hogy valami különbséget is lássunk, most egyszerre mindkét LED-del villantunk. Hardver követelmények: ugyanazok, mint az előző programoknál. 3_3. lista: A dco_16mhz.c program listája
Ez a program az előzőtől csak a DCOCTL és BCSCTL1 regiszterek beállításában különbözik, s természetesen a nagyobb frekvenciának megfelelően a késleltetéseket is újra kellett számoln.
Láthatjuk, hogy aktív módban a nagyobb CPU frekvenciához nagyobb energiafogyasztás tartozik. Ha összevetjük a fenti értékeket az adatlapból kiolvashatókkal, akkor jónak mondható az egyezés. A cikk még nem ért véget, lapozz! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |