A PICD-2-B program
Általános ismertetés
Regisztertérkép
A program folyamatvázlata
Alapbeállítások
Sebességvezérlés
Nyomógombkezelés
Késleltetés
Léptetés
Megjelenítés
Teljes folyamatábra
Letölthető programlista
A PICD-2-B egy futó fényhatást keltő program, amelynél a futási sebességet a nyomógombbal lehet változtatni.
A megjelenített jelsorozat öt 5-bites "szóból" áll, amelyek egymás után kerülnek megjelenítésre, folyamatosan ismétlődve. A jelsorozat a következő ábrán látható.
A futás a minimális sebességgel, 0,8 s-os jelváltási közökkel indul, és a nyomógomb működtetésével gyorsítható a maximális sebességig, amely elérése után újra lassulni kezd. A nyomógomb állapotának lekérdezése 0,05 s-onként, de folyamatos nyomvatartás esetén a sebesség egy fokozattal való növelése nyolcszor ennyi, vagyis 0,4 s-onként történik meg. A program 16 futási sebességet biztosít, amelyek során a jelváltási idő 0,05 s-tól 0,8 s-ig változhat 0,05 s-onként.
A nyomógomb működtetése valójában egy SPEED nevű regiszter tartalmának egyesével való növelését, illetve csökkentését végzi. (Folyamatos nyomvatartás esetén 0,05 s-onként.) A kezdőérték: "0000 0000", innen indul a növelés, majd a "0111 1111" érték elérése után következik az irányváltás, vagyis a csökkentés, vissza "0000 0000"-ig.
A DIRECTION regiszter értéke jelöli ki a léptetés irányát. A DIRECTION regiszter alapértéke: "0", majd a SPEED regiszter fent említett értékénél ("0111 1111") "1"-re vált, majd a "0000 0000" érték elérésekor ismét "0"-ra vált. A DIRECTION regiszter "0" értékénél a SPEED regiszter nő, "1" értékénél pedig csökken.
A jelsorozaton belüli címzést a COUNTER nevű szoftveres számlálóregiszter végzi, ennek kezdőértéke 0, ami jelváltásonként eggyel növekszik, de a 4-es érték után újra 0 következik, majd így tovább...
A 0,05 másodperces szoftveres késleltetéshez a viszonylag magas, 4MHz-es órajel miatt szükséges még két számláló-segédregiszter: S1, S2.
A következő táblázat a programban használt általános és vezérlő regisztereket foglalja össze.
Cím | Megnevezés | Feladat |
---|---|---|
- | OPTION | A GP3 felhúzó ellenállásának bekapcsolása. |
- | TRISGPIO | A kivezetések adatirányának beállítása. |
02h | PCL | A programszámláló alsó 8-bites része a számított ugrások végrehajtásához. |
03h | STATUS | A C túlcsordulás-jelzőbit és a Z zérus-jelzőbit helye. |
06h | GPIO | A mikrovezérlő kimeneti regisztere. |
07h | SPEED | A jelváltás sebességét kijelölő regiszter. |
08h | DIRECTION | A sebességváltozás irányát kijelölő regiszter. |
09h | COUNTER | A jelsorozaton belüli helyzetet tároló regiszter. |
0Ah | S1 | A 16-bites késleltető ciklus alsó 8-bites regisztere. Általános tároló regiszter. |
0Bh | S2 | A 16-bites késleltető ciklus felső 8-bites regisztere. |
A program vázlatos felépítését mutatja be a következő ábra.
A - Alapbeállítások
A program elején végre kell hajtani a mikrovezérlő kívánt működéséhez szükséges alapbeállításokat:
ˇ
Az OPTION vezérlő regiszterben engedélyezni kell a GP3 bemenet belső felhúzóellenállását;
ˇ
A TRISGPIO vezérlő regiszterben a GP3 kivezetést bemenetnek, a többit kimenetnek kell konfigurálni;
ˇ
Nullázni kell a SPEED sebességvezérlő regisztert;
ˇ
Nullázni kell a DIRECTION iránykiválasztó regisztert;
ˇ
Nullázni kell a COUNTER számláló/címző regisztert.
Az ezt megvalósító programrészlet:
... movlw B'10000000' ;A 80h érték betöltése a W munkaregiszterbe option ;A W tartalmának betöltése az OPTION regiszterbe movlw B'00001000' ;A 08h érték betöltése a W munkaregiszterbe tris H'6' ;A W tartalmának betöltése a TRISGPIO regiszterbe clrf SPEED ;SPEED = 0 clrf DIRECTION ;DIRECTION = 0 clrf COUNTER ;COUNTER = 0 ... ...
B - Sebességvezérlés
A nyomógomb működtetése a SPEED nevű regiszter tartalmának egyesével való növelését, illetve csökkentését végzi. (Folyamatos nyomvatartás esetén 0,05 s-onként.) A kezdőérték: "0000 0000", innen indul a növelés, majd a "0111 1111" érték elérése után következik az irányváltás, vagyis a csökkentés, vissza "0000 0000"-ig, majd ismét növelés, és így tovább...
A DIRECTION regiszter értéke jelöli ki a léptetés irányát. A DIRECTION regiszter alapértéke: "0", majd a SPEED regiszter fent említett értékénél ("0111 1111") "1"-re vált, utána a "0000 0000" érték elérésekor ismét "0"-ra vált. A DIRECTION regiszter "0" értékénél a SPEED regiszter nő, "1" értékénél pedig csökken.
A kimenet jelváltásai között a 0,05 s-os késleltetés a SPEED regiszter értékétől függő számban hajtódik végre. Így a SPEED értékének beállításával vezérelhető a kimenetváltások közötti időtartam, vagyis a látszólagos futási sebesség.
A késleltetési idő a SPEED regiszter minden nyolcadik léptetésénél, változik (nő vagy csökken) 0,05 s-mal. Ez biztosítja, hogy a nyomógomb folyamatos működtetésénél ne legyen túl gyors a sebességváltozás, vagyis a sebesség könnyen beállítható legyen. Folyamatos nyomvatartás esetén a sebesség 0,4 s-onként (8 x 0,05 s) változik.
A fentiekből belátható, hogy a sebesség 16 lépésben változtatható.
A következő ábra a SPEED regiszter értékétől függő késleltetés megvalósítását mutatja be.
Az ábra szerinti megoldás biztosítja:
ˇ
a SPEED regiszter értékétől függő késleltetést;
ˇ
a nyomógomb 0,05 s-onkénti leolvasását;
ˇ
működtetett nyomógomb esetén a SPEED regiszter értékének 0,05 s-onkénti módosítását;
ˇ
folyamatosan működtetett nyomógomb esetén a sebesség egy fokozattal történő automatikus növelését 0,4 s-onként.
A folyamatábrán ismétlődő ágakat célszerű szubrutinnal megoldani.
A folyamatábrán látható elágazást megvalósító programrészlet:
... ... ;a program előző része A1 movf SPEED,0 ;W = SPEED movwf S1 ;S1 = SPEED rrf S1,1 ;S1 1.jobbra forgatása rrf S1,1 ;S1 2.jobbra forgatása rrf S1,0 ;W = S1 3.jobbra forgatása andlw B'00001111' ;a felső négy bit nullázása movwf S1 ;S1 = SPEED/8 movlw START ;W = az elágazás kezdőcíme addwf S1,0 ;W = START + SPEED/8 movwf PCL ;PCL = START + SPEED/8, ugrás a címre START call WAIT ;A nyomógombkezelő és késleltető szubrutin (1.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (2.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (3.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (4.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (5.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (6.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (7.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (8.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (9.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (10.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (11.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (12.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (13.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (14.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (15.) call WAIT ;A nyomógombkezelő és késleltető szubrutin (16.) ... ... ;a program további része
C - Nyomógombkezelés
A nyomógomb működtetésének hatására végre kell hajtani:
ˇ
a DIRECTION regiszter 0. bitjének "1"-re állítását, ha a SPEED regiszter értéke '0111 1111';
ˇ
a DIRECTION regiszter 0. bitjének "0"-ra állítását, ha a SPEED regiszter értéke '0000 0000';
ˇ
a SPEED regiszter értékének növelését, ha a DIRECTION regiszter értéke "0";
ˇ
a SPEED regiszter értékének csökkentését, ha a DIRECTION regiszter értéke "1";
A feladatot megoldó program folyamatábrája:
Ez a nyomógombkezelési megoldás természetesen kiküszöböli a nyomógomb érintkezőinek bizonytalan zárásából adódó "pergési" jelenségek hatását is.
A folyamatábrát megvalósító programrészlet:
... ... ;a program előző része btfsc GPIO,3 ;A GP3 bemenet tesztelése goto C4 ;ugrás, ha GP3=1 (nincs megnyomva) btfsc DIRECTION,0 ;A DIRECTION regiszter 0.bit tesztelése goto C2 ;ugrás, ha DIRECTION=1 (csökkentés) movlw B'01111111' ;W = B'0111 1111' subwf SPEED,0 ;W = SPEED - B'0111 1111', SPEED nem változik btfsc STATUS,2 ;A zérusjelző bit tesztelése goto C1 ;ugrik, ha SPEED = B'0111 1111' incf SPEED,1 ;SPEED = SPEED + 1 goto C4 ;ugrás a további programrészletekre C1 bsf DIRECTION,0 ;A DIRECTION 0.bit "1"-re vált goto C4 ;ugrás a további programrészletekre C2 movf SPEED,1 ;A SPEED regiszter tesztkiolvasása btfsc STATUS,2 ;A zérusjelző bit tesztelése goto C3 ;ugrik, ha SPEED = B'0000 0000' decf SPEED,1 ;SPEED = SPEED - 1 goto C4 ;ugrás a további programrészletekre C3 bcf DIRECTION,0 ;A DIRECTION 0.bit "0"-ra vált C4 ... ... ;a program további része ... ...
D - Késleltetés
A 0,05 s késleltetést szoftveres úton kell megvalósítani.
A mikrovezérlő belső órajelgenerátora 4 MHz-es órajelet biztosít, amely 1 MHz-es utasításvégrehajtást eredményez. Egy utasítás végrehajtásához tehát 1 µs időre van szükség.
A 0,05 s késleltetés 50000, a lényegi működés szempontjából passzív utasítás végrehajtásával érhető el. A Közepes teljesítményű PIC mikrovezérlők felhasználói kézikönyv 11.4.15. fejezetében található 16-bites késleltető ciklus alkalmazásával egyszerűen megvalósítható a feladat.
A kiszámított alapbeállítások: S1 = 0; S2 = 66.
A késleltető ciklust megvalósító szubrutin:
WAIT clrf S1 ;Az S1 regiszter nullázása movlw H'42' ;W = 66 movwf S2 ;S2 = 66 REPEAT decfsz S1,1 ;S1 = S1 - 1 goto REPEAT ;Visszaugrik, ha az eredmény nem nulla decfsz S2,1 ;S2 = S2 - 1 goto REPEAT ;Visszaugrik, ha az eredmény nem nulla retlw H'0' ;Visszatérés a szubrutinból
E - Léptetés
A megjelelnítés során a megjelenített jelsorozaton belül az egyes mintákat a COUNTER regiszter értéke választja ki. Tehát a COUNTER regiszter értékét minden kimenetváltás után 1-gyel növelni kell, illetve az utolsó minta után nullázni.
A COUNTER regiszter kezdőértéke nulla, majd négyig növekszik, majd újra nullázódik, és így tovább...
Az ezt megvalósító folyamatábra:
A programrészlet:
... ... ... movlw H'4' ;A 04h érték betöltése a W munkaregiszterbe subwf COUNTER,0 ;W = COUNTER-4, a COUNTER nem változik btfsc STATUS,2 ;A zérusjelző bit tesztelése goto CLEAR ;ugrik, ha COUNTER=2 incf COUNTER ;A COUNTER növelése 1-gyel goto CC ;Folytatás a CC-től CLEAR clrf COUNTER ;A COUNTER regiszter nullázása CC ... ... ... ...
F - Megjelenítés
Az 5-szavas jelsorozatok tárolása a programmemóriában történik egy 10-szavas blokkban. Mivel csak a programmemória első 256 szava érhető el számított ugrásokkal (a PC írásával), a 10-szavas blokkot ide kell helyezni.
A bitminták elkészítésekor figyelembe kell venni, hogy a GPIO kimeneti regiszter 3. bitje bemenetként van felhasználva, vagyis: az 1. kimenetnek a 0. bit, a 2.-nak az 1. bit, a 3.-nak a 2. bit, a 4.-nek a 4. bit, az 5.-nek az 5. bit felel meg.
A programmemóriában tárolt bitminta:
START2 movlw B'00100001' ;W = B'0010 0001' goto OUT ;Ugrás a megjelenítés programrészre movlw B'00000011' ;W = B'0000 0011' goto OUT ;Ugrás a megjelenítés programrészre movlw B'00000110' ;W = B'0000 0110' goto OUT ;Ugrás a megjelenítés programrészre movlw B'00010100' ;W = B'0001 0100' goto OUT ;Ugrás a megjelenítés programrészre movlw B'00110000' ;W = B'0011 0000' goto OUT ;Ugrás a megjelenítés programrészre
A START2 és COUNTER értékeiből kiszámítható a soron következő minta helye, vagyis a szükséges ugrás címe:
S1 = START2 + 2•COUNTER.
Felhasználva, hogy a balra forgatás 2-vel való szorzásnak felel meg, a kimenő jel kiválasztására és megjelenítésére a következő megvalósítás adódik:
... ... ... ;Az előző programrészek bcf STATUS,0 ;A C túlcsordulás-jelzőbit nullázása movlw START2 ;Az első bitminta címének betöltése W-be movwf S1 ;S1 = START2 rlf COUNTER,0 ;W = 2 x COUNTER addwf S1,0 ;W = START2 + 2xCOUNTER movwf PCL ;PCL = START2 + 2xCOUNTER, ugrás a címre START2 movlw B'00100001' ;W = B'0010 0001', 1. minta goto OUT ;Ugrás a megjelenítés programrészre movlw B'00000011' ;W = B'0000 0011', 2. minta goto OUT ;Ugrás a megjelenítés programrészre movlw B'00000110' ;W = B'0000 0110', 3. minta goto OUT ;Ugrás a megjelenítés programrészre movlw B'00010100' ;W = B'0001 0100', 4. minta goto OUT ;Ugrás a megjelenítés programrészre movlw B'00110000' ;W = B'0011 0000', 5. minta goto OUT ;Ugrás a megjelenítés programrészre OUT movwf GPIO ;GPIO = W, a bitminta megjelenik a kimeneten goto A1 ;visszatérés a program elejére
A soron következő bitminta címe az S1 regiszter segítségével a W munkaregiszterben jön létre, majd annak a PCL vezérlő regiszterbe történő beírásával végbemegy a számított ugrás.
Az ugrás célsorában a kiválasztott bitminta a W munkaregiszterbe kerül. Majd a program a megjelenítési résznél (OUT) folytatódik.
A megjelenítéshez a W értéke a GPIO kimeneti regiszterbe íródik.
A teljes folyamatábra
A főprogram folyamatábrája:
A nyomógombkezelő és késleltető szubrutin folyamatábrája:
A letölthető program
A fent bemutatott program forráslistája.
A konfigurációs szó beállításai:
ˇ
MCLRE = "0" - GP3 általános bemenet;
ˇ
CP = "1" - Kódvédelem kikapcsolva;
ˇ
WDTE = "0" - Biztonsági időzítő áramkör kikapcsolva;
ˇ
FOSC1 = "1" - Belső RC oszcillátor;
ˇ
FOSC0 = "0" - Belső RC oszcillátor.