A PIC32MX130F064B-nek több resetelési lehetősége van, ezt foglalja össze az első ábra.
1. ábra A PIC32MX mikrokontroller "resetlogikája" (www.microchip.com)
Ahhoz, hogy a "SYSRESET" kimenet logikai 1-be kerüljön (és a mikrovezérlő alapállapotba történő állítása megtörténjen), elég a hat lehetőség (pl.: BOR, WDTR, stb) egyikének a logikai 1-be kerülése.
Nem csak hardveresen, hanem szoftveresen, azaz a kódból is ki tudunk váltani reset-et a "Software Reset" segítségével.
Felvetődhet az a kérdés, hogy a hat lehetőség (1. ábra) közül melyik váltotta ki a mikrovezérlő alapállapotba kerülését. Erre ad választ az RCON regiszter, amelyben olyan jelzőbitek, flag-ek vannak, amelyek erről tájékoztatnak minket (2. ábra).
2. ábra Az RCON regiszter (www.microchip.com)
Megnézzük most két példa segítségével, hogy hogyan lehet eldönteni azt, hogy ki váltotta ki a reset-et. Ehhez az RCON regiszter tartalmát kell megvizsgálni.
Az első példában nem használunk függvényeket, makrókat, csak az RCON regiszter adott bitjeinek az állapotát vizsgáljuk. A másik példában igyekszünk mindent makrókkal megoldani.
Fontos viszont azt tudnunk, hogy a jelzőbiteket (flag-ek) mindig szoftveres úton kell törölnünk. Tehát megvizsgáljuk, hogy mi adott reset-et (hol van logikai 1), majd azt töröljük.
A PIC32MX130F064B-t tartalmazó tesztpanelen található LED-ek segítségével ábrázoljuk, hogy ki felelős a mikrovezérlő alaphelyzetbe állításáért. Ezért a "B" portot kimenetre állítjuk, igaz a 7. bitet bemenetre, mert ezen helyezkedik el panelon lévő nyomógomb. Ezt használjuk fel a while(1) ciklusban a szoftverreset előállítására.
#include <p32xxxx.h>
main()
{
TRISB = 0x0000;
TRISBbits.TRISB7 = 1;
DDPCONbits.JTAGEN = 0;
LATB = 0x0000;
// POR reset
if(RCONbits.POR)
{
RCONbits.POR = 0;
LATBbits.LATB0 = 1;
}
// BOR reset
if(RCONbits.BOR)
{
RCONbits.BOR = 0;
LATBbits.LATB1 = 1;
}
// Watchdog timer reset
if(RCONbits.WDTO)
{
RCONbits.WDTO = 0;
LATBbits.LATB2 = 1;
}
// Szoftver reset
if(RCONbits.SWR)
{
RCONbits.SWR = 0;
LATBbits.LATB3 = 1;
}
// MCLR reset
if(RCONbits.EXTR)
{
RCONbits.EXTR = 0;
LATBbits.LATB5 = 1;
}
while(1)
{
// szoftver reset előállítása
if(!PORTBbits.RB7)
SoftReset();
}
}
A JTAG tiltása után nullázzuk a kimenetet (LATB = 0x0000), majd ezek után a különböző feltételes szerkezetekkel azt vizsgáljuk, hogy az RCON regiszter melyik bitje került logikai 1 állapotba. Ahol logikai 1 van, akkor az ahhoz tartozó lehetőség váltotta ki a reset-et. Az MCC32-es fordító hasznáatánál a "SoftReset()" függvény meghívásával tudunk szoftveres reset-et előállítani.
A példánkban ez akkor történik meg, ha a nyomógombot (SW2) megnyomjuk. Fontos, hogy amikor az adott feltételes szerkezetben a megfelelő portbitet logikai 1-be állítjuk (bekapcsoljuk a LED-et), akkor ezt a flag-et töröljük is.
Hasonlít a második programunk felépítése az elsőhöz, de itt makrókat használtunk fel az RCON regiszter bitjeinek a figyeléséhez és a törléséhez is.
A makrók használatához elengedhetetlen a #include <plib.h> sor beírása.
#include <p32xxxx.h>
#include <plib.h>
main()
{
TRISB = 0x0000;
TRISBbits.TRISB7 = 1;
DDPCONbits.JTAGEN = 0;
LATB = 0x0000;
if(mGetMCLRFlag())
{
mClearMCLRFlag();
LATBbits.LATB1 = 1;
}
if(mGetBORFlag())
{
mClearBORFlag();
LATBbits.LATB1 = 1;
}
if(mGetPORFlag())
{
mClearPORFlag();
LATBbits.LATB2 = 1;
}
if(mGetWDTOFlag())
{
mClearWDTOFlag();
LATBbits.LATB3 = 1;
}
if(mGetSWRFlag())
{
mClearSWRFlag();
LATBbits.LATB6 = 1;
}
while(1)
{
if(!PORTBbits.RB7)
SoftReset();
}
}
A következő héten az órajel előállításáért felelős modul használatára térünk ki, megnézzük majd a beállítási lehetőségeket is.
Október közepén elindítjuk az Atmel 8 bites mikrovezérlőkről szóló sorozatunkat. Ehhez használnunk kell természetesen egy fejlesztőkörnyezetet is. Több ilyen is létezik, például a WinAVR, vagy az Atmel Studio. Mi az Atmel Studio-t fogjuk használni, e. . . .
A PIC18F mikrovezérlők ma is népszerű a fejlesztők körében. Noha 8 bites architektúráról beszélünk, számos érdekes és hasznos alkalmazás megvalósítható vele. Elég csak az USB-re, vagy akár az Ethernetre gondolnunk. Ezért a Szerkesztőség egy sorozat k. . . .
Megnézzük most néhány példa segítségével a Watchog Timer (WDT) használatát. Írni fogunk közvetlenül regisztert, de használni fogunk makrókat is.. . . .