打印
[PIC®/AVR®/dsPIC®产品]

MPLAB仿真自动reset

[复制链接]
939|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ywzqdpj|  楼主 | 2022-11-30 16:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我用过的芯片是dspic33FJ250MC710A,软件是MPLAB4.05,编译器XC16 V1.35;在仿真的时候总是自动reset,然后出现如下所示的提示;通过查看memory,在0x76e这个地方存放的是reset,我发现只要把spi_read_write_byte这个函数里面的内容屏蔽,就可以正常仿真,但是我之前也是这个驱动代码也没有出现这种问题,所以问题应该不在这里,有没有人遇到过这种问题?

QQ截图20221130161628.png (408.44 KB )

QQ截图20221130161628.png

使用特权

评论回复
沙发
ling_jing| | 2022-12-1 17:50 | 只看该作者
XC16用户手册有提到这个问题,解决方法是定义一个自己的_DefaultInterrupt

3.4.6.5 WHAT IS THE DEFAULT INTERRUPT, WHERE IS IT DEFINED, AND
HOW DO I USE IT?
The “default interrupt” fills in the vector table when no other named vector exists. If it is
not defined, the compiler will create one that will halt in a debugging environment or
Reset in a normal execution (non-debug) environment.
You can define your own handler by simply defining an ISR named:
_DefaultInterrupt.

使用特权

评论回复
板凳
ywzqdpj|  楼主 | 2022-12-1 21:45 | 只看该作者
ling_jing 发表于 2022-12-1 17:50
XC16用户手册有提到这个问题,解决方法是定义一个自己的_DefaultInterrupt

3.4.6.5 WHAT IS THE DEFAULT I ...

谢谢,终于找到方向了

使用特权

评论回复
地板
ywzqdpj|  楼主 | 2022-12-1 22:18 | 只看该作者
ling_jing 发表于 2022-12-1 17:50
XC16用户手册有提到这个问题,解决方法是定义一个自己的_DefaultInterrupt

3.4.6.5 WHAT IS THE DEFAULT I ...

请问一下,什么时候或者说什么情况下会进入默认中断呢?

使用特权

评论回复
5
ywzqdpj|  楼主 | 2022-12-2 10:10 | 只看该作者
ling_jing 发表于 2022-12-1 17:50
XC16用户手册有提到这个问题,解决方法是定义一个自己的_DefaultInterrupt

3.4.6.5 WHAT IS THE DEFAULT I ...

既然进入了默认中断,可以查到什么导致了进入了默认中断嘛?

使用特权

评论回复
6
ling_jing| | 2022-12-2 14:25 | 只看该作者
任何一个中断源产生的中断,当你没有定义该中断源的中断处理程序时,都会转到_DefaultInterrupt.
你的代码中使用了SPI模块,不知是否使能了中断,而没有定义中断处理程序?
你可以自己定义一个_DefaultInterrupt,在函数内判断各个中断标志位,来测试是哪个中断源产生的,trap引起的中断如果没有专门定义,也会跳转到DefaultInterrupt

7993763899a1fb3259.png (37.64 KB )

7993763899a1fb3259.png

使用特权

评论回复
7
ywzqdpj|  楼主 | 2022-12-2 16:44 | 只看该作者
ling_jing 发表于 2022-12-2 14:25
任何一个中断源产生的中断,当你没有定义该中断源的中断处理程序时,都会转到_DefaultInterrupt.
你的代码 ...

嗯嗯,谢谢,我查看下

使用特权

评论回复
8
ywzqdpj|  楼主 | 2022-12-2 19:34 | 只看该作者
ling_jing 发表于 2022-12-2 14:25
任何一个中断源产生的中断,当你没有定义该中断源的中断处理程序时,都会转到_DefaultInterrupt.
你的代码 ...

我在中断函数里面打断点,查看了有什么中断标志位没有清除,一看居然有这么多,大部分是我已经打开的中断而且也写了中断函数,但是还有一些是没有打开的,比如说外部中断1和外部中断2 。具体见下面2个图

仿真结果.png (30.32 KB )

仿真结果

仿真结果

代码.png (43.56 KB )

代码

代码

使用特权

评论回复
9
ywzqdpj|  楼主 | 2022-12-11 15:52 | 只看该作者
ling_jing 发表于 2022-12-2 14:25
任何一个中断源产生的中断,当你没有定义该中断源的中断处理程序时,都会转到_DefaultInterrupt.
你的代码 ...

隔了几天,还是来请教一下。
是这样的,上次我做了测试,在default中断函数里面查看了有哪些中断标志位,发现在打开4个中断的情况下有9个中断标志位置位;只要屏蔽了SPI发送函数就不会进入default中断。
现在的问题是,我在main函数的while(1)循环里面打断点,仿真都不暂停了,如果仿真手动暂停,都停在default中断和SPI发送函数里面。可能是中断太频繁了,导致没有时间执行while(1)函数里面的语句了。
目前的思路:
  • 再一次查看SPI驱动是否有问题;
  • 尝试在default中断函数里面清理多余的5个中断标志位;
但是,SPI驱动,我之前用的时候是没有问题的;清理5个多余的标志位估计也是无济于事,毕竟治标不治本。

我不知道该怎么办了。

使用特权

评论回复
10
ywzqdpj|  楼主 | 2022-12-11 18:45 | 只看该作者
本帖最后由 ywzqdpj 于 2022-12-12 19:20 编辑
ling_jing 发表于 2022-12-2 14:25
任何一个中断源产生的中断,当你没有定义该中断源的中断处理程序时,都会转到_DefaultInterrupt.
你的代码 ...

多谢了,已经找到原因了。是SPI配错了,SPI分频比配错了,导致频率过高,从而tx出现错误,进入错误中断,而错误中断没有中断函数,所以进入了默认中断。改了之后不再进入default interrupt了。多谢。

使用特权

评论回复
11
AdaMaYun| | 2022-12-25 13:36 | 只看该作者
ling_jing 发表于 2022-12-1 17:50
XC16用户手册有提到这个问题,解决方法是定义一个自己的_DefaultInterrupt

3.4.6.5 WHAT IS THE DEFAULT I ...

手册确实是解决问题最快捷的方法

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

141

帖子

2

粉丝