Microchip
直播中

颜廷波

7年用户 214经验值
私信 关注
[问答]

PIC18F和MPASM程序集代码异常怎么办

你好,我有一个奇怪的问题,我希望有人能给我一些提示。我有一个PIC18F44K22,它的一部分是I2C从机。我认为它工作正常,但它只适用于接收的第一个(10)I2C包。在第十一个数据包上,我调用了一个调用子程序,但是它没有返回到被调用的点。我的主循环仍然在运行,但不是通过从中调用它的中断例程。然后,对第11个分组上的子例程的下一个调用也会发生同样的情况。BFLOOP:BANKSEL SSP1STAT btfss SSP1STAT,BF;数据是否被接收(发送完成)?返回BFLOOP如果我崩溃那个子例程并且不调用它,那么我就继续下一个……当我基本上移除所有调用时,代码似乎总是像它总是那样运行,以完成和清理SSP1中断。我怀疑我的问题是我搞砸了。使用银行交换,但我看不出前10个包是如何工作的,只是为了返回在第11个包上采取错误的分支。关于我的问题可能在这里以及什么使得返回在MPASM中不返回,有任何提示吗?我使用MPLABX/ICD3/MPASMWIN V5.64。另外,如果我的问题与银行的转换有关,如果我精简C,这会有助于减少这种奇怪现象吗?谢谢你,戴夫。

回帖(12)

tijing忽忽

2020-5-13 07:21:02
返回堆栈是如此之深。您是否通过过多嵌套调用来运行堆栈?听起来你已经填满了堆栈,然后“第十一包”导致一个额外的嵌套调用和繁荣,状态消失了。
举报

杨玲

2020-5-13 07:55:44
你为什么要在PIC18上访问SFRS?
举报

王雪

2020-5-13 08:18:58
谢谢你的回复。下面是我的完整程序。实际上不是我的全部程序,我把它简化为测试用例的I2C奴隶,这使它成为一个单独的项目来减少问题。我不认为它是看门狗,因为我已经禁用了这个测试。我也不认为是因为嵌套呼叫太多,因为我已经压扁了大多数的嵌套呼叫,以便把它们推到一个角落里,我可以在上面放一个盒子。我只有来自中断向量的呼叫和SSP中断例程中剩余的一个呼叫。我想这会留下多余的银行交换?罪有应得我虔诚地使用银行债券,因为我认为这是银行所做的事情。我显然是一个黑客,我真的不知道什么时候银行交换机和何时不。我在下面展示的是从我能找到的,然后面条上拼凑起来的,直到我开始工作。我认为这很好,因为它以前的使用仅限于在上电后需要处理一些I2C数据包。直到我试着重复地敲打它,我才陷入这个陷阱。下面的代码似乎可以工作,但它仍然显示出问题。我有一个用GPIO引脚(标记为TP7)创建的硬件提示,这样我可以调试代码在哪里运行,在哪里没有运行。我最后一个是在END_I2C:例程中,有一个延迟调用。我的I2C主机正在发送这对于我发送该包的前10次运行正常,但是在11日,200uS延迟被调用,但是返回没有从调用的地方返回。由于它似乎找到了主启动循环,我在START:例程中重复了SSP中断清理,它将整天成功运行来处理我的I2C测试包。特殊情况下SFR不在访问RAM中?今晚我会试着提出那个建议,除非有人能指出我犯的其它致命的罪过。我再次谢谢你们!戴夫
举报

tijing忽忽

2020-5-13 08:37:53
有什么地方吗?我找不到一个,但是你已经启用中断了吗?也许今天下午我瞎了!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分