打印

各位大侠及版主,使用PIC16F873A时遇到了问题,请教!

[复制链接]
2835|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ilinkyou|  楼主 | 2012-4-13 17:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    近期基于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知道,麻烦指导一下,谢谢了!
沙发
原野之狼| | 2012-4-13 23:45 | 只看该作者
楼主给我发站内信提了这个问题,我给他的回复如下:

XXX同学,你好!

1、尽量在论坛公开发帖。一般来说我不单独解答问题,论坛里的大多数版主也持这样的意见。因为公开发帖,一方面可以有更多的人为你解答问题,另外一方面,也能有更多的人看见问题探讨的过程,这样对大家都有帮助。因此我建议你把帖子公开发布在论坛,以本论坛的人气来看,只要你经过了独立思考,且描述问题够详细,就一定有人来回复你的帖子。
2、你所提到的开发平台我没有搞过,因此没法精准分析问题所在,坛子里倒是有人精通PIC平台的,所以你公开发帖收效更大。
3、很多新手经常会遇到莫名其妙的问题,包括我自己,一路走来也遇到不少问题。现在回过头来总结,其实问题本身并不奇妙,而是自己没有掌握正确的方式方法以及基础知识不够牢靠。
4、技术上来讲,84个字节和85个字节并无本质区别,因此不必抓住这个不放,很有可能问题跟这个毫无关系。
5、简单粗暴的拆分成两个数组的方式并不是一个良好的设计,这样子的解决方案不可取,理由同上,很有可能跟这个毫无关系。虽说在开发的过程中需要不断地“试”,但是一定是有目的有组织的去“试”,不能盲目。
6、老手们很少采用在线仿真的方式来调试程序。有关正确的调试方法散落在论坛各地,需要你自己去收集。
7、你提到的“该字节总是在变化”问题,可能是由于程序的BUG导致的越界访问,又或者是由于对开发工具的理解不深入从而在配置或应用上存在问题,所以在开始任何一个项目之前,如果可能,尽量系统地阅读开发工具的权威文档(编译器、链接器、IDE配置、特殊语法等等)。
8、一个人干活总是进展缓慢,找机会多和同行交流,比如实验室的高年级同学或者论坛上的网友。

希望以上内容能对你有所帮助。

使用特权

评论回复
板凳
cunwmy| | 2012-4-14 08:38 | 只看该作者
不知道LZ为什么选用873A,这是一颗很老的芯片了。RAM本身就不是很大,192字节。
1  LZ要求每次双方收发的数据包大小为96字节,不知道收发是否同时需要RAM来存数据。
2  最多可以定义84字节大小的一个数组,这个是和RAM有关系的,Linker文件可以看到最大可定义的空间,如果RAM比较大的芯片,是可以根据修改linker文件修改这个空间的最大值的,因为PIC16使用PICC编译器,我没有找到对应的linker文件在哪,建议LZ自己去看看。
3  Debug确实会占用RAM,这个是在linker文件有定义的,使用多大的空间也可以看到。
4  2个数组内均接收到了正确的数据。然后让程序继续运行,再也无法接收到正确的数据了。此时的两个数组是否已经接收到96字节的数据,如果已满,那么数组会溢出。
不知道是否可以帮到LZ,大家可以探讨。

使用特权

评论回复
地板
ilinkyou|  楼主 | 2012-4-14 18:19 | 只看该作者
本帖最后由 ilinkyou 于 2012-4-14 21:26 编辑

感谢 原野之狼和cunwmy的热心回答!太感谢了!。
TO cunwmy:
1,通信协议时对方规定好了的,我只好遵守。每次双方收发的数据包大小为96字节:包括起始符,分隔符,校验和标志,结束符等等。由于要通过比对校验和来确认数据接收是否正确,所以收发同时需要RAM来存数据。
2、3,我礼拜一去实验室电脑上看哈LINKER文件
4,我在MAIN函数之前定义了2个数组,共计96个字节,上电初始化时程序会分配96个字节的RAM空间给2个数组,且该空间不会挪作他用。我的设计思路是:通信时判读第1个字节是否为起始符'$',若是则继续接收,直至计数器达到96.然后就判断校验和,若校验和正确,则就将不同的数据提取出来,分别叠加到视频上。若校验和不正确,视频上显示“数据无效”信息。然后进行下一轮的通信,数据仍然存储到上面的那2个数组内(新数据冲掉旧数据)。目前仿真的情况是:上电后,第一次通信时2个数组内均接收到了正确的数据,然后程序就将不同的数据提取出来,叠加到视频上。哪怕此后不再通信,我通过WATCH窗口发现:校验和标志‘*’之前的那个字节的内容总是在毫无规律地变化。若通信的话,由于该字节的内容总是"自身在变化"(其他字节可以接收到正确的内容),因此,程序计算出的校验和与接收到的不一样,因此程序经判断后,视频上总是显示“数据无效”信息。
由于我的程序设计思想是:只有当接收到96个字节才进行校验和判断。所以第1次通信成功后,若继续通信的话,视频上总是显示“数据无效”信息,那么表明:2个数组接收到了96字节的数据(该96个字节的数据“冲掉”了第1次存储的数据),只不过经检验校验和,认为“接收到的数据错误”而已。不知您讲的“那么数组会溢出”是什么意思?如何解决?我尝试着在每次通信完毕后,将2个数组清零,然后再存储新的数据,发现问题依旧!

我后来又用4个数组,每个大概20多个字节来接收96个字节的数据,发现始终是'*'之前的那个字节的内容在变化。同时,根据通信协议约定:该字节的内容为分隔符','(ASCII码为0X2C,通信时传输的就是ASCII码),因此我将程序改了哈:计算校验和时不计算该字节,直接加上0X2C,发现该字节和该字节之间的内容同时在无规律地变化。哎,我就更晕了!
即使第一次通信成功后,不再通信,我让程序继续运行(也就是在一个死循环内“转圈”),此时我发现'*'之前的那个字节的内容还是在无规律地变化。

期待进一步的指教!谢谢了!

PS:我看了DATASHEET,发现PIC16F876A与873A封装,引脚定义一模一样,但是RAM大了1倍,为368B,不知我用876A的话,此问题是否会解决?
我的电路板已做了三防且我手边没有876A,还需订购,所以替换较麻烦,希望您给个建议。

使用特权

评论回复
5
Ryanhsiung| | 2012-4-14 19:02 | 只看该作者
LZ可以去看一下 887系列的兼容芯片,887据说与877A系列的完全兼容

使用特权

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

本版积分规则

7

主题

11

帖子

1

粉丝