<< Előző oldal Vissza a tartalomjegyzékhez Következő oldal >>
11.4.15. Késleltetések
Assembly programozás tartalomjegyzék
Rövid késleltetések NOP utasításokkal
8 bites késleltető ciklus
16 bites késleltető ciklus
24 bites késleltető ciklus
32 bites késleltető ciklus
n·8 bites késleltető ciklus
Aktív késleltetés
Késleltetés 8 bites hardver számlálóval
Késleltetés 16 bites hardver számlálóval
Késleltetés SLEEP módban
A külső vagy belső hardverműködések során számos esetben szükség van bizonyos idejű késleltetésekre. Ezeket célszerű szoftveres eszközökkel megoldani.
Rövid késleltetések NOP utasításokkal:
A NOP üres utasítás végrehajtása során nem történik műveletvégzés, viszont eltelik egy utasításciklusnyi idő. (Az utasításciklus hossza természetesen az órajel frekvenciájától függ: tutasítás = 4 / fórajel.)
A teendő csupán annyi, hogy a kívánt késleltetésnek megfelelő számú NOP utasítást kell elhelyezni a program adott pontjára.
Az ilyen késleltetést csak rövidebb időtartamok esetében célszerű alkalmazni, mivel a programmemória szűkössége nem minden esetben enged meg "néhány száz" plusz utasítást. Ha a programon belül több helyen is szükség van ugyanolyan késleltetésre, célszerű a NOP utasításokat egy szubrutinban elhelyezni, ami bárhonnan hívható.
A következő programrészlet három utasításciklusnyi idejű késleltetést valósít meg:
... ... NOP NOP NOP ;három utasításciklusnyi késleltetés ...
Egy hat utasításciklusnyit késleltető szubrutin:
... ... ... CALL VARJ ;a késleltető szubrutin hívása ... ... VARJ NOP NOP RETURN ;a szubrutin vége ...
A szubrutin hívását végző utasítás, a két darab NOP utasítás és a visszatérő utasítás szintén két-két ciklusnyit késleltet, így összesen hat ciklusnyi a késleltetés.
A fentiekből következik, hogy a szubrutin megoldású késleltetés minimális ideje négy utasításciklus, ekkor persze NOP utasításokra nincs is szükség.
Késleltető ciklusok:
Késleltető ciklus bármilyen léptető ciklussal megvalósítható; üres, vagy csak NOP utasításokat tartalmazó ciklusmaggal.
8 bites késleltető ciklus
A legegyszerűbb megoldást a DECFSZ utasítással felépített 8 bites hátra számláló léptető ciklus adja:
... ... movlw 0x06 ;W = 6 movwf SZAMLALO ;SZAMLALO = 6 UJRA decfsz SZAMLALO,1 ;SZAMLALO = SZAMLALO - 1; zérus vizsgálat goto UJRA ;visszaugrik, ha SZAMLALO nem nulla ...
A léptető ciklus megkezdése előtt a SZAMLALO azonosítójú számláló regiszterbe be kell tölteni a kezdeti értéket, ami a késleltetés hosszát egyértelműen meghatározza. Ennek az értéknek az 1..255 (01h..FFh) intervallumban kell lennie. (Nulla érték esetén a ciklus nem a kívántaknak megfelelően viselkedik, ilyenkor a ciklus futási ideje 769 utasításciklus lesz.)
A ciklus futási idejét a következő működések adják:
ˇ
2 ciklusos értékadás;
ˇ
3·(SZAMLALO − 1) ciklusos leszámlálás;
ˇ
2 ciklusos kilépés.
Ebből a végrehajtott utasításciklusok száma: C = 2 + 3·(SZAMLALO − 1) + 2.
Egyszerűsítve: C = 3 · SZAMLALO + 1.
Amiből a késleltetési idő ismeretében a szükséges számláló kezdőérték számítható: SZAMLALO = (C − 1) / 3.
Az így beállítható késleltetések tehát: C = 4, 7, 10, 13, ... 763, 766 értékek lehetnek.
A 8 bites léptető ciklussal megvalósítható késleltetésekre mutat példákat a következő táblázat.
Mikrovezérlő órajel |
Minimum késleltetés |
Maximum késleltetés |
---|---|---|
32kHz | 0,5ms | 95,75ms |
200kHz | 0,08ms | 15,32ms |
4MHz | 0,004ms | 0,766ms |
20MHz | 0,0008ms | 0,1532ms |
16 bites késleltető ciklus
Ha nagyobb késleltetésekre van szükség, akkor több számláló regisztert kell bevonni a késleltető ciklusba. A két regiszterrel és két DECFSZ utasítással felépített 16 bites hátra számláló léptető ciklus:
... ... movlw 0x06 ;W = 6 movwf S1 ;S1 = 6 movlw 0x02 ;W = 2 movwf S2 ;S2 = 2 UJRA decfsz S1,1 ;S1 = S1 - 1; zérus vizsgálat goto UJRA ;visszaugrik, ha S1 nem nulla decfsz S2,1 ;S2 = S2 - 1; zérus vizsgálat goto UJRA ;visszaugrik, ha S2 nem nulla ...
(A programban beállított kezdőértékek esetén a ciklus késleltetése 793 utasításciklus.)
A léptető ciklus megkezdése előtt az S1 és S2 azonosítójú számláló regiszterekbe be kell tölteni a kezdeti értéket, ami a késleltetés hosszát egyértelműen meghatározza. Jelen esetben az S1 regiszter a kisebb helyiértékű. A kezdőértékeknek az 1..255 (01h..FFh) intervallumban kell lenniük. (Nulla kezdőértékek esetén a ciklus nem a kívántaknak, vagyis nem az alábbiakban meghatározott összefüggésnek megfelelően viselkedik.)
A ciklus futási idejét a következő működések adják:
ˇ
4 ciklusos értékadás;
ˇ
3·(S1 − 1) ciklusos S1 első leszámlálás;
ˇ
2 ciklusos belső ciklusból való első kilépés;
ˇ
3·255·(S2 − 1) ciklusos S1 teljes leszámlálás;
ˇ
2·(S2 − 1) ciklusos belső ciklusból való kilépés;
ˇ
3·(S2 − 1) ciklusos S2 leszámlálás;
ˇ
2 ciklusos kilépés.
Ebből az utasításciklusok száma: C = 4 + 3·(S1 − 1) + 2 + 765·(S2 − 1) + 2·(S2 − 1) + 3·(S2 − 1) + 2.
Egyszerűsítve: C = 3·S1 + 770·S2 − 765.
A szükséges számláló kezdőérték meghatározásában nyújt segítséget a következő segédprogram.
Az így beállítható késleltetések tehát: C = 8, 11, 14, 17, ... 196347, 196350 értékek lehetnek. A 767 utasításciklusnál rövidebb késleltetéseket természetesen egy 8 bites léptető ciklussal kell megoldani.
A 16 bites léptető ciklussal megvalósítható késleltetésekre mutat példákat a következő táblázat.
Mikrovezérlő órajel |
Felbontás | Maximum késleltetés |
---|---|---|
32kHz | 374800ns | 24,5s |
200kHz | 60000ns | 3,93s |
4MHz | 3000ns | 0,196s |
20MHz | 600ns | 0,039s |
Az S1 számláló állandóra vett nulla kezdőértéke esetén (CLRF S1) a késleltetés értéke az S2 kezdőértékével csak 770 utasításciklusonkénti értékekre állítható be: 772, 1542, 2312 ... 196 352. Ez a beállítás jól használható kisebb pontosságú, nagyobb időtartamú késleltetések esetében.
Erre mutat példát a következő programrészlet:
... ... clrf S1 ;S1 = 0 movlw 0x02 ;W = 2 movwf S2 ;S2 = 2 UJRA decfsz S1,1 ;S1 = S1 - 1; zérus vizsgálat goto UJRA ;visszaugrik, ha S1 nem nulla decfsz S2,1 ;S2 = S2 - 1; zérus vizsgálat goto UJRA ;visszaugrik, ha S2 nem nulla ...
A végrehajtott utasításciklusok számíthatóak: C = 770·S2 + 2.
24 bites késleltető ciklus
Ha még nagyobb késleltetésre van szükség, újabb számláló regisztert kell bevonni a késleltető ciklusba. A három regiszterrel és három DECFSZ utasítással felépített 24 bites hátra számláló léptető ciklus:
... ... movlw 0x06 ;W = 6 movwf S1 ;S1 = 6 movlw 0x02 ;W = 2 movwf S2 ;S2 = 2 movlw 0x05 ;W = 5 movwf S3 ;S3 = 5 UJRA decfsz S1,1 ;S1 = S1 - 1; zérus vizsgálat goto UJRA ;visszaugrik, ha S1 nem nulla decfsz S2,1 ;S2 = S2 - 1; zérus vizsgálat goto UJRA ;visszaugrik, ha S2 nem nulla decfsz S3,1 ;S3 = S3 - 1; zérus vizsgálat goto UJRA ;visszaugrik, ha S3 nem nulla ...
(A programban beállított kezdőértékek esetén a ciklus késleltetése 786217 utasításciklus.)
A léptető ciklus megkezdése előtt az S1, S2 és S3 azonosítójú számláló regiszterekbe be kell tölteni a kezdeti értéket, ami állandó órajel mellett a késleltetés hosszát egyértelműen meghatározza. Jelen esetben az S1 regiszter a legkisebb helyiértékű. A kezdőértékeknek az 1..255 (01h..FFh) intervallumban kell lenniük. (Nulla kezdőértékek esetén a ciklus nem a kívántaknak, vagyis nem az alábbiakban meghatározott összefüggésnek megfelelően viselkedik.)
A ciklus futási idejét a következő működések adják:
ˇ
6 ciklusos értékadás;
ˇ
3·(S1 − 1) ciklusos S1 első leszámlálás;
ˇ
2 ciklusos belső ciklusból való első kilépés;
ˇ
3·255·(S2 − 1) ciklusos S1 teljes leszámlálás;
ˇ
2·(S2 − 1) ciklusos (S1) belső ciklusból való kilépés;
ˇ
3·(S2 − 1) ciklusos S2 első leszámlálás;
ˇ
2 ciklusos (S2) középső ciklusból való első kilépés;
ˇ
3·255·255·(S3 − 1) ciklusos S1 teljes leszámlálás;
ˇ
2·255·(S3 − 1) ciklusos (S1) belső ciklusból való kilépés;
ˇ
3·255·(S3 − 1) ciklusos S2 teljes leszámlálás;
ˇ
2·(S3 − 1) ciklusos (S2) középső ciklusból való kilépés;
ˇ
3·(S3 − 1) ciklusos S3 leszámlálás;
ˇ
2 ciklusos kilépés.
Ebből az utasításciklusok száma: C = 4 + 3·(S1 − 1) + 2 + 765·(S2 − 1) + 2·(S2 − 1) + 3·(S2 − 1) + 2 + 3·255·255·(S3 − 1) + 2·255·(S3 − 1) + 3·255·(S3 − 1) + 2·(S3 − 1) + 3·(S3 − 1) + 2.
Egyszerűsítve: C = 3·S1 + 770·S2 + 196355·S3 − 197116, ami alapján a szükséges számláló kezdőértékek meghatározhatók.
Az így beállítható késleltetések tehát: C = 12, 15, 18, 21, ... 50 070 521, 50 070 524 értékek lehetnek. A 196353 utasításciklusnál rövidebb késleltetéseket természetesen 16, illetve 8 bites léptető ciklussal kell megoldani.
A 24 bites léptető ciklussal megvalósítható késleltetésekre mutat példákat a következő táblázat.
Mikrovezérlő órajel |
Felbontás | Maximum késleltetés |
---|---|---|
32kHz | 374800ns | 6260s |
200kHz | 60000ns | 1000s |
4MHz | 3000ns | 50s |
20MHz | 600ns | 10s |
Az S1 és S2 számláló állandóra vett nulla kezdőértéke esetén a késleltetés értéke az S3 kezdőértékével csak 196355 utasításciklusonként állítható be: 197 125, 393 480, 589 835 ... 50 071 295. Ez a beállítás jól használható kisebb pontosságú, nagyobb időtartamú késleltetések esetében.
Erre mutat példát a következő programrészlet:
... ... clrf S1 ;S1 = 0 clrf S2 ;S2 = 0 movlw 0x05 ;W = 5 movwf S3 ;S3 = 5 UJRA decfsz S1,1 ;S1 = S1 - 1; zérus vizsgálat goto UJRA ;visszaugrik, ha S1 nem nulla decfsz S2,1 ;S2 = S2 - 1; zérus vizsgálat goto UJRA ;visszaugrik, ha S2 nem nulla decfsz S3,1 ;S3 = S3 - 1; zérus vizsgálat goto UJRA ;visszaugrik, ha S3 nem nulla ...
A végrehajtott utasításciklusok számíthatóak: C = 196355·S3 + 770.
32 bites késleltető ciklus
A 32 bites késleltető ciklus utasításciklusainak száma: C = 3·S1 + 770·S2 + 196355·S3 + 50070530·S4 − 50267642.
Így a maximális késleltetés: 12 717 914 878 utasításciklus.
Az egyszerűsített kezdőértékű (S1=S2=S3=0) késleltető ciklus esetében: C = 50070530·S4 + 196355.
Példa képpen számítsuk ki egy 4 órás késleltetés számláló kezdőértékeit 32,768kHz-es órajelfrekvencia mellett!
A késleltetés időtartama:
tk = 4 óra = 240 perc = 14400 másodperc.
Az órajel frekvenciája és lehetséges hibája (értékhiba, hőmérsékleti hiba, öregedés):
fosc = 32768Hz ±0,003% (±1Hz).
Az órajel periódusideje:
Tosc = 1/fosc = 1/32768Hz = 0,0000305s = 30,5μs.
(A ±1Hz-es frekvenciahiba miatt, a 14400 másodperces időtartam alatt a késleltetés hibája:
thiba = tk · fhiba · Tosc = 14400s · ±1Hz · 0,0000305s = ±0,44s.)
Az utasításciklus hossza:
Tut = 4·Tosc = 4·0,0000305s = 0,000122s = 122μs.
A 4 óra késleltetéshez szükséges utasításciklusok száma:
C4óra = tk/Tut = 14400s/0,000122s = 118 032 787.
Mivel a szükséges ciklusszám nagyobb, mint 50 071 295, 32 bites késleltető ciklusra van szükség.
A 32 bites ciklus szakasz elején bemutatott egyenletébe a C4óra-t behelyettesítve:
118 032 787 = 3·S1 + 770·S2 + 196355·S3 + 50070530·S4 − 50267642.
Mindkét oldalhoz 50 267 642-t hozzáadva:
168 300 429 = 3·S1 + 770·S2 + 196355·S3 + 50070530·S4.
Amiből:
S4 = 168 300 429 / 50 070 530 egészre lefelé kerekítve = 3.
Az S4 értékével az előző egyenlet:
168 300 429 = 3·S1 + 770·S2 + 196355·S3 + 150 211 590.
Mindkét oldalból 150 211 590-et kivonva:
18 088 839 = 3·S1 + 770·S2 + 196355·S3.
Amiből:
S3 = 18 088 839 / 196 355 egészre lefelé kerekítve = 92.
Az S3 értékével az előző egyenlet:
18 088 839 = 3·S1 + 770·S2 + 18 064 660.
Mindkét oldalból 18 064 660-at kivonva:
24 179 = 3·S1 + 770·S2.
Amiből:
S2 = 24 179 / 770 egészre lefelé kerekítve = 31.
Az S2 értékével az előző egyenlet:
24 179 = 3·S1 + 23 870.
Mindkét oldalból 23 870-et kivonva:
309 = 3·S1.
Amiből:
S1 = 309 / 3 (egészre lefelé kerekítve) = 103.
Tehát 32768Hz-es órajel mellett a 4 óra késleltetéshez a 32 bites késleltető ciklushoz az S1=103, S2=31, S3=92 és S4=3 számláló kezdőértékek szükségesek.
n·8 bites késleltető ciklus
A fent bemutatott módszerrel tetszőlegesen hosszú késleltető ciklusok is megvalósíthatóak.
A következő táblázat a felhasznált regiszterek számának megfelelő megvalósítható késleltetéseket mutatja be egyszerűsített késleltető ciklusok esetére:
Mikrovezérlő órajel |
Regiszterek száma |
Programsorok száma |
Maximum késleltetés |
---|---|---|---|
32kHz | 1 | 4 | 96ms |
2 | 7 | 24,5s | |
3 | 10 | 104 perc | |
4 | 13 | 440 óra | |
5 | 15 | 12,8 év | |
6 | 18 | 3270 év | |
7 | 21 | 835 évezred | |
8 | 24 | 215 millió év | |
9 | 27 | 55 milliárd év | |
10 | 30 | 13820 milliárd év |
Látható, hogy a legegyszerűbb mikrovezérlővel is meglehetősen nagy (sőt több, mint elegendő) késleltetés valósítható meg.
Az egyszerűsített késleltető ciklusok, amelyeknél az utolsót megelőző összes számláló regiszter nulla kezdőértékű, általános számítási összefüggése:
Ahol n a felhasznált számlálóregiszterek száma.
A közelítő összefüggés: Cn ≈ 3·255(n−1)·Sn, ahol minden esetben a ténylegesen szükséges Cn > 3·255(n−1)·Sn.
Aktív késleltetés:
A NOP utasításokkal vagy késleltető ciklusokkal megvalósított késleltetések esetében a késleltetési működés a mikrovezérlő számítási teljesítményét teljes egészében leköti.
A késleltetés megoldható egy egyébként is elvégzendő feladat programsorainak vagy ennek egy részének végrehajtásával. Csupán ki kell választani egy megfelelően "hosszú" feladatot és szükség esetén ki kell egészíteni valamely, már tárgyalt késleltetéssel.
Ezzel növelhető a program hatékonysága és csökkenthető a program hossza.
Késleltetés 8 bites hardver számlálóval:
Minden közepes teljesítményű PIC mikrovezérlő tartalmaz egy 8 bites időzítő/számláló egységet, amely külső vagy belső jelekkel léptethető, és túlcsordulásakor megszakítást generál. A léptetőjelhez hardver előosztó rendelhető, amelynek osztási aránya az 1:1-től 1:256-ig terjedő tartományban beállítható. A számlálóregiszter kezdőértékkel is feltölthető, amely beállíthatóvá teszi a megszakításig hátra levő időt.
A kívánt késleltetés a mikrovezérlő órajelétől függ. Ha az órajel értéke kettővel osztható (32,768kHz; 2,097152MHz; 4,194304MHz), akkor másodperc alapú késleltetések is könnyen megvalósíthatók.
Mivel a hardver-számlálóregiszter csak 8 bites, általában szükség van még egy szoftveres működtetésű számláló regiszterre, amit az előbbi túlcsordulásakor végrehajtott megszakításkezelő szubrutin léptet.
A 8 bites hardver számláló programozása a 15.2. fejezetben részletes ismertetésre kerül.
Késleltetés 16 bites hardver számlálóval:
A nagyobb kivezetés-számú közepes teljesítményű PIC mikrovezérlő tartalmaznak egy 16 bites időzítő/számláló egységet, amely külső vagy belső jelekkel léptethető, és túlcsordulásakor megszakítást generál. A léptetőjelhez hardver előosztó rendelhető, amelynek osztási aránya az 1:1-től 1:8-ig terjedő tartományban beállítható. A számlálóregiszter kezdőértékkel is feltölthető, amely beállíthatóvá teszi a megszakításig hátra levő időt.
Belső léptető jel alkalmazásakor a kívánt késleltetés a mikrovezérlő órajelétől függ. Ha az órajel értéke kettővel osztható (32,768kHz; 2,097152MHz; 4,194304MHz), akkor másodperc alapú késleltetések is könnyen megvalósíthatók. Az időzítő egységhez tartozik egy beépített külön kvarc-oszcillátor áramkör, amelyhez egy külső kisfrekvenciás (30..200kHz) kvarckristályt csatlakoztatva, a mikrovezérlő órajelétől független léptetőjel hozható létre.
A 16 bites hardver számláló programozása a 15.3. fejezetben részletes ismertetésre kerül.
Késleltetés SLEEP módban:
Hosszabb késleltetések ideje alatt, amikor a mikrovezérlőnek nincs érdemi feladata, célszerű azt készenléti üzemmódba helyezni, amikor a fogyasztás a minimálisra csökken. A 16-bites hardver számláló külső órajellel készenléti üzemmódban is működtethető, és túlcsordulásával aktivizálja a mikrovezérlőt.
A PIC mikrovezérlők készenléti üzemmódjának gyári elnevezése a SLEEP (alvás) üzemmód. A mikrovezérlők a SLEEP utasítással helyezhetők ebbe a minimális fogyasztású állapotba.
SLEEP állapotban bekövetkező engedélyezett számláló túlcsordulás-megszakítás hatására a GIE (Global Interrupt Enable) globális megszakítás engedélyező bit "0" értékénél (megszakítások tiltva) a mikrovezérlő kilép a SLEEP üzemmódból és a már előolvasott utasítással folytatja a normál működést.
A SLEEP üzemmód részletes ismertetése az 5.2. fejezetben található.
Tudomány és Technika (test@t-es-t.hu)
<< Előző oldal Vissza a tartalomjegyzékhez Vissza a lap tetejére Következő oldal >>