3DG11 发表于 2011-9-1 21:52:24

熟悉STC的PCA模块的同学进来帮帮忙 实在想不明白的问题

这次设计使用STC12C5608AD第一次用PCA模块 使用高速输出模式,使用demo程序,一开始频率很低,加了定义时钟分频CLK_DIV=0x00;,工作正常
输出4khz 40khz 400hz都正常    修改T100KHZ的值即可改变延时值改变频率   原程序是输出100k 所以变量起的这个名字
程序需要控制几个端口状态,现在只要在程序里修改任何其余端口的状态 比如FIL_B=0, 即使状态不变 比如FIL_A=1原本就高电平 还是高电平 有这句就出故障输出频率变为45.76HZ 不管以前什么频率端口状态可正常改变就是pca输出频率变了 实在搞不明白
后来发现使用P1=0xDF这类改变端口状态,可以正常工作 ,pca也正常, 现在只能这样调试看看硬件是否正常
可要改变端口的有10多个,而且各自独立,不使用位操作很麻烦    现在情况可能是一出现位操作就不正常 。。。
第一次用PCA模块可能还不熟悉大家给看看


#include <intrins.h>
#include <absacc.h>
#include <STC12C5608.h>

#define FOSC 12000000L                      //12MHZ晶振
#define T100KHz (FOSC / 4 / 4000)//延时值


typedef unsigned char BYTE;
typedef unsigned int WORD;

sbit FIL_B=P1^5;               //控制端口
sbit FIL_A=P2^5;
sbit AMP_B=P1^7;

WORD value;

void PCA_isr()interrupt 7 using 1
{
CCF3 = 0;            //Clear interrupt flag
CCAP3L = value;
CCAP3H = value >> 8; //Update compare value
value += T100KHz;
}


void main()
{

AMP_B=1;   //此处放置端口状态后 pca输出频率会变化为45.76HZ,无论原来频率多少

CLK_DIV=0x00;
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 = 0x02; //Set PCA timer clock source as Fosc/2
             //Disable PCA timer overflow interrupt
value = T100KHz;
CCAP3L = value;      
CCAP3H = value >> 8;
value += T100KHz;



CCAPM3 = 0x4d;   //PCA module-3 work in 16-bit timer mode
               //and enable PCA interrupt,

CR = 1;          //PCA timer start run

EPCA_LVD = 1;
EA = 1;

while (1)
{

}


}

3DG11 发表于 2011-9-2 16:48:12

是不是 stc单片机 位操作和传统51不一样??
感觉 stc很像avravr不支持位操作stc位操作是否特殊处理过?
以后选择还是慎用 stc   有很多潜在问题

YL_L 发表于 2011-10-13 14:31:04

STC12C5608AD芯片PCA的中断号为6而不是7
voidPCA_LVD_Routine(void)      interrupt 6;

实在不敢恭维宏晶的Datasheet!
页: [1]
查看完整版本: 熟悉STC的PCA模块的同学进来帮帮忙 实在想不明白的问题