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

 


A PICD-2-C program


Általános ismertetés
Regisztertérkép
A program folyamatvázlata
Alapbeállítások
Nyomógombkezelés
PWM megjelenítés
Léptetés
Letölthető program


 

      A PICD-2-C egy futó fényhatást keltő program, amely egy változó fényerősségű fénymintát mozgat végig a LED-soron, a nyomógomb által kiválasztott irányban.
      A megjelenített, illetve mozgatott fényminta a következő ábrán látható. (A minta fényerősség értékei gyakorlati megfigyelések alapján vannak megválasztva.)

A mozgatott fényminta

      Az 5 LED-ből álló kijelzőn a 10 elemet tartalmazó fénymintának egyszerre csak egy része jelenik meg. A minták 0,1 s-onként az ábrához viszonyítva jobbra tolódnak, így jön létre a futófény effektus. A minták eltolása végtelenítve ismétlődik.
      A nyomógomb működtetésére a fényminta és futásának iránya is megfordul.
      A fényerősség beállítása szoftveres impulzus-szélesség modulációval (PWM) történik és 3,2%-os lépésekben, azaz 31 lépésben lehetséges. (A PWM felbontás: 4,95 bit.)
      A fényminta megjelenítésének lépéseit mutatja be a következő ábra.

A fényminta mozgatásának ütemterve

Vissza a lap tetejére

      A nyomógomb működtetése valójában egy BUTTON nevű regiszter tartalmának egyesével való növelését végzi. (Folyamatos nyomvatartás esetén 0,1 s-onként.) A kezdőérték: "0000 0000", innen indul a növelés, majd a "0000 1000" érték elérése után következik az kijelzési irány megváltoztatása, vagyis egy DIRECTION nevű regiszter negálása.
      A DIRECTION regiszter értéke jelöli ki a mozgatás irányát (jobbra vagy balra). A DIRECTION regiszter alapértéke: "0", majd a nyomógomb legalább 0,4 s-os működtetésekor negálódik, "1"-re vált.

      A kijelzendő minta kiválasztását 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 9-es érték után újra 0 következik, majd így tovább...

      Az öt kimenet beállított fényerejét az ON1, ON2, ON3, ON4 és ON5 regiszterek tárolják. Értékük 0-tól 30-ig állítható be.
      A CNT a PWM számláló regiszter, amelynek lefutása határozza meg a PWM ciklus hosszát és értékének figyelésével valósul meg a lehetséges 31 (24,95) kitöltési tényező. Értéke 1-től 30-ig nő egyesével, majd újra 1-re vált, és így tovább...
      A CKL regiszter a PWM ciklusok számát határozza meg. Ez a regiszter állítja be a 0,1 s-os aktív késleltetést.

      A 0,2 ms-os szoftveres késleltetéshez szükséges egy számláló-segédregiszter: S1.

      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 BUTTON A nyomógomb hatását késleltető regiszter.
08h DIRECTION A mozgatás irányát kijelölő regiszter.
09h COUNTER A mintát kijelölő számláló regiszter.
0Ah CNT PWM számláló regiszter.
0Bh CKL A 0,1 s-os késleltető/PWM ciklus számláló regisztere.
0Ch ON1 L1 fényerő regisztere.
0Dh ON2 L2 fényerő regisztere.
0Eh ON3 L3 fényerő regisztere.
0Fh ON4 L4 fényerő regisztere.
10h ON5 L5 fényerő regisztere.
11h S1 A 8-bites késleltető ciklus regisztere. Ideiglenes tároló regiszter.

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

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 BUTTON sebességvezérlő regisztert;
     ˇ Nullázni kell a DIRECTION iránykiválasztó regisztert;
     ˇ Nullázni kell a COUNTER számláló/címző regisztert.
     ˇ Nullázni kell az ON1, ON2, ON3, ON4 és ON5 fényerő regisztereket.
      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 BUTTON ;BUTTON = 0
  clrf DIRECTION ;DIRECTION = 0
  clrf COUNTER ;COUNTER = 0
  clrf ON1 ;ON1 = 0
  clrf ON2 ;ON2 = 0
  clrf ON3 ;ON3 = 0
  clrf ON4 ;ON4 = 0
  clrf ON5 ;ON5 = 0
... ...    

Vissza a lap tetejére

 

B - Nyomógombkezelés

      A nyomógomb működtetése a BUTTON nevű regiszter tartalmának egyesével való növelését, illetve csökkentését végzi. (Folyamatos nyomvatartás esetén 0,1 s-onként.) A kezdőérték: "0000 0000", innen indul a növelés, majd a "0000 0100" érték elérésekor a DIRECTION regiszter értéke negálódik, vagyis a látszólagos futási irány megfordul.
      A nyomógomb kezelésének folyamatábrája:

A nyomógombkezelés folyamatábrája

      Az irányváltás mellett szükség van a BUTTON nyomógomb-késleltető és COUNTER minta kijelölő regiszter nullázására is.
      A nyomógombkezelést megvalósító programrészlet:

  ... ... ;a program előző része
A1 btfsc GPIO,3 ;A GP3 bemenet tesztelése
  goto C1 ;ugrás, ha GP3=1 (nincs megnyomva)
  incf BUTTON,1 ;BUTTON = BUTTON + 1
  movlw H'4' ;A 04h érték betöltése a W munkaregiszterbe
  subwf BUTTON,0 ;W = BUTTON - 4, a BUTTON nem változik
  btfss STATUS,2 ;A zérusjelző bit tesztelése
  goto C1 ;ugrik, ha BUTTON = 0..3
  comf DIRECTION,1 ;DIRECTION negációja
  clrf COUNTER ;COUNTER = 0
  clrf BUTTON ;BUTTON = 0
C1 ... ... ;a program további része
  ... ...  

Vissza a lap tetejére

 

C - PWM megjelenítés

      A PWM ciklus alatt az egyes kimenetek kimenő jelének kitöltési tényezője az ONx regiszterek értékeinek kell, hogy megfeleljen.
      A ciklus elején végre kell hajtani a nullától nagyobb kitöltési tényezőjű kimenetek bekapcsolását, majd a ciklus lefutása alatt az ONx regiszterekben beállított időhányad elteltével, az éppen esedékes kimenet kikapcsolását.
      Az ONx regiszterekben beállítható kitöltési tényezők: 0%, 3,2%, 6,4%, ... 100%, amelyeknek a: 0, 1, 2, ... 30 regiszterértékek felelnek meg.
      A 31 különböző beállítható kitöltési tényező 4,95-bites PWM felbontást eredményez. (24,95 = 31.)
      A PWM ciklus a 0,1 s-os késleltetés alatt folyamatosan ismétlődik. A viszonylag nagy frekvencia miatt a LED-ek különböző fényerővel, de látszólag folyamatosan világítanak.
      A feladatot megoldó program folyamatábrája:

A PWM megjelenítés folyamatábrája

Vissza a lap tetejére

A folyamatábrát megvalósító programrészlet:

  ... ... ;a program előző része
C1 clrf CKL ;CKL = 0
A2 clrf CNT ;CNT = 0
  incf CNT,1 ;CNT = 1
  movf ON1,1 ;ON1 kiolvasása tesztelése
  btfss STATUS,2 ;A zérusjelző bit tesztelése
  bsf GPIO,0 ;ha ON1 > 0, akkor GP0 = 1; a kimenet bekapcsolása
  movf ON2,1 ;ON2 kiolvasása tesztelése
  btfss STATUS,2 ;A zérusjelző bit tesztelése
  bsf GPIO,1 ;ha ON2 > 0, akkor GP1 = 1; a kimenet bekapcsolása
  movf ON3,1 ;ON3 kiolvasása tesztelése
  btfss STATUS,2 ;A zérusjelző bit tesztelése
  bsf GPIO,2 ;ha ON3 > 0, akkor GP2 = 1; a kimenet bekapcsolása
  movf ON4,1 ;ON4 kiolvasása tesztelése
  btfss STATUS,2 ;A zérusjelző bit tesztelése
  bsf GPIO,4 ;ha ON4 > 0, akkor GP4 = 1; a kimenet bekapcsolása
  movf ON5,1 ;ON5 kiolvasása tesztelése
  btfss STATUS,2 ;A zérusjelző bit tesztelése
  bsf GPIO,5 ;ha ON5 > 0, akkor GP5 = 1; a kimenet bekapcsolása
A3 call WAIT ;0,2 ms késleltetés
  movf CNT,0 ;W = CNT
  subwf ON1,0 ;W = ON1 - CNT
  btfsc STATUS,2 ;A zérusjelző bit tesztelése
  bcf GPIO,0 ;ha ON1 = CNT, akkor GP0 = 0; a kimenet kikapcsolása
  movf CNT,0 ;W = CNT
  subwf ON2,0 ;W = ON2 - CNT
  btfsc STATUS,2 ;A zérusjelző bit tesztelése
  bcf GPIO,1 ;ha ON2 = CNT, akkor GP1 = 0; a kimenet kikapcsolása
  movf CNT,0 ;W = CNT
  subwf ON3,0 ;W = ON3 - CNT
  btfsc STATUS,2 ;A zérusjelző bit tesztelése
  bcf GPIO,2 ;ha ON3 = CNT, akkor GP2 = 0; a kimenet kikapcsolása
  movf CNT,0 ;W = CNT
  subwf ON4,0 ;W = ON4 - CNT
  btfsc STATUS,2 ;A zérusjelző bit tesztelése
  bcf GPIO,4 ;ha ON4 = CNT, akkor GP4 = 0; a kimenet kikapcsolása
  movf CNT,0 ;W = CNT
  subwf ON5,0 ;W = ON5 - CNT
  btfsc STATUS,2 ;A zérusjelző bit tesztelése
  bcf GPIO,5 ;ha ON5 = CNT, akkor GP5 = 0; a kimenet kikapcsolása
  movlw H'1E' ;W = 30
  subwf CNT,0 ;W = CNT - 30
  btfsc STATUS,2 ;A zérusjelző bit tesztelése
  goto C2 ;ugrik, ha CNT = 30
  incf CNT,1 ;CNT = CNT + 1
  goto A3 ;vissza a PWM ciklus következő ütemére
C2 movlw H'F' ;W = 15
  subwf CKL,0 ;W = CKL - 15
  btfsc STATUS,2 ;A zérusjelző bit tesztelése
  goto C3 ;ugrik, ha CKL = 15
  incf CKL,1 ;CKL = CKL + 1
  goto A2 ;vissza a PWM ciklus elejére
C3 ... ... ;a program további része
  ... ...  
WAIT movlw H'42' ;W = 66
  movwf S1 ;S1 = 66
REPEAT decfsz S1,1 ;S1 = S1 - 1
  goto REPEAT ;Visszaugrik, ha az eredmény nem nulla
  retlw H'0' ;Visszatérés a szubrutinból

Vissza a lap tetejére

 

D - Léptetés

      Az egyes mintákat a COUNTER és DIRECTION regiszterek értékei választják ki. 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 DIRECTION regiszter értéke a nyomógomb működtetésére negálódik, lehetséges értékei: 0000 0000 és 1111 1111.
      A COUNTER regiszter kezdőértéke nulla, majd kilencig növekszik, majd újra nullázódik, és így tovább...
      A feladat tehát egy kétszer tíz, azaz húsz irányú elágazás létrehozása, ami számított ugrásokkal könnyen megvalósítható:

... ... ...  
C3 movf COUNTER,0 ;W = COUNTER
  movwf S1 ;S1 = COUNTER
  btfss DIRECTION,0 ;DIRECTION tesztelése
  goto C4 ;ugrik, ha DIRECTION = 0000 0000
  movlw H'A' ;W = 10
  addwf S1,1 ;S1 = COUNTER + 10
C4 incf S1,0 ;W = S1 + 1
  ADDWF PCL,1 ;PCL = PCL + (S1 + 1)
  goto LEFT0 ;ugrás az értékbeállításra
  goto LEFT1 ;ugrás az értékbeállításra
  goto LEFT2 ;ugrás az értékbeállításra
  goto LEFT3 ;ugrás az értékbeállításra
  goto LEFT4 ;ugrás az értékbeállításra
  goto LEFT5 ;ugrás az értékbeállításra
  goto LEFT6 ;ugrás az értékbeállításra
  goto LEFT7 ;ugrás az értékbeállításra
  goto LEFT8 ;ugrás az értékbeállításra
  goto LEFT9 ;ugrás az értékbeállításra
  goto RIGHT0 ;ugrás az értékbeállításra
  goto RIGHT1 ;ugrás az értékbeállításra
  goto RIGHT2 ;ugrás az értékbeállításra
  goto RIGHT3 ;ugrás az értékbeállításra
  goto RIGHT4 ;ugrás az értékbeállításra
  goto RIGHT5 ;ugrás az értékbeállításra
  goto RIGHT6 ;ugrás az értékbeállításra
  goto RIGHT7 ;ugrás az értékbeállításra
  goto RIGHT8 ;ugrás az értékbeállításra
  goto RIGHT9 ;ugrás az értékbeállításra
LEFT0 movlw H'' ;W =
  movwf ON1 ;ON1 =
  movlw H'' ;W =
  movwf ON2 ;ON2 =
  movlw H'' ;W =
  movwf ON3 ;ON3 =
  movlw H'' ;W =
  movwf ON4 ;ON4 =
  movlw H'' ;W =
  movwf ON5 ;ON5 =
  goto OUT ;ugrás a számláló kezelésre
LEFT1 movlw H'' ;W =
  movwf ON1 ;ON1 =
  ... ...  
LEFT2 ... ...  
  ... ...  
  ... ...  
  ... ...  
  ... ...  
LEFT9 ... ...  
  ... ...  
RIGHT0 ... ...  
  ... ...  
RIGHT1 ... ...  
  ... ...  
  ... ...  
  ... ...  
  ... ...  
RIGHT9 ... ...  
  ... ...  
OUT movlw H'9' ;W = 9
  subwf COUNTER,0 ;W = COUNTER - 9, a COUNTER nem változik
  btfsc STATUS,2 ;A zérusjelző bit tesztelése
  goto CLEAR ;ugrik, ha COUNTER=9
  incf COUNTER ;A COUNTER növelése 1-gyel
  goto A1 ;vissza a program elejére
CLEAR clrf COUNTER ;A COUNTER regiszter nullázása
  goto A1 ;vissza a program elejére

      A számított ugrással megvalósított 20-irányú elágazás irányai kijelölik az aktuális öt fényerőértéket, amelyek az ONx regiszterekbe íródnak.
      A programrészlet végén található a COUNTER regiszter léptetése, illetve értékbeállítása.

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