Fórum témák
» Több friss téma |
Cikkek » Launchpad: ismerkedés az MSP430 mikrovezérlőkkel III. Launchpad: ismerkedés az MSP430 mikrovezérlőkkel III.
Szerző: icserny, idő: Jún 19, 2012, Olvasva: 20569, Oldal olvasási idő: kb. 6 perc
Az I/O portok kezeléseCikksorozatunk első részében már megismerkedtünk az I/O portok kezelésével, s a portok kezelésével kapcsolatos regiszterekekel. Az MSP430G2553 és az MSP430G2452 mikrovezérlőknél ezekhez képest annyi különbség van, hogy a P1 és P2 port új funkciókkal bővült (mindegyik portláb felhasználható kapacitív érzékeléshez), s a kibővült feladatkör miatt mindkét porthoz bevezettek egy-egy második funkcióválasztó regisztert (P1SEL2 és P2SEL2, lásd az alábbi táblázatokban). A P2 port mindkét mikrovezérlőben teljes (azaz 8 bites), s az MSP430G2553 mikrovezérlő nagyobb lábszámú példányaiban P3 port is található (ez utóbbival azonban itt nem foglalkozunk, mivel az általunk használt 20 lábú példányokban nincs kiépítve). Az MSP430G25531 és MSP430G2452 mikrovezérlőink P1 és P2 portjának működését tehát az alábbi regiszterek segítségével vezérelhetjük (lásd az adatlap "Peripherals With Byte Access" c. táblázatában): A P1 porthoz tartozó regiszterek
|
Regiszter |
Cím | A regiszternév rövid magyarázata |
P1IN | 0x0020 | PORT1 input (P1 bemenet) |
P1OUT | 0x0021 | PORT1 output (P1 kimenet) |
P1DIR | 0x0022 | PORT1 direction (P1 adatáramlási irány) |
P1IFG | 0x0023 | PORT1 interrupt flags (P1 megszakítási kérelmet jelző bitek) |
P1IES | 0x0024 | PORT1 edge select (P1 fel- vagy lefutóél választása megszakításhoz) |
P1IE | 0x0025 | PORT1 interrupt enable (P1 programmegszakítás engedélyezés) |
P1SEL | 0x0026 | PORT1 selection (P1 funkcióválasztó bitek) |
P1REN | 0x0027 | PORT1 resistor enable (P1 fel-, vagy lehúzás engedélyezés) |
P1SEL2 |
0x0041 |
PORT1 selection 2 (P1 további funkcióválasztó bitek) |
A P2 porthoz tartozó regiszterek
Regiszter |
Cím | A regiszternév rövid magyarázata |
P2IN | 0x0028 | PORT2 input (P2 bemenet) |
P2OUT | 0x0029 | PORT2 output (P2 kimenet) |
P2DIR | 0x002A | PORT2 direction (P2 adatáramlási irány) |
P2IFG | 0x002B | PORT2 interrupt flags (P2 megszakítási kérelmet jelző bitek) |
P2IES | 0x002C | PORT2 edge select (P2 fel- vagy lefutóél választása megszakításhoz) |
P2IE | 0x002D | PORT2 interrupt enable (P2 programmegszakítás engedélyezés) |
P2SEL | 0x002E | PORT2 selection (P2 funkcióválasztó bitek) |
P2REN | 0x002F | PORT2 resistor enable (P2 fel-, vagy lehúzás engedélyezés) |
P2SEL2 | 0x0042 | PORT2 selection 2 (P2 további funkcióválasztó bitek) |
Amint látjuk, a két port regiszterkészlete azonos. Megjegyezzük azonban, hogy az MSP430 mikrovezérlő család nagyobb kiépítettségű tagjainál, ahol kettőnél több I/O port is van, a magasabb sorszámú portokhoz már kevesebb regiszter tartozik. Külső jellel történő programmegszakítás ugyanis csak a P1 és P2 portokon lehetséges, ennek megfelelően például az MSP430G2553 nagyobb lábszámú példányainál a P3 porthoz nem tartozik P3IE, P3IES és P3IFG regiszter.
Az I/O portok kivezetéseinek funkciója és adatáramlási iránya bitenként beállítható, ezért az I/O portok kezelése többnyire bitműveletekkel történik.
Mivel P1 és P2 regiszterkészlete hasonló, itt csak a P1 port regisztereit ismertetjük részletesebben.
P1IN - a P1 port bemenő regiszterének nevezzük, de valójában nem regiszter (nem tartozik hozzá adattárolásra alkalmas eszköz), hanem a a mikrovezérlő P1.x jelzésű digitális bemeneteinek pillanatnyi állapotát olvashatjuk be ezen a címen. A P1IN regiszter olvasása előtt gondoskodnunk kell róla, hogy a vizsgálni kívánt bemenetek digitális I/O funkciója legyen kiválasztva. Például a P1 port esetében a P1SEL=0;P1SEL2=0; állítja az összes portlábat digitális I/O funkcióra. A P1 portnál egyébként bekapcsolásnál ez az alapértelmezett beállítás, A P2 portnál viszont nem teljesen, mivel a P2.6 és P2.7 lábak estében a kvarcoszcillátor az alapértelmezett funkció.
Egy fontos megjegyzés: Megjegyezzük, hogy az analóg-digitális átalakítóval rendelkező mikrovezérlőknél (esetünkben MSP430G2231 ilyen) egy adott láb digitális módba történő állításához az adott lábhoz tartozó analóg funkciót is le kell tiltani az ADC10AE regiszter megfelelő bitjének nullára állításával (pl. P1OUT.x esetén ADC10AE.x=0). Egyszerű mintapéldáinkban azért nem foglalkozunk ezzel, mert bekapcsoláskor ez az alapértelmezett beállás. Mindenesetre jegyezzük meg, hogy a portlábak viselkedését mellékhatásként más perifériák vezérlő regiszterei is befolyásolják! Hogy pontosan melyek, azt a mikrovezérlő adatlapjának Application Information című fejezetének táblázatai írják le részletesen.
P1OUT - a P1 port kimeneti adatregisztere. Elektronikában jártasak ezt egy D-típusú tárolónak képzeljék el, amely őrzi a beleírt adatot. Az adat visszaolvasható a regiszterből, s ha valamelyik bitjéhez tartozó kivezetés digitális kimenetre van állítva (P1SEL.x=0 és P1DIR.x=1, akkor a kimeneten megjelenik a P1OUT.x-be írt állapot).
P1DIR - a P1 port kivezetésein az adatáramlási irányát szabja meg, amelyet bitenként beállíthatunk. Ha valamelyik bitet '0'-ra állítjuk, akkor a hozzá tartozó kivezetés bemenet lesz (bekapcsoláskor egyébként ez az alapértelmezett beállás), ha pedig '1'-re állítjuk, akkor kimenetként viselkedik. Összefoglalva tehát 0: bemeneti, 1: kimeneti irány. Mindez csak akkor igaz, ha a kivezetés digitális ki/bemenetnek van konfigurálva (azaz P1SEL és PSEL2 megfelelő bitje '0'), ami a P1 portnál alapértelmezett beállás, de a P2 portnál nem teljesen...
P1SEL és P1SEL2 - a P1 port kivezetéseinek funkcióját választhatjuk ki velük. Úgy kell elképzelni, hogy P1SEL és P1SEL2 azonos helyiértékű bitjei összeolvasandók egy kétbites számmá, így - ha csak ezeket a biteket nézzük - négyféle funkciót tudnak beállítani a P1 port azonos helyiértéken levő bitjére vonatkozóan. További regiszterek beállításával még több funkció közül választhatunk. Az alábbi táblázatban a P1 port 0. bitjére (a P1.0 kivezetésre) vonatkozó funkcióbeállítási lehetőségeket foglaltuk össze. Ez és a többi lábra vonatkozó hasonló információ a mikrovezérlő adatlapjának végén található, a PORT SCHEMATICS nevű szekcióban.
Név | Funkció | P1DIR.0 |
P1SEL.0 | P1SEL2.0 | ADC10AE.0 | CAPD.0 |
P1.0 | Digitális I/O | 0: be, 1: ki | 0 | 0 | 0 | 0 |
TA0CLK | Timer0 órajel bemenet | 0 | 1 | 0 | 0 | 0 |
ACLK | ACLK órajel kimenet | 1 | 1 | 0 | 0 | 0 |
A0 | Analóg bemenet 0. csatorna | X | X | X | 1 | 0 |
CA0 | Analóg komparátor 0. bemenet | X | X | X | 0 | 1 |
Pin Osc | Kapacitív érzékelés | X | 0 | 1 | 0 | 0 |
P1REN - ha valamelyik bitjét '1'-be állítjuk, akkor a P1 port megfelelő bemenetén engedélyezzük a beépített fel- vagy lehúzó ellenállást. Azt a P1OUT regiszter megfelelő bitje mondja meg, hogy a fel- vagy lehúzás legyen érvényben (1: felhúzás Vcc-re, 0: lehúzás Vss-re).
A P1 port további regiszterei a megszakításokkal kapcsolatosak. Engedélyezhetjük, hogy külső események hatására a port valamelyik bemenete programmegszakítást kérjen (ha P1IE megfelelő bitje '1'). Megadhatjuk, hogy a megszakítási kérelem fel- vagy lefutó élre keletkezzen (ha P1IES megfelelő bitje '0', akkor felfutó élre, ha pedig '1', akkor lefutó élre keletkezik megszakítás). A megszakítási kérelem jelzőbitjét a P1IFG regiszter megfelelő bitjében találjuk meg (1: programmegszakítási kérelem jelzése, 0: nincs megszakítási kérelem).
Az I/O portok részletesebb leírása az MSP430x2xx Family Users Guide kézikönyv 8. fejezetében található.
A portkezelés buktatói az új Launchpad kártyánál
Cikksorozatunk első részének példaprogramjai könnyen adaptálhatók aj új Launchpad kártyához: a legtöbb esetben csak a mikrovezérlő típusát kell módosítanunk (MSP430G2231 helyett MSP430G2553), s újrafordítás után letölthető és futtatható a program. Az első meglepetés csak akkor ér bennünket, ha az S2 nyomógombot szeretnénk használni. A gond az, hogy az új Launchpad kártyánál nincs beépítve a P1.3 bemenet felhúzásáról gondoskodó R34 ellenállás, ezért a nyomógomb nem használható, ha nem gondoskodunk a felhúzásról. A legegyszerűbb megoldás a belső felhúzás bekapcsolása, de ehhez módosítani kell az eredeti forráskódot.
1_ledflash. 1_ledflas2, 1_ledflash_all
Ezeknél a programoknál csak a mikrovezérlő típusát kell beállítani az új kiadású Launchpad kártyához.
Az 1_ledswitch program
Ez az első cikkben az egyetlen mintaprojekt, amelyet módosítanunk kell: engedélyeznünk kell benne a belső felhúzást. Ebben a programban egyébként LED1-et kapcsolgathatjuk az S2 nyomógomb segítségével. Két utasítást kell beszúrnunk: A P1REN regiszter 3. bitjének '1'-re állításával engedélyezzük a belső le/felhúzást a P1.3 portlábon, a P1OUT regiszer 3. bitjének '1'-re állításával pedig megmondjuk, hogy felhúzást akarunk, nem lefelé húzást. A módosított program listája így néz ki
Megjegyzés: az IAR Embedded Workbench for MSP430 korábbi változataiban külön be kellett csatolni az "intrinsics.h" fejléc állományt, de a v5.30.1 és újabb változatoknál már nincs erre szükség!
A belső felhúzás használatának vannak buktatói: Ha bekapcsoljuk a belső felhúzást, és utána a programban vaalhol P1OUT = valami; típusú értékadást használunk, akkor megeshet, hogy mellékhatásként a felhúzást lehúzásba kapcsoljuk át a P1OUT regiszter BIT3 helyiértékű bitjének gondatlanságból elkövetett törlése miatt! Meg kell tehát szoknunk, hogy mindig csak azokat a biteket módosítsuk, ahol változást szeretnénk elérni!
A "bitfaragás" legalapvetőbb esetei:
Bit '1'-be állítása: P1OUT |= BITn; Például mindkét LED bekapcsolása: P1OUT |= BIT0 + BIT6;
Bit '0'-ba állítása: P1OUT &= ~BITn; Például mindkét LED kikapcsolása: P1OUT &= ~(BIT0 + BIT6);
Bit átbillentése: P1OUT ^= BITn; Például mindkét LED állapotának átbillentése: P1OUT ^= BIT0 + BIT6;
ahol n = 0 ... 7 lehet.
Egy másik buktató amire oda kell figyelnünk: A portláb funkciójának beállításakor nem elég a P1SEL (vagy P2SEL) regisztert beállítani, a P1SEL2 (vagy P2SEL2 regiszterre is gondolnunk kell az új Launchpad kártya mikrovezérlőinél!
1_knight_rider, 1_lcd_2x16, 1_lcd_4x20
Ezeknél a programoknál csak a mikrovezérlő típusát kell beállítani az új kiadású Launchpad kártyához.
A cikk még nem ért véget, lapozz!