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. 5 perc
Lapozás: OK   8 / 10

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ázlata

A 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:

  • külső órajel: TACLK vagy INCLK. Az új kiadású Launchpadhoz kapott mikrovezérlőknél az INCLK bemenet választása a  P1 és P2 portok bemeneteinek kapacitív érzékelésre történő felhasználását segíti (Pinosc. funkció, lásd az MSP430x2xx Family Users Guide kézikönyv 5. fejezetében). 
  • az ACLK órajel, ami általában 32 kHz vagy (VLO használata esetén) ~12 kHz
  • az SMCLK órajel, ami általában magas frekvenciájú (MHz-es nagyságrendű)

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ák

Az 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 regiszterei

A TIMER0_A3 egység a következő regisztereket használja:

Regiszter
Funkció rövid leírása Cím Típus
TA0CTL TIMER0_A3 vezérlő regisztere 0x160 r/w
TA0R TIMER0_A3 számláló regisztere 0x170 r/w
TA0CCTL0 Capture/Compare 0. csatorna vezérlő regisztere 0x162 r/w
TA0CCR0 Capture/Compare 0. csatorna adatregisztere 0x172 r/w
TA0CCTL1 Capture/Compare 1. csatorna vezérlő regisztere 0x164 r/w
TA0CCR1 Capture/Compare 1. csatorna adatregisztere 0x174 r/w
TA0CCTL1 Capture/Compare 1. csatorna vezérlő regisztere 0x166 r/w
TA0CCR1 Capture/Compare 1. csatorna adatregisztere 0x176 r/w
TA0IV TIMER0_A3 interrupt vektor 0x12E ro

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 vektorok

A 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:

TAIV tartalma A megszakítás forrása Jelzőbit Prioritás
0x0000 Nincs kiszolgálásra váró megszakítás    
0x0002 Capture/Compare 1. csatorna CCIFG1 Magas
0x0004 Capture/Compare 2. csatorna CCIFG2  
0x0006 későbbi fejlesztésnek fenntartva    
0x0008 későbbi fejlesztésnek fenntartva    
0x000A Timer túlcsordulás TAIFG Alacsony

Megjegyzések a mintapéldák használatához

A 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_poll

Ebben 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_ccr0

Az 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_int 

A 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_int

A 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!
Következő: »»   8 / 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