nczcc 发表于 2012-6-13 22:39:14

STC12C5A60S2的pca用作16位定时器怎么设置?

stc12c5a60s2的pca用作16位软件定时器实现中断定时,
我遇到一个特别郁闷的问题,寄存器的设置如下,我没有置位CR,定时器中断却能产生,做了一个测试程序测试了很久,程序开始时不置位CR就会进入中断一次,不知怎么回事啊 实在郁闷,望高手指点
void pca_init()
{
CMOD=0x88;
CCON=0x00;
CCAPM0=0x49;
CCAP0L=0xcd;
CCAP0H=0x1c;
CL=0x00;
CH=0x00;
EA=1;
}
void pca_inter() interrupt 7
{
if(CCF0)
{
CCF0=0;
CL=0;
CH=0;
led=0;                  
}
}

jxcylxh 发表于 2012-6-14 00:00:27

有时候我得TR1都置0了,中断还是一样开。

nczcc 发表于 2012-6-14 01:17:21

您好 您的回复为什么看不到?

6K6K 发表于 2012-6-14 09:51:14

//T_Value0 = time(sec) * ,mm Fosc / 12, for 10ms @ 6MHz, T_Value = 0.01 * 6000000 / 12 = 5000
code uint16 T_Value1=MAIN_Fosc / 100 / 12;

void PCA_Timer_Init(void)
{
    CCON=0;               //Initial PCA control register
                            //PCA timer stop running
                            //Clear CF flag
                            //Clear all module interrupt flag
    CL=0;                   //Reset PCA base timer
    CH=0;
    CMOD=0x00;            //Set PCA timer clock source as Fosc/12
                            //Disable PCA timer overflow interrupt
    T_PCA1=T_Value1;
    CCAP1L=T_PCA1;
    CCAP1H=T_PCA1 >> 8;   //Initial PCA module-1
    T_PCA1+=T_Value1;
    CCAPM1=0x49;            //PCA module-1 work in 16-bit timer mode
                            //and enable PCA interrupt
    CR=1;                   //PCA timer start run
    EPCA_LVD=1;
}

//对STC52/54/56系列PCA中断是6,STC5A系列是7
void PCA_isr(void) interrupt 6
{
    if(CCF1)
    {
      CCF1=0;
      CCAP1L=T_PCA1;                  //重新设置PCA比较计数器的值,这是PCA定时器和普通定时器的重要区别
      CCAP1H=T_PCA1 >> 8;
      T_PCA1+=T_Value1;
      ...
    }
}

6K6K 发表于 2012-6-14 09:53:27

这一块在STC的datasheet里说的不明不白,我也是找了很久才知道的,希望能帮到你。

nczcc 发表于 2012-6-14 11:49:33

6K6K 发表于 2012-6-14 09:51 static/image/common/back.gif
//T_Value0 = time(sec) * ,mm Fosc / 12, for 10ms @ 6MHz, T_Value = 0.01 * 6000000 / 12 = 5000
code u ...

谢谢您的回复 stc单片机的pca定时器这两天看了特别多的资料 只是不知道是我单片机的问题还是哪点我没注意到

编了个测试程序,不置位CR,却总能进入中断一次,百思不得其解

另外您的代码中那个 EPCA_LVD=1;在pca只用作一个16位软件定时器时,需要设置该位吗?
程序中也没有置位EA啊?

是我哪儿理解错了吗?

nczcc 发表于 2012-6-14 12:44:47

有人遇到这问题吗?帮帮忙啊
{:cry:}

nczcc 发表于 2012-6-14 22:31:39

有人遇到过吗?一般的定时器会这样吗?

nczcc 发表于 2012-6-14 23:26:53

求高手忙中抽闲指点一二啊

nczcc 发表于 2012-6-15 00:25:45

有知道可能有哪些方面原因的也行啊指点指点

6K6K 发表于 2012-6-15 08:59:43

nczcc 发表于 2012-6-14 11:49 static/image/common/back.gif
谢谢您的回复 stc单片机的pca定时器这两天看了特别多的资料 只是不知道是我单片机的问题还是哪点我没注意 ...

需要EA=1,也需要开PCA那个中断
那是程序片段,不完整。

nczcc 发表于 2012-6-15 12:35:43

6K6K 发表于 2012-6-15 08:59 static/image/common/back.gif
需要EA=1,也需要开PCA那个中断
那是程序片段,不完整。

没有EPCA_LVD这一位啊

有个ELVD允许位

还有个PCA_PWM0寄存器 没见EPCA_LVD啊

是在IE中吗?

现在我不明白的是为什么没有置位CR测试程序在开始时却能产生且只产生一次中断,而如果置位CR,开始就产生一次中断,后来也能正常产生中断

这是为啥啊?

为啥没有置位CR,相当于没有运行定时器,定时器没开始运行,却产生了中断,这个STC的pca实现16位软件定时器的方式不该有问题啊

6K6K 发表于 2012-6-15 13:28:22

PCA和LVD是公用一个中断,所以ELVD应该就是EPCA_LVD。
另一个问题我也不清楚怎么回事,不好意思。

看你的程序,你是每次中断后将CL、CH清零,其实这个是不对的,CH、CL是多个PCA定时器公用的,如果使用了多个PCA定时器,这里就有问题了。我的那个程序是让CH、CL不停地计数,但每次中断改变比较值CCAP,这样多个PCA也不至于出问题。
在STC12C2052AD.pdf的301页有个简单的说明,但也不够详细。在309页就是我那个程序了。
http://stcmcu.com/datasheet/stc/STC-AD-PDF/STC12C2052AD.pdf

nczcc 发表于 2012-6-15 13:57:07

6K6K 发表于 2012-6-15 13:28 static/image/common/back.gif
PCA和LVD是公用一个中断,所以ELVD应该就是EPCA_LVD。
另一个问题我也不清楚怎么回事,不好意思。



嗯,谢谢您的回复!
我也看到了,只是在那里面我只用到pca的一个模块一个功能,那只是个测试程序,实际用时我需要让pca计时一段时间产生中断,在中断中停止运行pca,因此这样写的。

lee345 发表于 2012-6-15 13:59:28

中断程序内有问题,CCAPnL,CCAPnH增加一个相同的数值,下一次中断来临的间隔时间也是相同的

nczcc 发表于 2012-6-15 14:06:20

lee345 发表于 2012-6-15 13:59 static/image/common/back.gif
中断程序内有问题,CCAPnL,CCAPnH增加一个相同的数值,下一次中断来临的间隔时间也是相同的 ...

就用了pca的一个模块的一个功能,用做16软件定时器,这只是个测试程序,实际用时实现比如用一个按键来置位CR,进入中断执行中断程序并关闭pca,所以没有用递加数值的方法,不过不知道为啥还没有置位CR却总能进入中断一次呢?

nczcc 发表于 2012-6-15 14:23:33

我不知道是不是STC12C5A60S2单片机的pca用作16位软件定时器时有点问题还是我程序的问题,不知道你们明白我遇到的问题没?

就是测试程序中没有置位CR,运行时却总是会进入且只进入中断一次,

如果我置位CR的话,刚开始就进入中断一次,过定时的时间段后又会正常进入中断了

nczcc 发表于 2012-6-17 00:28:35

谢谢各位的帮忙,问题找到,需将CCON=0;放在CCAPM0=0x49;后面

原因不明

nczcc 发表于 2012-6-17 00:29:51

有没有知道为啥需要这样的?数据手册上从没提起过,数据手册上的例子也不是这样的

liyue52133 发表于 2012-7-6 22:47:06

这两天一直再搞PCA用做定时器
问题是PCA定时器能不能做4个相互独立的定时器呢?
开始命令为CR=1,意味着4个定时器都开始计数。这样来看好像不能单独控制。
但是同时作用的话,PCA0工作的时候,其余的PCA定时器都不能工作了。
如果独立使用的话,为什么还要说其单片机内部除了2个常规定时器外,还有4个定时器呢?

hpdell 发表于 2012-7-19 16:21:13

liyue52133 发表于 2012-7-6 22:47 static/image/common/back.gif
这两天一直再搞PCA用做定时器
问题是PCA定时器能不能做4个相互独立的定时器呢?
开始命令为CR=1,意味着4个 ...

同样迷惑中,

上路新手 发表于 2012-11-29 18:55:30

QQ404891290,加个好友吧

zhangzike 发表于 2013-8-21 22:51:22

6K6K 发表于 2012-6-14 09:53 static/image/common/back.gif
这一块在STC的datasheet里说的不明不白,我也是找了很久才知道的,希望能帮到你。 ...

我刚刚用到这个功能,但是也遇到了一些问题,在手册上说必须CCFn和ECCFn位都置位才能产生中断,在手册的例程当中没有提到ECCFn位,也可以产生中断,这是为什么?我用这个定时器和别的例程结合起来却进不了中断,这是为什么?

kuanglf 发表于 2014-6-12 11:40:11

记号备用
页: [1]
查看完整版本: STC12C5A60S2的pca用作16位定时器怎么设置?