【发布时间】:2017-05-04 21:11:12
【问题描述】:
我正在使用极低功耗 (XLP) 微控制器 PIC 16LF1933。
为了消耗很少的电池,我让它进入睡眠状态,直到它在 RX 中接收到一个中断字符(00h)。该文档很好地解释了如何在 RX 中设置带中断字符的自动唤醒。我跟着它。
我正在使用 Proteus 来模拟项目,并使用虚拟终端来发送信息。如果您按
CTRL + SHIFT + @,它会发送 de 00h(null/全 0),因此,如文档中所述,这将唤醒 PIC。
问题是,当我这样做时,我会收到一条警告日志说Wake up event is only 937.500003us wide. Minimum (at current baudrate) expected is 6.656ms. I'm using 9600 baudrate.
如何使用 RX 进行正确的唤醒事件?
我的while 代码
while (1) {
BAUDCONbits.WUE = 1; //Wake-up Enable
SLEEP();
while (BAUDCONbits.WUE);
msg = Receive_Serial(); //Clear RCIF
__delay_ms(100);
msg = '\0'; //Discard
__delay_ms(100);
msg = Receive_Serial(); //Receive the next character
__delay_ms(100);
RCREG = 0;
msg = '\0';
__delay_ms(100);
}
还有我的接收功能
unsigned char Receive_Serial() {
if (OERR) { //Overrun error
RCSTAbits.CREN = 0; //Fix reset Enable Receive
RCSTAbits.CREN = 1;
}
while (!RCIF);
return RCREG;
}
【问题讨论】:
-
它有时被称为“突破水平信号”,其中行在
0状态下保持超过一个字符时间,以将其与正确的框架区分开来特点。您的数据表说“因此,传输中的初始字符必须全为 0。这必须是十个或更多位时间,对于 LIN 总线建议使用 13 位时间,或者对于标准 RS-232 设备,必须是任意数量的位时间。 "尽管您应该如何传输该中断电平信号,但我不知道,但是正如您所说,发送0数据字节不会这样做。对于 8 位数据,发送0只会使线路保持低电平 9 位时间。 -
感谢您的评论,它确实解释了。对不起,我没有阅读这一部分,这是正确的。我会弄清楚如何发送 13 位乘以 0。
-
是的,但是警告日志表明它应该更长?
937.5 us是9600波特率的 9 位时间(约 1 毫秒),可能需要为 7 毫秒。 -
那么,我必须发送一个 63 位乘以 0 的数据?
-
除非蓝牙模块允许即时切换到较低的波特率 (1。
标签: sleep microcontroller pic wakeup usart