近期基于PIC16F873A + MAX7456搭建了一个小系统:与PC通信(通过485总线),接收到PC发送过来的数据,经识别并判读后,叠加在视频信号上(MAX7456的作用就是字符叠加)。目前正在调试中,开发环境为MPLAB V8.80 + PICC V9.83,使用的仿真器为ICD2.目前遇到了一个怪异的问题,特向各位请教!
单片机每1S内要与PC通信1次,每次双方收发的数据包大小为96字节。我在编写程序时,采用数组的方式进行存储。我发现最多可以定义84字节大小的一个数组(除此之外,我还定义了几个小数组
,4个4个字节的,1个15字节的),再大就会出错,系统提示“找不到85个字节的空间”。于是我就定义了2个数组(1个为20字节大小,一个为76字节大小)来存储接收到的数据。目前遇到的怪异问题是:第1次通信时,可以接收到正确的数据(相应地经识别并判读后,可以正确叠加在视频信号上),此时暂停并在“WATCH"窗口观察了一下,2个数组内均接收到了正确的数据。然后让程序继续运行,再也无法接收到正确的数据了,我用“WATCH"并结合"file registers"看了一下,发现数据包内的结束字符‘*’(通信协议中约定用'*'来作为结束字符)之前的那个字节总是在变化。即使不再与PC通信,让程序继续运行(一个死循环,滚动显示”无效数据“的信息并叠在在视频上),该字节的内容总是在变化。我不知问题出在了哪里?
我这几天疯狂地超找资料,看到论坛上有网友提到:因ICD2是在线仿真,所以会占用部分芯片资源。但编译器的链接文件不够聪明,不知道哪些资源会被ICD2占用,有可能链接器分配的ROM和RAM空间恰巧是被ICD2占用的,会引起用户程序和ICD2的调试程序发生冲突.......解决办法:编译程序前,在MPLAB IDE中的PROJECT菜单下,按如下操作PROJECT->BUILD OPTIONS->PROJECT->PICC Global,在PICC Global选项卡中选择"compile for ICD",确定后就可以编译程序啦。
我用的是PICC V9.83,在LINKER 选项下的DEBUGGER下拉菜单内选择了ICD2,但是问题依旧!
我尝试把96个字节氛围4个数据来存储,但是发现始终是数据包内的结束字符‘*’之前的那个字节总是在毫无规律地变化。不知是哪里的问题?搞得我的头大,查资料也不知该如何下手,询问了周
围好多人也没有一个人可以解释清楚。
不知哪位XDJM知道,麻烦指导一下,谢谢了! |