共2条
1/1 1 跳转至页
pic16f690,clock,out pic16f690 clock out问题
问
请教大家一个问题:我用690的内部4M晶振,clockout输出,wdt off,开始时候clock输出准确为1M,但运行了将近3个小时后输出变为了800khz,程序只是一行goto $.又测了一个片子,连续运行2天后频率输出变为1.2MHz。又测了第3个片子,直到现在clock输出仍然正常,请问这能说明是单片机的质量问题吗?
答 1:
需了解温度漂移的概念。690标称精度是在25℃的情况下,在其他温度范围有表格可共参考,这个温度是指单片机本身的温度。如果发热,受凉,感冒了就不是这个精度了。
答 2:
我也遇到这个问题好像内部的时钟不准确,在同样的环境下,有的还准一些,有的就不准,我用了OSCTUN寄存器调整了一下,但这不是最终的办法。时钟一飘串口通信都不正常了。
答 3:
你用的MPLAB是什么版本?早期版本出现过破坏内部校准字的情况,7.40以后的没问题。
答 4:
破坏内部校准字?我用的maplab7.40。martin说的破坏内部校准字是指的内部校准字的值被修改了是吗?但是我的测试程序就是2行:clrf OSCTUNE
goto $
答 5: 如果要求精度还是用外部的吧标称的内部晶振都x%的稳定度,不能用于要求高的场合 答 6: re: suger我指的破坏内部校准字不是指OSCTUNE,是怀疑芯片内部2008地址的出厂校准字被破坏,仅仅只是怀疑,因为这个校准字用各种烧录设备都是无法访问的,你描述的现象是在程序运行过程出现偏差20%的现象就更为奇特,我只见过在用MPLAB早期版本,因为烧录而意外破坏出厂校准字的2个例子(理论上不应该被破坏,因为普通烧录设备访问不到这个地址,但在编程模式下因为编程时序的错乱而破坏的可能性还是存在的。一般被破坏后的芯片会一直偏差约20%,而且没有办法恢复这个出厂校准字)。MPLAB升级之后就再没有看到过这种例子了。 答 7: 借贴问一下martin,这个不能修改的校准字是不是MPLAB_ICD2设置里的“Calibration Memory”?用ICD2是可以修改的啊。用的是12F629。如果不慎修改了这个值怎样才能重新校准芯片? 答 8: :芯片在出厂前是经过仪器校准的,生成的校准值在出厂前是已经编程在芯片里的,对应各个芯片该数值有可能是不一样的.在MPLAB-IDE中是可以使用ICD-2来编程校准字,但是,你并不知道原来的数值是什么,当然你可以自己编写一段程序来测试不同的数值,直到寻找到某个数值能使内部晶体的误差在正负1%之间.
当然你也可以随便写入任意的数值,但是注意,该任意数值并不一定能保证内部晶体的精度的范围在正负1%之内.
因为内部校准单元被擦除后会导致编程时校验失败而使芯片不能重复编程,所以这种功能可提供给你通过编程校验步骤的方法. 答 9: 这句话没看懂:“因为内部校准单元被擦除后会导致编程时校验失败而使芯片不能重复编程,所以这种功能可提供给你通过编程校验步骤的方法.”
我在用ICD2小批量写芯片的时候发现过有少量芯片提示写入校验失败,需要填写“Calibration Memory”值并一起写入才能通过,这个功能有什么用?什么叫“通过编程校验步骤”? 答 10: :如果内部校准字被意外擦除后,比如说该单元变为0x00,那么如果你不选择重新写入Calibration Memory,其编程校验是通不过的.
上面已经解释过了,原来的数值你是不知道的,那么你会选择哪个数值呢?而这个数值是用来给赋给OSCTUNE来做内部振荡器做微调的,否则内部振荡器就可能不能保证在正负1%误差内,如果你选择内部振荡器做系统时钟的话,这个值可不是随随便便填一个就行了.
答 11: 明白了,就是当MPLAB发现芯片内校准字的值为0x00时,必须要打开“Calibration Memory”的写入允许才能写芯片。芯片出厂的时候校准字的值一般不为零,所以它一旦为零说明芯片可能需要重新校准。 答 12: :你又理解错了,以PIC12F629为例子: 其最后一个单元地址0x3FF的值应该是一个W带立即数返回的指令 "RETLW XX", XX这个值有可能是任何一个数,其中也包括0X00,这条指令对应的十六进制码为:34XX,所以当这个地址单元被意外改写了,例如,变成了0x0000,那么当你编程校验时,当检验到这个地址时,会发现该值和预期的数值不一致,会产生报错,编程无法完成.
而ICD-2可支持往最后一个单元写入这条RETLW XX 指令,而XX的数值是由用户自己定义的.在最新的MPLAB IDE 7.42里面,PM-3也可支持这个功能.解释清楚了吗?
答 13: 清楚了,谢谢systemchip的解释! 答 14: re:ocon你用的PIC12F629的出厂校准字是放在程序区的,当编程器对Flash的芯片擦除时,出厂校准字也会被擦除,所以原厂出产的编程器或按原厂设计生产的编程器,都会在对芯片擦除时,先读出出厂校准字,然后擦除,之后再写回去。这样的过程看似应该没有问题,但实际发现很多用户采用了没有这种设计的第三方的编程器,或者编程操作中的意外失误,都导致了出厂校准字的擦除。ICD2提供了一个功能来重新写入校准字,但是,在不知道先前出厂校准字是多少的情况下,只能是猜一个值填进去。
出厂校准字放在程序区引起了很多用户的麻烦,所以,之后出的PIC,都把出厂校准字放到一个普通编程器不能访问的地址(比如690放到了2008地址),放在这个地址的校准字只能是出厂时被写入,普通编程器在擦除芯片时不再会擦除该地址。所以,也不再提供用户恢复Calibration Memory的功能了。 答 15: to:martin 之后我又发现有两个芯片(690)用ICD2第一次编程后一切正常,重复编程后马上测试频率就不对了,修改OSCTUNE能把频率修正过来。真的怀疑是690的出厂校准字被改写了。如果不是MAPLAB的原因,那会不会是ICD2的原因呢?我的ICD2可是正规代理商生产的! 答 16: 请高人给予帮助!!!
goto $
答 5: 如果要求精度还是用外部的吧标称的内部晶振都x%的稳定度,不能用于要求高的场合 答 6: re: suger我指的破坏内部校准字不是指OSCTUNE,是怀疑芯片内部2008地址的出厂校准字被破坏,仅仅只是怀疑,因为这个校准字用各种烧录设备都是无法访问的,你描述的现象是在程序运行过程出现偏差20%的现象就更为奇特,我只见过在用MPLAB早期版本,因为烧录而意外破坏出厂校准字的2个例子(理论上不应该被破坏,因为普通烧录设备访问不到这个地址,但在编程模式下因为编程时序的错乱而破坏的可能性还是存在的。一般被破坏后的芯片会一直偏差约20%,而且没有办法恢复这个出厂校准字)。MPLAB升级之后就再没有看到过这种例子了。 答 7: 借贴问一下martin,这个不能修改的校准字是不是MPLAB_ICD2设置里的“Calibration Memory”?用ICD2是可以修改的啊。用的是12F629。如果不慎修改了这个值怎样才能重新校准芯片? 答 8: :芯片在出厂前是经过仪器校准的,生成的校准值在出厂前是已经编程在芯片里的,对应各个芯片该数值有可能是不一样的.在MPLAB-IDE中是可以使用ICD-2来编程校准字,但是,你并不知道原来的数值是什么,当然你可以自己编写一段程序来测试不同的数值,直到寻找到某个数值能使内部晶体的误差在正负1%之间.
当然你也可以随便写入任意的数值,但是注意,该任意数值并不一定能保证内部晶体的精度的范围在正负1%之内.
因为内部校准单元被擦除后会导致编程时校验失败而使芯片不能重复编程,所以这种功能可提供给你通过编程校验步骤的方法. 答 9: 这句话没看懂:“因为内部校准单元被擦除后会导致编程时校验失败而使芯片不能重复编程,所以这种功能可提供给你通过编程校验步骤的方法.”
我在用ICD2小批量写芯片的时候发现过有少量芯片提示写入校验失败,需要填写“Calibration Memory”值并一起写入才能通过,这个功能有什么用?什么叫“通过编程校验步骤”? 答 10: :如果内部校准字被意外擦除后,比如说该单元变为0x00,那么如果你不选择重新写入Calibration Memory,其编程校验是通不过的.
上面已经解释过了,原来的数值你是不知道的,那么你会选择哪个数值呢?而这个数值是用来给赋给OSCTUNE来做内部振荡器做微调的,否则内部振荡器就可能不能保证在正负1%误差内,如果你选择内部振荡器做系统时钟的话,这个值可不是随随便便填一个就行了.
答 11: 明白了,就是当MPLAB发现芯片内校准字的值为0x00时,必须要打开“Calibration Memory”的写入允许才能写芯片。芯片出厂的时候校准字的值一般不为零,所以它一旦为零说明芯片可能需要重新校准。 答 12: :你又理解错了,以PIC12F629为例子: 其最后一个单元地址0x3FF的值应该是一个W带立即数返回的指令 "RETLW XX", XX这个值有可能是任何一个数,其中也包括0X00,这条指令对应的十六进制码为:34XX,所以当这个地址单元被意外改写了,例如,变成了0x0000,那么当你编程校验时,当检验到这个地址时,会发现该值和预期的数值不一致,会产生报错,编程无法完成.
而ICD-2可支持往最后一个单元写入这条RETLW XX 指令,而XX的数值是由用户自己定义的.在最新的MPLAB IDE 7.42里面,PM-3也可支持这个功能.解释清楚了吗?
答 13: 清楚了,谢谢systemchip的解释! 答 14: re:ocon你用的PIC12F629的出厂校准字是放在程序区的,当编程器对Flash的芯片擦除时,出厂校准字也会被擦除,所以原厂出产的编程器或按原厂设计生产的编程器,都会在对芯片擦除时,先读出出厂校准字,然后擦除,之后再写回去。这样的过程看似应该没有问题,但实际发现很多用户采用了没有这种设计的第三方的编程器,或者编程操作中的意外失误,都导致了出厂校准字的擦除。ICD2提供了一个功能来重新写入校准字,但是,在不知道先前出厂校准字是多少的情况下,只能是猜一个值填进去。
出厂校准字放在程序区引起了很多用户的麻烦,所以,之后出的PIC,都把出厂校准字放到一个普通编程器不能访问的地址(比如690放到了2008地址),放在这个地址的校准字只能是出厂时被写入,普通编程器在擦除芯片时不再会擦除该地址。所以,也不再提供用户恢复Calibration Memory的功能了。 答 15: to:martin 之后我又发现有两个芯片(690)用ICD2第一次编程后一切正常,重复编程后马上测试频率就不对了,修改OSCTUNE能把频率修正过来。真的怀疑是690的出厂校准字被改写了。如果不是MAPLAB的原因,那会不会是ICD2的原因呢?我的ICD2可是正规代理商生产的! 答 16: 请高人给予帮助!!!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |