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

PIC16LF1508单片机无法进入定时器中断1

[复制链接]
1167|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生成的接口用叉了还是怎么回事,还是继续再排查一下吧,谢谢

使用特权

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

使用特权

评论回复
6
jiajs| | 2022-2-19 14:32 | 只看该作者
时钟跑多快??

使用特权

评论回复
7
xxrs| | 2022-2-19 14:34 | 只看该作者
你的ISR里面所有操作的时间是多少?

使用特权

评论回复
8
llljh|  楼主 | 2022-2-19 14:38 | 只看该作者
我刚才试了在中断里面把全局中断和定时器使能关了,执行完再打开,结果还是不行,有可能我中断时间调的小了,也没想过操作时间这些问题,这个月才开始学单片机,很多东西考虑不足

使用特权

评论回复
9
dengdc| | 2022-2-19 14:40 | 只看该作者
推荐你使用simulator软仿的stopwatch功能..设2个断点,可以直接得到你的ISR指令时常的, 比较方便..

使用特权

评论回复
10
llljh|  楼主 | 2022-2-19 14:42 | 只看该作者
哦哦,好的,我上网查查怎么用,谢谢

使用特权

评论回复
11
pzsh| | 2022-2-22 16:42 | 只看该作者
其他中断试试看?都差不多的

使用特权

评论回复
12
tpgf| | 2022-3-7 15:45 | 只看该作者
那肯定是配置问题了

使用特权

评论回复
13
kxsi| | 2022-3-7 15:54 | 只看该作者
这一位是什么意思呢

使用特权

评论回复
14
wiba| | 2022-3-7 16:04 | 只看该作者
看看其他定时器能进入吗

使用特权

评论回复
15
nawu| | 2022-3-7 16:12 | 只看该作者
相关寄存器或者标志位有问题

使用特权

评论回复
16
tfqi| | 2022-3-7 16:21 | 只看该作者
这是需要手动写入的是吗

使用特权

评论回复
17
lcczg| | 2022-3-7 16:21 | 只看该作者
本帖最后由 lcczg 于 2022-3-7 16:30 编辑
kxsi 发表于 2022-3-7 15:54
这一位是什么意思呢

意思是T1的时钟输入和系统时钟同步于否。置1为异步模式,在睡眠时必须在异步模式,估计这是楼主最初碰到Timer1不累加的问题。

使用特权

评论回复
18
zljiu| | 2022-3-7 16:32 | 只看该作者
配置问题,中断限量问题,使能问题,信号源问题

使用特权

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

本版积分规则

855

主题

11301

帖子

6

粉丝