打印
[PIC®/AVR®/dsPIC®产品]

求助帖,PIC16LF1508单片机无法进入定时器中断1

[复制链接]
1030|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cyb999|  楼主 | 2020-8-11 11:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序框架是使用MCC进行配置。
定时器1初始化如下:
void TMR1_Initialize(void)
{
    //Set the Timer to the options selected in the GUI

    //T1GSS T1G_pin; TMR1GE disabled; T1GTM disabled; T1GPOL low; T1GGO_nDONE done; T1GSPM disabled;
    T1GCON = 0x00;

    TMR1H = 0xFF;

    TMR1L = 0xE1;           //时间1ms

    // Clearing IF flag before enabling the interrupt.
    PIR1bits.TMR1IF = 0;

    // Load the TMR value to reload variable
    timer1ReloadVal=(uint16_t)((TMR1H << 8) | TMR1L);

    // Enabling TMR1 interrupt.
    PIE1bits.TMR1IE = 1;

    // Set Default Interrupt Handler
    TMR1_SetInterruptHandler(TMR1_DefaultInterruptHandler);

    // T1CKPS 1:1; T1OSCEN disabled; nT1SYNC synchronize; TMR1CS LFINTOSC; TMR1ON enabled;
    T1CON = 0xC1;
}
定时器1中断程序如下:
void TMR1_ISR(void)
{

    // Clear the TMR1 interrupt flag
    PIR1bits.TMR1IF = 0;

    TMR1_WriteTimer(timer1ReloadVal);

    Bug_Check();

    Read_Key_Value();

    // ticker function call;
    // ticker is 1 -> Callback function gets called everytime this ISR executes
    TMR1_CallBack();
}

中断处理程序如下:
void __interrupt() INTERRUPT_InterruptManager (void)
{
    // interrupt handler
    if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
    {
        TMR0_ISR();
    }
    else if(INTCONbits.PEIE == 1)
    {
        if(PIE1bits.TMR1IE == 1 && PIR1bits.TMR1IF == 1)
        {
            TMR1_ISR();
        }
        else
        {
            //Unhandled Interrupt
        }
    }      
    else
    {
        //Unhandled Interrupt
    }
}

主程序如下:
void main(void)
{
    SYSTEM_Initialize();

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

    //TMR1_StartTimer();

    //TMR1_SetInterruptHandler(TMR1_ISR);

    uint16_t t;

    t = TMR1_ReadTimer();



    while(1)
    {
        WDT_Disable();

        Power_Low_Check();
        t = TMR1_ReadTimer();
        Key_Handle();

        Reset_Time_Judge();

        Reset_Task();

        Led_Blink();

        WDT_Enable();

        SLEEP();
    }
}

按道理来说定时器初始化后TMR1ON都已经设为1了,全局中断和外设中断一开启应该就能开启计时,但是经过读取,两次的t都是FFE2,计数值感觉都没变,打断点调试了一下发现也没有进入中断,求大佬指点。

使用特权

评论回复
沙发
cyb999|  楼主 | 2020-8-11 11:34 | 只看该作者
随便说说也行,我没思路了,一开始以为是定时器0中断占用了,但是我定时器0的IE给关了,应该也不是这个问题,有什么其他思路吗

使用特权

评论回复
板凳
mintspring| | 2020-8-11 13:09 | 只看该作者
先找个可以用的定时器中断例子参考参考。

使用特权

评论回复
地板
cyb999|  楼主 | 2020-8-11 13:57 | 只看该作者
mintspring 发表于 2020-8-11 13:09
先找个可以用的定时器中断例子参考参考。

刚才建了一个新工程,只写了个定时闪灯的程序是可以的,我不知道是MCC生成的接口用叉了还是怎么回事,还是继续再排查一下吧,谢谢

使用特权

评论回复
5
cyb999|  楼主 | 2020-8-11 14:19 | 只看该作者
找到原因了,我把T1SYNC置1,就是不将异步时钟输入与系统时钟(FOSC)同步,发现可以进入中断了,但是现在问题又来了,他在中断里退不出去,是因为1ms的中断太短了吗,感觉主程序都没执行

使用特权

评论回复
6
CoolSilicon| | 2020-8-11 14:44 | 只看该作者
cyb999 发表于 2020-8-11 14:19
找到原因了,我把T1SYNC置1,就是不将异步时钟输入与系统时钟(FOSC)同步,发现可以进入中断了,但是现在 ...

1.你时钟跑多快??
2. 你的ISR里面所有操作的时间是多少??
这是需要搞清楚的...


使用特权

评论回复
7
cyb999|  楼主 | 2020-8-11 14:59 | 只看该作者
CoolSilicon 发表于 2020-8-11 14:44
1.你时钟跑多快??
2. 你的ISR里面所有操作的时间是多少??
这是需要搞清楚的...

嗯嗯,我刚才试了在中断里面把全局中断和定时器使能关了,执行完再打开,结果还是不行,有可能我中断时间调的小了,也没想过操作时间这些问题,这个月才开始学单片机,很多东西考虑不足

使用特权

评论回复
8
CoolSilicon| | 2020-8-11 16:19 | 只看该作者
cyb999 发表于 2020-8-11 14:59
嗯嗯,我刚才试了在中断里面把全局中断和定时器使能关了,执行完再打开,结果还是不行,有可能我中断时间 ...

推荐你使用simulator软仿的stopwatch功能..设2个断点,可以直接得到你的ISR指令时常的, 比较方便..

使用特权

评论回复
9
cyb999|  楼主 | 2020-8-12 09:23 | 只看该作者
CoolSilicon 发表于 2020-8-11 16:19
推荐你使用simulator软仿的stopwatch功能..设2个断点,可以直接得到你的ISR指令时常的, 比较方便.. ...

哦哦,好的,我上网查查怎么用,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

0

粉丝