<< Előző oldal Vissza a tartalomjegyzékhez Következő oldal >>
16.2.1. Válaszidő mérése
Bevezetés
Válaszidő mérése a Timer 1 nullázásával, jelzőbitfigyeléssel
Válaszidő mérése a Timer 1 nullázásával, megszakításkezeléssel
Válaszidő mérése a Timer 1 kiolvasásával (nullázás nélkül), jelzőbitfigyeléssel
Válaszidő mérése a Timer 1 kiolvasásával (nullázás nélkül), megszakításkezeléssel
Válaszidő mérése két esemény közötti időtartam mérésére visszavezetve
A válaszidő egy külső folyamat indításától annak visszajelzéséig terjedő időtartam. A mikrovezérlő valamely kivezetésének jelére indul a külső folyamat és a CCPx kivezetésre érkezik a válaszjel, illetve válaszjelek.
A válaszjelek jelzik a külső folyamat állapotát (befejezettségét, bizonyos pontokon való áthaladását). A válaszidő mérése megadja a végbement folyamat, illetve a részfolyamatok időtartamát.
A válaszidő mérés alkalmazási példái:
ˇ
ultrahangos távolságmérők;
ˇ
reakcióidő mérők;
ˇ
folyamatellenőrzés (időtúllépés esetén riasztás).
Válaszidő-meghatározási feladatoknál a Capture üzemmód (CCP modul) használatára csak viszonylag pontos mérések esetében van szükség, ugyanis sok esetben bőven elegendő a beépített számláló áramkörök kiolvasásán alapuló időmérés pontossága.
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 egy későbbi 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özepes teljesítményű PIC mikrovezérlőkkel mérhető válaszidők minimális értékeit mutatja be a következő táblázat.
Pontosság | Órajelfrekvencia | |||
---|---|---|---|---|
20 MHz (5 MIPS) | 10 MHz (2,5 MIPS) | 4 MHz (1 MIPS) | 1 MHz (0,25 MIPS) | |
5% | 4 µs | 8 µs | 20 µs | 80 µs |
1% | 20 µs | 40 µs | 100 µs | 400 µs |
0,1% | 200 µs | 400 µs | 1 ms | 4 ms |
0,01% | 2 ms | 4 ms | 10 ms | 40 ms |
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 válaszidő mérésének legegyszerűbb módját mutatja be a következő folyamatábra. A Timer 1 nulláról indul a kimenő indítójellel egyidőben, a válaszjel hatására a Timer 1 értéke kiolvasódik, így ez az érték arányos a mért időtartammal.
16.2.1-1. Ábra
A következő programrészlet a feladat gyakorlati megvalósítását mutatja be. 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 ... ... ... ... clrf TMR1H ;TMR1H = 0; felső bájt nullázása movlw 0x01 ;W = 0x01 movwf TMR1L ;TMR1L = 1; alsó bájt kezdőérték beállítása bsf PORTx,x ;külső folyamat indítá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 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 movf CCPR1L,0 ;W = CCPR1L movwf TIMEL ;TIMEL = CCPR1L (alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TIMEH ;TIMEH = CCPR1H (felső bájt elmentve) bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása clrf CCP1CON ;a CCP modul kikapcsolása bcf T1CON,TMR1ON ;a Timer 1 léptetésének leállítása ;*** Időtartamszámítás *** ... ...
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 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.)
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.
... ... 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 ;TMR1H = 0; felső bájt nullázása movlw 0x01 ;W = 0x01 movwf TMR1L ;TMR1L = 1; alsó bájt kezdőérték beállítása bsf PORTx,x ;külső folyamat indítá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 movf CCPR1L,0 ;W = CCPR1L movwf TIMEL ;TIMEL = CCPR1L (alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TIMEH ;TIMEH = CCPR1H (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 bcf T1CON,TMR1ON ;a Timer 1 léptetésének leállítása ;*** Időtartamszámítás *** ... ... 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 ... ...
Ha a Timer 1 számlálónak egyéb feladata is van, akkor annak válaszidőméréshez történő nullázása hibákat okozhat más alkalmazások működésében.
A válaszidő mérését mindig a Timer 1 túlcsordulásakor (nulla értékénél) kezdve, kikerülhető a probléma. Természetesen ez nem minden alkalmazásnál oldható meg.
Egy másik megoldást mutat be a következő folyamatábra, ahol a külső folyamat indításakor a Timer 1 értéke mentésre kerül, így számítható a válszjelig eltelt időtartam. A számításhoz felhasznált két érték egymáshoz való viszonyait, a számítás megvalósíthatóságát és a számítási fogásokat a 16.2.3. fejezet mutatja be.
16.2.1-2. Ábra
A következő programrészlet a feladat gyakorlati megvalósítását mutatja be.
A Timer 1 elmentett értékének tárolóregiszterei: TEMP1L, TEMP1H; a kiolvasott érték tárolóregiszterei: TEMP2L, TEMP2H.
... ... 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 ... ... ;*** A mérés indítása a Timer 1 kiolvasásával *** movf TMR1H,0 ;W = TMR1H; a felső bájt olvasása movwf TEMP1H ;TEMP1H = TMR1H; a felső bájt elmentése movf TMR1L,0 ;W = TMR1L; az alsó bájt olvasása movwf TEMP1L ;TEMP1L = TMR1L; az alsó bájt elmentése movf TMR1H,0 ;W = TMR1H; a felső bájt újraolvasása teszteléshez subwf TEMP1H,0 ;W = TEMP1H - TMR1H; ellenőrző kivonás btfsc STATUS,0 ;a zérusjelző bit tesztelése goto TOVA1 ;ugrik, ha az értékek megegyeznek ;ÚJRAOLVASÁS, ha az értékek különböznek movf TMR1H,0 ;W = TMR1H; a felső bájt olvasása movwf TEMP1H ;TEMP1H = TMR1H; a felső bájt elmentése movf TMR1L,0 ;W = TMR1L; az alsó bájt olvasása movwf TEMP1L ;TEMP1L = TMR1L; az alsó bájt elmentése goto TOVA2 ;a folytatásra lépés TOVA1 nop ;kiegyenlítő késleltetés nop ;kiegyenlítő késleltetés nop ;kiegyenlítő késleltetés nop ;kiegyenlítő késleltetés nop ;kiegyenlítő késleltetés TOVA2 movlw 0x10 ;W = 0x10 (= 16d) addwf TEMP1L,1 ;TEMP1L = TEMP1L + 0x10 btfsc STATUS,C ;a túlcsordulás vizsgálata incf TEMP1H,1 ;az átvitel végrehajtása bsf PORTx,x ;külső folyamat indítása movlw 0x05 ;W = 0x05 movwf CCP1CON ;a Capture üzemmód indítása, kiolvasás minden felfutó élre 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 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) bcf PIR1,CCPIF ;a CCPIF jelzőbit nullázása clrf CCP1CON ;a CCP modul kikapcsolása ;*** Időtartamszámítás *** ... ...
A program biztosítja, hogy a külső folyamat indításakor a TEMP1L, TEMP1H regiszterpár értéke a Timer 1 pillanatnyi értékével megegyező legyen.
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 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.)
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.
... ... 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 ... ... ;*** A mérés indítása a Timer 1 kiolvasásával *** movf TMR1H,0 ;W = TMR1H; a felső bájt olvasása movwf TEMP1H ;TEMP1H = TMR1H; a felső bájt elmentése movf TMR1L,0 ;W = TMR1L; az alsó bájt olvasása movwf TEMP1L ;TEMP1L = TMR1L; az alsó bájt elmentése movf TMR1H,0 ;W = TMR1H; a felső bájt újraolvasása teszteléshez subwf TEMP1H,0 ;W = TEMP1H - TMR1H; ellenőrző kivonás btfsc STATUS,0 ;a zérusjelző bit tesztelése goto TOVA1 ;ugrik, ha az értékek megegyeznek ;ÚJRAOLVASÁS, ha az értékek különböznek movf TMR1H,0 ;W = TMR1H; a felső bájt olvasása movwf TEMP1H ;TEMP1H = TMR1H; a felső bájt elmentése movf TMR1L,0 ;W = TMR1L; az alsó bájt olvasása movwf TEMP1L ;TEMP1L = TMR1L; az alsó bájt elmentése goto TOVA2 ;a folytatásra lépés TOVA1 nop ;kiegyenlítő késleltetés nop ;kiegyenlítő késleltetés nop ;kiegyenlítő késleltetés nop ;kiegyenlítő késleltetés nop ;kiegyenlítő késleltetés TOVA2 movlw 0x10 ;W = 0x10 (= 16d) addwf TEMP1L,1 ;TEMP1L = TEMP1L + 0x10 btfsc STATUS,C ;a túlcsordulás vizsgálata incf TEMP1H,1 ;az átvitel végrehajtása bsf PORTx,x ;külső folyamat 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 movf CCPR1L,0 ;W = CCPR1L movwf TEMP2L ;TEMP2L = CCPR1L (alsó bájt elmentve) movf CCPR1H,0 ;W = CCPR1H movwf TEMP2H ;TEMP2H = CCPR1H (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 ;*** Időtartamszámítás *** ... ... 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 válaszidőmérés megoldható két bemeneti esemény időpontjának rögzítésével és ezek összehasonlításával is. Ehhez az indító eseményt vissza kell vezetni a mikrovezérlő CCPx bemenetére, amely egyben a válaszjelet is fogadja.
Az alábbi ábra ennek egy kapuáramkörrel megvalósított megoldását mutatja be.
16.2.1-3. Ábra
Egy két CCP modult alkalmazó megoldás:
16.2.1-4. Ábra
A két bemeneti esemény közötti időtartam meghatározását a 16.2.3. fejezet mutatja be.
Tudomány és Technika (test@t-es-t.hu)
<< Előző oldal Vissza a tartalomjegyzékhez Vissza a lap tetejére Következő oldal >>