Vissza a főoldalra    Vissza a PIC főoldalra

<< 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.

16.2.3-1. Táblázat
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:

Az időtartamszámítás szemléltetése
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.

Vissza a lap tetejére

      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.

Két esemény közötti idő mérésének folyamata
16.2.3-2. Ábra

Vissza a lap tetejére

      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 ***
  ...    
  ...    

Vissza a lap tetejére

      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
  ...    
  ...    

Vissza a lap tetejére

      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%.

Vissza a lap tetejére

      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.

Vissza a lap tetejére

      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%.

Vissza a lap tetejére

      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%.

Vissza a lap tetejére

      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.

Folyamatos időmérés folyamatábrája
16.2.3-3. Ábra

Vissza a lap tetejére

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

Vissza a főoldalra    Vissza a PIC főoldalra