WebElektronika

Órajelmenedzsment a PIC32MX130F064B mikorvezérlőnél

person access_time 2014.11.12.
Folytatjuk a PIC32MX sorozatunkat, most az órajelelőállítást nézzük meg gyakorlati oldalról. Különböző megoldásokat nézünk meg az adott órajel(ek) tulajdonságainak a beállításához..


A PIC32MX130F064B mikrovezérlő különböző órajelforrásokkal és PLL beállítási lehetőségekkel rendelkezik. A mikrovezérlő oszcillátorának a diagramjának a rajza látható az első ábrán. Rendelkezik a mikrovezérlő külső (kettő, POSC, SOSC) és belső (FRC, LPRC) órajelforrással.
 


1. ábra   A PIC32MX130F064B órajelblokk
 

Láthatjuk, hogy ez a blokkvázlat nagyon bonyolult, nem könnyű bitszinten programozni. A különböző konfigurációs bitek az OSCCON regiszterben találhatók (2. ábra).
 


2. ábra   A PIC32MX130F064B OSCCON regisztere (link)
 

Ennek a regiszternek a tartalmát módosíthatjuk közvetlenül a regiszterbe való írással, vagy pedig egyéb megoldással, ha szeretnénk az órajelünk frekvenciáját módosítani.

A következő példák ezekre mutatnak megoldásokat, tehát megkerüljük azt, hogy az OSCCON regiszterbe közvetlenül írjunk.

 

 

1. példa (alapprogram)


Fordítsuk le a következő programot, amely a B port 0. bitjén lévő LED-et (LD1) villogtatja. Hogy lássuk a LED-nek a villogását, egy "Keses()" függvényt hívunk meg a while(1) végtelen ciklusban. (Ezt a programot fogjuk később különbözőképpen módosítani.)
 

#include <p32xxxx.h>

main()
{
    DDPCONbits.JTAGEN = 0;
    TRISB = 0x0000;
    LATB = 0x0000;

    while(1)
    {
        LATBbits.LATB0 = ~LATBbits.LATB0;
        Keses(50000);
    }
}

void Keses(unsigned int Hatar)
{
    int i;
    for(i = 0; i <= Hatar; i++)
    {}
}

 

Először tiltjuk a JTAG-et, majd beállítjuk a "B" portot kimenetre, amelyet azután törlünk. A "B" port törlése után bekerül a vezérlés a végtelen ciklusba, majd a szoftveres késleltetés után mindig negáljuk a "B" port 0. kimenetét.
 

 

2. példa

 

Használjuk a "#pragma config"-okat, hogy az órajelmodulnak a különböző lehetőségeit beállítsuk. Ezekről a beállítási lehetőségekről részletesebben olvashatunk a hlpPIC32MXConfigSet.chm file-ban, amely a fordító könyvtárában található.
 

#include <p32xxxx.h>

#pragma config FPLLMUL = MUL_20     // 20-szoros szorzás
#pragma config FPLLIDIV = DIV_2     // 2-es osztás
#pragma config FPLLODIV = DIV_2     // 2-es osztás
#pragma config POSCMOD = OFF        // az elsődleges órajelforrás tiltva
#pragma config FPBDIV = DIV_8       // SysCLK / 8
#pragma config FNOSC = FRC          // FRC-t használjuk
#pragma config FWDTEN = OFF

void Keses(unsigned int Hatar);

main()
{
    DDPCONbits.JTAGEN = 0;
    TRISB = 0x0000;
    LATB = 0x0000;

    while(1)
    {
        LATBbits.LATB0 = ~LATBbits.LATB0;
        Keses(250000);
    }
}

void Keses(unsigned int Hatar)
{
    int i;
    for(i = 0; i <= Hatar; i++);
}

 

3. példa

 

Elhagyva a "#pragma config" megoldást, használhatjuk az OSCConfig() függvényt és az mOSCSetPBDIV() makrót is az órajel tulajdonságainak a beállítására. Ezeknek a leírása szintén megtalálható a fordító könyvtárában (Microchip-PIC32MX-Peripheral-Library.chm).

Ahhoz, hogy ezt a függvényt és makrót használni tudjuk, a plib.h file-t hozzá kell adnunk (#include <plib.h>) a programunkhoz.
 

#include <p32xxxx.h>
#include <plib.h>

void Keses(unsigned int Hatar);

main()
{
    DDPCONbits.JTAGEN = 0;

    OSCConfig(OSC_FRC_DIV16,0,0,OSC_FRC_POST_8);

    // SYSCLK/4
    mOSCSetPBDIV(OSC_PB_DIV_4);

    TRISB = 0x0000;
    LATB = 0x0000;

    while(1)
    {
        LATBbits.LATB0 = ~LATBbits.LATB0;
        Keses(10000);
    }
}

void Keses(unsigned int Hatar)
{
    int i;
    for(i = 0; i <= Hatar; i++);
}