用QY4内部振荡器做时钟时定时问题

[复制链接]
 楼主| 谭可 发表于 2007-5-21 18:16 | 显示全部楼层 |阅读模式
使用QY4时,采用了内部振荡器。做定时功能的时候发现误差很大,超过了20%。各位大侠帮我看看我哪个地方没有设置好。今天才用Freescale的单片机。相关程序如下:<br />#include&nbsp;&lthidef.h&gt&nbsp;/*&nbsp;for&nbsp;EnableInterrupts&nbsp;macro&nbsp;*/<br />#include&nbsp;&quot;derivative.h&quot;&nbsp;/*&nbsp;include&nbsp;peripheral&nbsp;declarations&nbsp;*/<br /><br />typedef&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;&nbsp;UINT8;<br />typedef&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT16;<br />typedef&nbsp;unsigned&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT16;<br />typedef&nbsp;unsigned&nbsp;long&nbsp;&nbsp;&nbsp;UINT32;<br />typedef&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT32;<br /><br /><br />void&nbsp;Init_Device(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;init&nbsp;the&nbsp;mcu&nbsp;register*/<br />&nbsp;&nbsp;&nbsp;&nbsp;DisableInterrupts;<br />&nbsp;&nbsp;&nbsp;&nbsp;CONFIG1&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CONFIG2&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSCTRIM&nbsp;=&nbsp;*(unsigned&nbsp;char*far)0xFFC0;&nbsp;/*&nbsp;Initialize&nbsp;OSCTRIM&nbsp;register&nbsp;from&nbsp;a&nbsp;non&nbsp;volatile&nbsp;memory&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;DDRB&nbsp;=&nbsp;0x3F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*portb&nbsp;0&nbsp;to&nbsp;5&nbsp;as&nbsp;2s,15m,1h,2h,3h,5h*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DDRA&nbsp;=&nbsp;0x10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*porta4&nbsp;as&nbsp;LED&nbsp;output*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TSC&nbsp;=&nbsp;0x30;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Stop&nbsp;and&nbsp;reset&nbsp;counter&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TMOD&nbsp;=&nbsp;0x2710;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Period&nbsp;value&nbsp;setting&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TSC&nbsp;=&nbsp;0x45;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Int.&nbsp;flag&nbsp;clearing&nbsp;(2nd&nbsp;part)&nbsp;and&nbsp;timer&nbsp;contr.&nbsp;register&nbsp;setting&nbsp;*/<br />&nbsp;&nbsp;PTA&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;PTB&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;EnableInterrupts;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Enable&nbsp;interrupts&nbsp;*/<br />}<br />void&nbsp;main(void)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Init_Device();<br />&nbsp;&nbsp;&nbsp;&nbsp;EnableInterrupts;&nbsp;/*&nbsp;enable&nbsp;interrupts&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;include&nbsp;your&nbsp;code&nbsp;here&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;for(;;)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__RESET_WATCHDOG();&nbsp;/*&nbsp;feeds&nbsp;the&nbsp;dog&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;/*&nbsp;loop&nbsp;forever&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;please&nbsp;make&nbsp;sure&nbsp;that&nbsp;you&nbsp;never&nbsp;leave&nbsp;main&nbsp;*/<br />}
张明峰 发表于 2007-5-21 21:40 | 显示全部楼层

注意校准值

出厂时FFC0处会有一校准值,但用简单的调试工具进行芯片擦除时也会将该值一起擦除。<br /><br />调试时先将空芯片的内容读出来,记下出厂的校准值,软件直接赋值进行校准。批量生产时选用能保留此校准值的工具(先读出来,然后擦除芯片,再一起烧写)。
 楼主| 谭可 发表于 2007-5-22 09:01 | 显示全部楼层

请教张明峰

FFC0地址是属于Flash中的地址,可以直接赋值吗?
afanti 发表于 2007-5-22 10:20 | 显示全部楼层

re

const&nbsp;byte&nbsp;strName[]&nbsp;@0xFFC0&nbsp;=&nbsp;{0x55};可以这样。<br />FSL的校正值太麻烦了~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

1

粉丝

2

主题

3

帖子

1

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