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;
}
} 有时候我得TR1都置0了,中断还是一样开。 您好 您的回复为什么看不到? //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;
...
}
}
这一块在STC的datasheet里说的不明不白,我也是找了很久才知道的,希望能帮到你。 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啊?
是我哪儿理解错了吗?
有人遇到这问题吗?帮帮忙啊
{:cry:} 有人遇到过吗?一般的定时器会这样吗? 求高手忙中抽闲指点一二啊 有知道可能有哪些方面原因的也行啊指点指点 nczcc 发表于 2012-6-14 11:49 static/image/common/back.gif
谢谢您的回复 stc单片机的pca定时器这两天看了特别多的资料 只是不知道是我单片机的问题还是哪点我没注意 ...
需要EA=1,也需要开PCA那个中断
那是程序片段,不完整。
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位软件定时器的方式不该有问题啊 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 6K6K 发表于 2012-6-15 13:28 static/image/common/back.gif
PCA和LVD是公用一个中断,所以ELVD应该就是EPCA_LVD。
另一个问题我也不清楚怎么回事,不好意思。
嗯,谢谢您的回复!
我也看到了,只是在那里面我只用到pca的一个模块一个功能,那只是个测试程序,实际用时我需要让pca计时一段时间产生中断,在中断中停止运行pca,因此这样写的。
中断程序内有问题,CCAPnL,CCAPnH增加一个相同的数值,下一次中断来临的间隔时间也是相同的 lee345 发表于 2012-6-15 13:59 static/image/common/back.gif
中断程序内有问题,CCAPnL,CCAPnH增加一个相同的数值,下一次中断来临的间隔时间也是相同的 ...
就用了pca的一个模块的一个功能,用做16软件定时器,这只是个测试程序,实际用时实现比如用一个按键来置位CR,进入中断执行中断程序并关闭pca,所以没有用递加数值的方法,不过不知道为啥还没有置位CR却总能进入中断一次呢? 我不知道是不是STC12C5A60S2单片机的pca用作16位软件定时器时有点问题还是我程序的问题,不知道你们明白我遇到的问题没?
就是测试程序中没有置位CR,运行时却总是会进入且只进入中断一次,
如果我置位CR的话,刚开始就进入中断一次,过定时的时间段后又会正常进入中断了 谢谢各位的帮忙,问题找到,需将CCON=0;放在CCAPM0=0x49;后面
原因不明 有没有知道为啥需要这样的?数据手册上从没提起过,数据手册上的例子也不是这样的 这两天一直再搞PCA用做定时器
问题是PCA定时器能不能做4个相互独立的定时器呢?
开始命令为CR=1,意味着4个定时器都开始计数。这样来看好像不能单独控制。
但是同时作用的话,PCA0工作的时候,其余的PCA定时器都不能工作了。
如果独立使用的话,为什么还要说其单片机内部除了2个常规定时器外,还有4个定时器呢? liyue52133 发表于 2012-7-6 22:47 static/image/common/back.gif
这两天一直再搞PCA用做定时器
问题是PCA定时器能不能做4个相互独立的定时器呢?
开始命令为CR=1,意味着4个 ...
同样迷惑中, QQ404891290,加个好友吧 6K6K 发表于 2012-6-14 09:53 static/image/common/back.gif
这一块在STC的datasheet里说的不明不白,我也是找了很久才知道的,希望能帮到你。 ...
我刚刚用到这个功能,但是也遇到了一些问题,在手册上说必须CCFn和ECCFn位都置位才能产生中断,在手册的例程当中没有提到ECCFn位,也可以产生中断,这是为什么?我用这个定时器和别的例程结合起来却进不了中断,这是为什么? 记号备用
页:
[1]