请大家帮忙  单片机编程的问题 !! 谢谢

gshlsh   2009-2-24 22:08 楼主
#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 呢??
我捕捉了 有的时候值是正确的  有的时候就像这样不正确 ?  这是问什么呢 ??




回复评论 (15)

while ( 1 )
{
if ( TF2 = 1 )   // 应该是 if ( TF2 == 1 ) 吧
{
TT2++ ;
TF2 = 0 ;
}
点赞  2009-2-25 08:21
友情up
点赞  2009-2-25 09:20
友情up
点赞  2009-2-25 09:20
正如 1楼说的 if ( TF2 = 1 )  也能编译通过?
点赞  2009-2-25 13:07
哦  谢谢  !  编译是通过了  我也没检查到  
不过改成 ==  后 ,还是值不正确   
那里不影响curTime 的值  ? 郁闷
点赞  2009-2-25 13:23
curTime =  RCAP2H  + RCAP2L 你这个东西能这么加吗? 我不是很清楚RCAP2H、RCAP2L是什么意思?
是不是应该 (curTime =  RCAP2H << 0x08 + RCAP2L) ???
点赞  2009-2-25 14:02
放在中断函数中试试啊,感觉你在中断外面做的加法正好发生了t2中断,那RCAP2H、RCAP2L就变化了
点赞  2009-2-25 16:44
引用: 引用 5 楼 youngbird221 的回复:
哦  谢谢  !  编译是通过了  我也没检查到  
不过改成 ==  后 ,还是值不正确  
那里不影响curTime 的值  ? 郁闷

汗,这也能编译通过?编译器有问题吧。。?
另外,你这个是什么单片机啊?那两个寄存器是啥我也不懂,帮顶吧。。
点赞  2009-2-25 19:04
看上去是通过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 ;
  }

}
=====

建议再细看下书
点赞  2009-2-25 22:47
RCAP2H 和 RCAP2L 是T2工作在捕获方式下的寄存器  
在你设置的条件下会自动把 TH2和TL2内容自动装载到RCAP2H 和 RCAP2L里。
点赞  2009-2-26 09:37
是的  兄弟很强 这都看出来了   完成的程序太多我没贴上来  因为也是出现curTime 值不对的问题  我就把那程序的一部分:计算curTime 的值的程序简写了下   看能不能得到正确的值  但是得不出来
所以来求大家的帮助来了

谢谢你的解答  我正研究你的解答  。。。。。。
点赞  2009-2-26 09:47
他是在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老是算不对  所以才写个简单的看哪里出问题了 !
点赞  2009-2-26 10:31
引用: 引用 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引起捕获
点赞  2009-2-26 12:53
引用: 引用 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引起捕获
点赞  2009-2-26 12:53
多谢大家帮忙    问题解决了  
程序调通了  结贴吧
点赞  2009-2-27 18:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复