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