完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
大家好,我有一个关于使用多个中断的问题。我使用PIC18F46K20、带有一些传统外围库的XC8编译器和PICkit3作为调试器。我使用的一个中断是基于ADC的中断,每隔1kHz有一个定时器和CCP特殊偶数触发器。我尝试使用的另一个中断是一个具有三个用户选项的USAT接收器中断。在我进一步解释之前,让我张贴我的一些代码。请注意,用户DAN1138给了我一些在特殊事件触发器上运行ADC的代码。(我不知道在我之前的论坛帖子中的特殊事件触发。谢谢DA1138!使用这个代码,我想为选项2将一些数据存储到EEPROM中,虽然我不确定是否应该在中断内写入EEPROM。不过,以后我可能会修改这段代码。一些初始化函数:按照现在的方式,我看到ADC中断正在运行,但是如果我通过PuTTY向芯片传输一些东西,我看不到代码进入中断。如果我将ADC中断设置为低优先级,那么ADC中断将在代码开始时运行一次,但是代码将继续检查是否设置了接收器中断标志,并且不会执行其他操作。在ADC中断中放置断点确认它将在此配置中运行一次,然后不再运行。如果需要更多的代码或信息,我将提供它。我的主要问题是我做了什么不正确的事情?我不知道如何正确处理PIC芯片的优先级。谢谢!
|
|
相关推荐
19个回答
|
|
|
嗯,不要执行那些长时间的操作,例如在USAT RX中断处理程序中的PUPSUART或写入EEPROM…
|
|
|
|
|
|
达里奥,谢谢你提供的信息。我想知道如何在中断处理程序之外执行这些操作。但是,您认为这会导致问题吗?谢谢
|
|
|
|
|
|
我不确定,那些冗长的操作可能使PIC挂起很长时间,但是看起来您在设置高优先级-低优先级中断时遇到了麻烦:您有这个吗:RCONbits.IPEN=1;//Modalita'Avanzata的中断!?
|
|
|
|
|
|
没有理由你不能在中断中给EEPROM写信,但是你不应该等待写在中断中完成。
|
|
|
|
|
|
当然,对于USAT来说也是一样
|
|
|
|
|
|
我已经从中断中移除了putsUSART和eeprom_write,而是在其他地方实现它们。在使用ADC时应该优先考虑。明天有时间我会重新测试所有的东西。在我原来的帖子中,有一件事我忘了提及,那就是主时钟是一个设置为16MHz的内部时钟。我不知道这些信息对于我的问题有多么有价值,但是我认为也许有些时间问题我不知道?
|
|
|
|
|
|
好的,是的,USART应该比ADC有更高的优先级。而且我认为你不应该遇到时间问题,一切都安排得正确吗?当然,也许“越快越好”,所以你可能想跑@ 64兆赫。
|
|
|
|
|
|
AsSivia,我没有看到中断优先级指定。XC8可以容忍两个中断功能PIC18芯片由于两个中断向量。但您没有指定哪一个中断是高优先级和低优先级。默认情况下,没有优先级说明符的中断被视为高优先级。我认为你应该选择两个选项之一:不要使用中断优先级。将函数代码、ADC和UART结合为一个中断作为一个函数,使用中断优先级。对于每个中断函数,使用HealHyLead优先级和LoWiLoad优先级说明符。参见当前的XC8手册中的“编写中断服务程序”的第5.5.1章。当然,它是在你的版本XC8目录下的PDF格式。祝你好运!
|
|
|
|
|
|
我推荐这个。没有理由在这样的快速PIC上增加ADC+UART中断优先级的复杂性。
|
|
|
|
|
|
谢谢你的回复!所以,因为我很固执,我试着尝试使用中断优先级。但是,我仍然遇到前面描述的问题。以下是稍微更新的代码:在启用全局中断之前,我还放置了RCONbits.IPEN=1。我所看到的问题是,我的代码将到达主循环的末尾并运行这个函数:当它到达这个函数的末尾时:n,代码继续检查是否设置了接收器中断标志,然后返回到这个ADC_StartCapturefunction的结尾。它不断地停留在这个检查循环中。发生了什么事?我想如果我不能让它工作,那么我将合并这两个中断。但是ADC中断在1ms定时器上运行,以周期性地收集数据。从USAT(Read Suto())函数中读取不是慢下来停止和读取接收到的数据吗?
|
|
|
|
|
|
这是XC8吗?我不确定,因为基本上我从来没有使用它,但…它是声明高优先级和低优先级中断处理程序的正确方法吗?
|
|
|
|
|
|
这直接从XC8手册的5.5.1中得到。我相信我正在正确使用优先级处理程序。
|
|
|
|
|
|
我仍然无法处理优先级,但是我把两个中断组合成一个中断。它似乎正在工作,但是第二个Read UsTARE函数调用似乎被跳过了。但是,我的主要问题似乎已经解决了。谢谢大家的帮助。我仍然想知道为什么我看到了我之前看到的具体问题。如果有人有更多的信息,请告诉我。谢谢!
|
|
|
|
|
|
你有没有优先考虑不同的中断?
|
|
|
|
|
|
好的,我想你应该删除所有的处理,只要把2个IRQs放在它们的最小处理程序中…
|
|
|
|
|
|
如果没有一个完整的可构建的最小源代码,那么这将是困难的。
|
|
|
|
|
|
如果这样说的话,您指的是这个部分……您不应该在一个中断中两次读取uart,而至少应该检查是否有其他可用的char。而且,这个状态没有任何作用。RCIF是只读的并且在读取RCREG时自动清除。您最好只缓冲isr中接收到的所有字符,并在其外部执行所有处理。
|
|
|
|
|
|
杰瑞,我意识到我忘了删除PIR1BIT.RCIF代码。很抱歉。我想我的另一个选择是只为第二组选项使用相同的缓冲区。相反,我可以读最后三个字符,而不是最后两个字符。例如,1A,然后进入。谢谢你的信息虽然!在中断之外的处理就是我现在要做的事情。
|
|
|
|
|
|
你好,阿姆西维亚,你能解决这个问题吗?如果你还有麻烦,请重新发邮件。谢谢,戴维。OtnPIC18应用经理
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1122浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
872浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:51 , Processed in 0.963996 second(s), Total 76, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3431