完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我正在调查一个UART在一段时间内忽略输入数据的bug。这种症状在低数据率之前还没有出现过,这似乎是由于数据进入率较高所致。一旦它进入状态,没有PIC的复位,它就永远不会恢复。在ISR中读取UART,因此:使用方便的LED,我可以看到当出现症状时ISR不再被调用。我还看到,子句检查有时是真的,表明数据正在进入。太快了。在进入上述“忽略中断”模式之前,这种情况可能发生多次。我试图在代码的另一部分重置中断标志(如果数据一段时间没有看到,则会超时),但这似乎无法解决该问题。目前我做了一个work-around,用于在收到消息之后禁用中断,并在一段时间(一秒钟)之后重新启用它,为下一消息做好准备。我认为如果在ISR期间发生另一个中断,那么只要重新设置了标志,ISR在返回之后就会立即被调用。我的疑问NS:我对在同一事件的服务过程中发生的中断的理解是否正确?关于中断为什么被忽略的任何想法?有什么想法,我怎么能正确地修复它?谢谢你,Mike Watts
|
|
相关推荐
19个回答
|
|
|
什么是UART2HASDATA()?
|
|
|
|
|
|
谢谢回复-我编辑了这个帖子来代替
|
|
|
|
|
|
在调试器中确认,当代码进入“忽略中断”模式时,是否设置了RXIE和RXIF位?
|
|
|
|
|
|
你使用的任何特殊图片,在PIC33范围内有很多?什么是“太快”,大于1200波特?我是否理解在同一事件的服务过程中发生的中断是正确的?不,“为什么中断被忽略了?”如果禁用,中断将被忽略。高优先级的中断只是降级并导致它等待,它不会被忽略,“关于如何正确地修复它,有什么想法吗?”我建议你拿起一个UART应用笔记,研究一下应该如何执行UART中断例程。PIC33系列是一个(非常)成熟的设备。有很多例子要遵循。当谈到UART,T Yorky时,真的不值得重新发明。
|
|
|
|
|
|
很可能增加整体业务造成超支。在这种情况下,将Buffsig大小设为零。“主”代码能处理在任何点都可以将零的大小设置为零的情况吗?在所有这样的情况下,它会清除这个标志吗?顺便说一句,当FuffFig的大小为零时,这是从缓冲区外面传来的。把它从小路移开是个不错的主意。
|
|
|
|
|
|
嗨,你用的是PIC24/DSSP33????当做
|
|
|
|
|
|
你试过在结束时清除中断标志吗?它值得一试,我什么都不知道,但它值得一试…保持一个中断,直到你完成了处理?缓冲区会超支吗?它是否与高速和低速运行的处理器一样(包括改变波特寄存器)?尼尔:
|
|
|
|
|
|
你是如何设置BRG的?是不是一个奇怪的波特率是不可分割的?什么是芯片FCY?如果它被锁定,您可能会在代码中写入其他变量时导致缓冲区溢出。请尝试设置异常/陷阱中断。
|
|
|
|
|
|
当索引器为零时,假设它是整数,则在此位置进行检查。如果(_input_.[65535]==0x0A),则只在可以接收换行符的地方检查换行符。可能这两者的组合取决于终端程序。
|
|
|
|
|
|
清除溢出错误的方法是错误的。仅清除U2STAbits。OERR位不会导致接收器再次启动。请阅读目标实现的UART类型的家族参考部分。
|
|
|
|
|
|
我想你想的是8位UART。
|
|
|
|
|
|
我想你想的是8位UART。是的,你是对的。清除U2STAbits.OERR位将允许接收器再次启动,但是它也有从FIFO清除所有未读数据的副作用。
|
|
|
|
|
|
一些很棒的建议,谢谢!RXIF&RXIE-我还没有检查过,但是可以(现在是Mon或Tues),但是我已经尝试过从状态恢复过来,它是一个dsPIC33EP512MU810,BAUD被设置为38400,但是数据以相当低的速率进入——大约每100ms 40字节;晶体是7.3728MHz,这是有意的。是波特率的整数倍!阅读应用笔记-非常礼貌地放!如果你有喜欢的,你会推荐(那不使用轮询)我很乐意接受你的建议;-)你[T Yorky]暗示,如果在中断例程中出现另一个字节(至少是我如何阅读你的答复),它不会重新触发中断。怎样才能避免漏掉一个中断?还是让我回到“阅读应用笔记”?一般来说,我想我可以移除ISR中的一些延迟,但是我仍然想知道,即使那是一个冗长的麻烦事件,如何避免进入丢失的中断状态。捕获所有中断例程-好主意。几个指出在缓冲区之外读取的潜力-我肯定y修复了这个问题,虽然我不相信这会导致我们看到的症状。我会说硬件[4字节]缓冲区没有溢出,因为我检查过了。
|
|
|
|
|
|
在仔细查看代码片段之后,我想我可以看到问题在哪里出现。问题:当(HasaReqdIsMSG)为非零时,ISR退出而不从接收FIFO读取数据。这会使出现溢出错误时中断被忽略。解决方案:读取接收FIFO中的所有数据,语句如下:“do{u2RxReg;},同时(U2Stest.UrxDA);”然后退出ISR。问题:当发生溢出错误时,IFS1BIT.U2RXIF可能无法设置。家庭参考手册规定,当从接收移位寄存器到FIFO的数据传输时,UXRXIF标志被设置。当FIFO满时,不会发生溢出错误状态位。未处理的溢出错误可以锁定接收器中断。解决方案:实现ISR来处理UART错误事件,而不是在接收ISR中进行。注意:在复位后,三种可能的UART中断具有相同的中断优先级(IPL)。自然顺序允许(RX/TX)数据中断在UART错误中断之前被服务。为了允许UART错误中断在(RX/TX)数据中断之前被服务,它的中断优先级(UxEIP)被提高或者数据中断优先级(UxRXIP和UxTXIP)被降低。添加注意:即使中断嵌套被禁用,中断优先级也很重要。注释:当这些问题出现时,可能是不确定的,并且取决于波特率、串行数据字节流的消息起搏和微控制器的中断延迟。要确定方法的稳定性,需要对UART实现的完整源代码进行静态和动态分析。
|
|
|
|
|
|
您不会递归地向中断处理程序提供向量,但将设置RXIF标志。
|
|
|
|
|
|
DAN1138-所有听起来很好的建议,谢谢。我已经检查过“忽略模式”没有发生(至少每次)_has_recd_msg是在进入ISR时设置的,但是我不能说这是_all_time s,正如您所指出的,在缓冲区中有多少信息,同时会有其他因素,哪些信息进入(或不进入)第二类。确保4字节的缓冲区在返回之前已经被读出并清空听起来是个好计划。为错误条件中断设置单独的、优先级更高的优先级看起来也是一个明智的计划。我将尝试这些并报告回来。T Yorky-谢谢你的澄清。
|
|
|
|
|
|
虽然这在调试问题时是有意义的,但是请记住,如果实际发生溢出,则它是由软件错误引起的。在正确编写的软件中,溢出错误不是需要检查的。
|
|
|
|
|
|
我稍微改写一下:在正确编写的软件中,不应该出现溢出错误。您总是希望签入以检测它已经发生,除非您知道您总是编写100%无bug的软件。;)
|
|
|
|
|
|
我从不检查它,因为我不喜欢添加额外的代码来检查可能的未知错误。我如何测试那个额外的代码才能看到它是正确的?当发生溢出时,副作用非常显著和明显,您可能立即从错误报告中知道发生了溢出。但是如果你添加代码来掩盖溢出,比如说丢弃一个数据包,你会知道它正在发生吗?如果没有办法报告错误发生了怎么办?这个系统可能会继续正确地运行99%,但是由于在日食期间丢弃数据包,这个非常罕见、很难复制的bug……
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1124浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1097浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 07:40 , Processed in 1.070732 second(s), Total 110, Slave 93 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1672