10.2.1. Az MSP430 mikrovezérlők digitális I/O programozása Az MSP430 mikrovezérlők esetében minden kimeneti / bemeneti (I/O) vonal önállóan konfigurálható, az P1. és P2. csoportnak van megszakítás létrehozó képessége is. Az általunk használt MSP430f261x-as 6 Portal rendelkezik: P1, P2, P3, P4, P5, P6. Mindegyik portnak 8 általános célú kimeneti/bemeneti (I/O) vonala van, az összes szükséges ellenőrző és konfigurálható regiszterrel. Mindegyik I/O vonalat egymástól függetlenül lehet ellenőrizni. A Portok MDB és MAB buszokon keresztül kapcsolódnak a processzor magjához. 1.ábra - Az MSP430f261x felépítése Konfiguráció 1. Első lépés - be kell állítani a feladat választó regisztert SEL (pl. P1SEL). Az ellenőrző regiszterek segítségével rendeljük el a kívánt funkciót. Mindegyik regiszter nyolc bitet tartalmaz, amelyek a megfelelő lábakra vonatkoznak és mindegyik láb funkcióját külön-külön lehet megadni. 2. Második lépés - meg kell határozni, hogy kimeneti (O) vagy bemeneti (I) portnak akarjuk-e használni. Ezt a DIR regiszterben állítjuk be (pl. P1DIR). A vezérlő regiszterek nyolc egymástól független bitet tartalmaznak, amelyek meghatározzák a kimeneti/bemeneti lábak vezérlését. Amikor az adott bit = 0 a láb bemenetként működik, amikor az adott bit = 1 a láb kimenetként működik.
3. Harmadik lépés - Az előző beállításoktól függően lehet: IN regiszterből olvashatunk azdatot a perifériáról OUT regiszterbe kell írnunk a perifériára szánt adatot Interrupt zászlók Mindegyik interrupt flag regiszter nyolc flaget tartalmaz, amelyek jelzik, hogy folyamatban vane interrupt (megszakítás) a megfelelő lábon(pl. P1IFG). Interrupt engedélyező regiszterek Mindegyik interruptot engedélyező regiszter tartalmaz biteket amelyek hozzáférhetővé teszik az interrupt flageket mindegyik kimeneti/bemeneti láb részére a porton belül. Amikor a bit=1 a megszakítás kérés elérhető és amikor bit=0 megszakítás nem elérhető. (pl.p1ie) Részletes leírás a ki- és bemeneti konfigurációról valamit a megszakításról az MSP_430x2xxx - Family User's Guide ##LINK: www.ti.com/lit/ug/slau144i/slau144i.pdf## könyv 8. fejezetében található. 1. Feladat: Egy LED bekapcsolása! 2. ábra - LED-ek bekötése (kapcsolás pozitív logikára)
folyamatábra: megvalósítás: 3. ábra - LED folyamatábra //deklarációs rész WDTCTL = WDTPW + WDTHOLD; P2OUT = 0xff; // Stop WDT // beállítjuk P2 kimenetnek P2OUT= ~ 0x01; // kigyújtjuk az első LED-et megjegyzés: a fenti kód az inverz logikával kötött LED-ek esetét mutatja. Összegzés: A deklarációs részt kötelező megadni. A főprogramunkat main() belül kell, hogy legyen. Érdemes megemlíteni a watchdog timert. Ennek a modulnak az elsődleges szerepe, hogy ellenőrzött módon és időn belül újra indítja a rendszert, amikor valamilyen szoftveres hiba jelentkezik. A példában kikapcsoltuk. Mivel nem akarunk különleges funkciót végezni így nem kell átállítani a P2SEL regiszter, hiszen alapértelmezetten: P2SEL=0x00, vagyis a port I/O üzemben van. P2OUT tartalma pozitív logikára: P2OUT = 0x01 avagy binárisan 0000 0001. Ekkor a legkisebb helyértékű LED fog világítani.
P2OUT tartalma inverz logikára: P2OUT = ~0x01 avagy binárisan 1111 1110. Ekkor szintén a legkisebb helyértékű LED fog világítani. A P2OUT regiszter egyszerre 8 I/O lábat címez. Vagyis egyszerre több LED-et is be tudtunk kapcsolni. 2.Feladat: Az összes LED bekapcsolása! megvalósítás: WDTCTL = WDTPW + WDTHOLD; // Stop WDT P2OUT=0xff; P2OUT=0x00; Összegzés: Az előző példától nem sokban tér el, most az összes LED-et kigyújtottuk 0x00-al. 3.Feladat: LED villogtatás! megvalósítás: WDTCTL = WDTPW + WDTHOLD; // Stop WDT // beállítsuk P2 kimenetnek P2OUT = 0xff; unsigned int i; // előjel nélküli integer while(1) // végtelen ciklus P2OUT= ~ 0x01; // bekapcsoljuk az első LED-et for(i=0;i<50000;i++); // várakozás, ez alatt a LED világít P2OUT=0xff; // kikapcsoljuk az első LED-et for(i=0;i<50000;i++); // várakozás, ez alatt a LED NEM világít Összegzés: Létre kell hozni egy előjel nélküli egész változót a késleltetési ciklusok véget (unsigned int i). Létrehozunk egy végtelen ciklust: while (1), vagy for( ; ; ) segítségével. Bekacsoljuk a LED-et, várakozunk, kikapcsoljuk a LED-et, ismét várakozunk. Természetesen minél rövidebb a várakozási ciklus annál gyorsabban fog villogni a LED. 4. Feladat: LED léptetés shift utasítással (jobbra)
megvalósítás: #include <math.h> int main( void ) WDTCTL = WDTPW + WDTHOLD; P2DIR = 0xff; P2OUT =0xff; unsigned int i; int k; k=128; while (1) if (k==0) P2OUT &=~0x80; for(i=0;i<50000;i++) k=128; k=k>>1; P2OUT= ~ k; for(i=0;i<50000;i++) // a legnagyobb helyértéktől indulunk //128 hexadecimális értéke //jobbra shift Összegzés: A k segédváltozó kap egy kezdő értéket, 128-at (1000 0000 binárisan), vagyis a legnagyobb helyértéken található egy 1-es. A segédváltozót léptetjük jobbra, kiküldjük a LED-re (vagy a negáltját). Amennyiben a segédváltozó eléri a 0 értéket, ismét feltöltjük 128-el. lépés k k BIN k INV BIN 1 128 1000 0000 0111 1111 2 64 0100 0000 1011 1111 3 32 0010 0000 1101 1111 4 16 0001 0000 1110 1111 5 8 0000 1000 1111 0111 6 4 0000 0100 1111 1011 7 2 0000 0010 1111 1101 8 1 0000 0001 1111 1110 9 0 0000 0000 1111 1111 10 128 1000 0000 0111 1111 4. ábra a k segédváltozó értékeinek sora 5. Feladat: A lenyomott taszterek sorszámával azonos sorszámú LED-ek világítsanak! A taszterek bekötési rajza:
5. ábra - A taszterek bekötési rajza Folyamatábra: 6.ábra - Folyamatábra LED és taszter
Megvalósítás: WDTCTL = WDTPW + WDTHOLD; P2OUT = 0xff; // P2 output, a LED-ek kimenetnek megadva P1DIR = 0x00; P1OUT = 0x00; while(1) P2OUT =~ P1IN; // P1 input, a taszterek bemenetnek megadva Összegzés: A portok felkonfigurálása után. Egy végtelen ciklusban a P1-es portról beolvasott taszter értékeket negáljuk majd kiküldjük a P2-es portra a negatív logikával bekötött LED sorra. Irodalom: MSP_430x2xxx - Family User's Guide ##LINK: www.ti.com/lit/ug/slau144i/slau144i.pdf##