使用 USART RX 唤醒 PIC
Posted
技术标签:
【中文标题】使用 USART RX 唤醒 PIC【英文标题】:Wake-up PIC with USART RX 【发布时间】: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。
【参考方案1】:
您收到的警告消息仅仅是因为空字符 (00h) 不是中断条件。
您的图片代码可能没问题,但开发工具未生成正确的测试数据。
很久很久以前,我曾经绝望地发送一个break来唤醒一个休眠的设备,需要给它发送一个break。我的终端无法发送一个。我必须让它工作,所以快速破解是发送一个空字符并将终端设置为较低的波特率,然后切换回正确的波特率。
【讨论】:
以上是关于使用 USART RX 唤醒 PIC的主要内容,如果未能解决你的问题,请参考以下文章