请教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都在输出脉冲,这不影响我的使用了吗 只初始化一路PCA,不影响另外的IO的。 本帖最后由 STCunio 于 2015-2-3 11:27 编辑
你是不是设置了
CCAPM0 = 0x4d;CCAPM1 = 0x4d; CCAPM2 = 0x4d;
CCAPMn(n=0,1,2,)是CCAP的模式设置寄存器,高速脉冲、PWM、捕捉等设置都不同 小李非刀 发表于 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输出脉冲,该如何初始化 STCunio 发表于 2015-2-3 11:20
你是不是设置了
CCAPM0 = 0x4d;CCAPM1 = 0x4d; CCAPM2 = 0x4d;
CCAPMn(n=0,1,2,)是CCAP的模式设置寄存 ...
我就是不知道怎么具体设置到一个io口输出脉冲,上面给的程序是官方的,它那个程序初始化完后,不是下一下有四个IO是高速脉冲输出吗 设置ccapmx对应的寄存器 你不会只初始化一路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都不受影响。 小李非刀 发表于 2015-2-6 23:03
你不会只初始化一路PCA么?
void PCA_config(void)
梁工对STC的单片机果然理解深透,佩服佩服。 chen849928055 发表于 2015-2-3 12:37
我就是不知道怎么具体设置到一个io口输出脉冲,上面给的程序是官方的,它那个程序初始化完后,不是下一下 ...
CCAPM0 = 0x4d; 只设置这个,其他的不要设置 小李非刀 发表于 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又该怎么设置 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。
晕,这个引脚图很清楚的啊。。。。 官方软件带的例程? 小李非刀 发表于 2015-2-6 23:03
你不会只初始化一路PCA么?
void PCA_config(void)
这个是初始化PCA(P24_P25_P26_P27)这四个IO中的哪一个io口 chen849928055 发表于 2015-3-3 17:01
这个是初始化PCA(P24_P25_P26_P27)这四个IO中的哪一个io口
你看看11楼我的贴。。。
都一个月过去啦。。。 小李非刀 发表于 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]