本帖最后由 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的功耗。
|