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. 5 perc
Timer - a sokoldalúan használható időzítőAz új kiadású Launchpad kártya MSP430G2452 mikrovezérlő TIMER0_A3 időzítője abban különbözik a cikksorozat második részében bemutatott MSP430G2231 mikrovezérlő TIMER0_A2 időzítőjétől, hogy nem 2 db hanem 3 db Capture/Compare csatorna csatlakozik hozzá. Az MSP430G2553 mikrovezérlő pedig két darab, egyenként háromcsatornás Timer egységgel rendelkezik: TIMER0_A3 és TIMER1_A3. Mivel ezek egyformák, így az alábbiakban csak a TIMER0_A3 egységet mutatjuk be röviden. A részletesebb leírása az MSP430x2xx Family Users Guide kézikönyv 12. fejezetében, valamint a cikksorozatom második részének 7. oldalán található. A TIMER0_A3 modul leegyszerűsített blokkvázlata az alábbi ábrán látható. Hardveresen két fő részre osztható: a számláló egységre (Timer blokk) és a jelelfogásra, digitális komparálásra vagy impulzusszélesség-modulációra használható Capture/Compare csatornákra. Azt a rajzon nem sikerült érzékeltetni, hogy mindhárom Capture/Compare csatorna regisztere és digitális komparátora az egyetlen Timer blokk TAR regiszteréhez kapcsolódik, ennek értéke másolódik át (Capture módban) vagy kerül összehasonlításra (Compare mód). 8_1. ábra: A TIMER_A3 egység egyszerűsített blokkvázlataA számlálóA számláló egység (Timer blokk) egy 16 bites regisztert tartalmaz (TAR), amelyhez a következő források közül választhatunk:
A bejövő órajel szükség esetén tovább osztható 2-vel, 4-gyel, vagy 8-cal. A számláló túlcsordulásakor (amikor TAR 0xFFFF-ből 0-ra vált) a TAIFG jelzőbit bebillen, s engedélyezése esetén programmegszakítást generál (a TIMER0_A1_VECTOR tartozik hozzá). Megjegyzés: Van egy kis különbség a megszakítási vektorok elnevezésében, mert amíg a korábbi cikkekben ismertetett 14 lábú mikrovezérlőknél TIMERA1_VECTOR volt a ennek a megszakítási vektornak a neve, a 20 lábú mikrovezérlőknél már TIMER0_A1_VECTOR lett belőle. Erre a változásra azért volt szükség, mert pl. az MSP430G2553 mikrovezérlő két Timer egységgel is rendelkezik, melyek számlálójának túlcsordulásához a TIMER0_A1_VECTOR, illetve a TIMER1_A1_VECTOR megszakítási vektorok tartoznak. A Capture/Compare csatornákAz egyforma felépítésű Capture/Compare csatornák központi eleme a 16 bites TACCRx regiszter (ahol x = 0, 1, 2 lehet), amelybe jelelfogás módban a kiválasztott esemény bekövetkeztekor átmásolódik a TAR regiszter pillanatnyi állapota, komparátor módban pedig megadja azt az időt, amelyet elérve a kimenet változik, s programmegszakítási kérelem keletkezik. Megjegyzés: A fenti elvi rajzzal ellentétben ezeknél a kis lábszámú mikrovezérlőknél nincs mindegyik egység minden be- és kimenete kivezetve. Ez bizonyos mértékben korlátozza a használatot (például a TIMER0_A3 egység 2. Capture/Compare modulja csak belső jelforrásokkal használható. A Timer0_A3 egység regisztereiA TIMER0_A3 egység a következő regisztereket használja:
Vegyük észre, hogy a korábbiakban használt "egyszerűsített" neveknél a "TA" előtag után most mindenütt belép a Timer egység sorszáma, ami az MSP430G2553 mikrovezérlő esetében 0 vagy 1 lehet. A TIMER0 esetében azonban 1-2 kivétellel továbbra is használhatjuk rövidebb neveket is (például TA0CTL helyett TACTL, TA0R helyett TAR). Kivételek: a TA0CTL_bit, TA0CCTL0_bit stb. típusú struktúrák neve, és a megszakítási vektorok esetén nincs rövidített név. A mikrovezérlőt leíró fejléc állományokban (pl. io430g2553.h) nézhetünk utána ezeknek a részleteknek.. Fentiek alapján már nem lesz nehéz kitalálni az MSP430G2553 mikrovezérlő TIMER1_A3 egysége regisztereinek nevét: TA1CTL, TA1R, TA1CCTL0, TA1CCR0, TA1CCTL1, TA1CCR1, TA1CCTL1, TA1CCR1, TA1IV. Megszakítási vektorokA Timer0_A3 egység megszakításáról tudnunk kell, hogy összesen négy megszakítást generáló forrása van: TAIFG, CCIFG0, CCIFG1 és CCIFG2, melyekhez csak két megszakítási vektor tartozik. A TIMER0_A0_VECTOR-t kizárólag a CCIFG0 megszakítás használja. Ez nem közös használatú, tehát a megszakításba történő belépéskor a megszakításjelző bit automatikusan törlődik. A TIMER0_A1_VECTOR pedig megosztott használatú, CCIFG1, CCIFG2 és TAIFG használja. Annak gyors eldöntésére, hogy melyik forrás generálta a megszakítást, hasznáhatjuk a TA0IV regisztert. Ennek kiolvasásakor automatikusan törlődik a megszakítást kiváltó jelzőbit, és a T0AIV regiszter is. Ebből következik, hogy egy megszakításon belül csak egyszer szabad olvasni. A T0AIV regiszter lehetséges értékeihez tartozó megszakításokat az alábbi táblázat szerint kell értelmezni:
Megjegyzések a mintapéldák használatáhozA cikksorozatom második részében található mintapéldák használatánál arra kell ügyelni, hogy az új kiadású Launchpad kártya mikrovezérlőinél a TIMER0_A3 egység esetében a "rövidebb" nevek (pl. TA0CTL helyett TACTL) csak korlátozottan használhatók. Emiatt néhány apró változtatásra van szükség, ha az új kártya mikrovezérlőihez adaptáljuk a korábbi cikkek mintapéldáit. 2_timer_pollEbben a programban LED1-et és LED2-t ellenütemben villogtatjuk, kb. 1 s periódussal. Az időzítést a folyamatos módban számláló (MCx = 2) Timer túcsordulása (TAIFG bebillenése) adja. A Timer bemenőjele SMCLK lesz (TASSELx = 2), Az alapértelmezett 1 MHz körüli DCO frekvenciát azonban 8-cal leosztjuk (IDx = 3). A túlcsordulás így T = 2^16 *8/1 000 000 Hz = 0,524 s-onként következik be. A LED-ek villogási periódusa ennek kétszerese lesz, 1,048 s, ami nagyjából 1 s-nak vehető. A szükséges változtatás:TACTL_bit.TAIFG helyett TA0CTL_bit.TAIFG a vizsgált bit elérése (kétszer szerepel a programban!). 2_timer_ccr0Az előző példában csak közelítőleg tudtuk beállítani az időzítést, mert csak a leosztási arányok között válogathattunk. Ebben a programban a pontosabb időzítéshez "felfelé számlálás adott értékig" módot használunk (MCx = 1), s a TACCR0 regiszterbe írjuk be, hogy meddig tartson a számlálás (pontosabban a kívánt érték -1-et kell beleírni). A szükséges változtatás: TACTL_bit.TAIFG helyett TA0CTL_bit.TAIFG a vizsgált bit elérése (kétszer szerepel a programban!). 2_timer_intA szoftveres lekérdezés helyett ebben a programban megszakítást használunk. A közös használatú TIMER0_A1_VECTOR-nál a TA0IV segítségével, egy switch() utasítással ellenőrizzük a megszakítás forrását. A TA0IV regiszter kiolvasása egyúttal törli is a megszakítást okozó bitet, ezért a TAIFG bit törlésre itt nincs szükség. A szükséges változtatások: TIMERA1_VECTOR helyett TIMER0_A1_VECTOR,TAIV helyett TA0IV írandó, s a teljesség kedvéért berakhatunk egy default ágat is a switch utasításba. 2_timer_ccr0_intA CCIFG0 használatával keltett megszakítás kiszolgálása egyszerűbb, mivel a TIMER0_A0_VECTOR nem megosztott használatú, így nem kell nézegetni, hogy melyik bit okozta a megszakítást. Ebben a programban tehát nem a Timer modul, hanem a 0. Capture/Compare modul okozza a megszakítást. A megszakítás kiszolgálását ezért a TIMER0_A0_VECTOR-hoz kellett rendelni. A szükséges változtatások: TIMERA0_VECTOR helyett TIMER0_A0_VECTOR-t kell írni. A cikk még nem ért véget, lapozz! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |