完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
我在使用PIC16F676的XC8_u._ms()函数时遇到了问题。我创建了1分钟定时器来闪烁LED,但我发现分钟延迟是+1秒。我已经在几个集成电路上试过这种方法,但是仍然有同样的问题,我也在较长的时间里运行测试,仍然得到+1秒每分钟的误差,我已经检查过OSCCAL(@0x3ff)是否完好无损,并且正在使用,我使用的是内部4MHz振荡器。在XC8全局选项XC8链接器中,使用保留程序存储器和校准振荡器将OSCCAL值设置为0x3ff。我有最新的MPLLABIDE和XC8编译器:MPLAB X IDE v3.30、MPLAB XC8 C编译器(Pro.)V1.37(B)。代码很简单。RY代码我可以看到:6调用0x3FF 7 MOVWF T1CONNEY出错了,我怎样才能使计时器更准确?
|
|
相关推荐
11个回答
|
|
|
参见数据表参数F10。内部振荡器仅被分割为+/-1%@Vdd=3.5V,25摄氏度。在更正常的温度和Vdd电压范围内,它的+/-2%因此可以预期高达+/-1.2秒/分钟的定时误差。程序存储器视图不能(不能)跟踪存储库选择位,所以通常不会显示他纠正SFR,取代其银行0“影子”。如果希望查看实际编译了什么代码以打开项目的.lst文件,该文件是一个汇编程序列表,在注释中用原始C源进行了注释。
|
|
|
|
|
|
Ian.M.谢谢你提供的信息,它非常有用。我查看了.lst文件,没有提到OSCCAL或0x3FF。在LST文件中是否应该有这个OSCCAL的实例,或者我应该注意什么?我认为在0x3FF中存储的OSCCAL值被用来校准振荡器并减少+/- 1%误差。我目前正在运行5xPIC16F676,同时使用相同的电源电压和温度Vdd=5V,25摄氏度,具有相同的应用,我得到了广泛的结果+/-2%。事实上,结果相当随机,因为每次我给测试台供电时,我得到的结果都不一样……我如何让程序使用OSCCAL?有没有一种方法可以使Sy-DelayyMS(1000)更精确?
|
|
|
|
|
|
看一下数据表中校准内部振荡器的第9.2.5.1节,这里有一个示例(9-1),说明如何使用0x3ff的校准指令和OSCCAL SFR。
|
|
|
|
|
|
谢谢你杰克KKStand指向我的数据表。我注意到去耦电容对内部振荡器的稳定性有很大的影响。不幸的是,校准代码示例在ASM中,我正在使用XC8 C。当我在XC8 C中开发PIC应用程序时,如何启用OSCCAL呢?XC8编译器自动为我做这个振荡器校准吗?当我对PIC进行编程时,可以看到OSCCAL内存位置正在程序内存ASM中使用,但是与数据表示例的方式不同。BSF STATUS,0x5 CALL 0x3FF MOVWF T1CON BCF STATUS,0x5欢迎进一步的帮助。
|
|
|
|
|
|
“反汇编器”不跟踪银行(STATUS sfr中正在改变的那些位),因此它将显示位于银行0中的sfr的nmum.,其地址与指令中使用的sfr相同(T1CON和OSCCAL都位于银行0中的至少0x10、T1CON和OSCCAL中银行1)。这是您正在使用的反汇编列表的一个已知问题,X.LST文件显示得更好。如果您不熟悉这些pic处理器中使用的银行寻址方案,我建议快速阅读内存组织部分中的16F676的数据表。
|
|
|
|
|
|
在XC8编译器选项中有一个复选框,用于处理振荡器校准。我不知道它是否足够聪明,在默认情况下为您的PIC。
|
|
|
|
|
|
默认情况下,XC8编译器调用振荡器校准码。XC8使用的代码存在问题。如果PIC16F66校准指令不是RESLW或被擦除,则该代码在锁定时失败。
|
|
|
|
|
|
***
|
|
|
|
|
|
再次感谢jack@kk.,我已经检查了MPLAB X IDE&XC8生成的.X.lst文件,没有提到OSCCAL、0x3ff、RETLW、T1CON。我应该寻找什么来确认OSCCAL正在被使用?是否有一个开关使PIC能够使用OSCCAL?我附上了Timer1.X...lst的副本作为txt,如果您能给我一些关于如何在我的应用程序中实际使用_u._ms(1000)的指示的话。
|
|
|
|
|
|
在Project属性-gt;xc8链接器中,确保校验振荡器复选框被选中。这将产生自动校准振荡器的代码。BSF STATUS,0x05呼叫0x3FFMOVWF T1CON BCF STATUS,0x5由于STATUS指向bank1,MOVWF指令将保存到OSCCAL中。现在你仍然会得到不精确的定时,当使用γ-DelayyMs函数时。正如编译器用户指南(P.64)中所解释的:3.5.10,我如何实现代码中的延迟?如果需要准确的延迟,或者在延迟期间还有其他任务可以执行,那么使用定时器来生成中断是最好的方法。如果代码中没有这些问题,那么可以使用编译器内置的delay伪函数:_.、_._ms或_._ms。参见附录A图书馆功能。所有这些都扩展到内联汇编指令或(嵌套)指令循环,这将消耗指定的周期或时间。由于延迟函数只是一系列嵌套循环,因此会出现错误累积。这就是为什么建议使用定时器中断(如Time1)来进行更精确的计时。希望这有帮助。
|
|
|
|
|
|
***
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1124浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 02:58 , Processed in 1.053908 second(s), Total 92, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1676