<< Előző oldal Vissza a tartalomjegyzékhez Következő oldal >>
16.2.3. Két esemény között eltelt idő mérése
Bevezetés
Két egyedi esemény közötti idő meghatározása jelzőbitfigyeléssel
Két egyedi esemény közötti idő meghatározása megszakításokkal
Folyamatos időmérés jelzőbitfigyeléssel - 1. változat (30 kHz-ig)
Folyamatos időmérés jelzőbitfigyeléssel - 2. változat (30 kHz-ig)
Folyamatos időmérés megszakításokkal (30 kHz-ig)
Folyamatos időmérés megszakításokkal (4 MHz-ig)
Folyamatos időmérés jelzőbitfigyeléssel (10 MHz-ig)
A két bemeneti esemény közötti idő mérése a Capture üzemmód alapfelhasználása. (Ez teszi lehetővé periódusidő és frekvencia pontos mérését is.)
Mivel a mérés időalapját a Timer 1 számláló biztosítja:
ˇ
alapesetben a mérhető időintervallumot felülről a Timer 1 számlálási ciklusának hossza, alulról pedig a mikrovezérlő utasításciklusával összemérhető késleltetés által okozott hiba határolja be (az intervallum megnövelését a következő fejezet mutatja be);
ˇ
a mérés pontosságát alapvetően befolyásolja a számláló léptető órajelének pontossága és állandósága.
A két bemeneti esemény közötti idő mérésénél a Timer 1 számláló nullázására (vagy bármilyen alaphelyzetére) nincs szükség. A számláló értéke az első esemény fellépésekor tetszőleges lehet. Az állandó órajellel léptetett számláló értéke az első esemény hatására kiolvasásra, majd szoftveresen elmentésre kerül. A bizonyos idő múlva fellépő második eseménynek is megfelel egy elmentett számlálóérték. Ha a két esemény között idő alatt a számláló léptetése állandó órajellel történt, akkor az elmentett értékek különbsége arányos a két esemény közötti idővel. A két esemény között eltelt idő = az elmentett értékek különbsége · Timer 1 léptetőjel periódusideje.
A következő táblázat a két elmentett érték lehetséges viszonyaira mutat példákat.
Eset | 1. mentett érték | Viszony | 2. mentett érték | 2. - 1. különbség | |
---|---|---|---|---|---|
A | 56A4h | < | A1B0h | 4B0Ch | 19212 |
B | C728h | > | 1234h | 4B0Ch | 19212 |
C | B4F4h | > | 0000h | 4B0Ch | 19212 |
D | FFFDh | < | FFFFh | 0002h | 2 |
E | FFFFh | > | 0001h | 0002h | 2 |
F | FFFEh | > | 0000h | 0002h | 2 |
Az utóbbi három példa szemléletes bemutatása:
16.2.3-1. Ábra
Az ábrán is megfigyelhető, hogy a két esemény között eltelt időtartam mindhárom esetben azonos, a kiolvasott értékek egymáshoz való viszonyától függetlenül. (Az ábrán a kiolvasás-késleltetés nem figyelhető meg, mivel a Timer 1 beállított léptető jelének periódusidejéhez képest a mikrovezérlő utasításciklusának időtartama elhanyagolható mértékű.)
A mérés hibátlan végrehajtásához biztosítani kell:
ˇ
hogy a mérendő időtartam kisebb legyen, mint a Timer 1 számlálási ciklusának hossza, ami FFFFh, vagyis 65535 léptető jel időtartamú;
ˇ
hogy a mérés ideje alatt a Timer 1 pillanatnyi értéke ne legyen szoftverből felülírva (nullázás, értékadás);
ˇ
hogy a mérés ideje alatt a mikrovezérlő ne kerüljön készenléti (SLEEP) állapotba.
A következő folyamatábra két bemeneti esemény között eltelt idő meghatározását szemlélteti jelzőbit figyeléses módszer alkalmazásával.
16.2.3-2. Ábra
A következő programrészlet a feladat gyakorlati megvalósítását mutatja be. Az "első érték" tárolóregiszterei: TEMP1L, TEMP1H; a "második érték" tárolóregiszterei: TEMP2L, TEMP2H; az eredményregiszterek: TIMEL, TIMEH.
... ... clrf CCP1CON ;a CCP modul kikapcsolása clrf T1CON ;Timer 1 kikapcsolva (előosztás 1:1, belső léptetés, szinkronizáció) clrf INTCON ;a megszakítások tiltása bsf STATUS,5 ;az 1. adatmemória lap kiválasztása bsf TRISC,CCP1 ;a CCP1 kivezetés bemenetként való beállítása clrf PIE1 ;a periféria megszakítások tiltása bcf STATUS,5 ;a 0. adatmemória lap kiválasztása clrf PIR1 ;a periféria megszakításkérő jelzőbitek nullázása ... ... ... ... bsf T1CON,TMR1ON ;a Timer 1 léptetésének indítása movlw 0x05 ;W = 0x05 movwf CCP1CON ;a Capture üzemmód indítása, kiolvasás minden felfutó élre ELSO btfss PIR1,CCPIF ;a CCP modul megszakításkérés jelzőbit vizsgálata; ugrik, ha "1" GOTO ELSO ;visszalép, mivel nem történt kiolvasás movf CCPR1L,0 ;W = CCPR1L movwf TEMP1L ;TEMP1L = CCPR1L ("első érték" alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP1H ;TEMP1H = CCPR1H ("első érték" felső bájt elmentve) bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása MASOD btfss PIR1,CCPIF ;a CCP modul megszakításkérés jelzőbit vizsgálata; ugrik, ha "1" GOTO MASOD ;visszalép, mivel nem történt kiolvasás movf CCPR1L,0 ;W = CCPR1L movwf TEMP2L ;TEMP2L = CCPR1L ("második érték" alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP2H ;TEMP2H = CCPR1H ("második érték" felső bájt elmentve) bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása clrf CCP1CON ;a CCP modul kikapcsolása ;*** A két érték közötti különbség meghatározása *** ;Az eredmény a TIMEL, TIMEH regiszterekbe kerül comf TEMP1L,1 ;"első érték" negálása incf,1 TEMP1L ;"első érték" negálása btfsc STATUS,Z ;"első érték" negálása decf TEMP1H,1 ;"első érték" negálása comf TEMP1H,1 ;"első érték" negálása movf TEMP1L,0 ;a két 16-bites érték összeadása addwf TEMP2L,0 ;a két 16-bites érték összeadása movwf TIMEL ;a két 16-bites érték összeadása btfsc STATUS,C ;a két 16-bites érték összeadása incf TEMP1H,0 ;a két 16-bites érték összeadása addwf TEMP2H,0 ;a két 16-bites érték összeadása movwf TIMEH ;a két 16-bites érték összeadása ;*** Időtartamszámítás *** ... ... ;*** Konverzió (például bináris/BCD és BCD/7-szegmens) *** ... ... ;*** Kijelzés vezérlése *** ... ...
A következő programrészlet a fenti program megszakításkezeléssel megvalósított változatát mutatja be. A CCP modul megszakítás csak a két kiolvasás megtörténtéig van engedélyezve. (A példaprogramban a CCP modul megszakításon kívül, minden megszakítás tiltva van. Egyéb megszakítások együttes használatánál meg kell oldani, hogy mindkét kiolvasott érték elmentésére legyen elég idő.)
A megszakításos kiolvasás-kezelés biztosítja, hogy a főprogram a lehető legtöbb időt tölthesse más feladatokkal, mivel így nincs szükség a folyamatos erőforrásigényű jelzőbit-figyelésre.
Abban, hogy a megszakításkezelő szubrutin meg tudja állapítani, hogy éppen az első kiolvasási esemény történt-e meg (amiből még nem számítható időtartam), egy szoftveres jelzőbit regiszter (FIRST) segédkezik, amelynek 0. bitje jelzi az első esemény megtörténtét. Ha FIRST,0 = "1", akkor az első kiolvasási esemény már megtörtént.
... ... clrf CCP1CON ;a CCP modul kikapcsolása clrf T1CON ;Timer 1 kikapcsolva (előosztás 1:1, belső léptetés, szinkronizáció) clrf INTCON ;a megszakítások tiltása bsf STATUS,5 ;az 1. adatmemória lap kiválasztása bsf TRISC,CCP1 ;a CCP1 kivezetés bemenetként való beállítása clrf PIE1 ;a periféria megszakítások tiltása bcf STATUS,5 ;a 0. adatmemória lap kiválasztása clrf PIR1 ;a periféria megszakításkérő jelzőbitek nullázása clrf FIRST ;a szoftveres jelzőbit regiszterének nullázása ... ... bsf T1CON,0 ;a Timer 1 léptetésének indítása movlw 0x05 ;W = 0x05 movwf CCP1CON ;a Capture üzemmód indítása, kiolvasás minden felfutó élre bsf STATUS,5 ;az 1. adatmemória lap kiválasztása movlw B'xxxxxxxx' ;megszakítás engedélyező maszk bevitele; CCPIE="1" movwf PIE1 ;a maszk érvényesítése bcf STATUS,5 ;a 0. adatmemória lap kiválasztása bsf INTCON,6 ;PEIE="1"; periféria megszakítások engedélyezése bsf INTCON,7 ;GIE="1"; globális megszakítás engedélyezés ... ... MEGSZ movwf W_TEMP ;a W értékének mentése swapf STATUS,0 ;W = STATUS bitcserével movwf S_TEMP ;a STATUS regiszter bitcserélt értékének elmentése clrf STATUS ;a 0. adatmemória lap kiválasztása btfss FIRST,0 ;az első eseményt jelző szoftveres jelzőbit vizsgálata goto ELSO ;ugrik, ha FIRST,0 = "0" movf CCPR1L,0 ;W = CCPR1L movwf TEMP2L ;TEMP2L = CCPR1L ("második érték" alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP2H ;TEMP2H = CCPR1H ("második érték" felső bájt elmentve) bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása bsf STATUS,5 ;az 1. adatmemória lap kiválasztása clrf PIE1 ;a periféria megszakítások tiltása bcf STATUS,5 ;a 0. adatmemória lap kiválasztása clrf CCP1CON ;a CCP modul kikapcsolása ;*** A két érték közötti különbség meghatározása *** ... ... ;*** Időtartamszámítás *** ... ... ;*** Konverzió (például bináris/BCD és BCD/7-szegmens) *** ... ... ;*** Kijelzés vezérlése *** ... ... goto END ;ugrás a megszakításkezelő szubrutin végére ELSO movf CCPR1L,0 ;W = CCPR1L movwf TEMP2L ;TEMP2L = CCPR1L ("elso érték" alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP2H ;TEMP2H = CCPR1H ("elso érték" felső bájt elmentve) bsf FIRST,0 ;az első érték elmentésének jelzése a szoftvernek bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása END swapf S_TEMP,0 ;W = STATUS regiszter elmentett értéke movwf STATUS ;a STATUS regiszter értékének visszaállítása swapf W_TEMP,1 ;a W_TEMP értékének bitcseréje swapf W_TEMP,0 ;a W értékének visszaállítása retfie ;visszatérés a megszakításból ... ...
A következő programrészletek folyamatos időmérés (például frekvenciamérés, fordulatszámmérés) megvalósítását mutatják be a CCPIF megszakításkérő jelzőbit szoftverből történő folyamatos figyelésével, viszonylag nagy periódusidők méréséhez (kis frekvenciájú jelekhez). Az "előző érték" tárolóregiszterei: TEMP1L, TEMP1H; az "új érték" tárolóregiszterei: TEMP2L, TEMP2H; az eredményregiszterek: TIMEL, TIMEH.
A folyamatos időmérés alkalmazhatóságának feltétele a mérendő jelsorozat rövid intervallumban viszonylag állandó frekvenciája.
... ... clrf CCP1CON ;a CCP modul kikapcsolása clrf T1CON ;Timer 1 kikapcsolva (előosztás 1:1, belső léptetés, szinkronizáció) clrf INTCON ;a megszakítások tiltása bsf STATUS,5 ;az 1. adatmemória lap kiválasztása bsf TRISC,CCP1 ;a CCP1 kivezetés bemenetként való beállítása clrf PIE1 ;a periféria megszakítások tiltása bcf STATUS,5 ;a 0. adatmemória lap kiválasztása clrf PIR1 ;a periféria megszakításkérő jelzőbitek nullázása ... ... clrf TMR1H ;a Timer 1 számlálóregiszter felső bájt nullázása clrf TMR1L ;a Timer 1 számlálóregiszter alsó bájt nullázása clrf TEMP2H ;az "új érték" tárolóregiszter felső bájt nullázása clrf TEMP2L ;az "új érték" tárolóregiszter alsó bájt nullázása ... ... ... ... movlw 0x05 ;W = 0x05 movwf CCP1CON ;a Capture üzemmód indítása, kiolvasás minden felfutó élre KEZD btfss PIR1,CCPIF ;a CCP modul megszakításkérés jelzőbit vizsgálata; ugrik, ha "1" GOTO KEZD ;visszalép, mivel nem történt kiolvasás bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása bsf T1CON,TMR1ON ;a Timer 1 léptetésének indítása az első kiolvasáskor FIGYEL btfss PIR1,CCPIF ;a CCP modul megszakításkérés jelzőbit vizsgálata; ugrik, ha "1" GOTO FIGYEL ;visszalép, mivel nem történt kiolvasás bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása movf TEMP2L,0 ;W = TEMP2L movwf TEMP1L ;TEMP1L = TEMP2L ("előző érték" alsó bájt átírva) movf TEMP2H,0 ;W = TEMP2H movwf TEMP1H ;TEMP1H = TEMP2H ("előző érték" felső bájt átírva) movf CCPR1L,0 ;W = CCPR1L movwf TEMP2L ;TEMP2L = CCPR1L (kiolvasott érték alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP2H ;TEMP2H = CCPR1H (kiolvasott érték felső bájt elmentve) ;*** A két érték közötti különbség meghatározása *** ;A TEMP1L, TEMP1H értéke elveszik ;A TEMP2L, TEMP2H értéke változatlan marad ;Az eredmény a TIMEL, TIMEH regiszterekbe kerül comf TEMP1L,1 ;"előző érték" negálása incf,1 TEMP1L ;"előző érték" negálása btfsc STATUS,Z ;"előző érték" negálása decf TEMP1H,1 ;"előző érték" negálása comf TEMP1H,1 ;"előző érték" negálása movf TEMP1L,0 ;a két 16-bites érték összeadása addwf TEMP2L,0 ;a két 16-bites érték összeadása movwf TIMEL ;a két 16-bites érték összeadása btfsc STATUS,C ;a két 16-bites érték összeadása incf TEMP1H,0 ;a két 16-bites érték összeadása addwf TEMP2H,0 ;a két 16-bites érték összeadása movwf TIMEH ;a két 16-bites érték összeadása ;*** Időtartamszámítás *** ... ... ;*** Konverzió (például bináris/BCD és BCD/7-szegmens) *** ... ... ;*** Kijelzés vezérlése *** ... ... goto FIGYEL ;vissza a következő esemény figyeléséhez
A bemutatott program a KEZD címkénél vár az első eseményre, amelynek megjelenése indítja a nullázott Timer 1 számlálót. (Ha a mérés a Timer 1 tetszőleges (ismeretlen) állapotában indulna, akkor az első esemény időpontját külön tárolni kellene, és ez alapján már számítható volna a következő eseményig eltelt idő. Ezt a változatot a következő példa mutatja be.)
A program a FIGYEL címkénél vár a következő eseményre, amelynek észlelése után nullázza a CCPIF jelzőbitet, átmásolja az előző eseménykor kiolvasott értéket (a TEMP2-t a TEMP1-be), majd elmenti az éppen észlelt eseménykor kiolvasott értéket (a CCPR1-et a TEMP2-be).
A program meghatározza a két utolsó eseményhez tartozó kiolvasott értékek közötti különbséget. A két időpont közötti különbség és a Timer 1 léptetőjelének frekvenciája ismeretében számítható az események közötti időtartam.
(Az esetlegesen túlzottan ingadozó kijelzett érték simítására alkalmazható a mért intervallumok átlagolása: a bizonyos számú előző adattal számított számtani közép kijelzése.)
A bemutatott program a számításokat, a konverziókat és a kijelzés vezérlését a két esemény közötti idő alatt végzi el, ami alulról behatárolja a mérhető időtartamot. ("Rövid" időtartamok pontos mérésére a további példák adnak útmutatót.)
A fenti program méréshatárai 20 MHz-es órajelfrekvencia (200ns-os (5 MIPS) utasításvégrehajtás) mellett:
ˇ
Az alsó határfrekvenciát a Timer 1 számlálási ciklusa határolja be: 0,013 s (76 Hz).
ˇ
A felső határfrekvenciát a megszakításkezelő szubrutin hossza korlátozza: ~33 µs (~30 kHz). A maximális mérési hiba a 200 ns-os felbontás miatt: 0,006%.
A Timer 1 kezelése terén módosított program (szintén alacsony frekvenciás jelekhez):
... ... clrf CCP1CON ;a CCP modul kikapcsolása clrf T1CON ;Timer 1 kikapcsolva (előosztás 1:1, belső léptetés, szinkronizáció) clrf INTCON ;a megszakítások tiltása bsf STATUS,5 ;az 1. adatmemória lap kiválasztása bsf TRISC,CCP1 ;a CCP1 kivezetés bemenetként való beállítása clrf PIE1 ;a periféria megszakítások tiltása bcf STATUS,5 ;a 0. adatmemória lap kiválasztása clrf PIR1 ;a periféria megszakításkérő jelzőbitek nullázása ... ... ... ... bsf T1CON,TMR1ON ;a Timer 1 léptetésének indítása movlw 0x05 ;W = 0x05 movwf CCP1CON ;a Capture üzemmód indítása, kiolvasás minden felfutó élre KEZD btfss PIR1,CCPIF ;a CCP modul megszakításkérés jelzőbit vizsgálata; ugrik, ha "1" GOTO KEZD ;visszalép, mivel nem történt kiolvasás bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása movf CCPR1L,0 ;W = CCPR1L movwf TEMP2L ;TEMP2L = CCPR1L (kiolvasott érték alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP2H ;TEMP2H = CCPR1H (kiolvasott érték felső bájt elmentve) FIGYEL btfss PIR1,CCPIF ;a CCP modul megszakításkérés jelzőbit vizsgálata; ugrik, ha "1" GOTO FIGYEL ;visszalép, mivel nem történt kiolvasás bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása movf TEMP2L,0 ;W = TEMP2L movwf TEMP1L ;TEMP1L = TEMP2L ("előző érték" alsó bájt átírva) movf TEMP2H,0 ;W = TEMP2H movwf TEMP1H ;TEMP1H = TEMP2H ("előző érték" felső bájt átírva) movf CCPR1L,0 ;W = CCPR1L movwf TEMP2L ;TEMP2L = CCPR1L (kiolvasott érték alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP2H ;TEMP2H = CCPR1H (kiolvasott érték felső bájt elmentve) ;*** A két érték közötti különbség meghatározása *** ... ... ;*** Időtartamszámítás *** ... ... ;*** Konverzió (például bináris/BCD és BCD/7-szegmens) *** ... ... ;*** Kijelzés vezérlése *** ... ... goto FIGYEL ;vissza a következő esemény figyeléséhez
Megfigyelhető, hogy a módosítások nem érintik a program FIGYEL címkétől kezdődő, állandóan futó fő részét. Így mindkét bemutatott verzióval azonos mérési teljesítmény (azonos felső frekvencia-méréshatár) valósítható meg.
A következő programrészlet a fenti program megszakításkezeléssel megvalósított változatát mutatja be.
... ... clrf CCP1CON ;a CCP modul kikapcsolása clrf T1CON ;Timer 1 kikapcsolva (előosztás 1:1, belső léptetés, szinkronizáció) clrf INTCON ;a megszakítások tiltása bsf STATUS,5 ;az 1. adatmemória lap kiválasztása bsf TRISC,CCP1 ;a CCP1 kivezetés bemenetként való beállítása clrf PIE1 ;a periféria megszakítások tiltása bcf STATUS,5 ;a 0. adatmemória lap kiválasztása clrf PIR1 ;a periféria megszakításkérő jelzőbitek nullázása clrf FIRST ;a szoftveres jelzőbit regiszterének nullázása ... ... bsf T1CON,0 ;a Timer 1 léptetésének indítása movlw 0x05 ;W = 0x05 movwf CCP1CON ;a Capture üzemmód indítása, kiolvasás minden felfutó élre bsf STATUS,5 ;az 1. adatmemória lap kiválasztása movlw B'xxxxxxxx' ;megszakítás engedélyező maszk bevitele; CCPIE="1" movwf PIE1 ;a maszk érvényesítése bcf STATUS,5 ;a 0. adatmemória lap kiválasztása bsf INTCON,6 ;PEIE="1"; periféria megszakítások engedélyezése bsf INTCON,7 ;GIE="1"; globális megszakítás engedélyezés ... ... MEGSZ movwf W_TEMP ;a W értékének mentése swapf STATUS,0 ;W = STATUS bitcserével movwf S_TEMP ;a STATUS regiszter bitcserélt értékének elmentése clrf STATUS ;a 0. adatmemória lap kiválasztása btfsc PIR1,CCPIF ;a CCP modul megszakításkérés jelzőbit vizsgálata; ugrik, ha "0" goto CCPINT ;ugrás a kiolvasás kezelésére ... ;egyéb lehetséges megszakítások tesztelése ... ... CCPINT btfss FIRST,0 ;az első eseményt jelző szoftveres jelzőbit vizsgálata goto ELSO ;ugrik, ha FIRST,0 = "0" movf TEMP2L,0 ;W = TEMP2L movwf TEMP1L ;TEMP1L = TEMP2L ("előző érték" alsó bájt átírva) movf TEMP2H,0 ;W = TEMP2H movwf TEMP1H ;TEMP1H = TEMP2H ("előző érték" felső bájt átírva) movf CCPR1L,0 ;W = CCPR1L movwf TEMP2L ;TEMP2L = CCPR1L (kiolvasott érték alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP2H ;TEMP2H = CCPR1H (kiolvasott érték felső bájt elmentve) ;*** A két érték közötti különbség meghatározása *** ... ... ;*** Időtartamszámítás *** ... ... ;*** Konverzió (például bináris/BCD és BCD/7-szegmens) *** ... ... ;*** Kijelzés vezérlése *** ... ... bcf PIR1,CCPIF ;a CCP modul megszakításkérő jelzőbit nullázása goto END ;ugrás a megszakításkezelő szubrutin végére ELSO movf CCPR1L,0 ;W = CCPR1L movwf TEMP2L ;TEMP2L = CCPR1L (kiolvasott érték alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP2H ;TEMP2H = CCPR1H (kiolvasott érték felső bájt elmentve) bsf FIRST,0 ;az első érték elmentésének jelzése a szoftvernek bcf PIR1,CCPIF ;a CCP modul megszakításkérő jelzőbit nullázása goto END ;ugrás a megszakításkezelő szubrutin végére ... ... END swapf S_TEMP,0 ;W = STATUS regiszter elmentett értéke movwf STATUS ;a STATUS regiszter értékének visszaállítása swapf W_TEMP,1 ;a W_TEMP értékének bitcseréje swapf W_TEMP,0 ;a W értékének visszaállítása retfie ;visszatérés a megszakításból ... ...
Abban, hogy a megszakításkezelő szubrutin meg tudja állapítani, hogy éppen az első kiolvasási esemény történt-e meg (amiből még nem számítható időtartam), egy szoftveres jelzőbit regiszter (FIRST) segédkezik, amelynek 0. bitje jelzi az első esemény megtörténtét. Ha FIRST,0 = "1", akkor az első kiolvasási esemény már megtörtént.
A megszakításos kiolvasás-kezelés biztosítja, hogy a főprogram a lehető legtöbb időt tölthesse más feladatokkal, mivel így nincs szükség a folyamatos erőforrásigényű jelzőbit-figyelésre.
A példában a megszakításkezelő szubrutin a számításokat, a konverziókat és a kijelzés vezérlését a két esemény közötti idő alatt végzi el, ami az előző példákhoz hasonlóan, szintén behatárolja a mérhető időtartamot. ("Rövid" időtartamok pontos mérésére a további példák adnak útmutatót.)
A fenti program méréshatárai 20 MHz-es órajelfrekvencia (200ns-os (5 MIPS) utasításvégrehajtás) mellett:
ˇ
Az alsó határfrekvenciát a Timer 1 számlálási ciklusa határolja be: 0,013 s (76 Hz).
ˇ
A felső határfrekvenciát a megszakításkezelő szubrutin hossza korlátozza: ~33 µs (~30 kHz). A maximális mérési hiba a 200 ns-os felbontás miatt: 0,006%.
A következő programrészlet folyamatos időmérés megvalósítását mutatja be megszakításkezeléssel, és akár egészen kicsi periódusidők mérésére is alkalmazható.
A rövid időtartamok kezelését biztosítja:
ˇ
a Timer 1 minél gyorsabb léptetése (nagyobb léptető frekvencia nagyobb felbontást, pontosabb mérést tesz lehetővé);
ˇ
a CCP modul bemenő jelének beállított 1:16 osztási aránya (minden 16. esemény hatására jön létre kiolvasás, vagyis a számított időintervallumot 16-tal osztani kell a helyes végeredményhez);
ˇ
a kiolvasott értékek párban való kezelése: két kiolvasott érték után a feldolgozás ideje alatt a Capture üzemmód ki van kapcsolva (így néhány bejövő esemény észlelése kimarad, de van elég idő az egyéb feladatok elvégzésére);
ˇ
a megszakításkezelő szubrutin gyors átfutása az értékpár első elemének kiolvasásakor (ez az átfutási idő adja meg a mérés felső határfrekvenciáját, az átfutási időnek kisebbnek kell lennie mint a két esemény közötti időtartam kétszerese, hogy a második érték nehogy még a kiolvasás előtt felülíródjon; valamint az első kiolvasott értéket még a második esemény előtt el kell menteni).
Az "első érték" tárolóregiszterei: TEMP1L, TEMP1H; a "második érték" tárolóregiszterei: TEMP2L, TEMP2H; az eredményregiszterek: TIMEL, TIMEH.
A FIRST szoftveres jelzőbit regiszter 0. bitje jelzi az első esemény megtörténtét. Ha FIRST,0 = "1", akkor az első kiolvasási esemény már megtörtént.
... ... clrf CCP1CON ;a CCP modul kikapcsolása clrf T1CON ;Timer 1 kikapcsolva (előosztás 1:1, belső léptetés, szinkronizáció) clrf INTCON ;a megszakítások tiltása bsf STATUS,5 ;az 1. adatmemória lap kiválasztása bsf TRISC,CCP1 ;a CCP1 kivezetés bemenetként való beállítása clrf PIE1 ;a periféria megszakítások tiltása bcf STATUS,5 ;a 0. adatmemória lap kiválasztása clrf PIR1 ;a periféria megszakításkérő jelzőbitek nullázása clrf FIRST ;a szoftveres jelzőbitregiszter nullázása ... ... bsf T1CON,0 ;a Timer 1 léptetésének indítása movlw B'00000111' ;A CCP modul vezérlő maszk betöltése movwf CCP1CON ;a Capture üzemmód indítása, kiolvasás minden 16. felfutó élre bsf STATUS,5 ;az 1. adatmemória lap kiválasztása movlw B'xxxxxxxx' ;megszakítás engedélyező maszk bevitele; CCPIE="1" movwf PIE1 ;a maszk érvényesítése bcf STATUS,5 ;a 0. adatmemória lap kiválasztása bsf INTCON,6 ;PEIE="1"; periféria megszakítások engedélyezése bsf INTCON,7 ;GIE="1"; globális megszakítás engedélyezés ... ... MEGSZ movwf W_TEMP ;a W értékének mentése swapf STATUS,0 ;W = STATUS bitcserével movwf S_TEMP ;a STATUS regiszter bitcserélt értékének elmentése clrf STATUS ;a 0. adatmemória lap kiválasztása btfsc PIR1,CCPIF ;a CCP modul megszakításkérés jelzőbit vizsgálata; ugrik, ha "0" goto CCPINT ;ugrás a kiolvasás kezelésére ;*** Egyéb megszakítások esetén szükséges beállítások *** clrf CCP1CON ;egyéb megszakítás esetén a CCP modul kikapcsolása bcf FIRST,0 ;az "első érték kiolvasása következik" jelzés beállítása ... ;*** Egyéb megszakítások tesztelése *** ... ... CCPINT btfss FIRST,0 ;az első eseményt jelző szoftveres jelzőbit vizsgálata goto ELSO ;ugrik, ha FIRST,0 = "0" clrf CCP1CON ;a CCP modul kikapcsolása movf CCPR1L,0 ;W = CCPR1L movwf TEMP2L ;TEMP2L = CCPR1L ("második érték" alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP2H ;TEMP2H = CCPR1H ("második érték" felső bájt elmentve) ;*** A két érték közötti különbség meghatározása *** ... ... ;*** Időtartamszámítás *** ... ... ;*** Konverzió (például bináris/BCD és BCD/7-szegmens) *** ... ... ;*** Kijelzés vezérlése *** ... ... bcf FIRST,0 ;az "első érték kiolvasása következik" jelzés beállítása bcf PIR1,CCPIF ;a CCP modul megszakításkérő jelzőbit nullázása movlw B'00000111' ;A CCP modul vezérlő maszk betöltése movwf CCP1CON ;a Capture üzemmód indítása, kiolvasás minden 16. felfutó élre goto END ;ugrás a megszakításkezelő szubrutin végére ELSO movf CCPR1L,0 ;W = CCPR1L movwf TEMP1L ;TEMP1L = CCPR1L ("első érték" alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP1H ;TEMP1H = CCPR1H ("első érték" felső bájt elmentve) bsf FIRST,0 ;a "második érték kiolvasása következik" jelzés beállítása bcf PIR1,CCPIF ;a CCP modul megszakításkérő jelzőbit nullázása goto END ;ugrás a megszakításkezelő szubrutin végére ... ;*** Egyéb megszakítások kezelése *** ... ... movlw B'00000111' ;egyéb megszakítás kezelése után a CCP modul indítása movwf CCP1CON ;a Capture üzemmód indítása, kiolvasás minden 16. felfutó élre END swapf S_TEMP,0 ;W = STATUS regiszter elmentett értéke movwf STATUS ;a STATUS regiszter értékének visszaállítása swapf W_TEMP,1 ;a W_TEMP értékének bitcseréje swapf W_TEMP,0 ;a W értékének visszaállítása retfie ;visszatérés a megszakításból ... ...
A megkívánt gyors működés miatt külön figyelmet kell fordítani az egyéb megszakítások kezelésére. A két kiolvasási esemény között fellépő megszakítás végrehajtás meghiúsíthatja a következő esemény kiolvasását, illetve egy vagy több esemény figyelmen kívül maradhat, ami mérési hibát okoz. Ezért egyéb megszakítás fellépésekor a már megkezdett mérést törölni kell, valamint a megszakításkezelés után új mérést kell indítani. Ez a működés a példaprogramon is végigkövethető.
A fenti program méréshatárai 20 MHz-es órajelfrekvencia (200ns-os (5 MIPS) utasításvégrehajtás) mellett:
ˇ
Az alsó határfrekvenciát a Timer 1 számlálási ciklusa határolja be: 0,013 s (76 Hz).
ˇ
A felső határfrekvenciát a megszakításkezelő szubrutin hossza korlátozza: 230 ns (4,4 MHz). A maximális mérési hiba a 12,5 ns-os felbontás miatt: 5..6%.
A következő folyamatábra rövid időtartamok folyamatos mérésének megvalósítását mutatja be, az előző programrészlethez hasonló megoldásokkal, de jelzőbitfigyeléses módszerrel. Ez előnyösen használható, azokban az esetekben, amikor a mikrovezérlőnek a mérésen és a mért érték kijelzésén kívül nincs egyéb feladata.
16.2.3-3. Ábra
A folyamatábrát megvalósító programrészlet:
... ... clrf CCP1CON ;a CCP modul kikapcsolása clrf T1CON ;Timer 1 kikapcsolva (előosztás 1:1, belső léptetés, szinkronizáció) clrf INTCON ;a megszakítások tiltása bsf STATUS,5 ;az 1. adatmemória lap kiválasztása bsf TRISC,CCP1 ;a CCP1 kivezetés bemenetként való beállítása clrf PIE1 ;a periféria megszakítások tiltása bcf STATUS,5 ;a 0. adatmemória lap kiválasztása clrf PIR1 ;a periféria megszakításkérő jelzőbitek nullázása clrf FIRST ;a szoftveres jelzőbitregiszter nullázása ... ... bsf T1CON,0 ;a Timer 1 léptetésének indítása UJRA movlw B'00000111' ;A CCP modul vezérlő maszk betöltése movwf CCP1CON ;a Capture üzemmód indítása, kiolvasás minden 16. felfutó élre ELSO btfss PIR1,CCPIF ;a CCP modul megszakításkérés jelzőbit vizsgálata; ugrik, ha "1" GOTO ELSO ;visszalép, mivel nem történt kiolvasás movf CCPR1L,0 ;W = CCPR1L movwf TEMP1L ;TEMP1L = CCPR1L ("első érték" alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP1H ;TEMP1H = CCPR1H ("első érték" felső bájt elmentve) bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása MASOD btfss PIR1,CCPIF ;a CCP modul megszakításkérés jelzőbit vizsgálata; ugrik, ha "1" GOTO MASOD ;visszalép, mivel nem történt kiolvasás movf CCPR1L,0 ;W = CCPR1L movwf TEMP2L ;TEMP2L = CCPR1L ("második érték" alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP2H ;TEMP2H = CCPR1H ("második érték" felső bájt elmentve) bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása clrf CCP1CON ;a CCP modul kikapcsolása ;*** A két érték közötti különbség meghatározása *** ... ... ;*** Időtartamszámítás *** ... ... ;*** Konverzió (például bináris/BCD és BCD/7-szegmens) *** ... ... ;*** Kijelzés vezérlése *** ... ... goto UJRA ;visszalép egy újabb mérési ciklus indítására
A program méréshatárai 20 MHz-es órajelfrekvencia (200ns-os (5 MIPS) utasításvégrehajtás) mellett:
ˇ
Az alsó határfrekvenciát a Timer 1 számlálási ciklusa határolja be: 0,013 s (76 Hz).
ˇ
A felső határfrekvenciát az "első érték" elmentését végző programrészlet hossza korlátozza: 100 ns (10 MHz). A maximális mérési hiba a 12,5 ns-os felbontás miatt: 12,5%.
Tudomány és Technika (test@t-es-t.hu)
<< Előző oldal Vissza a tartalomjegyzékhez Vissza a lap tetejére Következő oldal >>