【问题标题】:Timer is not counting on sleep mode with PIC18F?定时器不是依靠 PIC18F 的睡眠模式吗?
【发布时间】:2013-07-16 17:50:55
【问题描述】:

我有带有 MPLAB C18 的 PIC18F87J11。我试图通过强制它进入睡眠状态来限制设备对电池的消耗。我注意到进入睡眠模式后,timer0 停止计数,直到唤醒。此外,我知道唤醒设备的唯一方法是当它从另一个节点接收到消息时,因为我有一个 MRF89XA 收发器。

为了让我的设备进入睡眠状态,我只需调用它在编译器头文件中定义的这个函数。

Sleep(); 

Q1:除了从某个节点接收消息外,我如何唤醒设备? 在 DataSheet 中,它说 EXIT BY INTERRUPT 或 EXIT BY RESET 但是如果没有计时器,你怎么做?

通过阅读DataSheet,它声明必须使用Timer1才能监控时间,真的是这样吗?

我真正想要的只是尽可能降低电池使用量并让计时器在睡眠模式下工作。

谢谢!

【问题讨论】:

    标签: embedded microcontroller pic microchip pic18


    【解决方案1】:

    是的,Timer1 是唯一可以在休眠模式下工作的定时器。来自数据表:

    从任何其他模式进入睡眠模式不会 需要时钟开关。这是因为没有时钟 一旦控制器进入睡眠状态就需要。如果 WDT 被选中,INTRC 源将继续 操作。如果 Timer1 振荡器被使能,它也会 继续运行。

    要以最低功耗运行定时器,请使用睡眠模式和 Timer1。

    如果您希望在功耗管理模式下使用其他外围设备,例如 Timer0,则可以使用称为空闲模式的睡眠模式替代方案:

    如果在 SLEEP 指令执行时 IDLEN 位设置为 ‘1’ 执行时,外设将由时钟提供时钟 使用 SCS 位选择的源;然而 CPU 不会被计时。时钟源状态位是 不受影响。设置 IDLEN 并执行 SLEEP 指令提供了一种从一个快速切换的方法 将运行模式赋予其对应的空闲模式。

    要将 IDLEN 位设置为 1,请在发出 Sleep(); 之前在某处添加 OSCCON |= 0b10000000;

    显然空闲模式会比睡眠模式消耗更多的电量,因为外围设备仍在运行。

    【讨论】:

    • 您回答了我需要 timer1 的问题,但我不完全理解您的回答。就像timer0和timer1有什么区别?哪个更准确?另外,您如何将 IDLEN 设置为 '1' ?就像代码中的确切位置一样?这些小东西真的让我很困惑,不是你的错,我对配置管脚的理解不是很深。如果你能再解释一下,那就太好了。谢谢!
    • 您的设备有五个定时器模块。 Timer0 和 Timer1 都具有 16 位精度。 Timer0 可配置为在 8 位或 16 位模式下工作。 Timer1 是一个 16 位定时器。研究数据表以了解其他差异。
    • 我的 Timer0 在没有睡眠模式的情况下工作正常,如果我要实现 timer1,代码中需要更改的主要内容是什么?
    • 要尝试空闲模式,请尝试在 Sleep(); 之前的某处添加行 OSCCONbits.IDLEN = 1;
    • 我会这样做,我会在新线程上发布我的新问题(如果有的话)。感谢您的帮助!
    【解决方案2】:

    我确实遇到了这个问题,但这是我个人的一个小疏忽。 Timer1 可以有/有一个同步位,称为:

    T1CONbits.nT1SYNC = 1; // Timer1 外部时钟输入同步控制位。

    这会将定时器 1 与主时钟同步。由于主时钟不在睡眠模式下运行,它无法同步,因此 Timer1 不工作。我需要做的就是确保我没有将 Timer1 同步到主时钟。将其配置为正确的睡眠模式,即不是深度睡眠或空闲或 vBAT,一切正常。

    我将 MPLABx 和 XC8 与 PIC18F97j94 一起使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多