如何在 PIC12F675 微控制器上实现睡眠模式?

问题描述 投票:0回答:1

我正在开展一个项目,我需要通过将 PIC12F675 微控制器置于低能耗模式来节省电力(我使用两节 AA 电池)。具体来说,我想将微控制器设置为每五个小时唤醒一次,进行测量,然后重新进入睡眠状态以节省能源。谁能提供有关如何实现这一目标的指导?

我正在寻找有关如何将 PIC12F675 置于低能耗模式以及如何设置定时器或中断以每五小时唤醒一次微控制器的建议。任何代码示例或建议的方法将不胜感激。

我有一个项目可以执行所需的任务,但我想降低功耗,因为它是一个电池供电的系统。为此,我计划实施睡眠模式和看门狗定时器。但是,我是微控制器编程的新手,无法在互联网上找到任何指导。我将不胜感激有关如何使用睡眠模式和看门狗定时器以达到节能目的的任何建议,或任何为微控制器编程初学者推荐的资源。

编辑: 我已经用下面的代码实现了 SLEEP 方法:

#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

// X8 compiler header include
#include <xc.h>
#define _XTAL_FREQ 4000000

void main(void) {
    // Clear the WDT
    CLRWDT();
    
    // Enable interrupts
    INTCONbits.GIE = 1;
    INTCONbits.PEIE = 1;
    
    // Setup GPIO pin
    TRISIO0 = 0;
    
    while(1) {
        SLEEP();
        // Main program loop
        GPIO0 = 1;
        __delay_ms(1000);
        GPIO0 = 0;
        for(int i = 0; i<7826; i++){
            SLEEP();
        }
        // Clear the WDT periodically
        CLRWDT();
    }
}

有什么方法可以修改这段代码以进一步提高电池寿命吗?

c embedded pic
1个回答
0
投票

我会从简单的开始: 使用可以通过 GPIO 控制 LED 的测试板。确保你可以用你的代码控制 LED,比如一个循环,它只是用一个短暂的暂停来切换 LED(检查你的代码是否运行,LED pin 是否正确,Pin 被设置为输出,......)。确定可以控制LED后,就可以设置WDT了

在主循环中设置 WDT 并进入休眠状态后,切换 LED,再次进入休眠状态。 WDT 设置后应该可以正常工作,只要您足够快地恢复睡眠。

#include <xc.h>

void main(void)
{
  //Put to code to setup GPIOs here
  //Put to code to setup WDT here
  while(1)
  {
    SLEEP();
    //Put code to toggle LED here
  }
}

完成后,将

SLEEP()
宏/指令放入带有
7826
计数器的 for 循环中(好吧,稍微低一点,直到您确定其他一切正常,因为如此长的延迟测试很烦人)。 请记住 WDT 定时器源远非精确,它有很大的容差。这也意味着你的 5h 将是的。如果您需要更高的精度,您可以使用 RTC,但是您不需要 WDT,但可以使用 RTC 的警报功能。

© www.soinside.com 2019 - 2024. All rights reserved.