A PICD-2-A program
Általános ismertetés
Regisztertérkép
A program folyamatvázlata
Alapbeállítások
Nyomógombkezelés
Késleltetés
Léptetés
Tárolás, címszámítás
Címzés, megjelenítés
Teljes folyamatábra
Letölthető programlista
A PICD-2-A, egy komplex ütemvezérlést bemutató program. A nyomógombbal különböző jelsorozatok közül lehet választani, amelyek villogó és futó fényhatásokat keltenek. A kimenet jelváltása állandó 0,2 másodperces időközönként történik meg.
Az egyes jelsorozatok tíz 5-bites "szóból" állnak, amelyek egymás után kerülnek megjelenítésre, folyamatosan ismétlődve. A kilenc lehetséges kimenő jelsorozat látható a következő ábrán.
Az áramkör bekapcsolásakor automatikusan a 0 jelű jelsorozat megjelenítése indul el. A nyomógomb legalább 0,2, de legfeljebb 0,4 másodperces megnyomásával lehet a következő jelsorozatra lépni. Hosszabb idejű nyomvatartás esetén a program az eltelt időnek megfelelő számú jelsorozat megjelenítésével folytatja működését.
A nyomógomb működtetése valójában egy SELECTOR nevű regiszter tartalmának egyesével való növelését végzi. A kezdőérték: "0000 0000", majd a "0000 1000" érték elérése után újra a kezdőérték következik.
A SELECTOR regiszter értéke egyértelműen kijelöli a megjeleníteni kívánt jelsorozatot.
A jelsorozaton belüli címzést a COUNTER nevű szoftveres számlálóregiszter végzi, ennek kezdőértéke 0, ami 0,2 másodpercenként eggyel növekszik, de a 9-es érték után újra 0 következik, majd így tovább...
A COUNTER és SELECTOR regiszterek értékéből számított cím az ADDRESS regiszterben jön létre, illetve tárolódik a megjelenítésig.
A 0,2 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 | SELECTOR | A jelsorozat-kiválasztó regiszter. |
08h | COUNTER | A jelsorozaton belüli cím. |
09h | ADDRESS | A számított programmemória-címeket tároló regiszter. |
0Ah | S1 | A 16-bites késleltető ciklus alsó 8-bites regisztere. Ideiglenes 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 SELECTOR számláló/címző 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 SELECTOR ;A SELECTOR regiszter nullázása clrf COUNTER ;A COUNTER regiszter nullázása ... ...
B - Nyomógombkezelés
A nyomógomb megfelelő időtartamú működtetésére az áramkör a sorban következő jelsorozat megjelenítésére tér át. A megjelenítés közben a program 0,2 másodpercenként ellenőrzi a nyomógomb állapotát. Tehát ahhoz, hogy az aktív állapotot bizonyosan észlelni lehessen, a legrosszabb esetben is elegendő 0,2 másodperces nyomvatartás.
A sikeres észlelés hatására a SELECTOR regiszter értéke eggyel nő, illetve a következő értékre lép. Ez jelöli ki a soron következő jelsorozatot a megjelenítésre.
A nyomógomb aktív állapotának észlelése után 0,4 másodperc van a nyomógomb elengedésére, aminek elteltével a program már a következő jelsorozat megjelenítését végzi. Ha a nyomógomb a 0,4 másodperc eltelte után is megnyomott állapotban van, akkor a program a SELECTOR regisztert tovább módosítja, amivel már a következő jelsorozatot jelöli ki.
Ha a nyomógomb működtetésével újabb jelsorozat kerül kiválasztásra, célszerű a COUNTER regisztert is nullázni, hogy a jelsorozat az első elemével kezdődjön.
A nyomógomb folyamatosan működtetett állapotában a jelsorozat léptetése áll, a kimenet nem változik (, viszont a SELECTOR regiszter folyamatosan ismétlődve számlál 0-tól 8-ig).
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 A1 btfsc GPIO,3 ;A GP3 bemenet tesztelése goto C2 ;ugrás, ha GP3=1 (nincs megnyomva) A2 movlw H'8' ;A 08h érték betöltése a W munkaregiszterbe subwf SELECTOR,0 ;W = SELECTOR-8, a SELECTOR nem változik btfsc STATUS,2 ;A zérusjelző bit tesztelése goto CLEAR ;ugrik, ha SELECTOR=8 incf SELECTOR ;A SELECTOR növelése 1-gyel goto C1 ;Folytatás a C1-től CLEAR clrf SELECTOR ;A SELECTOR nullázása C1 call WAIT ;0,2s késleltetés call WAIT ;0,2s késleltetés btfss GPIO,3 ;A GP3 bemenet tesztelése goto A2 ;ugrás, ha GP3=0 (megnyomva) clrf COUNTER ;A COUNTER nullázása C2 ... ... ;a program további része
C - Késleltetés
A 0,2 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,2 s késleltetés 200000, 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 = 255; S2 = 255.
A késleltető ciklust megvalósító szubrutin:
WAIT movlw H'FF' ;W = 255 movwf S1 ;S1 = 255 movlw H'FF' ;W = 255 movwf S2 ;S2 = 255 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
D - 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 kilencig növekszik, majd újra nullázódik, és így tovább...
Az ezt megvalósító folyamatábra:
A programrészlet:
... ... ... movlw H'9' ;A 09h érték betöltése a W munkaregiszterbe subwf COUNTER,0 ;W = COUNTER-9, a COUNTER nem változik btfsc STATUS,2 ;A zérusjelző bit tesztelése goto CLEAR2 ;ugrik, ha COUNTER=9 incf COUNTER ;A COUNTER növelése 1-gyel goto C3 ;Folytatás a C3-tól CLEAR2 clrf COUNTER ;A COUNTER regiszter nullázása C3 ... ... ... ...
E - Tárolás, címszámítás
A 10-szavas jelsorozatok tárolása 20-szavas blokkokban történik a programmemóriában. A programmemória első 256 szava számított ugrásokkal (a PC írásával) is elérhető. Mivel a program számított ugrásokra épül a 180 soros (9x20) adathalmaz előtt csak 76 programmemória-hely használható fel.
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 első bitminta:
START movlw B'11111111' ;Az FFh érték betöltése a W munkaregiszterbe goto OUT ;Ugrás a megjelenítés programrészre movlw B'00000000' ;A 00h érték betöltése a W munkaregiszterbe goto OUT ;Ugrás a megjelenítés programrészre movlw B'11111111' ;Az FFh érték betöltése a W munkaregiszterbe goto OUT ;Ugrás a megjelenítés programrészre movlw B'00000000' ;A 00h érték betöltése a W munkaregiszterbe goto OUT ;Ugrás a megjelenítés programrészre movlw B'11111111' ;Az FFh érték betöltése a W munkaregiszterbe goto OUT ;Ugrás a megjelenítés programrészre movlw B'00000000' ;A 00h érték betöltése a W munkaregiszterbe goto OUT ;Ugrás a megjelenítés programrészre movlw B'11111111' ;Az FFh érték betöltése a W munkaregiszterbe goto OUT ;Ugrás a megjelenítés programrészre movlw B'00000000' ;A 00h érték betöltése a W munkaregiszterbe goto OUT ;Ugrás a megjelenítés programrészre movlw B'11111111' ;Az FFh érték betöltése a W munkaregiszterbe goto OUT ;Ugrás a megjelenítés programrészre movlw B'00000000' ;A 00h érték betöltése a W munkaregiszterbe goto OUT ;Ugrás a megjelenítés programrészre
A jelsorozatokat tároló 20-szavas blokkok egymást követően helyezkednek el egy ismert kezdőcímtől (START) indulva.
A START, SELECTOR és COUNTER értékeiből kiszámítható a soron következő minta helye, vagyis a szükséges ugrás címe, amelyet az ADDRESS regiszter tárol.
A címszámítás összefüggése:
ADDRESS = START + 20•SELECTOR + 2•COUNTER.
ADDRESS = START + 4•SELECTOR + 16•SELECTOR + 2•COUNTER.
Felhasználva, hogy a balra forgatás 2-vel való szorzásnak felel meg, 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 START ;Az első bitminta címének betöltése W-be movwf ADDRESS ;ADDRESS = START movf SELECTOR,0 ;W = SELECTOR movwf S1 ;S1 = SELECTOR rlf S1,1 ;S1 = 2 x SELECTOR rlf S1,0 ;W = 4 x SELECTOR addwf ADDRESS,1 ;ADDRESS = START + 4xSELECTOR rlf S1,1 ;S1 = 4 x SELECTOR rlf S1,1 ;S1 = 8 x SELECTOR rlf S1,0 ;W = 16 x SELECTOR addwf ADDRESS,1 ;ADDRESS = START + 4xSELECTOR + 16xSELECTOR rlf COUNTER,0 ;W = 2 x COUNTER addwf ADDRESS,1 ;ADDRESS=START+4xSELECTOR+16xSELECTOR+2xCOUNTER ... ... ;A program további része
F - Címzés, megjelenítés
A soron következő bitminta címe az ADDRESS regiszterben van. Az ADDRESS értékének 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ékét a GPIO kimeneti regiszterbe kell írni.
Ezek megvalósítása:
... ... ;Alapbeállítások ... ... A1 ... ... ;Nyomógombkezelés, késleltetés, címszámítás ... ... ... ... movf ADDRESS,0 ;W = ADDRESS movwf PCL ;PCL = ADDRESS, ugrás a címre START movlw B'11111111' ;Az első bitminta goto OUT ;Ugrás a megjelenítésre movlw B'00000000' ;A második bitminta goto OUT ;Ugrás a megjelenítésre ... ... ... ... ... ... OUT movwf GPIO ;GPIO = W, a bitminta megjelenik a kimeneten goto A1 ;visszatérés a program elejére
A teljes folyamatábra
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.