真心请教,我的PIC定时器中断为啥只能进去1次

2020-02-06 10:30发布

看看标志位是不是写1清零
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
whangch_sh
2020-02-06 13:13
楼主看资料不细致
void InterruptServiceHigh ()应该需要声明为中断函数,不然系统只当普通函数来处理对待;
解决办法如下所示:
1、方法1
#pragma code
#pragma interrupt InterruptServiceHigh

void InterruptServiceHigh(void)
{
        if(INTCONbits.TMR0IF)       
           {
            TMR0H = 0xD8;               
            TMR0L = 0xEF;                        //0xFFFF-0xD8EF= 10000         定时10ms
            INTCONbits.TMR0IF = 0;
            INTCONbits.TMR0IE = 1;
           }
}
2、方法2
分析void InterruptServiceHigh(void)为普通函数时,系统进中断后,
最高级中断允许标志位清零;当中断处理完退出后,最高级中断允许标志位没有置1;
导致下次没法再进入高级中断。
个人感觉可以人为在函数最后加上如下一句:
void InterruptServiceHigh(void)
{
        if(INTCONbits.TMR0IF)       
           {
            TMR0H = 0xD8;               
            TMR0L = 0xEF;                        //0xFFFF-0xD8EF= 10000         定时10ms
            INTCONbits.TMR0IF = 0;
            INTCONbits.TMR0IE = 1;
           }
        INTCONbits.GIE_GIEH = 1;
}
初步测试可以再次进入中断,但没分析会不会有其它不良影响。

一周热门 更多>