打印

T2的脉宽测量到底怎么用啊?

[复制链接]
3045|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wpyan|  楼主 | 2009-10-26 10:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,我用T2脉宽测量来做遥控解码程序,遥控接收的信号直接输入到T2的引脚。在程序中,思路是这样的:每次T2中断就测量脉宽,通过脉宽测定来确定0和1,但是仿真器仿真和软件仿真都出现了下面问题:特定的脉宽可以产生中断,中断测量的脉宽也对,但是其他的脉宽连中断都进不去,不知道哪里设置出了问题的?
我的设置是这样的:上升沿触发,单边,用的芯片是69P55
沙发
warm_ice| | 2009-10-26 11:06 | 只看该作者
1.要查看规格书,规格书中对于T2所测量的信号是有要求的.确认您测量的信号符合此要求.
2.SH69P55在产生中断后硬件会自动清除掉IE,您需要在T2中断程序返回前重置IE,以便能响应下次中断.

使用特权

评论回复
板凳
wpyan|  楼主 | 2009-10-26 11:53 | 只看该作者
我需要测量的脉宽最小为0.56ms,这个脉宽可以产生中断,按照条件,大于0.56ms的也肯定能产生中断了,但是实际情况确不是这样的。比如10ms就不能产生中断,更长的时间也是不行的。另外,在程序中监控,中断是已经开了,即0.56ms的时候正常,可以中断,但是,改成10ms信号输入却不能产生中断了。因此我怎么也没搞明白怎么回事的。我是用这个T2来做遥控解码的。

使用特权

评论回复
地板
wpyan|  楼主 | 2009-10-26 11:57 | 只看该作者
中断里面是这样设置的:1。保存ACC值,2清IRQ,3读取脉宽,4,脉宽判断处理,5,开启中断,6,恢复ACC值
我特地谢了一个只含有T2中断的程序,也是这个情况的,这就排除了我其他的程序影响。结果还是一样。

使用特权

评论回复
5
warm_ice| | 2009-10-26 13:46 | 只看该作者
这样说比较难判断具体原因,能否将您的程序贴上来,我分析一下.谢谢!

使用特权

评论回复
6
wpyan|  楼主 | 2009-10-30 21:07 | 只看该作者
设置部分:

        LDI T2_MODEN,1111B        ;定义时钟源为8/4M=2us,上升沿触发。
        LDI T2_CON,1011B        ;定义成脉冲宽度测量模式,T2GO=1,在触发沿来到时候开始计数
;        LDI T2_MODEN,1111B        ;定义时钟源为8/4M=2us,上升沿触发。
        ORIM IE,0010B                ;开T2中断

中断处理部分:
;*********************************
;        T2中断处理
;*********************************
T2_INT:
        STA ACC_BUF,00H
        LDI IRQ,00H
;        BA1 ?ENDINT
        ANDIM IE,1011B                ;关T1中断,防止在解码过程中出现错误。
        LDA T2HH,07H
        STA T2HH_BUF,00H       
        LDA T2HL,07H
        STA T2HL_BUF,00H
        LDA T2LH,07H
        STA T2LH_BUF,00H       
        LDA T2LL,07H
        STA T2LL_BUF,00H        ;读起脉宽数值
       
        SBI T2LL_BUF,08H                 ;判断时间是否在0.4ms~0.7ms之间,即00C8H-015EH之间
        LDI TEMP2,0CH
        SBC T2LH_BUF,00H
        LDI TEMP2,00H
        SBC T2HL_BUF,00H
        LDI TEMP2,00H
        SBC T2HH_BUF,00H
        BNC ?ENDINT                        ;<0.4ms
        SBI T2LL_BUF,0EH                ;>0.4ms
        LDI TEMP2,05H
        SBC T2LH_BUF,00H
        LDI TEMP2,01H
        SBC T2HL_BUF,00H
        LDI TEMP2,00H
        SBC T2HH_BUF,00H
        BNC ?BIT0                        ;<0.7ms
       
        SBI T2LL_BUF,07H                 ;判断时间是否在1.55ms~1.85ms之间,即0307H-039DH之间
        LDI TEMP2,00H
        SBC T2LH_BUF,00H
        LDI TEMP2,03H
        SBC T2HL_BUF,00H
        LDI TEMP2,00H
        SBC T2HH_BUF,00H
        BNC ?ENDINT                        ;<1.55ms
        SBI T2LL_BUF,0DH                ;>1.55ms
        LDI TEMP2,09H
        SBC T2LH_BUF,00H
        LDI TEMP2,03H
        SBC T2HL_BUF,00H
        LDI TEMP2,00H
        SBC T2HH_BUF,00H
        BNC ?BIT1                        ;<1.85ms
;        LDI IR0L,00H                        ;非0,非1,则清code
;        LDI IR0H,00H
;        LDI IR1L,00H
;        LDI IR1H,00H
;        LDI IR2L,00H
;        LDI IR2H,00H
;        LDI IR3L,00H
;        LDI IR3H,00H                       
        JMP ?ENDINT
?BIT0:
;        LDI TEMP3,00H
;        ADI TEMP3,00H                ;清除C值
        LDA IR0L,00H
        ADDM IR0L,00H
        LDA IR0H,00H
        ADCM IR0H,00H
        LDA IR1L,00H
        ADCM IR1L,00H
        LDA IR1H,00H
        ADCM IR1H,00H
        LDA IR2L,00H
        ADCM IR2L,00H
        LDA IR2H,00H
        ADCM IR2H,00H
        LDA IR3L,00H
        ADCM IR3L,00H
        LDA IR3H,00H
        ADCM IR3H,00H
       
        ANDIM IR0L,1110B
       
        JMP ?JDDATA
?BIT1:
;        LDI TEMP3,00H
;        ADI TEMP3,00H                ;清除C值
        LDA IR0L,00H
        ADDM IR0L,00H
        LDA IR0H,00H
        ADCM IR0H,00H
        LDA IR1L,00H
        ADCM IR1L,00H
        LDA IR1H,00H
        ADCM IR1H,00H
        LDA IR2L,00H
        ADCM IR2L,00H
        LDA IR2H,00H
        ADCM IR2H,00H
        LDA IR3L,00H
        ADCM IR3L,00H
        LDA IR3H,00H
        ADCM IR3H,00H
       
        ORIM IR0L,0001B
       
        JMP ?JDDATA
?JDDATA:
        LDA IR0L,00H
        STA TEMP2,00H
        EORIM TEMP2,1111B
        SUB IR1L,00H
        BNZ ?ENDINT
        LDA IR0H,00H
        STA TEMP2,00H
        EORIM TEMP2,1111B
        SUB IR1H,00H       
        BNZ $+2
        JMP ?GETIRCODE
;        LDI IR0L,00H                        ;非0,非1,则清code
;        LDI IR0H,00H
;        LDI IR1L,00H
;        LDI IR1H,00H
;        LDI IR2L,00H
;        LDI IR2H,00H
;        LDI IR3L,00H
;        LDI IR3H,00H
;        JMP ?ENDINT                ;GET IRCODE       
?GETIRCODE:
        LDA IR1L,00H
        STA IRCODEL,00H
        LDA IR1H,00H
        STA IRCODEH,00H
        ORIM FLAG,0001B                ;FLAG,0, REMOTE ok
        JMP ?ENDINT       
?ENDINT:
        ANDIM IRQ,1101B
        ORIM IE,0100B
        ORIM IE,0010B                ;开T2,开T1
;        ORIM T2_CON,1000B
        LDA ACC_BUF,00H
        RTNI



这个就是相关部分的代码的。
帮我看看怎么回事?

使用特权

评论回复
7
wpyan|  楼主 | 2009-11-2 21:03 | 只看该作者
nobody know why.....

使用特权

评论回复
8
warm_ice| | 2009-11-3 08:47 | 只看该作者
本帖最后由 warm_ice 于 2009-11-3 11:50 编辑

昨天有些急事在处理.
我请了9楼的兄弟帮你看了,按他的方法试试看是否可以,谢谢!

使用特权

评论回复
9
juginhine| | 2009-11-3 11:43 | 只看该作者
本帖最后由 juginhine 于 2009-11-3 11:52 编辑

lz可以將timer2的初始化分開設置,先設置預分頻和觸發邊沿,然后設置為脈寬測量模式和單邊沿觸發,最后啟動timer2。同時在設置timer2的預分頻的時候,要考慮timer2的計數是否能夠包含你整個紅外波的最大脈寬量程。按照lz所述2us計數一次的話,timier2最大量程應該是FFFF×2=131.07ms,所以10ms應該是可以測量到的。
timer2設置請參考如下:
     LDI T2_MODEN,1111B   
     LDI T2_CON,0011B        
    ORIM T2_CON, 1000B
    ......

同時lz代碼有一點需要注意
?JDDATA:
        LDA IR0L,00H
        STA TEMP2,00H
        EORIM TEMP2,1111B
        SUB IR1L,00H
        BNZ ?ENDINT
        LDA IR0H,00H
        STA TEMP2,00H
        EORIM TEMP2,1111B
        SUB IR1H,00H        
        BNZ $+2      <---按照lz意思應該跳轉到?ENDINT,可是因為下面全部注釋,其實跳轉到?GETIRCODE
        JMP ?GETIRCODE
;        LDI IR0L,00H                        
;        LDI IR0H,00H
;        LDI IR1L,00H
;        LDI IR1H,00H
;        LDI IR2L,00H
;        LDI IR2H,00H
;        LDI IR3L,00H
;        LDI IR3H,00H
;        JMP ?ENDINT                ;GET IRCODE        
?GETIRCODE:

使用特权

评论回复
10
wpyan|  楼主 | 2009-11-3 20:08 | 只看该作者
现在在每次用go from reset 可以进入中断,但是全速运行停止后,则出现T2中断被关闭现象,如果用F9一步一步走,则可以看到T2中断是开的。我检查了IE的设置,没发现有出错的问题?难道程序跑飞了?还是T2引起的?

使用特权

评论回复
11
wpyan|  楼主 | 2009-11-4 00:15 | 只看该作者
问题解决了,主要出问题还是出在中断嵌套上面,上面程序把ORIM IE,0100B注释了后就OK了,每次能进中断了,T1是定时中断,定时时间4ms',目前解决方法是在T1中断中开启T2中断,这样,T2的优先级比T1高了,因此,解决了中断关闭的问题。

10楼时候说的情况应该没有跟踪到T1中断导致看不到问题出在哪里的。。。晕

谢谢各位~

使用特权

评论回复
12
warm_ice| | 2009-11-4 09:13 | 只看该作者
很高兴您的问题解决了,还有2点我想说明一下,供您参考!
1.程序只有在全速运行时才能进入中断,单步运行时会产生中断,但不会响应.
2.你说把ORIM IE,0100B注释后就OK了,这个主要是因为打开IE后,需要2条指令内退出中断,即倒数第2条为恢复累加器A的值,最后一条为RTNI.否则,超过2条指令,在退出前又产生了中断的话,这时IE被硬件清零,中断退出后,IRQ虽被置1,但IE为0,不会响应中断.

使用特权

评论回复
13
llljh| | 2009-11-5 22:25 | 只看该作者
好长的码,不过学到了不少东西

使用特权

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

本版积分规则

1

主题

7

帖子

0

粉丝