chen849928055 发表于 2015-2-3 09:31:31

请教STC15W408AS的PCA模块使用疑惑?



#include "reg51.h"
#include "intrins.h"

#define FOSC    18432000L
#define T100KHz (FOSC / 4 / 100000)

typedef unsigned char BYTE;
typedef unsigned int WORD;

sfr P_SW1       = 0xA2;             //外设功能切换寄存器1

#define CCP_S0 0x10               //P_SW1.4
#define CCP_S1 0x20               //P_SW1.5

sfr CCON      =   0xD8;         //PCA控制寄存器
sbit CCF0       =   CCON^0;         //PCA模块0中断标志
sbit CCF1       =   CCON^1;         //PCA模块1中断标志
sbit CR         =   CCON^6;         //PCA定时器运行控制位
sbit CF         =   CCON^7;         //PCA定时器溢出标志
sfr CMOD      =   0xD9;         //PCA模式寄存器
sfr CL          =   0xE9;         //PCA定时器低字节
sfr CH          =   0xF9;         //PCA定时器高字节
sfr CCAPM0      =   0xDA;         //PCA模块0模式寄存器
sfr CCAP0L      =   0xEA;         //PCA模块0捕获寄存器 LOW
sfr CCAP0H      =   0xFA;         //PCA模块0捕获寄存器 HIGH
sfr CCAPM1      =   0xDB;         //PCA模块1模式寄存器
sfr CCAP1L      =   0xEB;         //PCA模块1捕获寄存器 LOW
sfr CCAP1H      =   0xFB;         //PCA模块1捕获寄存器 HIGH
sfr PCAPWM0   =   0xf2;
sfr PCAPWM1   =   0xf3;

sbit PCA_LED    =   P1^0;         //PCA测试LED

BYTE cnt;
WORD value;

void PCA_isr() interrupt 7 using 1
{
    CCF0 = 0;                     //清中断标志
    CCAP0L = value;
    CCAP0H = value >> 8;            //更新比较值
    value += T100KHz;
}

void main()
{
    ACC = P_SW1;
    ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=0
    P_SW1 = ACC;                  //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
   
//ACC = P_SW1;
//ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=1 CCP_S1=0
//ACC |= CCP_S0;                  //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
//P_SW1 = ACC;
//
//ACC = P_SW1;
//ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=1
//ACC |= CCP_S1;                  //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
//P_SW1 = ACC;

    CCON = 0;                     //初始化PCA控制寄存器
                                    //PCA定时器停止
                                    //清除CF标志
                                    //清除模块中断标志
    CL = 0;                         //复位PCA寄存器
    CH = 0;
    CMOD = 0x02;                  //设置PCA时钟源
                                    //禁止PCA定时器溢出中断
    value = T100KHz;
    CCAP0L = value;               //P1.3输出100KHz方波
    CCAP0H = value >> 8;            //初始化PCA模块0
    value += T100KHz;
    CCAPM0 = 0x4d;                  //PCA模块0为16位定时器模式,同时反转CEX0(P1.3)口

    CR = 1;                         //PCA定时器开始工作
    EA = 1;
    cnt = 0;

    while (1);
}

例程里一设置同一组的IO都输出脉冲,比如我想让P3.5输出告诉脉冲,P3.4P3.6P3.7用作其他的作用。按照例程的设置后P3.4P3.6P3.7都在输出脉冲,这不影响我的使用了吗

小李非刀 发表于 2015-2-3 11:19:00

只初始化一路PCA,不影响另外的IO的。

STCunio 发表于 2015-2-3 11:20:28

本帖最后由 STCunio 于 2015-2-3 11:27 编辑

你是不是设置了
CCAPM0 = 0x4d;CCAPM1 = 0x4d; CCAPM2 = 0x4d;
CCAPMn(n=0,1,2,)是CCAP的模式设置寄存器,高速脉冲、PWM、捕捉等设置都不同

chen849928055 发表于 2015-2-3 12:33:25

小李非刀 发表于 2015-2-3 11:19
只初始化一路PCA,不影响另外的IO的。

初始化ACC = P_SW1;
         ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=1 CCP_S1=0
          ACC |= CCP_S0;                  //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
          P_SW1 = ACC;
不是有P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2这四个IO口都输出脉冲吗?我想只p3.5输出脉冲,该如何初始化

chen849928055 发表于 2015-2-3 12:37:55

STCunio 发表于 2015-2-3 11:20
你是不是设置了
CCAPM0 = 0x4d;CCAPM1 = 0x4d; CCAPM2 = 0x4d;
CCAPMn(n=0,1,2,)是CCAP的模式设置寄存 ...

我就是不知道怎么具体设置到一个io口输出脉冲,上面给的程序是官方的,它那个程序初始化完后,不是下一下有四个IO是高速脉冲输出吗

34071417 发表于 2015-2-6 22:35:27

设置ccapmx对应的寄存器

小李非刀 发表于 2015-2-6 23:03:26

你不会只初始化一路PCA么?

void        PCA_config(void)
{
        PCA_InitTypeDef                PCA_InitStructure;

        PCA_InitStructure.PCA_Clock    = PCA_Clock_1T;                //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI
        PCA_InitStructure.PCA_IoUse    = PCA_P24_P25_P26_P27;        //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27
        PCA_InitStructure.PCA_Interrupt_Mode = DISABLE;                //ENABLE, DISABLE
        PCA_InitStructure.PCA_Polity   = PolityLow;                        //优先级设置        PolityHigh,PolityLow
        PCA_InitStructure.PCA_RUN      = DISABLE;                        //ENABLE, DISABLE
        PCA_Init(PCA_Counter,&PCA_InitStructure);

        PCA_InitStructure.PCA_Mode   = PCA_Mode_PWM;                //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
        PCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit;                //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
        PCA_InitStructure.PCA_Interrupt_Mode = DISABLE;                //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
        PCA_InitStructure.PCA_Value    = 128 << 8;                        //对于PWM,高8位为PWM占空比
        PCA_Init(PCA0,&PCA_InitStructure);

        CR = 1;
}

这样只初始化一路PCA0做PWM输出,只占用PCA0的输出一个IO,别的IO都不受影响。

makeflyeasy 发表于 2015-2-6 23:55:22

小李非刀 发表于 2015-2-6 23:03
你不会只初始化一路PCA么?

void        PCA_config(void)


梁工对STC的单片机果然理解深透,佩服佩服。

34071417 发表于 2015-2-9 09:53:39

chen849928055 发表于 2015-2-3 12:37
我就是不知道怎么具体设置到一个io口输出脉冲,上面给的程序是官方的,它那个程序初始化完后,不是下一下 ...

CCAPM0 = 0x4d; 只设置这个,其他的不要设置

chen849928055 发表于 2015-2-10 12:06:41

小李非刀 发表于 2015-2-6 23:03
你不会只初始化一路PCA么?

void        PCA_config(void)


我怎么知道是PCA_P24_P25_P26_P27 哪一个IO口输出pwm还是说这样初始化后P24_P25_P26_P27这四个io口都输出pwm比如我只想p24这个IO口输出PWM又该怎么设置

小李非刀 发表于 2015-2-10 12:15:33

408AS没几条腿啊,你不会看看规格书的引脚图么?
PWM是固定对应的IO,你选择了一组IO,则每路PCA对应的IO就固定了。
P3.5就是CCP0,就是PCA0的引脚。
当你选择P24_P25_P26_P27,则P2.5是ECI,P2.5是CCP0,P2.6是CCP1,P2.7是CCP2。
晕,这个引脚图很清楚的啊。。。。

rifjft 发表于 2015-2-10 13:06:57

官方软件带的例程?

chen849928055 发表于 2015-3-3 17:01:12

小李非刀 发表于 2015-2-6 23:03
你不会只初始化一路PCA么?

void        PCA_config(void)


这个是初始化PCA(P24_P25_P26_P27)这四个IO中的哪一个io口

小李非刀 发表于 2015-3-3 18:19:21

chen849928055 发表于 2015-3-3 17:01
这个是初始化PCA(P24_P25_P26_P27)这四个IO中的哪一个io口

你看看11楼我的贴。。。

都一个月过去啦。。。

chen849928055 发表于 2015-3-6 10:39:34

小李非刀 发表于 2015-3-3 18:19
你看看11楼我的贴。。。

都一个月过去啦。。。

ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=0
P_SW1 = ACC;                  //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
   
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=1 CCP_S1=0
ACC |= CCP_S0;                  //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
P_SW1 = ACC;
//
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=1
ACC |= CCP_S1;                  //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
P_SW1 = ACC;
我这样初始化是使用哪一组      然后再设置哪个寄存器是确定使用的ECI    CCP0    CCP1   CCP2这四个模块中的其中的一个模块
页: [1]
查看完整版本: 请教STC15W408AS的PCA模块使用疑惑?