|
首先想请教几个问题: 1、定时器额 TCON 是不是在手动更新这个设置位置 1 后,在启动定时器后要将其清零 ?
2、定时器在初次设置TCFG0 TCFG1 TCNTBn TCMPBn 后是不是就对TCON 置 手动更新位,此时要不要把自动装载这个位打开?
3、定时器启动时 是不是 要把“自动装载打开”?
4、如果我要同时开启多个定时器时 是一次性对TCON 直接把所有定时器启动,如:TCON=0x599919,
为什么我不同时对TCON赋值 而是分别的 对某一个定时器启动时,老是会出现只有1、2个定时器才能用,有时就一个?
(我的分别启动定时器,是利用“移位” 对相应的开启位和自动重载位置1,没有影响其他位,并且我把手动更新位给清零了)
我的问题是同时启动4个定时器时,不能正常工作,只有1——2个定时器在工作,其他的基本没动,还有就是我启动1、2、3定时器时 可以很正常的工作,中断函数没问题,主要是在定时器设置上不知道对不对。
贴源码:
void TimeN_Init()
{
char i=0,j=0;
rTCON=0;
rTCFG0=0;
rTCFG1=0;
rTCNTB0=0;
rTCMPB0=0;
rTCNTB1=0;
rTCMPB1=0;
rTCNTB2=0;
rTCMPB2=0;
rTCNTB3=0;
rTCMPB3=0;
rTCNTB4=0;
rTCFG0=0xf9f9;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(((Div_Val>>j)&0x01)==1) //Div_Val=0x2 选择1/8 分割
{
rTCFG1|=1<<((i*4)+j);
}
else
{
rTCFG1&=~(1<<((i*4)+j));
}
}
}
rTCON|=1<<4;
}
void TimeN_Install(U8 Time_No,long SetTime_us)
{
char i=0,ipos1=0,ipos2=0;
switch(Time_No)
{
case 0:
{
rTCNTB0=SetTime_us/40;
rTCMPB0=SetTime_us/80;
}
break;
case 1:
{
rTCNTB1=SetTime_us/40;
rTCMPB1=SetTime_us/80;
}
break;
case 2:
{
rTCNTB2=SetTime_us/40;
rTCMPB2=SetTime_us/80;
}
break;
case 3:
{
rTCNTB3=SetTime_us/40;
rTCMPB3=SetTime_us/80;
}
break;
case 4:
{
rTCNTB4=SetTime_us/40;
}
break;
}
if(Time_No>0)
{
ipos1=8;
ipos2=1;
}
else
{
ipos1=0;
ipos2=0;
}
if(Time_No==4)
{
rTCON |=1<<21;
rTCON |=1<<22;
}
else
for(i=0;i<4;i++)
{
if(((rTCON_TN_VAL>>i)&0x1)==1)
{
rTCON|=1<<((Time_No-ipos2)*4+i+ipos1);
}
else
{
rTCON&=~(1<<((Time_No-ipos2)*4+i+ipos1));
}
}
}
void TimeN_Start(U8 Time_No)
{
if(Time_No>0)
{
if(Time_No==4)
{
rTCON |=1<<((Time_No-1)*4+8+2);
}
else
{
rTCON |=1<<((Time_No-1)*4+8+3);
rTCON&=~(1<<((Time_No-1)*4+8+2));
}
rTCON |=1<<((Time_No-1)*4+8+0);
//rTCON &=~(1<<((Time_No-1)*4+8+1));
rTCON&=~(1<<((Time_No-1)*4+8+1));
//rTCON=0x500000;
}
else
{
rTCON |=1<<((Time_No-0)*4+3);
rTCON |=1<<((Time_No-0)*4+0);
rTCON &=~(1<<((Time_No-0)*4+1));
rTCON &=~(1<<((Time_No-0)*4+2));
//rTCON=0x19;
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|