2014-07-02 62 views
0

我正在使用MPLAB XC8編譯器PIC18F87J11,我需要使用內部time1進行計數。我注意到如果中斷設置爲高優先級,我的代碼工作得很好。然而,低優先級它不起作用,我只是無法弄清楚。低優先級Timer1不工作

定時器1設置:

 // 1/1 prescalar 
     T1CONbits.T1CKPS1 = 1; 
     T1CONbits.T1CKPS0 = 1; 

     // Use Internal Clock 
     T1CONbits.TMR1CS = 0; 

     // Timer1 overflow interrupt 
     PIE1bits.TMR1IE = 1; 

     // Enable Timer 1 
     T1CONbits.TMR1ON = 1; 

     INTCONbits.PEIE = 1; // Enable Perpherial Interrupt 
     INTCONbits.GIE = 1; // Enable Global Interrupt 

這工作得很好

void interrupt high_priority lowISR(void) { 
    if (PIR1bits.TMR1IF == 1) { 

     Printf("\r\n 1 second"); 

     PIR1bits.TMR1IF = 0; 
    } 
    } 

然而,這並不和我不知道爲什麼。

void interrupt low_priority lowISR(void) { 
    if (PIR1bits.TMR1IF == 1) { 

     Printf("\r\n 1 second"); 

     PIR1bits.TMR1IF = 0; 
    } 


} 

我錯過了什麼?

回答

1

你實際設置定時器1使用低優先級的中斷,並在啓用中斷優先級控制(默認情況下,IIRC,所有中斷使用高優先級而不管個體中斷源的優先級位)。

0

我錯過了以下內容,添加它們可以解決我的問題。我發現他們here

IPR1bits.TMR1IP = 0;   // Timer 1 -> Low priority interrupt group 
PIE1bits.TMR1IE = 1;   // Enable Timer1 interrupt 

RCONbits.IPEN = 1;    // Enable interrupt system priority feature 
INTCONbits.GIEH = 1;   // Enable high priority interrupts 
INTCONbits.GIEL = 1;   // Enable low priority interrupts