#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 呢??
我捕捉了 有的时候值是正确的 有的时候就像这样不正确 ? 这是问什么呢 ??
while ( 1 )
{
if ( TF2 = 1 ) // 应该是 if ( TF2 == 1 ) 吧
{
TT2++ ;
TF2 = 0 ;
}
正如 1楼说的 if ( TF2 = 1 ) 也能编译通过?
哦 谢谢 ! 编译是通过了 我也没检查到
不过改成 == 后 ,还是值不正确
那里不影响curTime 的值 ? 郁闷
curTime = RCAP2H + RCAP2L 你这个东西能这么加吗? 我不是很清楚RCAP2H、RCAP2L是什么意思?
是不是应该 (curTime = RCAP2H << 0x08 + RCAP2L) ???
放在中断函数中试试啊,感觉你在中断外面做的加法正好发生了t2中断,那RCAP2H、RCAP2L就变化了
引用: 引用 5 楼 youngbird221 的回复:
哦 谢谢 ! 编译是通过了 我也没检查到
不过改成 == 后 ,还是值不正确
那里不影响curTime 的值 ? 郁闷
汗,这也能编译通过?编译器有问题吧。。?
另外,你这个是什么单片机啊?那两个寄存器是啥我也不懂,帮顶吧。。
看上去是通过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 ;
}
}
=====
建议再细看下书
RCAP2H 和 RCAP2L 是T2工作在捕获方式下的寄存器
在你设置的条件下会自动把 TH2和TL2内容自动装载到RCAP2H 和 RCAP2L里。
是的 兄弟很强 这都看出来了 完成的程序太多我没贴上来 因为也是出现curTime 值不对的问题 我就把那程序的一部分:计算curTime 的值的程序简写了下 看能不能得到正确的值 但是得不出来
所以来求大家的帮助来了
谢谢你的解答 我正研究你的解答 。。。。。。
他是在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老是算不对 所以才写个简单的看哪里出问题了 !
引用: 引用 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引起捕获
引用: 引用 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引起捕获