WebElektronika

Resetlehetőségek a PIC32-es mikrovezérlőnél

person access_time 2014.11.05.
Megnézzük most a PIC32MX család különböző reset lehetőségeit, ehhez a vizsgálathoz elkészítünk két programot is.


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.

 

 

1. példa

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.

 

 

2. példa

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.