12F519 flash 数据区读写异常请教

[复制链接]
5801|12
 楼主| eheart 发表于 2008-4-8 02:44 | 显示全部楼层 |阅读模式
我在使用12F519读写内部flash&nbsp;数据区时,按照规格书给的例程,发现结果异常,现象如下:<br /><br />规格书上给的例程:<br />读数据:<br />&nbsp;&nbsp;&nbsp;&nbsp;bsf&nbsp;&nbsp;&nbsp;&nbsp;FSR,5<br />&nbsp;&nbsp;&nbsp;&nbsp;movlw&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;LOAD&nbsp;ADDRESS&nbsp;TO&nbsp;READ<br />&nbsp;&nbsp;&nbsp;&nbsp;bsf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EECON,RD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;INITITATE&nbsp;THE&nbsp;READ&nbsp;INSTRUCTION<br />&nbsp;&nbsp;&nbsp;&nbsp;nop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;INSTRUCTION&nbsp;IGNORED<br />&nbsp;&nbsp;&nbsp;&nbsp;movf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEDATA,W&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;GET&nbsp;NEW&nbsp;DATA<br /><br />这个例程看起来不对,没有用到EEADR,&nbsp;执行起来也无法读到正确结果<br />我把它改写成:<br />&nbsp;&nbsp;&nbsp;&nbsp;bsf&nbsp;&nbsp;&nbsp;&nbsp;FSR,5<br />&nbsp;&nbsp;&nbsp;&nbsp;movlw&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;LOAD&nbsp;ADDRESS&nbsp;TO&nbsp;READ<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;&nbsp;EEADR<br />&nbsp;&nbsp;&nbsp;&nbsp;bsf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EECON,RD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;INITITATE&nbsp;THE&nbsp;READ&nbsp;INSTRUCTION<br />&nbsp;&nbsp;&nbsp;&nbsp;nop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;INSTRUCTION&nbsp;IGNORED<br />&nbsp;&nbsp;&nbsp;&nbsp;movf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEDATA,W&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;GET&nbsp;NEW&nbsp;DATA<br /><br />可是执行起来还是不对,尽管已经把FSR,5置位了,movwf&nbsp;EEADR&nbsp;指令执行的结果是把PORTB口清零了。EEADR&nbsp;和PORTB是在RAM&nbsp;bank0&nbsp;和1相对应的两个寄存器,难道是&nbsp;bsf&nbsp;FSR,5&nbsp;指令没有发挥作用?<br /><br />我以上的这个例程在MPLAB里仿真是正常的,烧在芯片里运行的结果不正常,百思不得其解,不知哪位兄弟能给解释一下?谢谢了!<br /><br />
xieyuanbin 发表于 2008-4-8 09:13 | 显示全部楼层

不明白你BSF FSR,5干吗?

FSR是间接寻址时的地址所在,你如果要切换BANK,应该去操作STATUS,RP0或RP1
 楼主| eheart 发表于 2008-4-8 09:43 | 显示全部楼层

谢谢指点.

不过12F519切换BANK,&nbsp;确实是用FSR,5来切换的,&nbsp;STATUS里没有RP0,RP1,只有PA0,是切换程序页面的。以上例程是Microchip提供的。
skygrow 发表于 2008-4-8 11:10 | 显示全部楼层

奇怪

换个地址呢?&nbsp;&nbsp;&nbsp;<br />如果给EEADR赋值0x01,&nbsp;RB0是不是也会置1?<br />还有EEADR=0,&nbsp;读出来的该是PC=0x400单元的低8位
 楼主| eheart 发表于 2008-4-8 16:02 | 显示全部楼层

真是奇怪

在不同的EEADR地址上操作结果是一样的,对EEADR的赋值都变成是对PORTB的操作,尽管前面有FSR,5<br />最奇怪的是,在软件仿真(MPLAB&nbsp;8.00)上都正常,烧到芯片里就不正常了
xieyuanbin 发表于 2008-4-8 21:54 | 显示全部楼层

的确,12F519的BANK操作通过FSR,5切换.

手头没有这块芯片,因此不能实际测试,你试试下面的程序,有时很多数据手册例程似乎没有经过实际验证.<br />&nbsp;&nbsp;&nbsp;&nbsp;movlw&nbsp;EEADR<br />&nbsp;&nbsp;&nbsp;&nbsp;movwf&nbsp;FSR<br />&nbsp;&nbsp;&nbsp;&nbsp;bsf&nbsp;&nbsp;&nbsp;&nbsp;FSR,5<br />&nbsp;&nbsp;&nbsp;&nbsp;movlw&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;LOAD&nbsp;ADDRESS&nbsp;TO&nbsp;READ<br />&nbsp;&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;&nbsp;INDF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;*利用间接寻址操作EEADR*<br />&nbsp;&nbsp;&nbsp;&nbsp;bsf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EECON,RD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;INITITATE&nbsp;THE&nbsp;READ&nbsp;INSTRUCTION<br />&nbsp;&nbsp;&nbsp;&nbsp;nop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;INSTRUCTION&nbsp;IGNORED<br />&nbsp;&nbsp;&nbsp;&nbsp;movf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EEDATA,W&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;GET&nbsp;NEW&nbsp;DATA<br />
xieyuanbin 发表于 2008-4-8 22:25 | 显示全部楼层

奇怪,难道16F526和12F519是一个娘胎里出来的?

我下载519的数据手册,其中中文的标明12F519/16F526在一起,结果打开又只是519的,完全没有526的内容,忽悠我?
 楼主| eheart 发表于 2008-4-9 11:19 | 显示全部楼层

做了一下试验,症状比较明显了

在芯片上烧了几次调试代码,症状算是基本可以肯定了<br /><br />我用以下代码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movfw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSCCAL<br />&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;Send_Asyncbyte&nbsp;&nbsp;&nbsp;&nbsp;;检查OSCCAL内容<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;movfw&nbsp;&nbsp;&nbsp;&nbsp;PORTB<br />&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;Send_Asyncbyte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;检查PORTB内容<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bsf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FSR,5<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movfw&nbsp;&nbsp;&nbsp;&nbsp;EEDATA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bcf&nbsp;&nbsp;&nbsp;&nbsp;FSR,5&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;Send_Asyncbyte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;检查EEDATA内容<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bsf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FSR,5<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movfw&nbsp;&nbsp;&nbsp;&nbsp;EEADR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bcf&nbsp;&nbsp;&nbsp;&nbsp;FSR,5&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;Send_Asyncbyte&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;检查EEADR内容<br />&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;&nbsp;&nbsp;&nbsp;$&nbsp;&nbsp;&nbsp;&nbsp;<br />Send_asynbyte&nbsp;是把W的内容从一个端口送出来。测试结果是,读取EEADR,实际读到的是PORTB,&nbsp;读取EEDATA&nbsp;实际读到的是OSCCAL,&nbsp;也就是说FSR,5没有起到作用,BANK没有切换<br />使用xieyuanbin版主建议的间接寻址方式,结果也是一样。为什么会发生BANK切换不了呢?<br />另外,说明一下,我是用ICD2来烧写12F519的,Firmware是&nbsp;MPLAB8.00带来的。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 楼主| eheart 发表于 2008-4-9 11:30 | 显示全部楼层

投诉一下Microchip的技术支持

800电话打过去很久才有人接,然后说没有芯片不能验证,提供不出任何有价值的信息
McuPlayer 发表于 2008-4-9 12:02 | 显示全部楼层

800你也去打啊,呵呵

假如你是FAE的老大,你会让你的主力小弟去做800的接线员吗?<br />最有效的方式是透过代理商找FAE
xieyuanbin 发表于 2008-4-9 14:17 | 显示全部楼层

应该正在解决中

这里MCP的FAE主力小弟经常在这里转的.问题应该已经在查了.<br />但还是不太相信519出问题,在产品出来前,MCP会做很长时间的测试,并且会交到重要客户手中测试,出这样的问题的几率极小.<br />
兰天白云 发表于 2008-4-11 20:15 | 显示全部楼层

本人有些时间不相信数据手册

  
 楼主| eheart 发表于 2008-4-14 11:37 | 显示全部楼层

问题找到了,气死人了,乌龙事件

芯片是DFN封装的,我申请的样片是12F519,实际来的看这现象应该是12F509,芯片表面的标识识别不出型号。<br />谢谢大家的帮助,特别是Xieyuanbin的热情,不好意思耽误了各位的时间&nbsp;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部