我有PIC18F87J11和MPLAB C18。我试图通过强制它进入睡眠来限制设备的电池消耗。我注意到进入睡眠模式后,timer0再次停止计数直到唤醒。我知道唤醒设备的唯一方法是它从另一个节点收到消息,因为我有一个MRF89XA收发器。
要让我的设备进入休眠状态,我只需将此函数称为编译器头文件中定义的函数。
Sleep();
Q1:除了从某个节点接收消息之外,我如何唤醒设备? 在DataSheet中它表示要退出INTERRUPT或EXIT BY RESET但是如果没有计时器你怎么做?
通过阅读DataSheet其声明必须使用Timer1来监控时间,是不是真的如此?
我真正想要的是尽可能降低电池使用量并保持定时器工作在睡眠模式。
谢谢!
答案 0 :(得分:1)
是的,Timer1是唯一可以在休眠模式下工作的定时器。来自数据表:
从任何其他模式进入睡眠模式不会 需要一个时钟开关。这是因为没有时钟 控制器进入睡眠模式后需要。如果 选择WDT,INTRC源将继续 操作。如果Timer1振荡器使能,它也会 继续跑。
要以最低功耗运行定时器,请使用休眠模式和Timer1。
如果您希望在功耗管理模式下使用其他外设(如Timer0),则可以使用称为空闲模式的休眠模式替代方案:
如果
‘1’
指令为IDLEN位,则设置为SLEEP
执行后,外设将从时钟开始计时 使用SCS< 1:0>选择的源。位;然而 CPU不会被计时。时钟源状态位是 不受影响。设置IDLEN并执行SLEEP
指令提供了一种从a切换的快速方法 给定运行模式到相应的空闲模式。
要将IDLEN位设置为1,请在发出OSCCON |= 0b10000000;
之前在某处添加Sleep();
。
显然,空闲模式将比休眠模式消耗更多功率,因为外设仍在运行。
答案 1 :(得分:0)
我有这个确切的问题,但这是对我的轻微疏忽。 Timer1可以具有/具有同步位,称为:
T1CONbits.nT1SYNC = 1; // Timer1外部时钟输入同步控制位。
这使计时器1与主时钟同步。由于主时钟不在睡眠模式下运行,因此无法同步,因此Timer1不工作。我需要做的就是确保我没有将Timer1同步到主时钟。在正确的睡眠模式下配置它,即没有深度睡眠或空闲或vBAT,一切正常。
我使用的是MPLABx和XC8以及PIC18F97j94