Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[XC8][pic18f] - Priorytet przerwania nie ma znaczenia dla działania programu...

superduo 27 Lis 2012 20:41 1764 14
  • #1 27 Lis 2012 20:41
    superduo
    Poziom 13  

    Właśnie przesiadłem się na XC8 i zauważyłem dziwną rzecz:

    Priorytet przerwania Timer0 nie ma znaczenia, tzn: nie ważne czy odpale obsługe przerwania w

    Code:
    void interrupt HighInterruptFunction(void)
    
    czy w
    void interrupt low_priority LowInterruptFunction(void)


    Przerwanie i tak się wykona. Samo przerwanie miga tylko diodą:

    Code:
      if (TMR0IE && TMR0IF) // Timer0 interrupt enable && Timer0 interrupt flag
    
        {
            TMR0IF=0;

                LATD = !LATD;

            return;
        }


    Priorytet ustawiam w ten sposób:

    Code:
      OpenTimer0( TIMER_INT_ON &
    
                    T0_16BIT &
                    T0_SOURCE_INT &
                    T0_PS_1_16);

        TMR0IP = 0; // Timer0 in low interrupt priority


    lub standardowo: INTCONbits.TMR0IP = 0/1

    Próbowałem też różnymi kombinacjami zezwoleń na przerwania:

    Code:
        ei(); // enable interrupts
    
       RCONbits.IPEN = 1; // IPEN: Interrupt Priority Enable bit
        INTCONbits.GIEL = 1; //GIE/GIEH: Global Interrupt Enable bit
        INTCONbits.GIEH = 1; //PEIE/GIEL: Peripheral/Low-Priority Interrupt Enable bit// </editor-fold>
        IPEN = 1;
        GIEL = 1;
        GIEH = 1;


    Ale nic to nie dało. O co może chodzić?

    0 14
  • #2 27 Lis 2012 21:14
    archanoid
    Poziom 25  

    Witam . Kolego troszkę więcej kodu pokaż a nie tylko wycinki.

    0
  • #3 27 Lis 2012 21:19
    superduo
    Poziom 13  

    To już cały kod :)

    Aktualna pełna wersja wygląda tak:

    Code:

    /*******************************************************************************
     *
     *      Architecture: Advanced PIC
     *      Processor:    18F47J53
     *      Compiler:     MPLAB XC8 (Free mode)
     *
     * *****************************************************************************
     *
     *      Description: Led Blinking in Timer0 interrupt
     * 
     * *****************************************************************************
     *
     *      Author:     tBlabs
     *      HomePage:   www.projekty.specteam.pl/tBlabs
     *
     * ****************************************************************************/
     
     
    #include <xc.h>
    #include <stdint.h>
    #include <plib/timers.h>


    #pragma config WDTEN = OFF
    #pragma config PLLDIV = 2
    #pragma config CFGPLLEN = OFF
    #pragma config XINST = OFF // extended instructions off
    #pragma config CPUDIV = OSC1 // CPU divide
    #pragma config OSC = INTOSCPLL // oscilator mode
    #pragma config CLKOEC = OFF // oscilator output on RA6 (12MHz)

    #define _XTAL_FREQ 48000000 // for __delay_ms() etc


    /******************************************************************************/

    void systemInit(void)

        // <editor-fold defaultstate="collapsed" desc="pll warm up">
        {
           uint16_t pll_startup_counter = 600;
           OSCTUNEbits.PLLEN = 1;
           while (pll_startup_counter--);
        } // </editor-fold>
     
        TRISA = 0x00;
        TRISB = 0x00;
        TRISC = 0x00;
        TRISD = 0x00;
        TRISE = 0x00;


    }

    /******************************************************************************/

    void peripheralsInit(void)
    {

        /// TIMER 0

        OpenTimer0( TIMER_INT_ON &
                    T0_16BIT &
                    T0_SOURCE_INT &
                    T0_PS_1_16);

        TMR0IP = 0; // Timer0 in low interrupt priority

    }





    /******************************************************************************/
    /*
    void interrupt HighInterruptFunction(void)
    {

        if (TMR0IE && TMR0IF) // Timer0 interrupt enable && Timer0 interrupt flag
        {
            TMR0IF=0;

                LATD = !LATD;

            return;
        }

    }
    */
    /******************************************************************************/

    void process()
    {
       // LATD = !LATD;
       // __delay_ms(5);
    }

    /******************************************************************************/

    void interrupt low_priority LowInterruptFunction(void)
    {
        if (TMR0IE && TMR0IF) // Timer0 interrupt enable && Timer0 interrupt flag
        {
            TMR0IF=0;

                LATD = !LATD;

            return;
        }

    }

    /******************************************************************************/

    int main(void)
    {
        systemInit();
        peripheralsInit();

        ei(); // enable interrupts
       RCONbits.IPEN = 1; // IPEN: Interrupt Priority Enable bit
        INTCONbits.GIEL = 1; //GIE/GIEH: Global Interrupt Enable bit
        INTCONbits.GIEH = 1; //PEIE/GIEL: Peripheral/Low-Priority Interrupt Enable bit// </editor-fold>
        IPEN = 1;
        GIEL = 1;
        GIEH = 1;
        while (1)
            process();

    }

    0
  • #4 27 Lis 2012 22:01
    archanoid
    Poziom 25  

    Witam . W PIC-ach 18 po wykryciu zdarzenia (przerwania) wykonywany jest skok pod adres wektora 0x08 dla high_priority lub pod 0x18 dla low_priority . Pod który adres wykonany zostanie skok zależy od konfiguracji odpowiednich bitów. Dodatkowo w kodzie należy umieścić pod jakimi adresami znajdują się wektory . Przykładowa obsłóga przerwania .

    Code:
    void high_isr(void);
    
    /*****************High priority interrupt vector **************************/
    #pragma code high_vector=0x08
    void interrupt_at_high_vector(void)
    {
      _asm GOTO high_isr _endasm
    }

    #pragma code
    /*****************High priority ISR **************************/

    #pragma interrupt high_isr
    void high_isr (void)
    {
         if (INTCONbits.TMR0IF){  // Interrupt Check   
         INTCONbits.TMR0IF = 0;                 
     
        }
    }

    0
  • #5 27 Lis 2012 22:07
    superduo
    Poziom 13  

    Zgadza się ale to nie dotyczy XC8 tylko C18. No chyba że nie napisali tego w "XC8 C compiler User's Guidzie"...

    Tak czy siak dziwne jest to że niezależnie od wektora w którym umieszcze kod i niezależnie od ustawionego priorytetu program wykonuje się w najlepsze. Jak dla mnie to bez sensu...

    0
  • #6 27 Lis 2012 22:19
    archanoid
    Poziom 25  

    Witam . A jesteś pewien że kod wykonuje się z przerwania o niskim priorytecie ?. W opisie jest wyraźnie napisane że domyślnym przerwaniem jest przerwanie o wysokim priorytecie.

    0
  • #7 28 Lis 2012 00:45
    superduo
    Poziom 13  

    No przecież podałem kod.

    Pozatym nie tylko z tym timerem są problemy. Timer 3 i 4 wogóle nie chcą ruszyć. Funkcja OpenTimer4 wogóle nie jest rozpoznawana przez środowisko! (podkreślona czerwoną falą).

    Z tego co wyczytałem w necie występują też inne problemy z XC8 (niby dobrze działają z pic 12 i 16).

    Czy ktoś może potwierdzić te informacje (że XC8 jest wciąż niedokończony)?

    0
  • #8 28 Lis 2012 07:45
    94075
    Użytkownik usunął konto  
  • #9 28 Lis 2012 13:17
    superduo
    Poziom 13  

    Też bym sie nie przejmował jakby kod działał.. to chyba jasne!

    A co do przerwania timera0 to powtarzam że niezależnie od jego priorytetu działa w dowonym wektorze (np jest ustawiony na wykonywanie się w niskim a działa i w niskim i wysokim i odwrotnie). Coś jest definitywnie walnięte.

    0
  • #10 28 Lis 2012 14:37
    94075
    Użytkownik usunął konto  
  • #11 28 Lis 2012 15:29
    archanoid
    Poziom 25  

    Witam. Jeśli nie wiesz które przerwanie się wykonuje to proponuje ci w jednym przerwaniu zapal jedną diodę a w drugim drugą.

    0
  • #12 28 Lis 2012 23:00
    superduo
    Poziom 13  

    Panowie! Jeśli chcecie pomóc to najpierw przeczytajcie treść posta a dopiero potem odpowiadajcie!
    Nie będe powtarzać na czym polega problem bo powiedziałem to już 3 razy.
    Chyba jest kutfa jasne że nie odpalam tego samego kodu w dwóch wektorach.... a zresztą. nie chce mi sie już pisać. temat do skasowania. i tak zrezygnowałem z XC.

    0
  • #13 28 Lis 2012 23:41
    94075
    Użytkownik usunął konto  
  • #14 29 Lis 2012 00:31
    superduo
    Poziom 13  

    strasznie ciężko się domyślić że pewnie któreś było zakomentowane podczas prób.

    nie udzielaj sie w moich tematch.

    0
  • #15 29 Lis 2012 07:14
    94075
    Użytkownik usunął konto