loader
Foto

Single módú megszakításkezelés alkalmazása a PIC32MX5xx/6xx/7xx családban

Ebben a cikkben a PIC32MX mikrovezérlő single módban alkalmazott megszakításkezelését nézzük meg. A single mód használatánál csak egy interrupt handler van, és erre "iratkoznak fel" azok a belső (és külső) perifériák, amelyeknek engedélyezett a megszakításkérés.

A korábbi cikkeinkben a multivector mód alkalmazását tekintettük át, most megnézzük a single mód használatát. Ezért indítsuk el az MpLABX-et, és hozzunk létre egy projektet.
Adjunk a projektünkhöz egy "C" file-t, amelybe másoljuk be a következő programot.

#include <p32xxxx.h>
#include <sys/attribs.h>

// SYSCLK = 20MHz, PBCLK = 10MHz
#pragma config FNOSC = FRCPLL, FSOSCEN = OFF, POSCMOD = OFF
#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_4, FPLLODIV = DIV_2
#pragma config FPBDIV = DIV_2

#define LED0        LATDbits.LATD0
#define LED1        LATDbits.LATD1
#define LED2        LATDbits.LATD2
#define LED3        LATDbits.LATD3

#define LED0Tg()    { LED0 = ~LED0; }
#define LED1Tg()    { LED1 = ~LED1; }
#define LED2Tg()    { LED2 = ~LED2; }
#define LED3Tg()    { LED3 = ~LED3; }
#define T1IFClear() { IFS0bits.T1IF = 0; }
#define T2IFClear() { IFS0bits.T2IF = 0; }

void __ISR(0, ipl1) ITfgv(void)
{
    if(IFS0bits.T1IF)
    {
        LATDbits.LATD4 = IFS0bits.T1IF;
        T1IFClear();
        LED1Tg();
        LATDbits.LATD4 = IFS0bits.T1IF;
    }
    
    if(IFS0bits.T2IF)
    {
        LATDbits.LATD5 = IFS0bits.T2IF;
        T2IFClear();
        LED2Tg();
        LATDbits.LATD5 = IFS0bits.T2IF;
    }
}

main()
{
    int k;
    DDPCONbits.JTAGEN = 0;
    
    // portbeállítások
    // A D porton vannak a LED-ek, amelyeket villogtatni szeretnék. -> kimenet
    TRISD = 0x0000;

    // belső perifériák beállítása, a villogás miatt
    // Timer1, 1:64
    T1CON = 0x0020;
    PR1 = 0x1234;
    TMR1 = 0x0000;
    
    // Timer2, 1:32
    T2CON = 0x0050;
    PR2 = 0x1234;
    TMR2 = 0x0000;
    
    // Timer3, 1:32
    T3CON = 0x0050;
    PR3 = 0x2345;
    TMR3 = 0x0000;
    
    // IT beállítás
    // Single mód -> egy IT függvény lesz
    INTCONbits.MVEC = 0;

    // T1 IT beállítása
    IFS0bits.T1IF = 0;
    IPC1bits.T1IP = 1;
    IEC0bits.T1IE = 1;
    
    // T2 IT beállítása
    IFS0bits.T2IF = 0;
    IPC2bits.T2IP = 1;
    IEC0bits.T2IE = 1;
    
    // "GIE"
    asm volatile("ei");
    
    // T1, T2, T3 elindítása
    T1CONbits.ON = 1;
    T2CONbits.ON = 1;
    T3CONbits.ON = 1;
    
    while(1)
    {
        if(IFS0bits.T3IF)
        {
            LED3Tg();
            IFS0bits.T3IF = 0;
        }
        for(k = 0; k < 500; k++);
        LED0Tg();
    }
}

 

Ez a tesztalkalmazás nagyon hasonlít a korábbi példánkhoz, a különbség az, hogy az interrupt kérés lehetőségével rendelkező belső perifériák (Timer1, Timer2) egy közös interrupt handleren "osztozkodnak". Azaz, bármelyikük is ad megszakítást, a vezérlés az "ITfgv()" függvényre kerül. Ezért a függvény legelején meg kell határozni azt, hogy ki adta a megszakításkérést. Ezt a IT flagek vizsgálatával tudjuk megtenni. 
Nem szerencsés a feltételes szerkezet használatánál az "else" ág alkalmazása, mert előfordulhat az, hogy az "if"szerkezethez tartozó IT kérés kiszolgálás közben egy másik IT flag is logikai "1"-be vált, tehát ezt a megszakításkérést is ki kell szolgálni. Ha ennek a vizsgálata az "else" ágban történne meg, akkor kilépne a vezérlés az "ITfgv()"-ből, majd újra végrehajtásra kerülne ezt a függvény. Ez a folyamat ugyanakkor felesleges stack műveleteket okozna, amely nem szerencsés.

Ahhoz, hogy a multivector mód helyett a single mód kerüljön alkalmazásra, szükséges az INTCON regiszterben található MVEC bitnek a beállítása. Az adatlap szerint ennek a bitnek logikai "0"-nak kell lennie, ennek a beállítása történik meg a "main()" függvényben.

Fordítsuk le a projektünket hex fileba, és töltsük le ezt a mikrovezérlőbe. 
Látható a kimeneteken (1.ábra), hogy a szoftveres késleltetés (D0) is működik, de amikor megszakításkérés érkezik, akkor a for ciklus működtetése felfüggesztésre kerül, illetve a Timer3 időzítő T3IF flagjének az állapotát is tudjuk figyelni a "while(1)" végtelen ciklusban. Amikor a T1IF, vagy a T2IF flagek egyike logikai "1"-be vált, akkor a vezérlés az ITfgv() interrupt függvénybe kerül.

kep
1. ábra   Minden második ITfgv() meghívásakor kerül kiértékelésre a két feltételes szerkezet
 

Az első ábrán könnyen észrevehető az, hogy a "D2" kimenetén lévő villogás frekvenciája kétszerese a "D1" kimenetén lévőnél. Látható az is, hogy az ITfgv() függvény feltételes szerkezeteiben az adott interrupt flagek szoftveresen törlésre kerülnek.

Állítsuk át a Timer2 belső osztójának az értékét, legyen most 1:64. Ehhez módosítani kell a T2CON regiszter értékét.

// Timer2, 1:64
   T2CON = 0x0060;
   PR2 = 0x1234;
   TMR2 = 0x0000;

 

Fordítsuk le a módosított alkalmazásunkat, és töltsük le a mikrovezérlőbe. Látható a 2. ábrán, hogy a "D1" és a "D2" villogási frekvenciái megegyeznek.

kep
2. ábra   Egy interruptkérésnél mind a két feltétel kiértékelésre kerül
 

Növeljük most meg a nagyítási értéket, és a 3. ábrán már jól látható az, hogy először a "D1" értékét negáljuk, majd a T1IF flaget töröljük. Ezután már ki sem lépünk az ITfgv()-ből, hanem a másik feltételes szerkezet blokkjába kerül a vezérlés, állapotot vált a "D2" kimenet, és töröljük a T2IF flaget is.

kep
3. ábra   Két flag szoftveres törlése, illetve állapotváltások egy interrupt függvény meghívásakor
 

 



Egyéb cikkek

További cikkeink ebben a témakörben

Régebbi cikkeink

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

A Microchip által javasolt fejlesztőkörnyezet az MPLABX, amely felváltja az MPlab-ot. Használata nehézkesnek tűnhet, ezért megnézzük ennek az IDE környezetnek a használatát, készítünk egy egyszerű projektet, amely egy PIC32 mikrovezérlőre épül.. . . .