打印

出一道题目:如何对 capture 的位数进行扩展?

[复制链接]
2539|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
icmap|  楼主 | 2008-10-26 18:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
hgjinwei| | 2008-10-26 20:26 | 只看该作者

允许T2溢出中断

使用特权

评论回复
板凳
icmap|  楼主 | 2008-10-26 21:14 | 只看该作者

T2溢出中断只是满足了时间处理的要求

关键的问题没解决。

使用特权

评论回复
地板
hgjinwei| | 2008-10-26 21:24 | 只看该作者

刚测试了一下这个程序(软件仿真)

晶振12M,捕捉位数为24,软件仿真时,捕捉1HZ信号,平均误差为4us.
;/*******************************************************************************
;**    T2自动捕捉测试程序
;********************************************************************************/

OVERTIME             EQU    040H    ;// 溢出次数软计数
RCAP_BANK0    EQU    050H
RCAP_BANK1    EQU    051H
RCAP_BANK2    EQU    052H

RCAP_READ    BIT        010H

ORG    0000H
;// 主程序入口
    JMP        MAIN
ORG    002BH
;// T2定时器中断入口
    JMP        INT_Timer2

ORG    0050H
;// 主程序
MAIN:
    MOV        SP,#07FH
    ;// 计数单元清零
    CLR        A
    MOV        OVERTIME,A
    MOV        TH2,A
    MOV        TL2,A
    ;// 清零完毕
    MOV        T2CON,#00001101B;// T2工作于16位捕捉

    SETB    ET2
    SETB    EA

LOOP:
    JNB    RCAP_READ,NETX
    CLR    RCAP_READ        
    SJMP    LOOP            ;// 虚拟捕捉处理程序
NETX:
    ORL    PCON,#01H
    SJMP    LOOP

;//    T2中断服务程序
INT_Timer2:
    JBC        EXF2,INT_NEXT
    ;// 溢出中断
    INC        OVERTIME
    CLR        TF2
    RETI
INT_NEXT:
    MOV        TL2,#0AH            ;// 0AH = 2("JBC EXF2,INT_NEXT")+2("MOV TL2,#4")+2("JMP INT_Timer2")+4(中断响应修正)
    MOV        TH2,#0           ;// 为了减小捕捉误差,先清零
    MOV        RCAP_BANK0,RCAP2L
    MOV        RCAP_BANK1,RCAP2H
    MOV        RCAP_BANK2,OVERTIME    
    MOV        OVERTIME,#0
    SETB       RCAP_READ
    RETI         
END

使用特权

评论回复
5
hgjinwei| | 2008-10-26 22:02 | 只看该作者

不好意思,打错字了,是16位捕捉

修改代码如下,不过

;/*******************************************************************************
;**    T2自动捕捉测试程序
;********************************************************************************/

OVERTIME    EQU        040H    ;// 溢出次数软计数
RCAP0        EQU        041H
RCAP1        EQU        042H
RCAP_BANK0    EQU        050H
RCAP_BANK1    EQU        051H
RCAP_BANK2    EQU        052H

RCAP_READ    BIT        010H

ORG    0000H
;// 主程序入口
    JMP        MAIN
ORG    002BH
;// T2定时器中断入口
    JMP        INT_Timer2

ORG    0050H
;// 主程序
MAIN:
    MOV        SP,#07FH
    ;// 计数单元清零
    CLR        A
    MOV        RCAP0,A
    MOV        RCAP1,A
    MOV        OVERTIME,A
    MOV        TH2,A
    MOV        TL2,A
    ;// 清零完毕
    MOV        T2CON,#00001101B;// T2工作于16位捕捉

    SETB    ET2
    SETB    EA

LOOP:
    JNB        RCAP_READ,NETX
    CLR        RCAP_READ        
    SJMP    LOOP            ;// 虚拟捕捉处理程序
NETX:
    ORL        PCON,#01H
    SJMP    LOOP

;//    T2中断服务程序
INT_Timer2:
    JBC        EXF2,INT_NEXT
    ;// 溢出中断
    INC        OVERTIME
    CLR        TF2
    RETI
INT_NEXT:
    PUSH       PSW
    PUSH       ACC
    CLR        C
    MOV        A,RCAP2L
    SUBB    A,RCAP0
    MOV        RCAP_BANK0,A
    MOV        RCAP0,RCAP2L

    MOV        A,RCAP2H
    SUBB    A,RCAP1
    MOV        RCAP_BANK1,A
    MOV        RCAP1,RCAP2H

    MOV        A,OVERTIME
    SUBB    A,#0
    MOV        RCAP_BANK2,A
    CLR        A    
    MOV        OVERTIME,A

    SETB    RCAP_READ
    POP     ACC
    POP     PSW
    RETI        
END    

使用特权

评论回复
6
hgjinwei| | 2008-10-26 22:31 | 只看该作者

我个人认为中断中修改TH2,TL2并没有什么不好

因为我用的是汇编,修改TH2,TL2所带来的定时误差我可以修正,比如我不是对TL2清零,而是送一个修正值.不过中断所带来的误差却是没办法的.

使用特权

评论回复
7
icmap|  楼主 | 2008-10-26 23:13 | 只看该作者

hgjinwei 的方法很好

本帖最后由 icmap 于 2010-2-10 14:05 编辑

hgjinwei 的方法很好

使用特权

评论回复
8
hgjinwei| | 2008-10-27 07:36 | 只看该作者

请教楼主一个弱智的问题

楼主你那汇编伪指令是不是所有汇编通用的还是只针对编译器.
我每次写纯汇编程序时都是自己分配内存,太累了.

使用特权

评论回复
9
hgjinwei| | 2008-10-27 07:43 | 只看该作者

刚试过了,在keil里也可以使用

不过那个BIT怎么用伪指令定义,还请楼主赐教. /*不好意思,我刚接触汇编不久*/

使用特权

评论回复
10
eagle758| | 2008-10-27 08:43 | 只看该作者

icmap:解释下你的思路?

使用特权

评论回复
11
xwj| | 2008-10-27 08:56 | 只看该作者

问题多多

1、占用全部的CPU资源
2、不允许中断


除非CPU什么的不敢,光计数

使用特权

评论回复
12
5880527| | 2008-10-27 10:18 | 只看该作者

有PCA功能的单片机做起来应该没什么问题

  

使用特权

评论回复
13
icmap|  楼主 | 2008-10-27 19:34 | 只看该作者

回复 hgjinwei

本帖最后由 icmap 于 2010-2-10 14:09 编辑

用 ds 定义变量是 ASM51 语言的标准方法。<br />很多编译器都支持这种定义,如万利 Medwin 和 Keil C 等都支持,不支持的是不合格的 ASM51 编译器。<br /><br />ASM51 语言说明:<br />http://www.tiancikj.com/netsoft/smyy/ASM.pdf<;br />

使用特权

评论回复
14
dengm| | 2008-10-27 20:14 | 只看该作者

要"环保", PUSH PSW; PUSH ACC; POP ACC; POP PSW

使用特权

评论回复
15
hgjinwei| | 2008-10-27 21:13 | 只看该作者

晕~

只是想测试一下想法,居然忘了"环保"了.看来"环保意识"还有待加强啊

使用特权

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

本版积分规则

11

主题

180

帖子

0

粉丝