低优先级的Timer1不起作用

时间:2014-07-02 20:57:32

标签: embedded interrupt microcontroller pic microchip

我正在使用带有PIC18F87J11的MPLAB XC8编译器,我需要使用内部time1进行计数。我注意到如果中断设置为高优先级,我的代码可以正常工作。但是,如果优先级不高,它就无法工作,我无法弄明白。

计时器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;
    }


}

我错过了什么?

2 个答案:

答案 0 :(得分:1)

您是否实际上将定时器1设置为使用低优先级中断,并且您是否启用中断优先级控制(默认情况下,IIRC,所有中断都使用高优先级,而不管个别中断源优先级位。)

答案 1 :(得分:1)

我错过了以下内容,添加它们解决了我的问题。我找到了他们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