[PIC®/AVR®/dsPIC®产品] PIC16LF1508单片机无法进入定时器中断1

[复制链接]
1451|17
 楼主| llljh 发表于 2022-2-19 14:18 | 显示全部楼层 |阅读模式
本帖最后由 pzsh 于 2022-2-22 16:43 编辑

程序框架是使用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,计数值感觉都没变,打断点调试了一下发现也没有进入中断,求大佬指点。
 楼主| llljh 发表于 2022-2-19 14:21 | 显示全部楼层
随便说说也行,我没思路了,一开始以为是定时器0中断占用了,但是我定时器0的IE给关了,应该也不是这个问题,有什么其他思路吗
yszong 发表于 2022-2-19 14:23 | 显示全部楼层
先找个可以用的定时器中断例子参考参考。
 楼主| llljh 发表于 2022-2-19 14:27 | 显示全部楼层
刚才建了一个新工程,只写了个定时闪灯的程序是可以的,我不知道是MCC生成的接口用叉了还是怎么回事,还是继续再排查一下吧,谢谢
 楼主| llljh 发表于 2022-2-19 14:29 | 显示全部楼层
找到原因了,我把T1SYNC置1,就是不将异步时钟输入与系统时钟(FOSC)同步,发现可以进入中断了,但是现在问题又来了,他在中断里退不出去,是因为1ms的中断太短了吗,感觉主程序都没执行
jiajs 发表于 2022-2-19 14:32 | 显示全部楼层
时钟跑多快??
xxrs 发表于 2022-2-19 14:34 | 显示全部楼层
你的ISR里面所有操作的时间是多少?
 楼主| llljh 发表于 2022-2-19 14:38 | 显示全部楼层
我刚才试了在中断里面把全局中断和定时器使能关了,执行完再打开,结果还是不行,有可能我中断时间调的小了,也没想过操作时间这些问题,这个月才开始学单片机,很多东西考虑不足
dengdc 发表于 2022-2-19 14:40 | 显示全部楼层
推荐你使用simulator软仿的stopwatch功能..设2个断点,可以直接得到你的ISR指令时常的, 比较方便..
 楼主| llljh 发表于 2022-2-19 14:42 | 显示全部楼层
哦哦,好的,我上网查查怎么用,谢谢
pzsh 发表于 2022-2-22 16:42 | 显示全部楼层
其他中断试试看?都差不多的
tpgf 发表于 2022-3-7 15:45 | 显示全部楼层
那肯定是配置问题了
kxsi 发表于 2022-3-7 15:54 | 显示全部楼层
这一位是什么意思呢
wiba 发表于 2022-3-7 16:04 | 显示全部楼层
看看其他定时器能进入吗
nawu 发表于 2022-3-7 16:12 | 显示全部楼层
相关寄存器或者标志位有问题
tfqi 发表于 2022-3-7 16:21 | 显示全部楼层
这是需要手动写入的是吗
lcczg 发表于 2022-3-7 16:21 | 显示全部楼层
本帖最后由 lcczg 于 2022-3-7 16:30 编辑
kxsi 发表于 2022-3-7 15:54
这一位是什么意思呢

意思是T1的时钟输入和系统时钟同步于否。置1为异步模式,在睡眠时必须在异步模式,估计这是楼主最初碰到Timer1不累加的问题。
zljiu 发表于 2022-3-7 16:32 | 显示全部楼层
配置问题,中断限量问题,使能问题,信号源问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

855

主题

11301

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部