我正在使用带有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;
}
}
我错过了什么?
答案 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