4854|15

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请大家帮忙  单片机编程的问题 !! 谢谢 [复制链接]

#include
#include

#define unchar unsigned char
#define VALID   1
#define INVALID 0

unchar TT2 ;
int preCounter , curCounter ;
long preTime , curTime ;

//设置定时器T2
void T2_set ()
{
        //T2中断 方式1工作
        T2CON = 0x0d;
        //T2MOD = 0x00;
        //启动定时 T0
        TR2 = VALID;
}

void main ()
{
        T2_set () ;
       
        while ( 1 )
        {
                if ( TF2 = 1 )
                {
                        TT2++ ;
                        TF2 = 0 ;
                }
               
                T2EX = 1 ;
                curTime =  RCAP2H  + RCAP2L ;
                T2EX = 0 ;
        }
       
}


下面是变量的值
RCAP2L : 100,64h,01100100b DATA(00CAH)
RCAP2H :235,0EBh,11101011b DATA(00CBH)  
curTime : 309,00000135h DATA(0017H)


为什么 curTime 不是等于 100+235 = 335 呢??
我捕捉了 有的时候值是正确的  有的时候就像这样不正确 ?  这是问什么呢 ??




最新回复

多谢大家帮忙    问题解决了   程序调通了  结贴吧  详情 回复 发表于 2009-2-27 18:06
点赞 关注

回复
举报

56

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
while ( 1 )
{
if ( TF2 = 1 )   // 应该是 if ( TF2 == 1 ) 吧
{
TT2++ ;
TF2 = 0 ;
}
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
友情up
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
友情up
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

5
 
正如 1楼说的 if ( TF2 = 1 )  也能编译通过?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
哦  谢谢  !  编译是通过了  我也没检查到  
不过改成 ==  后 ,还是值不正确   
那里不影响curTime 的值  ? 郁闷
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

7
 
curTime =  RCAP2H  + RCAP2L 你这个东西能这么加吗? 我不是很清楚RCAP2H、RCAP2L是什么意思?
是不是应该 (curTime =  RCAP2H << 0x08 + RCAP2L) ???
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

8
 
放在中断函数中试试啊,感觉你在中断外面做的加法正好发生了t2中断,那RCAP2H、RCAP2L就变化了
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 5 楼 youngbird221 的回复:
哦  谢谢  !  编译是通过了  我也没检查到  
不过改成 ==  后 ,还是值不正确  
那里不影响curTime 的值  ? 郁闷

汗,这也能编译通过?编译器有问题吧。。?
另外,你这个是什么单片机啊?那两个寄存器是啥我也不懂,帮顶吧。。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

10
 
看上去是通过T2的捕获方式来测量频率之类的,但程序本身有很多问题:
unchar TT2 ;
int preCounter , curCounter ;
long preTime , curTime ; //根据下面所写,curTime选int就行了,long浪费空间

//设置定时器T2
void T2_set ()
{
//T2中断 方式1工作         选用中断方式,却没有使能EA,ET2,也没写中断函数,不过看下面程序用的好象是查询
T2CON = 0x0d;
//T2MOD = 0x00;
//启动定时 T0
TR2 = VALID;
}

void main ()
{
  T2_set () ;

  while ( 1 )
  {
    if ( TF2 = 1 )    //如1楼所述
    {
        TT2++ ;
        TF2 = 0 ;
    }

    T2EX = 1 ;  //T2EX实际上表示的是P1.1口,你这里的操作是输出1到P1.1口,有何意义??
    curTime =  RCAP2H  + RCAP2L ;     //如6楼所述,curTime =  RCAP2H * 256 + RCAP2L ,这个放在主循环 中也不好,虽然在新的T2外部中断来前RCAP2H 和 RCAP2L 不变,但反复执行此句也是多余的。最好采用在中断服务中执行。若采用查询,也放在if(EXF2 == 1){}里面
    T2EX = 0 ;
  }

}
=====

建议再细看下书
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

11
 
RCAP2H 和 RCAP2L 是T2工作在捕获方式下的寄存器  
在你设置的条件下会自动把 TH2和TL2内容自动装载到RCAP2H 和 RCAP2L里。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

12
 
是的  兄弟很强 这都看出来了   完成的程序太多我没贴上来  因为也是出现curTime 值不对的问题  我就把那程序的一部分:计算curTime 的值的程序简写了下   看能不能得到正确的值  但是得不出来
所以来求大家的帮助来了

谢谢你的解答  我正研究你的解答  。。。。。。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

13
 
他是在T2EX引脚上出现负跳变时 EXF2置位 发生捕获的
我想给他一个高电平和低电平 使它有个负跳变 。

整个程序是这样的 : T2用作计时,TH2和TL2 我又用了个TT2 ,三个字节计时TH2溢出后给TT2一个1
T0定时200MS调用中断计算频率一次 ,还有一个自定义的16位的计数器TCounter,P1.0来一个信号TCounter加1.
200ms后 ,(curTime - pretTime )/TCounter .
curTime 就是根据TH2、TL2 和TT2算的 ,但是 curTime老是算不对  所以才写个简单的看哪里出问题了 !
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 12 楼 youngbird221 的回复:
他是在T2EX引脚上出现负跳变时 EXF2置位 发生捕获的
我想给他一个高电平和低电平 使它有个负跳变 。

整个程序是这样的 : T2用作计时,TH2和TL2 我又用了个TT2 ,三个字节计时TH2溢出后给TT2一个1
T0定时200MS调用中断计算频率一次 ,还有一个自定义的16位的计数器TCounter,P1.0来一个信号TCounter加1.
200ms后 ,(curTime - pretTime )/TCounter .
curTime 就是根据TH2、TL2 和TT2算的 ,但是 curTime老是算不对  …


如果只是测频率的话,将待测脉冲送至T2EX脚就行了,据你描述似乎你把信号送至p1.0脚去了,如果这样从硬件上就是错的,捕获方式可以看作外部中断一样--待测脉冲的下降沿引起捕获,而不是通过T2EX=1,再T2EX=0引起捕获
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 12 楼 youngbird221 的回复:
他是在T2EX引脚上出现负跳变时 EXF2置位 发生捕获的
我想给他一个高电平和低电平 使它有个负跳变 。

整个程序是这样的 : T2用作计时,TH2和TL2 我又用了个TT2 ,三个字节计时TH2溢出后给TT2一个1
T0定时200MS调用中断计算频率一次 ,还有一个自定义的16位的计数器TCounter,P1.0来一个信号TCounter加1.
200ms后 ,(curTime - pretTime )/TCounter .
curTime 就是根据TH2、TL2 和TT2算的 ,但是 curTime老是算不对  …


如果只是测频率的话,将待测脉冲送至T2EX脚就行了,据你描述似乎你把信号送至p1.0脚去了,如果这样从硬件上就是错的,捕获方式可以看作外部中断一样--待测脉冲的下降沿引起捕获,而不是通过T2EX=1,再T2EX=0引起捕获
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

16
 
多谢大家帮忙    问题解决了  
程序调通了  结贴吧
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表