各位好,我用STC8的芯片PCA软件延时功能,有个问题请教各位:
延时函数是:
void delay(U8 ccapH,U8 ccapL)
{
CCON=0;
CL=0;
CH=0;
CMOD=5; // 计数源为系统时钟4分频
CCAP0L=ccapL;
CCAP0H=ccapH;
CCAPM0=0x49; // 软件延时模式、允许匹配中断
CR=1; // 启动 PCA 计数器
while(~PCAflag); // 等待中断函数结束标志,PCAflag 这个变量在中断函数中置1
PCAflag=0;
}
复制代码
中断函数是:
void PCA()interrupt 7 //软件延时中断函数
{
CCF0=0; // 清除 PCA 匹配中断标志
CR=0; // 关闭 PCA 计数器
//CCAPM0=0x48; // 软件延时模式(ECOM位和MAT位)、禁止匹配中断
PCAflag=1;
}
复制代码
调用函数 delay 后,没反应,用keil调试发现,程序停在循环 while(~PCAflag); 中,也就是说,PCAflag 的值始终为0,但中断函数的最后我加了一句PCAflag=1; ,我觉得是中断函数出了问题,这句没执行,不知什么原因,望各位不吝赐教,谢谢。
补充说明:
厂家手册说:“如果每次PCA模块中断后,在中断服务程序中断给 CCAPnH,CCAPnL 增加一个相同的数值,那么下次中断来临的间隔时间T也是相同的,从而实现了定时功能”。但我是用来延时一次的,一次中断后,就不需要了,所以在中断函数中用 PCAflag 这个变量指示延时函数delay结束循环的,所以没给 CCAPnH,CCAPnL 这两个变量增加相同的值。我是在DHT11温湿度通信中用delay这个函数来延时的,因为用传统的延时函数在keil调试时发现差别太大,无法实现准确的延时(不知是否我对keil 还不太了解),故而使用STC的PCA软件延时功能。
还有个问题:
为了搞清楚PCA的软件延时功能,我把官方的例程直接烧到单片机里,可以运行,但修改CMOD的值后(计时脉冲源),就不行了,不知什么原因? |