Vissza a főoldalra    Vissza    Vissza a PIC mikrovezérlők főoldalra

 


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 megjelenített jelsorozat

      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.

Vissza a lap tetejére

      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.

Vissza a lap tetejére

      A program vázlatos felépítését mutatja be a következő ábra.

A program folyamatvázlata Ugrás a fejezetre Ugrás a fejezetre Ugrás a fejezetre Ugrás a fejezetre Ugrás a fejezetre Ugrás a fejezetre

Vissza a lap tetejére

 

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

Vissza a lap tetejére

 

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.

A sebességvezérlés folyamatábrája

      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

Vissza a lap tetejére

 

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:

A nyomógombkezelés 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
  ... ...  

Vissza a lap tetejére

 

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

Vissza a lap tetejére

 

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 jelsorozaton belüli cím létrehozása

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

Vissza a lap tetejére

 

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.

Vissza a lap tetejére

 

A teljes folyamatábra

 

      A főprogram folyamatábrája:

A főprogram folyamatábrája

      A nyomógombkezelő és késleltető szubrutin folyamatábrája:

A nyomógombkezelő és késleltető szubrutin folyamatábrája

Vissza a lap tetejére

 

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.

 

Vissza a lap tetejére

 

Vissza a főoldalra    Vissza    Vissza a PIC mikrovezérlők főoldalra