[PIC®/AVR®/dsPIC®产品] 【4月板卡】PIC16F184x6学习笔记-定时器中断

[复制链接]
 楼主| yongruru 发表于 2019-7-3 16:12 | 显示全部楼层 |阅读模式
本帖最后由 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函数添加如下程序
  1. void main(void)
  2. {
  3.     SYSTEM_Initialize();
  4.     VREGPM=1;
  5.     INTERRUPT_GlobalInterruptEnable();
  6.     INTERRUPT_PeripheralInterruptEnable();
  7.     int i,j;
  8.     while (1)
  9.     {
  10.         RA2 = 0;
  11.         j=10;
  12.         while(j--)
  13.         {
  14.             i=50000;
  15.             while(i--)
  16.             {
  17.                 NOP();
  18.             }
  19.         }
  20.         RA2=1;
  21.         SLEEP();
  22.     }
  23. }

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

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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| yongruru 发表于 2019-7-3 16:15 | 显示全部楼层


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
奔波儿熊 发表于 2019-7-3 16:19 | 显示全部楼层
细致入微.赞一个
 楼主| yongruru 发表于 2019-7-3 16:20 | 显示全部楼层

谢谢
734774645 发表于 2019-7-6 21:50 | 显示全部楼层
这个系列跟51类似,还有全局中断
pzsh 发表于 2019-7-10 15:44 | 显示全部楼层
下载了,好好学习下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

72

帖子

4

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