谈不谈得上是一个新发现?

[复制链接]
3469|16
 楼主| wenzong 发表于 2008-11-20 20:31 | 显示全部楼层 |阅读模式
对PIC单片机的定时器1的TMR1H或者TMR1L进行操作,如:<br /><br />bsf&nbsp;&nbsp;&nbsp;TMR1H,7<br />movf&nbsp;&nbsp;TMR1H<br /><br />会产生1个指令周期的延时<br /><br />或者关闭计数,再开启,如<br /><br />bcf&nbsp;&nbsp;&nbsp;&nbsp;T1CON,TMR1ON<br />movlw&nbsp;&nbsp;.3<br />addwf&nbsp;&nbsp;TMR1L<br />bsf&nbsp;&nbsp;&nbsp;&nbsp;T1CON,TMR1ON<br />(确保无进位)<br /><br />会产生1个指令周期的延时。<br /><br />注意:仿真无延时,实际延时了1个指令周期<br /><br /><br />
 楼主| wenzong 发表于 2008-11-20 20:37 | 显示全部楼层

比比看

bsf&nbsp;&nbsp;&nbsp;TMR1H,7<br />bsf&nbsp;&nbsp;&nbsp;TMR1H,7<br />bsf&nbsp;&nbsp;&nbsp;TMR1H,7<br />延时3个指令周期<br /><br />nop<br />bsf&nbsp;&nbsp;&nbsp;TMR1H,7<br />bsf&nbsp;&nbsp;&nbsp;TMR1H,7<br />延时2个指令周期<br /><br />nop<br />nop<br />bsf&nbsp;&nbsp;&nbsp;TMR1H,7<br />延时1个指令周期<br /><br />
 楼主| wenzong 发表于 2008-11-20 20:44 | 显示全部楼层

再看看

甚至对CCPR1L和CCPR1H操作<br /><br />都会产生1个指令周期的延时<br /><br />注意:仿真无延时,实际延时了1个指令周期<br /><br /><br />
 楼主| wenzong 发表于 2008-11-21 18:39 | 显示全部楼层

总之

总之:<br />对TMR1H和TMR1L操作的这条指令,<br />运行后TMR1L不会加一,如<br />bsf&nbsp;&nbsp;&nbsp;TMR1H,7<br />movf&nbsp;&nbsp;TMR1H&nbsp;等<br />而<br />bcf&nbsp;&nbsp;&nbsp;&nbsp;T1CON,TMR1ON<br />这条指令运行后TMR1L也不会加一(和仿真不一致);<br /><br />但<br />bsf&nbsp;&nbsp;&nbsp;TMR1L,7<br />这条指令运行后TMR1L不会加一(和仿真一致)。<br />
兰天白云 发表于 2008-11-21 23:47 | 显示全部楼层

实际延时的那个周期你是怎么测出来的?

  
 楼主| wenzong 发表于 2008-11-23 12:51 | 显示全部楼层

4M主时钟,每隔32us产生一个中断,实测中断频率

  
 楼主| wenzong 发表于 2008-11-23 16:55 | 显示全部楼层

致兰天白云

&nbsp;&nbsp;&nbsp;TMR1选内部时钟计数模式<br />&nbsp;&nbsp;&nbsp;org&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x4<br />&nbsp;&nbsp;&nbsp;bsf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PIR1,TMR1IF<br />&nbsp;&nbsp;&nbsp;movlw&nbsp;&nbsp;&nbsp;0xff<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H&nbsp;&nbsp;&nbsp;&nbsp;;1<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;movwf&nbsp;&nbsp;&nbsp;TMR1H&nbsp;&nbsp;&nbsp;&nbsp;;15<br />&nbsp;&nbsp;&nbsp;bcf&nbsp;&nbsp;&nbsp;&nbsp;T1CON,TMR1ON<br />&nbsp;&nbsp;&nbsp;movlw&nbsp;&nbsp;.256-.32+.3<br />&nbsp;&nbsp;&nbsp;addwf&nbsp;&nbsp;TMR1L<br />&nbsp;&nbsp;&nbsp;bsf&nbsp;&nbsp;&nbsp;&nbsp;T1CON,TMR1ON<br />&nbsp;&nbsp;&nbsp;comf&nbsp;&nbsp;&nbsp;PORTC&nbsp;&nbsp;;测C口输出<br />&nbsp;&nbsp;&nbsp;retfie<br /><br />比较:将16个TMR1H换成nop<br />测C口输出频率差别好大(仿真一样的)<br /><br />&nbsp;兰天白云&nbsp;发表于&nbsp;2008-11-21&nbsp;23:47&nbsp;PIC&nbsp;单片机&nbsp;←返回版面&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />5楼:&nbsp;实际延时的那个周期你是怎么测出来的?&nbsp;<br /><br />&nbsp;<br />&nbsp;
 楼主| wenzong 发表于 2008-11-23 18:00 | 显示全部楼层

以前的问题有了答案了

以前我发了一个&nbsp;奇怪的问题&nbsp;<br /><br />想用TMR1内部时钟来做电子钟<br />具体做法如下:<br /><br />主时钟:4M<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T1_Const&nbsp;&nbsp;&nbsp;&nbsp;(.65536-.31250+.7)<br /><br />程序每隔31.25ms产生一次中断<br /><br />后给TMR1赋初值:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bcf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PIR1,TMR1IF<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bcf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T1CON,TMR1ON<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movlw&nbsp;&nbsp;&nbsp;&nbsp;low(T1_Const)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addwf&nbsp;&nbsp;&nbsp;&nbsp;TMR1L<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movlw&nbsp;&nbsp;&nbsp;&nbsp;high(T1_Const)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;skpnc&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addlw&nbsp;&nbsp;&nbsp;&nbsp;.1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addwf&nbsp;&nbsp;&nbsp;&nbsp;TMR1H<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bsf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T1CON,TMR1ON&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTC&nbsp;&nbsp;&nbsp;;从C口输出脉冲<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;。。。。。。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请100M数字示波器测RC0,显示频率16.0000Hz<br /><br />奇怪的是,只将31250改为6250,使程序每隔6.25ms产生一次中断<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T1_Const&nbsp;&nbsp;&nbsp;&nbsp;(.65536-.6250+.7)<br /><br />请100M数字示波器测RC0,显示频率79.9896Hz<br /><br />怎么不为80.0000Hz?<br />&nbsp;<br />现在有了答案了:<br /><br />为16.0000Hz的原因是:主时钟4M和示波器的误差约抵消了32ppm<br /><br />为79.9896的原因是:79.9896的误差为(80-79.9896)/80=130ppm<br />1/6250=160ppm,主时钟4M和示波器的误差约为32ppm<br />160-32大约为130<br /><br />猜测<br />bcf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T1CON,TMR1ON<br />该指令运行后TMR1L不会加一<br /><br />
martin 发表于 2008-11-24 09:48 | 显示全部楼层

使用了TMR1预分频器

如果使用了TMR1预分频器,无论是对TMR1L还是TMR1H进行写操作,都会使预分频器清零。
 楼主| wenzong 发表于 2008-11-24 18:22 | 显示全部楼层

致martin

没有使用了TMR1预分频器,仿真与实际不一致。<br /><br />martin&nbsp;发表于&nbsp;2008-11-24&nbsp;09:48&nbsp;PIC&nbsp;单片机&nbsp;←返回版面&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />9楼:&nbsp;使用了TMR1预分频器&nbsp;<br /><br />如果使用了TMR1预分频器,无论是对TMR1L还是TMR1H进行写操作,都会使预分频器清零。<br /><br />&nbsp;<br />&nbsp;<br />
仲十三 发表于 2008-12-12 15:47 | 显示全部楼层

打分得分

答复的
 楼主| wenzong 发表于 2008-12-16 15:01 | 显示全部楼层

为什么没人赞一个?

  
lxrlxr 发表于 2008-12-17 08:12 | 显示全部楼层

如果你用ICD2仿真和实际运行是一样的

ICD2实际是芯片在运行
 楼主| wenzong 发表于 2008-12-21 12:20 | 显示全部楼层

我已测出

我已测出<br />bcf&nbsp;&nbsp;&nbsp;&nbsp;T1CON,TMR1ON<br />这条指令运行后TMR1L不会加一(软件仿真加一);<br />
xsl. 发表于 2009-2-16 00:45 | 显示全部楼层

这种事情有时确实很犯人

  
stghl 发表于 2009-2-16 20:57 | 显示全部楼层

麻烦

超级**烦,精度要高得看你的晶振!定时器只读不写呀!<br />这样精度就能保证
pjliuxw 发表于 2009-2-17 09:43 | 显示全部楼层

用CCP自动填装

如果作定时用,最好是启动定时器后不要去经常关闭,最好是使用CCP自动填装。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

158

帖子

1

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