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: 20471, Oldal olvasási idő: kb. 6 perc
Lapozás: OK   4 / 10

Az I/O portok kezelése

Cikksorozatunk 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!
Következő: »»   4 / 10
É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