搜索
bottom↓
回复: 2

求教 2440 的定时器设置问题

[复制链接]

出0入0汤圆

发表于 2010-11-28 14:20:42 | 显示全部楼层 |阅读模式
首先想请教几个问题: 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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2010-11-28 14:21:10 | 显示全部楼层
请各位指点下 ,本人初次学这个

出0入0汤圆

 楼主| 发表于 2010-12-1 00:49:06 | 显示全部楼层
无人回应,只有自己解决,截贴
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 10:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表