我正在做一个使用PIC12F675微控制器的项目。我的目标是使用GPIO1上的内置ADC读取电压,并根据测量结果打开LED几秒钟。在此之后,我打算使用SLEEP()宏使微控制器进入睡眠状态,并在大约一小时后重复测量过程(也可以接受更长的持续时间,如2小时)。
我的问题是看门狗定时器(WDT)只能设置为大约2.3秒。即使我尝试将**SLEEP()**宏包含在循环中,WDT也会在2.3秒后自动重置微控制器。我想知道是否有其他方法可以在较长时间后将微控制器从睡眠中唤醒,而无需使用外部触发器。不幸的是,我不能使用外部触发器来实现此目的。有人能提供指导,说明如何在不遇到WDT重置问题的情况下实现所需的唤醒间隔吗?
这是我的代码:
#include <xc.h>
// Configuration bits
#pragma config FOSC = INTRCIO // Internal oscillator
#pragma config WDTE = ON // Watchdog Timer enabled
#pragma config PWRTE = OFF // Power-up Timer disabled
#pragma config MCLRE = OFF // MCLR pin function is digital I/O
#pragma config BOREN = ON // Brown-out Reset enabled
#pragma config CP = OFF // Code protection disabled
#define _XTAL_FREQ 4000000 // Internal oscillator frequency for delay functions
void main() {
TRISIO = 0b00000010; // GP1 (ADC input) is an input, GP0 (LED output) is an output
ANSEL = 0b00000010; // Set GP1 as analog input
while (1) {
// Perform ADC measurement
ADCON0 = 0b00000001; // Select GP1 as ADC input
__delay_us(20); // Delay for ADC charging time
GO_nDONE = 1; // Start ADC conversion
while (GO_nDONE); // Wait for conversion to complete
// Read ADC result and control LED
uint16_t adcResult = ((ADRESH << 8) + ADRESL);
if (adcResult > 512) {
GP0 = 1; // Turn ON LED
__delay_ms(2000); // Keep LED ON for 2 seconds
GP0 = 0; // Turn OFF LED
}
for (unsigned int i = 0; i < 3600; i++) { // Loop for approximately 1 hour
SLEEP(); // Put microcontroller to sleep using WDT
}
}
}
2条答案
按热度按时间7vux5j2d1#
因为除了预分频器之外,不可能通过其他方式更改看门狗的RC振荡器频率,所以我们不能比您所做的更慢。
PIC12F675的睡眠指令说明如下(重点是我的):
关断状态位PD清0。设置超时状态位TO。看门狗定时器及其预分频器被清除。处理器进入睡眠模式,振荡器停止。
看门狗的描述(第9.6点):
在正常操作期间,WDT超时会生成设备故障。如果设备处于SLEEP模式,WDT超时将导致设备唤醒并继续正常操作
考虑到这一点,您提供的代码应该可以工作,并且似乎是获得长睡眠期的唯一合理方法。请注意,在睡眠循环中,MCU每次唤醒时仅运行约10 us(唤醒延迟和一些指令),这是它在睡眠模式中花费的时间的一小部分,可以忽略不计。
更重要的是,ADC在MCU处于休眠模式时仍会耗电,在进入休眠模式前将其关闭(ADCON0寄存器的ADON),然后再次使能。
6ovsh4lw2#
我正在做类似的事情。您应该将WDT超时设置为2.3,并检查当前绘制,看看您的SLEEP()是否实际上停止了Fundamental时钟并重置了WDT。