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