MPC82G516为台湾笙泉公司出产的8位MCU,兼容8051。内建PCA功用6个模块,模块0—5对应P1.2—P1.7, P1.1为输入脉冲源ECI。本文记载了测验PCA的代码和进程,要点剖析各寄存器的设置,还经过逻辑剖析仪记载相关波形。STC15F60S2等芯片也内建PCA功用,不过仅3模块,但功用更为丰厚,设置编程进程迥然不同,可参阅。
1、相关寄存器:
寄存器
功用
地址
7
6
5
4
3
2
1
0
描绘
CCON
操控
D8
CF
CR
CCF5
CCF4
CCF3
CCF2
CCF1
CCF0
CR:启停PCA总计数器
CF:PCA总计数器溢出标志
CCF0-5:各模块中止标志
CMOD
形式
D9
CIDL
—
—
—
—
CPS1
CPS0
ECF
CIDL:闲暇形式是否计数
CPS1、CPS0:时钟源:12分.2分.T0.ECI.四选一
ECF:PCA计数溢出中止
AUXIE
中止
AD
—
—
EKB
ES2
EBD
EPCA
EADC
ESPI
EPCA:PCA中止开关
CCAPM
0-5
模块形式
DA-
DF
—
ECOM
0-5
CAPP
0-5
CAPN
0-5
MAT
0-5
TOG
0-5
PWM
0-5
ECCF
0-5
ECOMn 答应比较
CAPPn 上升CAPNn 下降
MATn 匹配CCFn位
TOGn 匹配翻转引脚电平
PWM脉宽调制输出
ECCFn 使能中止信号CCFn
CCAPnL
捕获
寄存器
EA-EF
比较:先设初值,与PCA比较
捕获:捕获PCA值到寄存器
CCAPnH
FA-FF
PCAP
WM0-5
PWM
形式
F2-
F7
—
—
—
—
—
—
ECA
PnH
0-5
ECA
PnL
0-5
PWM时作为第9位
用于设定占空比
CL、CH
PCA
PCA总计数器
AUXR1
引脚
8E
P4KB
P4PCA
P4SPI
P4S2
GF2
—
—
DPS
P4PCA:引脚切换到P4口
2、比较、捕获形式设置寄存器CCAPM0-5:
CCAPMn
16进值
有/无中止
功用
补白
-000 0000
无操作
-x10 000x
20/21
16位CEXn引脚上升沿触发捕获形式
捕获值不处理仅进中止,相当于增加了外部中止功用
-x01 000x
10/11
16位CEXn引脚下降沿触发捕获形式
-x11 000x
30/31
16位CEXn引脚有跳变沿触发捕获形式
-100 100x
48/49
16位软件守时器
均需进中止重设比较值,并清0中止标志,因而最小守时值》=5us。差别是守时器仅运用中止信号,高速输出则运用对应引脚电平的翻转
-100 110x
4C/4D
16位高速输出
-100 0010
42/
8位PWM
占空比=1-[ECAPnH,CCAPnL]/256
3、PCA功用运用进程:
1) 确认CCON=0x00;一般先清0
2)确认CMOD=0x00;00不开PCA中止,01开;脉冲源为FSOC/12
3)AUXIE = 0x04;翻开PCA总中止开关,捕获及守时均要翻开,PWM时可封闭
4)设置各模块作业形式寄存器CCAPMn,见表2
5)设置PCA计数器初值:CL=0;CH=0
6)守时或高速输出时,需设置CCAPnL及CCAPnH值
7)PWM功用时,需设置CCAPnH(及ECAPnH在PCAPWM寄存器中)
8)发动PCA计数:CR=1;如有必要翻开总中止:EA=1
9)写中止处理函数,MPC82G516的PCA中止向量为10(53H),STC15F60S2为7
4、PCA功用逻辑图:
5、PCA中止逻辑示意图:
6、PCA中止向量
MPC82G516的PCA中止编号为10。STC15F60S2的中止矢量为7。
测验1:PCA总计数器溢出中止
思路:不运用任何模块,仅发动PCA总计数器,为便利调查,注册中止并在中止处理程序中设置调查变量(P2.1)作电平翻转,再用逻辑剖析仪调查其改变。
进程:
1、CCON清0,各中止标志清0,封闭PCA计数
2、CMOD:设置脉冲源,置位ECF(答应总PCA计数溢出中止)
3、翻开各级中止:AUXIE中设EPCA,开总中止EA
4、发动PCA:CR=1
在p2.1可调查到65.536宽度电平翻转。程序如下:
程序:
#include “REG_MPC82G516.H”
#include “intrins.h”
sbit LED =P2^1;//测验LED
void PCA_isr() interrupt 10 //留意中止向量号为10,STC15F为7
{
CF=0;//清中止
LED=!LED;//LED取反
}
void main()
{
CCON=0;
CL=0;
CH=0;
CMOD=0x01;//12分频。运用0x03则为体系时钟2分频
AUXIE=0x04;
EA=1;
CR=1;
while(1);
}
FOSC/12:PCA计数每65.531ms溢出一次(理论值应为65.536ms)
假如改脉冲源为FOSC/2:PCA计数每10.922ms溢出一次
测验2:PCA模块0用作捕获形式,CEX0引发中止
思路:
模块0设置为捕获形式,捕获信号由模块0对应的引脚P1.2输出,可上升、下降或边际触发,详细经过设置CCAPM0来完成,见表2。
下降沿触发捕获:CCAPM0=0x11 (00010001),即CAPN0=1、ECCF0=1可直接短接CEX0/P1.2与地来取得下降沿;
上升沿触发捕获:CCAPM0=0x21 (00100001) 需先短接CEX0/P1.2与地、再释放来取得上升沿;
留意MCU的四个端口复位后均为“准双向口”,开路时内部有弱上拉。
当CEX0触发捕获时,捕获到的数据并不作处理(如带仿真,可仿真时查看到该捕获值),因而本程序相当于为单片机增加了一个外部中止功用。
程序:
#include “REG_MPC82G516.H”
#include “intrins.h”
sbit LED =P2^1;//测验LED
sbit LED2=P2^2;//接LED调查
void PCA_isr() interrupt 10
{
unsigned charTmpL;//暂时变量,暂存捕获值
unsigned charTmpH;
//CF=0; //清中止(PCA计数溢出,这儿不用运用)
LED=!LED;//LED取反
if (CCF0)//当CEX0(P1.2)触发捕获时,引发中止CCF0
{
TmpL=CCAP0L;
TmpH=CCAP0H;
CCF0=0;//软件清中止
//P12=1;//拉高测验引脚,用于下次下降沿触发
LED2=!LED2;//可接发光二极管调查中止发生状况
}
}
void main()
{
CCON=0;
CL=0;
CH=0;
CMOD=0x00;//形式:FSOC/12、ECF制止PCA中止(避免发生无效中止)
AUXIE=0x04;//翻开PCA总中止
CCAPM0 =0x11;//模块0设置为外部引脚上升沿触发捕获形式,并发生模块0的中止信息CCF0
EA=1;
CR=1;
//P12=1;
while(1);
}
测验3:PCA模块0、1用作16位守时形式
思路:
PCA各模块如用作守时器,因16位PCA计数器发动后,总是从0000—FFFF循环计数,比较寄存器[CCAPnH + CCAPnL]如装载固定值的话,每个PCA计数周期(65535个脉冲)只能发生一次比较相同输出,为了完成自界说的计数值,必须在每次计数中止后给[CCAPnH + CCAPnL]加一个固定值,这样PCA计数到新值后又能发生中止输出,到达守时器的意图;
编程进程:
1) CCON清0,各中止标志清0,封闭PCA计数
2)CMOD:设置脉冲源,置位ECF(答应总PCA计数溢出中止)
3)PCA计数器CH+CL=0000,比较寄存器[CCAPnH + CCAPnL]+=T(T为守时值)
4)设置本模块作业方式为16位守时器:CCAPM0 =0x49
5)翻开各级中止:AUXIE=0x04 开总中止EA
6) 发动PCA:CR=1
7) 中止处理程序:增加代码 [CCAPnH + CCAPnL]+=T,作为下次比较值
调查方法:
在中止程序中设置变量LED/P2.1(模块1用LED2),每次中止回转以输出方波(接逻辑仪剖析)
代码:(模块0守时1ms,模块1守时3ms)
#include “REG_MPC82G516.H”
#include “intrins.h”
sbit LED =P2^1;//测验LED
sbit LED2=P2^2;//接LED调查
unsigned int t0=1000;//界说16位变量t,守时1ms
unsigned int t1=3000;//界说16位变量t,守时3ms
unsigned int value0;
unsigned int value1;
void PCA_isr() interrupt 10
{
if(CCF0)
{
CCF0=0;//清中止,因PCA计数溢出中止已制止,所以这儿不用再清CF
CCAP0L = value0; //更新比较值