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

【4月板卡】PIC16F184x6学习笔记-定时器中断

[复制链接]
1020|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yongruru 于 2019-7-3 16:18 编辑

定时器内容比较多,也复杂一些,PIC16F18446有7个定时器,Timer0最为简单,timer1、2、5支持比较和捕获模式,Timer2、4、6支持PWM模式。
本次使用Timer0定时5s,产生一个中断,唤醒CPU,执行一次闪灯,然后再次进入睡眠。
看看Timer0的结构,我分为6个部分


第一部分是定时器的时钟源,我选择LFINTOSC,
第二部分预分频,我选择1:64.
第三部分是否与系统时钟同步,我选择不同步,因为需要在睡眠模式下使用。如果同步,睡眠时系统时钟关闭,定时器的也就关闭了。
第四部分是计数器,用8位的
第五部分后分频,选择1:16.
第六部分中断标志和引脚输出

下面看MCC配置
时钟


添加定时器,双击TMR0


配置定时器


使能TMR0时钟


配置RA2输出


开启中断


生成代码,main函数添加如下程序
void main(void)
{
    SYSTEM_Initialize();
    VREGPM=1;
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();
    int i,j;
    while (1)
    {
        RA2 = 0;
        j=10;
        while(j--)
        {
            i=50000;
            while(i--)
            {
                NOP();
            }
        }
        RA2=1;
        SLEEP();
    }
}

现象LED灯5s闪一次。闪灯时电流约3.1ma,不闪灯时处于休眠,电流小于1ua。
到此这样一个:周期唤醒执行某项任务的功能基本完成。至于具体执行什么任务,开动大家的脑筋,可以是ADC采集,可以是按键检测,可以是消息发送,等等。
上面程序有个延时程序,用定时器来做替换,程序如下
    while (1)
    {
        RA2 = 0;
        TMR0_Reload(0x1D);
        SLEEP();
        RA2=1;
        TMR0_Reload(0x96);
        SLEEP();
    }

首先点亮LED,定时1秒,进入睡眠。1秒后中断唤醒,关闭LED,修改定时器为5秒,进入睡眠。5秒后中断唤醒,重复上面操作。
这样CPU绝大部分时间都是睡眠状态的。亮灯时电流为1.3ma,降低了1.8ma。1.3ma基本上就是LED的功耗。


使用特权

评论回复
沙发
yongruru|  楼主 | 2019-7-3 16:15 | 只看该作者
PIC16F184x6学习笔记-定时器中断.pdf (451.82 KB)

使用特权

评论回复
板凳
奔波儿熊| | 2019-7-3 16:19 | 只看该作者
细致入微.赞一个

使用特权

评论回复
地板
yongruru|  楼主 | 2019-7-3 16:20 | 只看该作者

谢谢

使用特权

评论回复
5
734774645| | 2019-7-6 21:50 | 只看该作者
这个系列跟51类似,还有全局中断

使用特权

评论回复
6
pzsh| | 2019-7-10 15:44 | 只看该作者
下载了,好好学习下。

使用特权

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

本版积分规则

10

主题

72

帖子

4

粉丝