PCA模块用作软件定时器 下载本文

内容发布更新时间 : 2024/12/23 21:47:45星期一 下面是文章的全部内容请认真阅读。

通过置位CCAPMn寄存器的ECOM和MAT位,可使PCA模块用作软件定时器(上图)。

PCA定时器的值与模块捕获寄存器的值相比较,当两者相等时,如果位CCFn(在CCON特殊功

能寄存器中)和位ECCFn(在CCAPMn特殊功能寄存器中)都置位,将产生中断。 先写

Write to CCAPnL 后写

Write to CCAPnH CCON

- ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn CCAPMn CCAPnH CCAPnL

使能16-Bit comparator 匹配 CH CL (To CCFn) PCA中断 0 0 1 0 0 1 0

PCA Software Timer Mode / PCA模块的16位软件定时器模式/PCA比较模式 CF CR CCF1 CCF0

16位软件定时器模式结构图如下图所示。

[CH,CL]每隔一定的时间自动加1,时间间隔取决于选择的时钟源。例如,当选择的时

钟源为SYSclk/12,每12个时钟周期[CH,CL]加1。当[CH,CL]增加到等于[CCAPnH, CCAPnL]

时,CCFn=1,产生中断请求。如果每次PCA模块中断后,在中断服务程序中断给[CCAPnH,

CCAPnL]增加一个相同的数值,那么下次中断来临的间隔时间T也是相同的,从而实现了定时

功能。定时时间的长短取 决于时钟源的选择以及PCA计数器计数值的设置。下面举例说明PCA

计数器计数值的计算方法。 假设,系统时钟频率SYSclk = 18.432MHz,选择的时钟源为SYSclk/12,定时时间T为5ms,则

PCA计数器计数值为:

PCA计数器的计数值 = T / (( 1 / SYSclk )×12 ) = 0.005 / (( 1 / 18432000)×12 ) = 7680 (10进制数) = 1E00H (16进制数)

也就是说,PCA计时器计数1E00H次,定时时间才是5ms,这也就是每次给[CCAPnH,

CCAPnL]增加的数值(步长)。

PCA的16位软定时器显示在示波器上面的波形一直没有变化。我的程序是定时让一个IO口电平翻转,示波器上面应该有方波,随着[CCAPnH,CCAPnL]的值的改变,方波的频率应该会变化。但是示波器上的方波固定显示7Hz左右。奇怪了!难道那个寄存器没设置?

我翻开Datasheet,仔细阅读,终于发现了问题所在。“如果每次PCA模块中断后,在中断服务程序中断给[CCAPnH,CCAPnL]增加一个相同的数值,那么下次中断来临的间隔时间T也是相同的,从而实现了定时功能。”“增加”二字被我忽略了。实质上PCA16位软定时器与定时器0和定时器1有区别,PCA16软定时器要给初装值增加一个初装值。后面的例程里面是这样处理的:将初装值赋给一个变量value,等value给[CCAPnH,CCAPnL]重装后,让value自增一个value值,即value+=0x039A。我之前的程序参考了例程,看到里面value的自增程序,但是没去理解,以为例程在干别的功能,我就直接把那几句删了。后果想当严重!

下面的程序是正确的,作为参考: sbit LED=P1^0; unsigned int value; void main() {

//PCA16定时器 CCON=0; CL=0; CH=0;

CMOD=0x00;

value=0x039A;//定时大约1ms CCAP0L=value; CCAP0H=value>>8; value+=0x039A;

CCAPM0=0x49;//设置PCA为16位软定时器 CR=1; EA=1; while(1) {} }

void PCA_isr() interrupt 7 using 1 {

CCF0=0;//清0中断标志 CCAP0L=value;

CCAP0H=value>>8;//定时大约1ms value+=0x039A;

LED=~LED; }