打印

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

[复制链接]
2431|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wenzong|  楼主 | 2008-11-20 20:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对PIC单片机的定时器1的TMR1H或者TMR1L进行操作,如:

bsf   TMR1H,7
movf  TMR1H

会产生1个指令周期的延时

或者关闭计数,再开启,如

bcf    T1CON,TMR1ON
movlw  .3
addwf  TMR1L
bsf    T1CON,TMR1ON
(确保无进位)

会产生1个指令周期的延时。

注意:仿真无延时,实际延时了1个指令周期


沙发
wenzong|  楼主 | 2008-11-20 20:37 | 只看该作者

比比看

bsf   TMR1H,7
bsf   TMR1H,7
bsf   TMR1H,7
延时3个指令周期

nop
bsf   TMR1H,7
bsf   TMR1H,7
延时2个指令周期

nop
nop
bsf   TMR1H,7
延时1个指令周期

使用特权

评论回复
板凳
wenzong|  楼主 | 2008-11-20 20:44 | 只看该作者

再看看

甚至对CCPR1L和CCPR1H操作

都会产生1个指令周期的延时

注意:仿真无延时,实际延时了1个指令周期


使用特权

评论回复
地板
wenzong|  楼主 | 2008-11-21 18:39 | 只看该作者

总之

总之:
对TMR1H和TMR1L操作的这条指令,
运行后TMR1L不会加一,如
bsf   TMR1H,7
movf  TMR1H 等

bcf    T1CON,TMR1ON
这条指令运行后TMR1L也不会加一(和仿真不一致);


bsf   TMR1L,7
这条指令运行后TMR1L不会加一(和仿真一致)。

使用特权

评论回复
5
兰天白云| | 2008-11-21 23:47 | 只看该作者

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

使用特权

评论回复
6
wenzong|  楼主 | 2008-11-23 12:51 | 只看该作者

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

使用特权

评论回复
7
wenzong|  楼主 | 2008-11-23 16:55 | 只看该作者

致兰天白云

   TMR1选内部时钟计数模式
   org     0x4
   bsf     PIR1,TMR1IF
   movlw   0xff
   movwf   TMR1H    ;1
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H
   movwf   TMR1H    ;15
   bcf    T1CON,TMR1ON
   movlw  .256-.32+.3
   addwf  TMR1L
   bsf    T1CON,TMR1ON
   comf   PORTC  ;测C口输出
   retfie

比较:将16个TMR1H换成nop
测C口输出频率差别好大(仿真一样的)

 兰天白云 发表于 2008-11-21 23:47 PIC 单片机 ←返回版面    

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

 
 

使用特权

评论回复
8
wenzong|  楼主 | 2008-11-23 18:00 | 只看该作者

以前的问题有了答案了

以前我发了一个 奇怪的问题 

想用TMR1内部时钟来做电子钟
具体做法如下:

主时钟:4M

#define        T1_Const    (.65536-.31250+.7)

程序每隔31.25ms产生一次中断

后给TMR1赋初值:

        bcf     PIR1,TMR1IF
        bcf        T1CON,TMR1ON
        movlw    low(T1_Const)
        addwf    TMR1L
        movlw    high(T1_Const)
        skpnc    
        addlw    .1
        addwf    TMR1H
        bsf      T1CON,TMR1ON 

        comf     PORTC   ;从C口输出脉冲

        。。。。。。

        请100M数字示波器测RC0,显示频率16.0000Hz

奇怪的是,只将31250改为6250,使程序每隔6.25ms产生一次中断

#define        T1_Const    (.65536-.6250+.7)

请100M数字示波器测RC0,显示频率79.9896Hz

怎么不为80.0000Hz?
 
现在有了答案了:

为16.0000Hz的原因是:主时钟4M和示波器的误差约抵消了32ppm

为79.9896的原因是:79.9896的误差为(80-79.9896)/80=130ppm
1/6250=160ppm,主时钟4M和示波器的误差约为32ppm
160-32大约为130

猜测
bcf        T1CON,TMR1ON
该指令运行后TMR1L不会加一

使用特权

评论回复
9
martin| | 2008-11-24 09:48 | 只看该作者

使用了TMR1预分频器

如果使用了TMR1预分频器,无论是对TMR1L还是TMR1H进行写操作,都会使预分频器清零。

使用特权

评论回复
10
wenzong|  楼主 | 2008-11-24 18:22 | 只看该作者

致martin

没有使用了TMR1预分频器,仿真与实际不一致。

martin 发表于 2008-11-24 09:48 PIC 单片机 ←返回版面    

9楼: 使用了TMR1预分频器 

如果使用了TMR1预分频器,无论是对TMR1L还是TMR1H进行写操作,都会使预分频器清零。

 
 

使用特权

评论回复
11
仲十三| | 2008-12-12 15:47 | 只看该作者

打分得分

答复的

使用特权

评论回复
12
wenzong|  楼主 | 2008-12-16 15:01 | 只看该作者

为什么没人赞一个?

使用特权

评论回复
13
lxrlxr| | 2008-12-17 08:12 | 只看该作者

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

ICD2实际是芯片在运行

使用特权

评论回复
14
wenzong|  楼主 | 2008-12-21 12:20 | 只看该作者

我已测出

我已测出
bcf    T1CON,TMR1ON
这条指令运行后TMR1L不会加一(软件仿真加一);

使用特权

评论回复
15
xsl.| | 2009-2-16 00:45 | 只看该作者

这种事情有时确实很犯人

使用特权

评论回复
16
stghl| | 2009-2-16 20:57 | 只看该作者

麻烦

超级**烦,精度要高得看你的晶振!定时器只读不写呀!
这样精度就能保证

使用特权

评论回复
17
pjliuxw| | 2009-2-17 09:43 | 只看该作者

用CCP自动填装

如果作定时用,最好是启动定时器后不要去经常关闭,最好是使用CCP自动填装。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

158

帖子

1

粉丝